| .. | .. |
|---|
| 9 | 9 | struct xlog; |
|---|
| 10 | 10 | struct xfs_inode; |
|---|
| 11 | 11 | struct xfs_mru_cache; |
|---|
| 12 | | -struct xfs_nameops; |
|---|
| 13 | 12 | struct xfs_ail; |
|---|
| 14 | 13 | struct xfs_quotainfo; |
|---|
| 15 | | -struct xfs_dir_ops; |
|---|
| 16 | 14 | struct xfs_da_geometry; |
|---|
| 17 | 15 | |
|---|
| 18 | 16 | /* dynamic preallocation free space thresholds, 5% down to 1% */ |
|---|
| .. | .. |
|---|
| 57 | 55 | long retry_timeout; /* in jiffies, -1 = infinite */ |
|---|
| 58 | 56 | }; |
|---|
| 59 | 57 | |
|---|
| 58 | +/* |
|---|
| 59 | + * The struct xfsmount layout is optimised to separate read-mostly variables |
|---|
| 60 | + * from variables that are frequently modified. We put the read-mostly variables |
|---|
| 61 | + * first, then place all the other variables at the end. |
|---|
| 62 | + * |
|---|
| 63 | + * Typically, read-mostly variables are those that are set at mount time and |
|---|
| 64 | + * never changed again, or only change rarely as a result of things like sysfs |
|---|
| 65 | + * knobs being tweaked. |
|---|
| 66 | + */ |
|---|
| 60 | 67 | typedef struct xfs_mount { |
|---|
| 61 | | - struct super_block *m_super; |
|---|
| 62 | | - xfs_tid_t m_tid; /* next unused tid for fs */ |
|---|
| 63 | | - struct xfs_ail *m_ail; /* fs active log item list */ |
|---|
| 64 | | - |
|---|
| 65 | 68 | struct xfs_sb m_sb; /* copy of fs superblock */ |
|---|
| 66 | | - spinlock_t m_sb_lock; /* sb counter lock */ |
|---|
| 67 | | - struct percpu_counter m_icount; /* allocated inodes counter */ |
|---|
| 68 | | - struct percpu_counter m_ifree; /* free inodes counter */ |
|---|
| 69 | | - struct percpu_counter m_fdblocks; /* free block counter */ |
|---|
| 70 | | - |
|---|
| 69 | + struct super_block *m_super; |
|---|
| 70 | + struct xfs_ail *m_ail; /* fs active log item list */ |
|---|
| 71 | 71 | struct xfs_buf *m_sb_bp; /* buffer for superblock */ |
|---|
| 72 | | - char *m_fsname; /* filesystem name */ |
|---|
| 73 | | - int m_fsname_len; /* strlen of fs name */ |
|---|
| 74 | 72 | char *m_rtname; /* realtime device name */ |
|---|
| 75 | 73 | char *m_logname; /* external log device name */ |
|---|
| 76 | | - int m_bsize; /* fs logical block size */ |
|---|
| 77 | | - xfs_agnumber_t m_agfrotor; /* last ag where space found */ |
|---|
| 78 | | - xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ |
|---|
| 79 | | - spinlock_t m_agirotor_lock;/* .. and lock protecting it */ |
|---|
| 80 | | - xfs_agnumber_t m_maxagi; /* highest inode alloc group */ |
|---|
| 81 | | - uint m_readio_log; /* min read size log bytes */ |
|---|
| 82 | | - uint m_readio_blocks; /* min read size blocks */ |
|---|
| 83 | | - uint m_writeio_log; /* min write size log bytes */ |
|---|
| 84 | | - uint m_writeio_blocks; /* min write size blocks */ |
|---|
| 85 | 74 | struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ |
|---|
| 86 | 75 | struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ |
|---|
| 87 | 76 | struct xlog *m_log; /* log specific stuff */ |
|---|
| 88 | | - int m_logbufs; /* number of log buffers */ |
|---|
| 89 | | - int m_logbsize; /* size of each log buffer */ |
|---|
| 90 | | - uint m_rsumlevels; /* rt summary levels */ |
|---|
| 91 | | - uint m_rsumsize; /* size of rt summary, bytes */ |
|---|
| 92 | 77 | struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ |
|---|
| 93 | 78 | struct xfs_inode *m_rsumip; /* pointer to summary inode */ |
|---|
| 94 | 79 | struct xfs_inode *m_rootip; /* pointer to root directory */ |
|---|
| .. | .. |
|---|
| 96 | 81 | xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ |
|---|
| 97 | 82 | xfs_buftarg_t *m_logdev_targp;/* ptr to log device */ |
|---|
| 98 | 83 | xfs_buftarg_t *m_rtdev_targp; /* ptr to rt device */ |
|---|
| 84 | + /* |
|---|
| 85 | + * Optional cache of rt summary level per bitmap block with the |
|---|
| 86 | + * invariant that m_rsum_cache[bbno] <= the minimum i for which |
|---|
| 87 | + * rsum[i][bbno] != 0. Reads and writes are serialized by the rsumip |
|---|
| 88 | + * inode lock. |
|---|
| 89 | + */ |
|---|
| 90 | + uint8_t *m_rsum_cache; |
|---|
| 91 | + struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ |
|---|
| 92 | + struct workqueue_struct *m_buf_workqueue; |
|---|
| 93 | + struct workqueue_struct *m_unwritten_workqueue; |
|---|
| 94 | + struct workqueue_struct *m_cil_workqueue; |
|---|
| 95 | + struct workqueue_struct *m_reclaim_workqueue; |
|---|
| 96 | + struct workqueue_struct *m_eofblocks_workqueue; |
|---|
| 97 | + struct workqueue_struct *m_sync_workqueue; |
|---|
| 98 | + |
|---|
| 99 | + int m_bsize; /* fs logical block size */ |
|---|
| 99 | 100 | uint8_t m_blkbit_log; /* blocklog + NBBY */ |
|---|
| 100 | 101 | uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ |
|---|
| 101 | 102 | uint8_t m_agno_log; /* log #ag's */ |
|---|
| 102 | | - uint8_t m_agino_log; /* #bits for agino in inum */ |
|---|
| 103 | | - uint m_inode_cluster_size;/* min inode buf size */ |
|---|
| 103 | + uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ |
|---|
| 104 | 104 | uint m_blockmask; /* sb_blocksize-1 */ |
|---|
| 105 | 105 | uint m_blockwsize; /* sb_blocksize in words */ |
|---|
| 106 | 106 | uint m_blockwmask; /* blockwsize-1 */ |
|---|
| .. | .. |
|---|
| 108 | 108 | uint m_alloc_mnr[2]; /* min alloc btree records */ |
|---|
| 109 | 109 | uint m_bmap_dmxr[2]; /* max bmap btree records */ |
|---|
| 110 | 110 | uint m_bmap_dmnr[2]; /* min bmap btree records */ |
|---|
| 111 | | - uint m_inobt_mxr[2]; /* max inobt btree records */ |
|---|
| 112 | | - uint m_inobt_mnr[2]; /* min inobt btree records */ |
|---|
| 113 | 111 | uint m_rmap_mxr[2]; /* max rmap btree records */ |
|---|
| 114 | 112 | uint m_rmap_mnr[2]; /* min rmap btree records */ |
|---|
| 115 | 113 | uint m_refc_mxr[2]; /* max refc btree records */ |
|---|
| 116 | 114 | uint m_refc_mnr[2]; /* min refc btree records */ |
|---|
| 117 | 115 | uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ |
|---|
| 118 | 116 | uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ |
|---|
| 119 | | - uint m_in_maxlevels; /* max inobt btree levels. */ |
|---|
| 120 | 117 | uint m_rmap_maxlevels; /* max rmap btree levels */ |
|---|
| 121 | 118 | uint m_refc_maxlevels; /* max refcount btree level */ |
|---|
| 122 | 119 | xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ |
|---|
| 123 | 120 | uint m_alloc_set_aside; /* space we can't use */ |
|---|
| 124 | 121 | uint m_ag_max_usable; /* max space per AG */ |
|---|
| 122 | + int m_dalign; /* stripe unit */ |
|---|
| 123 | + int m_swidth; /* stripe width */ |
|---|
| 124 | + xfs_agnumber_t m_maxagi; /* highest inode alloc group */ |
|---|
| 125 | + uint m_allocsize_log;/* min write size log bytes */ |
|---|
| 126 | + uint m_allocsize_blocks; /* min write size blocks */ |
|---|
| 127 | + int m_logbufs; /* number of log buffers */ |
|---|
| 128 | + int m_logbsize; /* size of each log buffer */ |
|---|
| 129 | + uint m_rsumlevels; /* rt summary levels */ |
|---|
| 130 | + uint m_rsumsize; /* size of rt summary, bytes */ |
|---|
| 131 | + int m_fixedfsid[2]; /* unchanged for life of FS */ |
|---|
| 132 | + uint m_qflags; /* quota status flags */ |
|---|
| 133 | + uint64_t m_flags; /* global mount flags */ |
|---|
| 134 | + int64_t m_low_space[XFS_LOWSP_MAX]; |
|---|
| 135 | + struct xfs_ino_geometry m_ino_geo; /* inode geometry */ |
|---|
| 136 | + struct xfs_trans_resv m_resv; /* precomputed res values */ |
|---|
| 137 | + /* low free space thresholds */ |
|---|
| 138 | + bool m_always_cow; |
|---|
| 139 | + bool m_fail_unmount; |
|---|
| 140 | + bool m_finobt_nores; /* no per-AG finobt resv. */ |
|---|
| 141 | + bool m_update_sb; /* sb needs update in mount */ |
|---|
| 142 | + |
|---|
| 143 | + /* |
|---|
| 144 | + * Bitsets of per-fs metadata that have been checked and/or are sick. |
|---|
| 145 | + * Callers must hold m_sb_lock to access these two fields. |
|---|
| 146 | + */ |
|---|
| 147 | + uint8_t m_fs_checked; |
|---|
| 148 | + uint8_t m_fs_sick; |
|---|
| 149 | + /* |
|---|
| 150 | + * Bitsets of rt metadata that have been checked and/or are sick. |
|---|
| 151 | + * Callers must hold m_sb_lock to access this field. |
|---|
| 152 | + */ |
|---|
| 153 | + uint8_t m_rt_checked; |
|---|
| 154 | + uint8_t m_rt_sick; |
|---|
| 155 | + |
|---|
| 156 | + /* |
|---|
| 157 | + * End of read-mostly variables. Frequently written variables and locks |
|---|
| 158 | + * should be placed below this comment from now on. The first variable |
|---|
| 159 | + * here is marked as cacheline aligned so they it is separated from |
|---|
| 160 | + * the read-mostly variables. |
|---|
| 161 | + */ |
|---|
| 162 | + |
|---|
| 163 | + spinlock_t ____cacheline_aligned m_sb_lock; /* sb counter lock */ |
|---|
| 164 | + struct percpu_counter m_icount; /* allocated inodes counter */ |
|---|
| 165 | + struct percpu_counter m_ifree; /* free inodes counter */ |
|---|
| 166 | + struct percpu_counter m_fdblocks; /* free block counter */ |
|---|
| 167 | + /* |
|---|
| 168 | + * Count of data device blocks reserved for delayed allocations, |
|---|
| 169 | + * including indlen blocks. Does not include allocated CoW staging |
|---|
| 170 | + * extents or anything related to the rt device. |
|---|
| 171 | + */ |
|---|
| 172 | + struct percpu_counter m_delalloc_blks; |
|---|
| 173 | + |
|---|
| 125 | 174 | struct radix_tree_root m_perag_tree; /* per-ag accounting info */ |
|---|
| 126 | 175 | spinlock_t m_perag_lock; /* lock for m_perag_tree */ |
|---|
| 127 | | - struct mutex m_growlock; /* growfs mutex */ |
|---|
| 128 | | - int m_fixedfsid[2]; /* unchanged for life of FS */ |
|---|
| 129 | | - uint64_t m_flags; /* global mount flags */ |
|---|
| 130 | | - bool m_finobt_nores; /* no per-AG finobt resv. */ |
|---|
| 131 | | - int m_ialloc_inos; /* inodes in inode allocation */ |
|---|
| 132 | | - int m_ialloc_blks; /* blocks in inode allocation */ |
|---|
| 133 | | - int m_ialloc_min_blks;/* min blocks in sparse inode |
|---|
| 134 | | - * allocation */ |
|---|
| 135 | | - int m_inoalign_mask;/* mask sb_inoalignmt if used */ |
|---|
| 136 | | - uint m_qflags; /* quota status flags */ |
|---|
| 137 | | - struct xfs_trans_resv m_resv; /* precomputed res values */ |
|---|
| 138 | | - uint64_t m_maxicount; /* maximum inode count */ |
|---|
| 139 | 176 | uint64_t m_resblks; /* total reserved blocks */ |
|---|
| 140 | 177 | uint64_t m_resblks_avail;/* available reserved blocks */ |
|---|
| 141 | 178 | uint64_t m_resblks_save; /* reserved blks @ remount,ro */ |
|---|
| 142 | | - int m_dalign; /* stripe unit */ |
|---|
| 143 | | - int m_swidth; /* stripe width */ |
|---|
| 144 | | - int m_sinoalign; /* stripe unit inode alignment */ |
|---|
| 145 | | - uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ |
|---|
| 146 | | - const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ |
|---|
| 147 | | - const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ |
|---|
| 148 | | - const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ |
|---|
| 149 | | - uint m_chsize; /* size of next field */ |
|---|
| 150 | | - atomic_t m_active_trans; /* number trans frozen */ |
|---|
| 151 | | - struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ |
|---|
| 152 | 179 | struct delayed_work m_reclaim_work; /* background inode reclaim */ |
|---|
| 153 | 180 | struct delayed_work m_eofblocks_work; /* background eof blocks |
|---|
| 154 | 181 | trimming */ |
|---|
| 155 | 182 | struct delayed_work m_cowblocks_work; /* background cow blocks |
|---|
| 156 | 183 | trimming */ |
|---|
| 157 | | - bool m_update_sb; /* sb needs update in mount */ |
|---|
| 158 | | - int64_t m_low_space[XFS_LOWSP_MAX]; |
|---|
| 159 | | - /* low free space thresholds */ |
|---|
| 160 | 184 | struct xfs_kobj m_kobj; |
|---|
| 161 | 185 | struct xfs_kobj m_error_kobj; |
|---|
| 162 | 186 | struct xfs_kobj m_error_meta_kobj; |
|---|
| 163 | 187 | struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX]; |
|---|
| 164 | 188 | struct xstats m_stats; /* per-fs stats */ |
|---|
| 189 | + xfs_agnumber_t m_agfrotor; /* last ag where space found */ |
|---|
| 190 | + xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ |
|---|
| 191 | + spinlock_t m_agirotor_lock;/* .. and lock protecting it */ |
|---|
| 165 | 192 | |
|---|
| 166 | | - struct workqueue_struct *m_buf_workqueue; |
|---|
| 167 | | - struct workqueue_struct *m_data_workqueue; |
|---|
| 168 | | - struct workqueue_struct *m_unwritten_workqueue; |
|---|
| 169 | | - struct workqueue_struct *m_cil_workqueue; |
|---|
| 170 | | - struct workqueue_struct *m_reclaim_workqueue; |
|---|
| 171 | | - struct workqueue_struct *m_log_workqueue; |
|---|
| 172 | | - struct workqueue_struct *m_eofblocks_workqueue; |
|---|
| 173 | | - struct workqueue_struct *m_sync_workqueue; |
|---|
| 193 | + /* |
|---|
| 194 | + * Workqueue item so that we can coalesce multiple inode flush attempts |
|---|
| 195 | + * into a single flush. |
|---|
| 196 | + */ |
|---|
| 197 | + struct work_struct m_flush_inodes_work; |
|---|
| 174 | 198 | |
|---|
| 175 | 199 | /* |
|---|
| 176 | 200 | * Generation of the filesysyem layout. This is incremented by each |
|---|
| .. | .. |
|---|
| 182 | 206 | * to various other kinds of pain inflicted on the pNFS server. |
|---|
| 183 | 207 | */ |
|---|
| 184 | 208 | uint32_t m_generation; |
|---|
| 209 | + struct mutex m_growlock; /* growfs mutex */ |
|---|
| 185 | 210 | |
|---|
| 186 | | - bool m_fail_unmount; |
|---|
| 187 | 211 | #ifdef DEBUG |
|---|
| 188 | 212 | /* |
|---|
| 189 | 213 | * Frequency with which errors are injected. Replaces xfs_etest; the |
|---|
| .. | .. |
|---|
| 195 | 219 | #endif |
|---|
| 196 | 220 | } xfs_mount_t; |
|---|
| 197 | 221 | |
|---|
| 222 | +#define M_IGEO(mp) (&(mp)->m_ino_geo) |
|---|
| 223 | + |
|---|
| 198 | 224 | /* |
|---|
| 199 | 225 | * Flags for m_flags. |
|---|
| 200 | 226 | */ |
|---|
| .. | .. |
|---|
| 202 | 228 | must be synchronous except |
|---|
| 203 | 229 | for space allocations */ |
|---|
| 204 | 230 | #define XFS_MOUNT_UNMOUNTING (1ULL << 1) /* filesystem is unmounting */ |
|---|
| 205 | | -#define XFS_MOUNT_BAD_SUMMARY (1ULL << 2) /* summary counters are bad */ |
|---|
| 206 | 231 | #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) |
|---|
| 207 | 232 | #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem |
|---|
| 208 | 233 | operations, typically for |
|---|
| .. | .. |
|---|
| 213 | 238 | #define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ |
|---|
| 214 | 239 | #define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ |
|---|
| 215 | 240 | #define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ |
|---|
| 216 | | -#define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ |
|---|
| 241 | +#define XFS_MOUNT_ALLOCSIZE (1ULL << 12) /* specified allocation size */ |
|---|
| 217 | 242 | #define XFS_MOUNT_SMALL_INUMS (1ULL << 14) /* user wants 32bit inodes */ |
|---|
| 218 | 243 | #define XFS_MOUNT_32BITINODES (1ULL << 15) /* inode32 allocator active */ |
|---|
| 219 | 244 | #define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ |
|---|
| .. | .. |
|---|
| 222 | 247 | * allocation */ |
|---|
| 223 | 248 | #define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ |
|---|
| 224 | 249 | #define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ |
|---|
| 225 | | -#define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred |
|---|
| 250 | +#define XFS_MOUNT_LARGEIO (1ULL << 22) /* report large preferred |
|---|
| 226 | 251 | * I/O size in stat() */ |
|---|
| 227 | 252 | #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams |
|---|
| 228 | 253 | allocator */ |
|---|
| 229 | 254 | #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ |
|---|
| 230 | | - |
|---|
| 231 | | -#define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */ |
|---|
| 232 | | - |
|---|
| 233 | | - |
|---|
| 234 | | -/* |
|---|
| 235 | | - * Default minimum read and write sizes. |
|---|
| 236 | | - */ |
|---|
| 237 | | -#define XFS_READIO_LOG_LARGE 16 |
|---|
| 238 | | -#define XFS_WRITEIO_LOG_LARGE 16 |
|---|
| 255 | +#define XFS_MOUNT_DAX_ALWAYS (1ULL << 26) |
|---|
| 256 | +#define XFS_MOUNT_DAX_NEVER (1ULL << 27) |
|---|
| 239 | 257 | |
|---|
| 240 | 258 | /* |
|---|
| 241 | 259 | * Max and min values for mount-option defined I/O |
|---|
| .. | .. |
|---|
| 243 | 261 | */ |
|---|
| 244 | 262 | #define XFS_MAX_IO_LOG 30 /* 1G */ |
|---|
| 245 | 263 | #define XFS_MIN_IO_LOG PAGE_SHIFT |
|---|
| 246 | | - |
|---|
| 247 | | -/* |
|---|
| 248 | | - * Synchronous read and write sizes. This should be |
|---|
| 249 | | - * better for NFSv2 wsync filesystems. |
|---|
| 250 | | - */ |
|---|
| 251 | | -#define XFS_WSYNC_READIO_LOG 15 /* 32k */ |
|---|
| 252 | | -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ |
|---|
| 253 | | - |
|---|
| 254 | | -/* |
|---|
| 255 | | - * Allow large block sizes to be reported to userspace programs if the |
|---|
| 256 | | - * "largeio" mount option is used. |
|---|
| 257 | | - * |
|---|
| 258 | | - * If compatibility mode is specified, simply return the basic unit of caching |
|---|
| 259 | | - * so that we don't get inefficient read/modify/write I/O from user apps. |
|---|
| 260 | | - * Otherwise.... |
|---|
| 261 | | - * |
|---|
| 262 | | - * If the underlying volume is a stripe, then return the stripe width in bytes |
|---|
| 263 | | - * as the recommended I/O size. It is not a stripe and we've set a default |
|---|
| 264 | | - * buffered I/O size, return that, otherwise return the compat default. |
|---|
| 265 | | - */ |
|---|
| 266 | | -static inline unsigned long |
|---|
| 267 | | -xfs_preferred_iosize(xfs_mount_t *mp) |
|---|
| 268 | | -{ |
|---|
| 269 | | - if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE) |
|---|
| 270 | | - return PAGE_SIZE; |
|---|
| 271 | | - return (mp->m_swidth ? |
|---|
| 272 | | - (mp->m_swidth << mp->m_sb.sb_blocklog) : |
|---|
| 273 | | - ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ? |
|---|
| 274 | | - (1 << (int)max(mp->m_readio_log, mp->m_writeio_log)) : |
|---|
| 275 | | - PAGE_SIZE)); |
|---|
| 276 | | -} |
|---|
| 277 | 264 | |
|---|
| 278 | 265 | #define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ |
|---|
| 279 | 266 | ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) |
|---|
| .. | .. |
|---|
| 287 | 274 | #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ |
|---|
| 288 | 275 | #define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ |
|---|
| 289 | 276 | #define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ |
|---|
| 290 | | -#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ |
|---|
| 291 | | -#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ |
|---|
| 292 | 277 | |
|---|
| 293 | 278 | /* |
|---|
| 294 | 279 | * Flags for xfs_mountfs |
|---|
| .. | .. |
|---|
| 311 | 296 | } |
|---|
| 312 | 297 | |
|---|
| 313 | 298 | /* per-AG block reservation data structures*/ |
|---|
| 314 | | -enum xfs_ag_resv_type { |
|---|
| 315 | | - XFS_AG_RESV_NONE = 0, |
|---|
| 316 | | - XFS_AG_RESV_AGFL, |
|---|
| 317 | | - XFS_AG_RESV_METADATA, |
|---|
| 318 | | - XFS_AG_RESV_RMAPBT, |
|---|
| 319 | | -}; |
|---|
| 320 | | - |
|---|
| 321 | 299 | struct xfs_ag_resv { |
|---|
| 322 | 300 | /* number of blocks originally reserved here */ |
|---|
| 323 | 301 | xfs_extlen_t ar_orig_reserved; |
|---|
| .. | .. |
|---|
| 357 | 335 | xfs_agino_t pagl_pagino; |
|---|
| 358 | 336 | xfs_agino_t pagl_leftrec; |
|---|
| 359 | 337 | xfs_agino_t pagl_rightrec; |
|---|
| 338 | + |
|---|
| 339 | + /* |
|---|
| 340 | + * Bitsets of per-ag metadata that have been checked and/or are sick. |
|---|
| 341 | + * Callers should hold pag_state_lock before accessing this field. |
|---|
| 342 | + */ |
|---|
| 343 | + uint16_t pag_checked; |
|---|
| 344 | + uint16_t pag_sick; |
|---|
| 345 | + spinlock_t pag_state_lock; |
|---|
| 346 | + |
|---|
| 360 | 347 | spinlock_t pagb_lock; /* lock for pagb_tree */ |
|---|
| 361 | 348 | struct rb_root pagb_tree; /* ordered tree of busy extents */ |
|---|
| 362 | 349 | unsigned int pagb_gen; /* generation count for pagb_tree */ |
|---|
| .. | .. |
|---|
| 367 | 354 | spinlock_t pag_ici_lock; /* incore inode cache lock */ |
|---|
| 368 | 355 | struct radix_tree_root pag_ici_root; /* incore inode cache root */ |
|---|
| 369 | 356 | int pag_ici_reclaimable; /* reclaimable inodes */ |
|---|
| 370 | | - struct mutex pag_ici_reclaim_lock; /* serialisation point */ |
|---|
| 371 | 357 | unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */ |
|---|
| 372 | 358 | |
|---|
| 373 | 359 | /* buffer cache index */ |
|---|
| .. | .. |
|---|
| 385 | 371 | |
|---|
| 386 | 372 | /* reference count */ |
|---|
| 387 | 373 | uint8_t pagf_refcount_level; |
|---|
| 374 | + |
|---|
| 375 | + /* |
|---|
| 376 | + * Unlinked inode information. This incore information reflects |
|---|
| 377 | + * data stored in the AGI, so callers must hold the AGI buffer lock |
|---|
| 378 | + * or have some other means to control concurrency. |
|---|
| 379 | + */ |
|---|
| 380 | + struct rhashtable pagi_unlinked_hash; |
|---|
| 388 | 381 | } xfs_perag_t; |
|---|
| 389 | 382 | |
|---|
| 390 | 383 | static inline struct xfs_ag_resv * |
|---|
| .. | .. |
|---|
| 413 | 406 | xfs_agnumber_t *maxagi); |
|---|
| 414 | 407 | extern void xfs_unmountfs(xfs_mount_t *); |
|---|
| 415 | 408 | |
|---|
| 416 | | -extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); |
|---|
| 417 | | -extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); |
|---|
| 409 | +/* Accessor added for 5.10.y backport */ |
|---|
| 410 | +static inline uint64_t |
|---|
| 411 | +xfs_fdblocks_unavailable( |
|---|
| 412 | + struct xfs_mount *mp) |
|---|
| 413 | +{ |
|---|
| 414 | + return mp->m_alloc_set_aside; |
|---|
| 415 | +} |
|---|
| 416 | + |
|---|
| 418 | 417 | extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, |
|---|
| 419 | 418 | bool reserved); |
|---|
| 420 | 419 | extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); |
|---|
| 421 | 420 | |
|---|
| 422 | | -extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); |
|---|
| 423 | 421 | extern int xfs_readsb(xfs_mount_t *, int); |
|---|
| 424 | 422 | extern void xfs_freesb(xfs_mount_t *); |
|---|
| 425 | 423 | extern bool xfs_fs_writable(struct xfs_mount *mp, int level); |
|---|
| .. | .. |
|---|
| 435 | 433 | struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp, |
|---|
| 436 | 434 | int error_class, int error); |
|---|
| 437 | 435 | void xfs_force_summary_recalc(struct xfs_mount *mp); |
|---|
| 436 | +void xfs_mod_delalloc(struct xfs_mount *mp, int64_t delta); |
|---|
| 438 | 437 | |
|---|
| 439 | 438 | #endif /* __XFS_MOUNT_H__ */ |
|---|