1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_MOUNT_H__
19#define __XFS_MOUNT_H__
20
21struct xlog;
22struct xfs_inode;
23struct xfs_mru_cache;
24struct xfs_nameops;
25struct xfs_ail;
26struct xfs_quotainfo;
27struct xfs_dir_ops;
28struct xfs_da_geometry;
29
30
31enum {
32 XFS_LOWSP_1_PCNT = 0,
33 XFS_LOWSP_2_PCNT,
34 XFS_LOWSP_3_PCNT,
35 XFS_LOWSP_4_PCNT,
36 XFS_LOWSP_5_PCNT,
37 XFS_LOWSP_MAX,
38};
39
40
41
42
43
44
45
46enum {
47 XFS_ERR_METADATA,
48 XFS_ERR_CLASS_MAX,
49};
50enum {
51 XFS_ERR_DEFAULT,
52 XFS_ERR_EIO,
53 XFS_ERR_ENOSPC,
54 XFS_ERR_ENODEV,
55 XFS_ERR_ERRNO_MAX,
56};
57
58#define XFS_ERR_RETRY_FOREVER -1
59
60
61
62
63
64
65
66struct xfs_error_cfg {
67 struct xfs_kobj kobj;
68 int max_retries;
69 long retry_timeout;
70};
71
72typedef struct xfs_mount {
73 struct super_block *m_super;
74 xfs_tid_t m_tid;
75 struct xfs_ail *m_ail;
76
77 struct xfs_sb m_sb;
78 spinlock_t m_sb_lock;
79 struct percpu_counter m_icount;
80 struct percpu_counter m_ifree;
81 struct percpu_counter m_fdblocks;
82
83 struct xfs_buf *m_sb_bp;
84 char *m_fsname;
85 int m_fsname_len;
86 char *m_rtname;
87 char *m_logname;
88 int m_bsize;
89 xfs_agnumber_t m_agfrotor;
90 xfs_agnumber_t m_agirotor;
91 spinlock_t m_agirotor_lock;
92 xfs_agnumber_t m_maxagi;
93 uint m_readio_log;
94 uint m_readio_blocks;
95 uint m_writeio_log;
96 uint m_writeio_blocks;
97 struct xfs_da_geometry *m_dir_geo;
98 struct xfs_da_geometry *m_attr_geo;
99 struct xlog *m_log;
100 int m_logbufs;
101 int m_logbsize;
102 uint m_rsumlevels;
103 uint m_rsumsize;
104 struct xfs_inode *m_rbmip;
105 struct xfs_inode *m_rsumip;
106 struct xfs_inode *m_rootip;
107 struct xfs_quotainfo *m_quotainfo;
108 xfs_buftarg_t *m_ddev_targp;
109 xfs_buftarg_t *m_logdev_targp;
110 xfs_buftarg_t *m_rtdev_targp;
111 uint8_t m_blkbit_log;
112 uint8_t m_blkbb_log;
113 uint8_t m_agno_log;
114 uint8_t m_agino_log;
115 uint m_inode_cluster_size;
116 uint m_blockmask;
117 uint m_blockwsize;
118 uint m_blockwmask;
119 uint m_alloc_mxr[2];
120 uint m_alloc_mnr[2];
121 uint m_bmap_dmxr[2];
122 uint m_bmap_dmnr[2];
123 uint m_inobt_mxr[2];
124 uint m_inobt_mnr[2];
125 uint m_rmap_mxr[2];
126 uint m_rmap_mnr[2];
127 uint m_refc_mxr[2];
128 uint m_refc_mnr[2];
129 uint m_ag_maxlevels;
130 uint m_bm_maxlevels[2];
131 uint m_in_maxlevels;
132 uint m_rmap_maxlevels;
133 uint m_refc_maxlevels;
134 xfs_extlen_t m_ag_prealloc_blocks;
135 uint m_alloc_set_aside;
136 uint m_ag_max_usable;
137 struct radix_tree_root m_perag_tree;
138 spinlock_t m_perag_lock;
139 struct mutex m_growlock;
140 int m_fixedfsid[2];
141 uint m_dmevmask;
142 uint64_t m_flags;
143 bool m_inotbt_nores;
144 int m_ialloc_inos;
145 int m_ialloc_blks;
146 int m_ialloc_min_blks;
147
148 int m_inoalign_mask;
149 uint m_qflags;
150 struct xfs_trans_resv m_resv;
151 uint64_t m_maxicount;
152 uint64_t m_resblks;
153 uint64_t m_resblks_avail;
154 uint64_t m_resblks_save;
155 int m_dalign;
156 int m_swidth;
157 int m_sinoalign;
158 uint8_t m_sectbb_log;
159 const struct xfs_nameops *m_dirnameops;
160 const struct xfs_dir_ops *m_dir_inode_ops;
161 const struct xfs_dir_ops *m_nondir_inode_ops;
162 uint m_chsize;
163 atomic_t m_active_trans;
164 struct xfs_mru_cache *m_filestream;
165 struct delayed_work m_reclaim_work;
166 struct delayed_work m_eofblocks_work;
167
168 struct delayed_work m_cowblocks_work;
169
170 bool m_update_sb;
171 int64_t m_low_space[XFS_LOWSP_MAX];
172
173 struct xfs_kobj m_kobj;
174 struct xfs_kobj m_error_kobj;
175 struct xfs_kobj m_error_meta_kobj;
176 struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
177 struct xstats m_stats;
178
179 struct workqueue_struct *m_buf_workqueue;
180 struct workqueue_struct *m_data_workqueue;
181 struct workqueue_struct *m_unwritten_workqueue;
182 struct workqueue_struct *m_cil_workqueue;
183 struct workqueue_struct *m_reclaim_workqueue;
184 struct workqueue_struct *m_log_workqueue;
185 struct workqueue_struct *m_eofblocks_workqueue;
186 struct workqueue_struct *m_sync_workqueue;
187
188
189
190
191
192
193
194
195
196
197 uint32_t m_generation;
198
199 bool m_fail_unmount;
200#ifdef DEBUG
201
202
203
204
205
206 unsigned int *m_errortag;
207 struct xfs_kobj m_errortag_kobj;
208#endif
209} xfs_mount_t;
210
211
212
213
214#define XFS_MOUNT_WSYNC (1ULL << 0)
215
216
217#define XFS_MOUNT_UNMOUNTING (1ULL << 1)
218#define XFS_MOUNT_WAS_CLEAN (1ULL << 3)
219#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4)
220
221
222#define XFS_MOUNT_DISCARD (1ULL << 5)
223#define XFS_MOUNT_NOALIGN (1ULL << 7)
224
225#define XFS_MOUNT_ATTR2 (1ULL << 8)
226#define XFS_MOUNT_GRPID (1ULL << 9)
227#define XFS_MOUNT_NORECOVERY (1ULL << 10)
228#define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12)
229#define XFS_MOUNT_SMALL_INUMS (1ULL << 14)
230#define XFS_MOUNT_32BITINODES (1ULL << 15)
231#define XFS_MOUNT_NOUUID (1ULL << 16)
232#define XFS_MOUNT_BARRIER (1ULL << 17)
233#define XFS_MOUNT_IKEEP (1ULL << 18)
234#define XFS_MOUNT_SWALLOC (1ULL << 19)
235
236#define XFS_MOUNT_RDONLY (1ULL << 20)
237#define XFS_MOUNT_DIRSYNC (1ULL << 21)
238#define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22)
239
240#define XFS_MOUNT_FILESTREAMS (1ULL << 24)
241
242#define XFS_MOUNT_NOATTR2 (1ULL << 25)
243
244#define XFS_MOUNT_DAX (1ULL << 62)
245
246
247
248
249
250#define XFS_READIO_LOG_LARGE 16
251#define XFS_WRITEIO_LOG_LARGE 16
252
253
254
255
256
257#define XFS_MAX_IO_LOG 30
258#define XFS_MIN_IO_LOG PAGE_SHIFT
259
260
261
262
263
264#define XFS_WSYNC_READIO_LOG 15
265#define XFS_WSYNC_WRITEIO_LOG 14
266
267
268
269
270
271
272
273
274
275
276
277
278
279static inline unsigned long
280xfs_preferred_iosize(xfs_mount_t *mp)
281{
282 if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE)
283 return PAGE_SIZE;
284 return (mp->m_swidth ?
285 (mp->m_swidth << mp->m_sb.sb_blocklog) :
286 ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ?
287 (1 << (int)MAX(mp->m_readio_log, mp->m_writeio_log)) :
288 PAGE_SIZE));
289}
290
291#define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \
292 ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN)
293#define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN)
294void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
295 int lnnum);
296#define xfs_force_shutdown(m,f) \
297 xfs_do_force_shutdown(m, f, __FILE__, __LINE__)
298
299#define SHUTDOWN_META_IO_ERROR 0x0001
300#define SHUTDOWN_LOG_IO_ERROR 0x0002
301#define SHUTDOWN_FORCE_UMOUNT 0x0004
302#define SHUTDOWN_CORRUPT_INCORE 0x0008
303#define SHUTDOWN_REMOTE_REQ 0x0010
304#define SHUTDOWN_DEVICE_REQ 0x0020
305
306
307
308
309#define XFS_MFSI_QUIET 0x40
310
311static inline xfs_agnumber_t
312xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d)
313{
314 xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
315 do_div(ld, mp->m_sb.sb_agblocks);
316 return (xfs_agnumber_t) ld;
317}
318
319static inline xfs_agblock_t
320xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
321{
322 xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
323 return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
324}
325
326
327enum xfs_ag_resv_type {
328 XFS_AG_RESV_NONE = 0,
329 XFS_AG_RESV_METADATA,
330 XFS_AG_RESV_AGFL,
331};
332
333struct xfs_ag_resv {
334
335 xfs_extlen_t ar_orig_reserved;
336
337 xfs_extlen_t ar_reserved;
338
339 xfs_extlen_t ar_asked;
340};
341
342
343
344
345
346typedef struct xfs_perag {
347 struct xfs_mount *pag_mount;
348 xfs_agnumber_t pag_agno;
349 atomic_t pag_ref;
350 char pagf_init;
351 char pagi_init;
352 char pagf_metadata;
353 char pagi_inodeok;
354 uint8_t pagf_levels[XFS_BTNUM_AGF];
355
356 uint32_t pagf_flcount;
357 xfs_extlen_t pagf_freeblks;
358 xfs_extlen_t pagf_longest;
359 uint32_t pagf_btreeblks;
360 xfs_agino_t pagi_freecount;
361 xfs_agino_t pagi_count;
362
363
364
365
366
367
368 xfs_agino_t pagl_pagino;
369 xfs_agino_t pagl_leftrec;
370 xfs_agino_t pagl_rightrec;
371 spinlock_t pagb_lock;
372 struct rb_root pagb_tree;
373 unsigned int pagb_gen;
374 wait_queue_head_t pagb_wait;
375
376 atomic_t pagf_fstrms;
377
378 spinlock_t pag_ici_lock;
379 struct radix_tree_root pag_ici_root;
380 int pag_ici_reclaimable;
381 struct mutex pag_ici_reclaim_lock;
382 unsigned long pag_ici_reclaim_cursor;
383
384
385 spinlock_t pag_buf_lock;
386 struct rhashtable pag_buf_hash;
387
388
389 struct rcu_head rcu_head;
390 int pagb_count;
391
392
393 struct xfs_ag_resv pag_meta_resv;
394
395 struct xfs_ag_resv pag_agfl_resv;
396
397
398 uint8_t pagf_refcount_level;
399} xfs_perag_t;
400
401static inline struct xfs_ag_resv *
402xfs_perag_resv(
403 struct xfs_perag *pag,
404 enum xfs_ag_resv_type type)
405{
406 switch (type) {
407 case XFS_AG_RESV_METADATA:
408 return &pag->pag_meta_resv;
409 case XFS_AG_RESV_AGFL:
410 return &pag->pag_agfl_resv;
411 default:
412 return NULL;
413 }
414}
415
416int xfs_buf_hash_init(xfs_perag_t *pag);
417void xfs_buf_hash_destroy(xfs_perag_t *pag);
418
419extern void xfs_uuid_table_free(void);
420extern int xfs_log_sbcount(xfs_mount_t *);
421extern uint64_t xfs_default_resblks(xfs_mount_t *mp);
422extern int xfs_mountfs(xfs_mount_t *mp);
423extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount,
424 xfs_agnumber_t *maxagi);
425extern void xfs_unmountfs(xfs_mount_t *);
426
427extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta);
428extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta);
429extern int xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta,
430 bool reserved);
431extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta);
432
433extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);
434extern int xfs_readsb(xfs_mount_t *, int);
435extern void xfs_freesb(xfs_mount_t *);
436extern bool xfs_fs_writable(struct xfs_mount *mp, int level);
437extern int xfs_sb_validate_fsb_count(struct xfs_sb *, uint64_t);
438
439extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
440
441extern void xfs_set_low_space_thresholds(struct xfs_mount *);
442
443int xfs_zero_extent(struct xfs_inode *ip, xfs_fsblock_t start_fsb,
444 xfs_off_t count_fsb);
445
446struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp,
447 int error_class, int error);
448
449#endif
450