#ifndef __XFS_MOUNT_H__
#define __XFS_MOUNT_H__
struct xlog;
struct xfs_inode;
struct xfs_mru_cache;
struct xfs_ail;
struct xfs_quotainfo;
struct xfs_da_geometry;
enum {
XFS_LOWSP_1_PCNT = 0,
XFS_LOWSP_2_PCNT,
XFS_LOWSP_3_PCNT,
XFS_LOWSP_4_PCNT,
XFS_LOWSP_5_PCNT,
XFS_LOWSP_MAX,
};
enum {
XFS_ERR_METADATA,
XFS_ERR_CLASS_MAX,
};
enum {
XFS_ERR_DEFAULT,
XFS_ERR_EIO,
XFS_ERR_ENOSPC,
XFS_ERR_ENODEV,
XFS_ERR_ERRNO_MAX,
};
#define XFS_ERR_RETRY_FOREVER -1
struct xfs_error_cfg {
struct xfs_kobj kobj;
int max_retries;
long retry_timeout;
};
typedef struct xfs_mount {
struct xfs_sb m_sb;
struct super_block *m_super;
struct xfs_ail *m_ail;
struct xfs_buf *m_sb_bp;
char *m_rtname;
char *m_logname;
struct xfs_da_geometry *m_dir_geo;
struct xfs_da_geometry *m_attr_geo;
struct xlog *m_log;
struct xfs_inode *m_rbmip;
struct xfs_inode *m_rsumip;
struct xfs_inode *m_rootip;
struct xfs_quotainfo *m_quotainfo;
xfs_buftarg_t *m_ddev_targp;
xfs_buftarg_t *m_logdev_targp;
xfs_buftarg_t *m_rtdev_targp;
uint8_t *m_rsum_cache;
struct xfs_mru_cache *m_filestream;
struct workqueue_struct *m_buf_workqueue;
struct workqueue_struct *m_unwritten_workqueue;
struct workqueue_struct *m_cil_workqueue;
struct workqueue_struct *m_reclaim_workqueue;
struct workqueue_struct *m_blockgc_workqueue;
struct workqueue_struct *m_sync_workqueue;
int m_bsize;
uint8_t m_blkbit_log;
uint8_t m_blkbb_log;
uint8_t m_agno_log;
uint8_t m_sectbb_log;
uint m_blockmask;
uint m_blockwsize;
uint m_blockwmask;
uint m_alloc_mxr[2];
uint m_alloc_mnr[2];
uint m_bmap_dmxr[2];
uint m_bmap_dmnr[2];
uint m_rmap_mxr[2];
uint m_rmap_mnr[2];
uint m_refc_mxr[2];
uint m_refc_mnr[2];
uint m_ag_maxlevels;
uint m_bm_maxlevels[2];
uint m_rmap_maxlevels;
uint m_refc_maxlevels;
xfs_extlen_t m_ag_prealloc_blocks;
uint m_alloc_set_aside;
uint m_ag_max_usable;
int m_dalign;
int m_swidth;
xfs_agnumber_t m_maxagi;
uint m_allocsize_log;
uint m_allocsize_blocks;
int m_logbufs;
int m_logbsize;
uint m_rsumlevels;
uint m_rsumsize;
int m_fixedfsid[2];
uint m_qflags;
uint64_t m_flags;
int64_t m_low_space[XFS_LOWSP_MAX];
struct xfs_ino_geometry m_ino_geo;
struct xfs_trans_resv m_resv;
bool m_always_cow;
bool m_fail_unmount;
bool m_finobt_nores;
bool m_update_sb;
uint8_t m_fs_checked;
uint8_t m_fs_sick;
uint8_t m_rt_checked;
uint8_t m_rt_sick;
spinlock_t ____cacheline_aligned m_sb_lock;
struct percpu_counter m_icount;
struct percpu_counter m_ifree;
struct percpu_counter m_fdblocks;
struct percpu_counter m_delalloc_blks;
struct radix_tree_root m_perag_tree;
spinlock_t m_perag_lock;
uint64_t m_resblks;
uint64_t m_resblks_avail;
uint64_t m_resblks_save;
struct delayed_work m_reclaim_work;
struct xfs_kobj m_kobj;
struct xfs_kobj m_error_kobj;
struct xfs_kobj m_error_meta_kobj;
struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
struct xstats m_stats;
xfs_agnumber_t m_agfrotor;
xfs_agnumber_t m_agirotor;
spinlock_t m_agirotor_lock;
struct work_struct m_flush_inodes_work;
uint32_t m_generation;
struct mutex m_growlock;
#ifdef DEBUG
unsigned int *m_errortag;
struct xfs_kobj m_errortag_kobj;
#endif
} xfs_mount_t;
#define M_IGEO(mp) (&(mp)->m_ino_geo)
#define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops
must be synchronous except
for space allocations */
#define XFS_MOUNT_UNMOUNTING (1ULL << 1) /* filesystem is unmounting */
#define XFS_MOUNT_WAS_CLEAN (1ULL << 3)
#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem
operations, typically for
disk errors in metadata */
#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */
#define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment
allocations */
#define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */
#define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */
#define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */
#define XFS_MOUNT_ALLOCSIZE (1ULL << 12) /* specified allocation size */
#define XFS_MOUNT_SMALL_INUMS (1ULL << 14) /* user wants 32bit inodes */
#define XFS_MOUNT_32BITINODES (1ULL << 15) /* inode32 allocator active */
#define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */
#define XFS_MOUNT_IKEEP (1ULL << 18) /* keep empty inode clusters*/
#define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width
* allocation */
#define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */
#define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */
#define XFS_MOUNT_LARGEIO (1ULL << 22) /* report large preferred
* I/O size in stat() */
#define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams
allocator */
#define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */
#define XFS_MOUNT_DAX_ALWAYS (1ULL << 26)
#define XFS_MOUNT_DAX_NEVER (1ULL << 27)
#define XFS_MAX_IO_LOG 30 /* 1G */
#define XFS_MIN_IO_LOG PAGE_SHIFT
#define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \
((mp)->m_flags & XFS_MOUNT_WAS_CLEAN)
#define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN)
void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
int lnnum);
#define xfs_force_shutdown(m,f) \
xfs_do_force_shutdown(m, f, __FILE__, __LINE__)
#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */
#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */
#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */
#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */
#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */
static inline xfs_agnumber_t
xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d)
{
xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
do_div(ld, mp->m_sb.sb_agblocks);
return (xfs_agnumber_t) ld;
}
static inline xfs_agblock_t
xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
{
xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
}
struct xfs_ag_resv {
xfs_extlen_t ar_orig_reserved;
xfs_extlen_t ar_reserved;
xfs_extlen_t ar_asked;
};
typedef struct xfs_perag {
struct xfs_mount *pag_mount;
xfs_agnumber_t pag_agno;
atomic_t pag_ref;
char pagf_init;
char pagi_init;
char pagf_metadata;
char pagi_inodeok;
uint8_t pagf_levels[XFS_BTNUM_AGF];
bool pagf_agflreset;
uint32_t pagf_flcount;
xfs_extlen_t pagf_freeblks;
xfs_extlen_t pagf_longest;
uint32_t pagf_btreeblks;
xfs_agino_t pagi_freecount;
xfs_agino_t pagi_count;
xfs_agino_t pagl_pagino;
xfs_agino_t pagl_leftrec;
xfs_agino_t pagl_rightrec;
uint16_t pag_checked;
uint16_t pag_sick;
spinlock_t pag_state_lock;
spinlock_t pagb_lock;
struct rb_root pagb_tree;
unsigned int pagb_gen;
wait_queue_head_t pagb_wait;
atomic_t pagf_fstrms;
spinlock_t pag_ici_lock;
struct radix_tree_root pag_ici_root;
int pag_ici_reclaimable;
unsigned long pag_ici_reclaim_cursor;
spinlock_t pag_buf_lock;
struct rhashtable pag_buf_hash;
struct rcu_head rcu_head;
int pagb_count;
struct xfs_ag_resv pag_meta_resv;
struct xfs_ag_resv pag_rmapbt_resv;
struct delayed_work pag_blockgc_work;
uint8_t pagf_refcount_level;
struct rhashtable pagi_unlinked_hash;
} xfs_perag_t;
static inline struct xfs_ag_resv *
xfs_perag_resv(
struct xfs_perag *pag,
enum xfs_ag_resv_type type)
{
switch (type) {
case XFS_AG_RESV_METADATA:
return &pag->pag_meta_resv;
case XFS_AG_RESV_RMAPBT:
return &pag->pag_rmapbt_resv;
default:
return NULL;
}
}
int xfs_buf_hash_init(xfs_perag_t *pag);
void xfs_buf_hash_destroy(xfs_perag_t *pag);
extern void xfs_uuid_table_free(void);
extern uint64_t xfs_default_resblks(xfs_mount_t *mp);
extern int xfs_mountfs(xfs_mount_t *mp);
extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount,
xfs_agnumber_t *maxagi);
extern void xfs_unmountfs(xfs_mount_t *);
extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta,
bool reserved);
extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta);
extern int xfs_readsb(xfs_mount_t *, int);
extern void xfs_freesb(xfs_mount_t *);
extern bool xfs_fs_writable(struct xfs_mount *mp, int level);
extern int xfs_sb_validate_fsb_count(struct xfs_sb *, uint64_t);
extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
extern void xfs_set_low_space_thresholds(struct xfs_mount *);
int xfs_zero_extent(struct xfs_inode *ip, xfs_fsblock_t start_fsb,
xfs_off_t count_fsb);
struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp,
int error_class, int error);
void xfs_force_summary_recalc(struct xfs_mount *mp);
void xfs_mod_delalloc(struct xfs_mount *mp, int64_t delta);
#endif /* __XFS_MOUNT_H__ */