hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/xfs/xfs_mount.h
....@@ -9,10 +9,8 @@
99 struct xlog;
1010 struct xfs_inode;
1111 struct xfs_mru_cache;
12
-struct xfs_nameops;
1312 struct xfs_ail;
1413 struct xfs_quotainfo;
15
-struct xfs_dir_ops;
1614 struct xfs_da_geometry;
1715
1816 /* dynamic preallocation free space thresholds, 5% down to 1% */
....@@ -57,38 +55,25 @@
5755 long retry_timeout; /* in jiffies, -1 = infinite */
5856 };
5957
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
+ */
6067 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
-
6568 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 */
7171 struct xfs_buf *m_sb_bp; /* buffer for superblock */
72
- char *m_fsname; /* filesystem name */
73
- int m_fsname_len; /* strlen of fs name */
7472 char *m_rtname; /* realtime device name */
7573 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 */
8574 struct xfs_da_geometry *m_dir_geo; /* directory block geometry */
8675 struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */
8776 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 */
9277 struct xfs_inode *m_rbmip; /* pointer to bitmap inode */
9378 struct xfs_inode *m_rsumip; /* pointer to summary inode */
9479 struct xfs_inode *m_rootip; /* pointer to root directory */
....@@ -96,11 +81,26 @@
9681 xfs_buftarg_t *m_ddev_targp; /* saves taking the address */
9782 xfs_buftarg_t *m_logdev_targp;/* ptr to log device */
9883 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 */
99100 uint8_t m_blkbit_log; /* blocklog + NBBY */
100101 uint8_t m_blkbb_log; /* blocklog - BBSHIFT */
101102 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 */
104104 uint m_blockmask; /* sb_blocksize-1 */
105105 uint m_blockwsize; /* sb_blocksize in words */
106106 uint m_blockwmask; /* blockwsize-1 */
....@@ -108,69 +108,93 @@
108108 uint m_alloc_mnr[2]; /* min alloc btree records */
109109 uint m_bmap_dmxr[2]; /* max bmap btree records */
110110 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 */
113111 uint m_rmap_mxr[2]; /* max rmap btree records */
114112 uint m_rmap_mnr[2]; /* min rmap btree records */
115113 uint m_refc_mxr[2]; /* max refc btree records */
116114 uint m_refc_mnr[2]; /* min refc btree records */
117115 uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */
118116 uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */
119
- uint m_in_maxlevels; /* max inobt btree levels. */
120117 uint m_rmap_maxlevels; /* max rmap btree levels */
121118 uint m_refc_maxlevels; /* max refcount btree level */
122119 xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */
123120 uint m_alloc_set_aside; /* space we can't use */
124121 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
+
125174 struct radix_tree_root m_perag_tree; /* per-ag accounting info */
126175 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 */
139176 uint64_t m_resblks; /* total reserved blocks */
140177 uint64_t m_resblks_avail;/* available reserved blocks */
141178 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 */
152179 struct delayed_work m_reclaim_work; /* background inode reclaim */
153180 struct delayed_work m_eofblocks_work; /* background eof blocks
154181 trimming */
155182 struct delayed_work m_cowblocks_work; /* background cow blocks
156183 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 */
160184 struct xfs_kobj m_kobj;
161185 struct xfs_kobj m_error_kobj;
162186 struct xfs_kobj m_error_meta_kobj;
163187 struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
164188 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 */
165192
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;
174198
175199 /*
176200 * Generation of the filesysyem layout. This is incremented by each
....@@ -182,8 +206,8 @@
182206 * to various other kinds of pain inflicted on the pNFS server.
183207 */
184208 uint32_t m_generation;
209
+ struct mutex m_growlock; /* growfs mutex */
185210
186
- bool m_fail_unmount;
187211 #ifdef DEBUG
188212 /*
189213 * Frequency with which errors are injected. Replaces xfs_etest; the
....@@ -195,6 +219,8 @@
195219 #endif
196220 } xfs_mount_t;
197221
222
+#define M_IGEO(mp) (&(mp)->m_ino_geo)
223
+
198224 /*
199225 * Flags for m_flags.
200226 */
....@@ -202,7 +228,6 @@
202228 must be synchronous except
203229 for space allocations */
204230 #define XFS_MOUNT_UNMOUNTING (1ULL << 1) /* filesystem is unmounting */
205
-#define XFS_MOUNT_BAD_SUMMARY (1ULL << 2) /* summary counters are bad */
206231 #define XFS_MOUNT_WAS_CLEAN (1ULL << 3)
207232 #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem
208233 operations, typically for
....@@ -213,7 +238,7 @@
213238 #define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */
214239 #define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */
215240 #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 */
217242 #define XFS_MOUNT_SMALL_INUMS (1ULL << 14) /* user wants 32bit inodes */
218243 #define XFS_MOUNT_32BITINODES (1ULL << 15) /* inode32 allocator active */
219244 #define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */
....@@ -222,20 +247,13 @@
222247 * allocation */
223248 #define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */
224249 #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
226251 * I/O size in stat() */
227252 #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams
228253 allocator */
229254 #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)
239257
240258 /*
241259 * Max and min values for mount-option defined I/O
....@@ -243,37 +261,6 @@
243261 */
244262 #define XFS_MAX_IO_LOG 30 /* 1G */
245263 #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
-}
277264
278265 #define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \
279266 ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN)
....@@ -287,8 +274,6 @@
287274 #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */
288275 #define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */
289276 #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 */
292277
293278 /*
294279 * Flags for xfs_mountfs
....@@ -311,13 +296,6 @@
311296 }
312297
313298 /* 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
-
321299 struct xfs_ag_resv {
322300 /* number of blocks originally reserved here */
323301 xfs_extlen_t ar_orig_reserved;
....@@ -357,6 +335,15 @@
357335 xfs_agino_t pagl_pagino;
358336 xfs_agino_t pagl_leftrec;
359337 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
+
360347 spinlock_t pagb_lock; /* lock for pagb_tree */
361348 struct rb_root pagb_tree; /* ordered tree of busy extents */
362349 unsigned int pagb_gen; /* generation count for pagb_tree */
....@@ -367,7 +354,6 @@
367354 spinlock_t pag_ici_lock; /* incore inode cache lock */
368355 struct radix_tree_root pag_ici_root; /* incore inode cache root */
369356 int pag_ici_reclaimable; /* reclaimable inodes */
370
- struct mutex pag_ici_reclaim_lock; /* serialisation point */
371357 unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */
372358
373359 /* buffer cache index */
....@@ -385,6 +371,13 @@
385371
386372 /* reference count */
387373 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;
388381 } xfs_perag_t;
389382
390383 static inline struct xfs_ag_resv *
....@@ -413,13 +406,18 @@
413406 xfs_agnumber_t *maxagi);
414407 extern void xfs_unmountfs(xfs_mount_t *);
415408
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
+
418417 extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta,
419418 bool reserved);
420419 extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta);
421420
422
-extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);
423421 extern int xfs_readsb(xfs_mount_t *, int);
424422 extern void xfs_freesb(xfs_mount_t *);
425423 extern bool xfs_fs_writable(struct xfs_mount *mp, int level);
....@@ -435,5 +433,6 @@
435433 struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp,
436434 int error_class, int error);
437435 void xfs_force_summary_recalc(struct xfs_mount *mp);
436
+void xfs_mod_delalloc(struct xfs_mount *mp, int64_t delta);
438437
439438 #endif /* __XFS_MOUNT_H__ */