.. | .. |
---|
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__ */ |
---|