0001
0002
0003
0004
0005
0006 #ifndef __XFS_MOUNT_H__
0007 #define __XFS_MOUNT_H__
0008
0009 struct xlog;
0010 struct xfs_inode;
0011 struct xfs_mru_cache;
0012 struct xfs_ail;
0013 struct xfs_quotainfo;
0014 struct xfs_da_geometry;
0015 struct xfs_perag;
0016
0017
0018 enum {
0019 XFS_LOWSP_1_PCNT = 0,
0020 XFS_LOWSP_2_PCNT,
0021 XFS_LOWSP_3_PCNT,
0022 XFS_LOWSP_4_PCNT,
0023 XFS_LOWSP_5_PCNT,
0024 XFS_LOWSP_MAX,
0025 };
0026
0027
0028
0029
0030
0031
0032
0033 enum {
0034 XFS_ERR_METADATA,
0035 XFS_ERR_CLASS_MAX,
0036 };
0037 enum {
0038 XFS_ERR_DEFAULT,
0039 XFS_ERR_EIO,
0040 XFS_ERR_ENOSPC,
0041 XFS_ERR_ENODEV,
0042 XFS_ERR_ERRNO_MAX,
0043 };
0044
0045 #define XFS_ERR_RETRY_FOREVER -1
0046
0047
0048
0049
0050
0051
0052
0053 struct xfs_error_cfg {
0054 struct xfs_kobj kobj;
0055 int max_retries;
0056 long retry_timeout;
0057 };
0058
0059
0060
0061
0062 struct xfs_inodegc {
0063 struct llist_head list;
0064 struct delayed_work work;
0065
0066
0067 unsigned int items;
0068 unsigned int shrinker_hits;
0069 };
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 typedef struct xfs_mount {
0081 struct xfs_sb m_sb;
0082 struct super_block *m_super;
0083 struct xfs_ail *m_ail;
0084 struct xfs_buf *m_sb_bp;
0085 char *m_rtname;
0086 char *m_logname;
0087 struct xfs_da_geometry *m_dir_geo;
0088 struct xfs_da_geometry *m_attr_geo;
0089 struct xlog *m_log;
0090 struct xfs_inode *m_rbmip;
0091 struct xfs_inode *m_rsumip;
0092 struct xfs_inode *m_rootip;
0093 struct xfs_quotainfo *m_quotainfo;
0094 xfs_buftarg_t *m_ddev_targp;
0095 xfs_buftarg_t *m_logdev_targp;
0096 xfs_buftarg_t *m_rtdev_targp;
0097 struct list_head m_mount_list;
0098 void __percpu *m_inodegc;
0099
0100
0101
0102
0103
0104
0105
0106 uint8_t *m_rsum_cache;
0107 struct xfs_mru_cache *m_filestream;
0108 struct workqueue_struct *m_buf_workqueue;
0109 struct workqueue_struct *m_unwritten_workqueue;
0110 struct workqueue_struct *m_reclaim_workqueue;
0111 struct workqueue_struct *m_sync_workqueue;
0112 struct workqueue_struct *m_blockgc_wq;
0113 struct workqueue_struct *m_inodegc_wq;
0114
0115 int m_bsize;
0116 uint8_t m_blkbit_log;
0117 uint8_t m_blkbb_log;
0118 uint8_t m_agno_log;
0119 uint8_t m_sectbb_log;
0120 uint m_blockmask;
0121 uint m_blockwsize;
0122 uint m_blockwmask;
0123 uint m_alloc_mxr[2];
0124 uint m_alloc_mnr[2];
0125 uint m_bmap_dmxr[2];
0126 uint m_bmap_dmnr[2];
0127 uint m_rmap_mxr[2];
0128 uint m_rmap_mnr[2];
0129 uint m_refc_mxr[2];
0130 uint m_refc_mnr[2];
0131 uint m_alloc_maxlevels;
0132 uint m_bm_maxlevels[2];
0133 uint m_rmap_maxlevels;
0134 uint m_refc_maxlevels;
0135 unsigned int m_agbtree_maxlevels;
0136 xfs_extlen_t m_ag_prealloc_blocks;
0137 uint m_alloc_set_aside;
0138 uint m_ag_max_usable;
0139 int m_dalign;
0140 int m_swidth;
0141 xfs_agnumber_t m_maxagi;
0142 uint m_allocsize_log;
0143 uint m_allocsize_blocks;
0144 int m_logbufs;
0145 int m_logbsize;
0146 uint m_rsumlevels;
0147 uint m_rsumsize;
0148 int m_fixedfsid[2];
0149 uint m_qflags;
0150 uint64_t m_features;
0151 uint64_t m_low_space[XFS_LOWSP_MAX];
0152 uint64_t m_low_rtexts[XFS_LOWSP_MAX];
0153 struct xfs_ino_geometry m_ino_geo;
0154 struct xfs_trans_resv m_resv;
0155
0156 unsigned long m_opstate;
0157 bool m_always_cow;
0158 bool m_fail_unmount;
0159 bool m_finobt_nores;
0160 bool m_update_sb;
0161
0162
0163
0164
0165
0166 uint8_t m_fs_checked;
0167 uint8_t m_fs_sick;
0168
0169
0170
0171
0172 uint8_t m_rt_checked;
0173 uint8_t m_rt_sick;
0174
0175
0176
0177
0178
0179
0180
0181
0182 spinlock_t ____cacheline_aligned m_sb_lock;
0183 struct percpu_counter m_icount;
0184 struct percpu_counter m_ifree;
0185 struct percpu_counter m_fdblocks;
0186 struct percpu_counter m_frextents;
0187
0188
0189
0190
0191
0192
0193 struct percpu_counter m_delalloc_blks;
0194
0195
0196
0197
0198
0199 atomic64_t m_allocbt_blks;
0200
0201 struct radix_tree_root m_perag_tree;
0202 spinlock_t m_perag_lock;
0203 uint64_t m_resblks;
0204 uint64_t m_resblks_avail;
0205 uint64_t m_resblks_save;
0206 struct delayed_work m_reclaim_work;
0207 struct xfs_kobj m_kobj;
0208 struct xfs_kobj m_error_kobj;
0209 struct xfs_kobj m_error_meta_kobj;
0210 struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
0211 struct xstats m_stats;
0212 xfs_agnumber_t m_agfrotor;
0213 xfs_agnumber_t m_agirotor;
0214 spinlock_t m_agirotor_lock;
0215
0216
0217 struct shrinker m_inodegc_shrinker;
0218
0219
0220
0221
0222 struct work_struct m_flush_inodes_work;
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233 uint32_t m_generation;
0234 struct mutex m_growlock;
0235
0236 #ifdef DEBUG
0237
0238
0239
0240
0241
0242 unsigned int *m_errortag;
0243 struct xfs_kobj m_errortag_kobj;
0244 #endif
0245 } xfs_mount_t;
0246
0247 #define M_IGEO(mp) (&(mp)->m_ino_geo)
0248
0249
0250
0251
0252
0253
0254
0255 #define XFS_FEAT_ATTR (1ULL << 0)
0256 #define XFS_FEAT_NLINK (1ULL << 1)
0257 #define XFS_FEAT_QUOTA (1ULL << 2)
0258 #define XFS_FEAT_ALIGN (1ULL << 3)
0259 #define XFS_FEAT_DALIGN (1ULL << 4)
0260 #define XFS_FEAT_LOGV2 (1ULL << 5)
0261 #define XFS_FEAT_SECTOR (1ULL << 6)
0262 #define XFS_FEAT_EXTFLG (1ULL << 7)
0263 #define XFS_FEAT_ASCIICI (1ULL << 8)
0264 #define XFS_FEAT_LAZYSBCOUNT (1ULL << 9)
0265 #define XFS_FEAT_ATTR2 (1ULL << 10)
0266 #define XFS_FEAT_PARENT (1ULL << 11)
0267 #define XFS_FEAT_PROJID32 (1ULL << 12)
0268 #define XFS_FEAT_CRC (1ULL << 13)
0269 #define XFS_FEAT_V3INODES (1ULL << 14)
0270 #define XFS_FEAT_PQUOTINO (1ULL << 15)
0271 #define XFS_FEAT_FTYPE (1ULL << 16)
0272 #define XFS_FEAT_FINOBT (1ULL << 17)
0273 #define XFS_FEAT_RMAPBT (1ULL << 18)
0274 #define XFS_FEAT_REFLINK (1ULL << 19)
0275 #define XFS_FEAT_SPINODES (1ULL << 20)
0276 #define XFS_FEAT_META_UUID (1ULL << 21)
0277 #define XFS_FEAT_REALTIME (1ULL << 22)
0278 #define XFS_FEAT_INOBTCNT (1ULL << 23)
0279 #define XFS_FEAT_BIGTIME (1ULL << 24)
0280 #define XFS_FEAT_NEEDSREPAIR (1ULL << 25)
0281 #define XFS_FEAT_NREXT64 (1ULL << 26)
0282
0283
0284 #define XFS_FEAT_NOATTR2 (1ULL << 48)
0285 #define XFS_FEAT_NOALIGN (1ULL << 49)
0286 #define XFS_FEAT_ALLOCSIZE (1ULL << 50)
0287 #define XFS_FEAT_LARGE_IOSIZE (1ULL << 51)
0288
0289 #define XFS_FEAT_WSYNC (1ULL << 52)
0290 #define XFS_FEAT_DIRSYNC (1ULL << 53)
0291 #define XFS_FEAT_DISCARD (1ULL << 54)
0292 #define XFS_FEAT_GRPID (1ULL << 55)
0293 #define XFS_FEAT_SMALL_INUMS (1ULL << 56)
0294 #define XFS_FEAT_IKEEP (1ULL << 57)
0295 #define XFS_FEAT_SWALLOC (1ULL << 58)
0296 #define XFS_FEAT_FILESTREAMS (1ULL << 59)
0297 #define XFS_FEAT_DAX_ALWAYS (1ULL << 60)
0298 #define XFS_FEAT_DAX_NEVER (1ULL << 61)
0299 #define XFS_FEAT_NORECOVERY (1ULL << 62)
0300 #define XFS_FEAT_NOUUID (1ULL << 63)
0301
0302 #define __XFS_HAS_FEAT(name, NAME) \
0303 static inline bool xfs_has_ ## name (struct xfs_mount *mp) \
0304 { \
0305 return mp->m_features & XFS_FEAT_ ## NAME; \
0306 }
0307
0308
0309 #define __XFS_ADD_FEAT(name, NAME) \
0310 __XFS_HAS_FEAT(name, NAME); \
0311 static inline void xfs_add_ ## name (struct xfs_mount *mp) \
0312 { \
0313 mp->m_features |= XFS_FEAT_ ## NAME; \
0314 xfs_sb_version_add ## name(&mp->m_sb); \
0315 }
0316
0317
0318 __XFS_ADD_FEAT(attr, ATTR)
0319 __XFS_HAS_FEAT(nlink, NLINK)
0320 __XFS_ADD_FEAT(quota, QUOTA)
0321 __XFS_HAS_FEAT(align, ALIGN)
0322 __XFS_HAS_FEAT(dalign, DALIGN)
0323 __XFS_HAS_FEAT(logv2, LOGV2)
0324 __XFS_HAS_FEAT(sector, SECTOR)
0325 __XFS_HAS_FEAT(extflg, EXTFLG)
0326 __XFS_HAS_FEAT(asciici, ASCIICI)
0327 __XFS_HAS_FEAT(lazysbcount, LAZYSBCOUNT)
0328 __XFS_ADD_FEAT(attr2, ATTR2)
0329 __XFS_HAS_FEAT(parent, PARENT)
0330 __XFS_ADD_FEAT(projid32, PROJID32)
0331 __XFS_HAS_FEAT(crc, CRC)
0332 __XFS_HAS_FEAT(v3inodes, V3INODES)
0333 __XFS_HAS_FEAT(pquotino, PQUOTINO)
0334 __XFS_HAS_FEAT(ftype, FTYPE)
0335 __XFS_HAS_FEAT(finobt, FINOBT)
0336 __XFS_HAS_FEAT(rmapbt, RMAPBT)
0337 __XFS_HAS_FEAT(reflink, REFLINK)
0338 __XFS_HAS_FEAT(sparseinodes, SPINODES)
0339 __XFS_HAS_FEAT(metauuid, META_UUID)
0340 __XFS_HAS_FEAT(realtime, REALTIME)
0341 __XFS_HAS_FEAT(inobtcounts, INOBTCNT)
0342 __XFS_HAS_FEAT(bigtime, BIGTIME)
0343 __XFS_HAS_FEAT(needsrepair, NEEDSREPAIR)
0344 __XFS_HAS_FEAT(large_extent_counts, NREXT64)
0345
0346
0347
0348
0349
0350
0351
0352
0353 __XFS_HAS_FEAT(noattr2, NOATTR2)
0354 __XFS_HAS_FEAT(noalign, NOALIGN)
0355 __XFS_HAS_FEAT(allocsize, ALLOCSIZE)
0356 __XFS_HAS_FEAT(large_iosize, LARGE_IOSIZE)
0357 __XFS_HAS_FEAT(wsync, WSYNC)
0358 __XFS_HAS_FEAT(dirsync, DIRSYNC)
0359 __XFS_HAS_FEAT(discard, DISCARD)
0360 __XFS_HAS_FEAT(grpid, GRPID)
0361 __XFS_HAS_FEAT(small_inums, SMALL_INUMS)
0362 __XFS_HAS_FEAT(ikeep, IKEEP)
0363 __XFS_HAS_FEAT(swalloc, SWALLOC)
0364 __XFS_HAS_FEAT(filestreams, FILESTREAMS)
0365 __XFS_HAS_FEAT(dax_always, DAX_ALWAYS)
0366 __XFS_HAS_FEAT(dax_never, DAX_NEVER)
0367 __XFS_HAS_FEAT(norecovery, NORECOVERY)
0368 __XFS_HAS_FEAT(nouuid, NOUUID)
0369
0370
0371
0372
0373
0374
0375 #define XFS_OPSTATE_UNMOUNTING 0
0376 #define XFS_OPSTATE_CLEAN 1
0377 #define XFS_OPSTATE_SHUTDOWN 2
0378 #define XFS_OPSTATE_INODE32 3
0379 #define XFS_OPSTATE_READONLY 4
0380
0381
0382
0383
0384
0385
0386 #define XFS_OPSTATE_INODEGC_ENABLED 5
0387
0388
0389
0390
0391
0392 #define XFS_OPSTATE_BLOCKGC_ENABLED 6
0393
0394
0395 #define XFS_OPSTATE_WARNED_SCRUB 7
0396
0397 #define XFS_OPSTATE_WARNED_SHRINK 8
0398
0399 #define XFS_OPSTATE_WARNED_LARP 9
0400
0401 #define __XFS_IS_OPSTATE(name, NAME) \
0402 static inline bool xfs_is_ ## name (struct xfs_mount *mp) \
0403 { \
0404 return test_bit(XFS_OPSTATE_ ## NAME, &mp->m_opstate); \
0405 } \
0406 static inline bool xfs_clear_ ## name (struct xfs_mount *mp) \
0407 { \
0408 return test_and_clear_bit(XFS_OPSTATE_ ## NAME, &mp->m_opstate); \
0409 } \
0410 static inline bool xfs_set_ ## name (struct xfs_mount *mp) \
0411 { \
0412 return test_and_set_bit(XFS_OPSTATE_ ## NAME, &mp->m_opstate); \
0413 }
0414
0415 __XFS_IS_OPSTATE(unmounting, UNMOUNTING)
0416 __XFS_IS_OPSTATE(clean, CLEAN)
0417 __XFS_IS_OPSTATE(shutdown, SHUTDOWN)
0418 __XFS_IS_OPSTATE(inode32, INODE32)
0419 __XFS_IS_OPSTATE(readonly, READONLY)
0420 __XFS_IS_OPSTATE(inodegc_enabled, INODEGC_ENABLED)
0421 __XFS_IS_OPSTATE(blockgc_enabled, BLOCKGC_ENABLED)
0422
0423 static inline bool
0424 xfs_should_warn(struct xfs_mount *mp, long nr)
0425 {
0426 return !test_and_set_bit(nr, &mp->m_opstate);
0427 }
0428
0429 #define XFS_OPSTATE_STRINGS \
0430 { (1UL << XFS_OPSTATE_UNMOUNTING), "unmounting" }, \
0431 { (1UL << XFS_OPSTATE_CLEAN), "clean" }, \
0432 { (1UL << XFS_OPSTATE_SHUTDOWN), "shutdown" }, \
0433 { (1UL << XFS_OPSTATE_INODE32), "inode32" }, \
0434 { (1UL << XFS_OPSTATE_READONLY), "read_only" }, \
0435 { (1UL << XFS_OPSTATE_INODEGC_ENABLED), "inodegc" }, \
0436 { (1UL << XFS_OPSTATE_BLOCKGC_ENABLED), "blockgc" }, \
0437 { (1UL << XFS_OPSTATE_WARNED_SCRUB), "wscrub" }, \
0438 { (1UL << XFS_OPSTATE_WARNED_SHRINK), "wshrink" }, \
0439 { (1UL << XFS_OPSTATE_WARNED_LARP), "wlarp" }
0440
0441
0442
0443
0444
0445 #define XFS_MAX_IO_LOG 30
0446 #define XFS_MIN_IO_LOG PAGE_SHIFT
0447
0448 void xfs_do_force_shutdown(struct xfs_mount *mp, uint32_t flags, char *fname,
0449 int lnnum);
0450 #define xfs_force_shutdown(m,f) \
0451 xfs_do_force_shutdown(m, f, __FILE__, __LINE__)
0452
0453 #define SHUTDOWN_META_IO_ERROR (1u << 0)
0454 #define SHUTDOWN_LOG_IO_ERROR (1u << 1)
0455 #define SHUTDOWN_FORCE_UMOUNT (1u << 2)
0456 #define SHUTDOWN_CORRUPT_INCORE (1u << 3)
0457 #define SHUTDOWN_CORRUPT_ONDISK (1u << 4)
0458
0459 #define XFS_SHUTDOWN_STRINGS \
0460 { SHUTDOWN_META_IO_ERROR, "metadata_io" }, \
0461 { SHUTDOWN_LOG_IO_ERROR, "log_io" }, \
0462 { SHUTDOWN_FORCE_UMOUNT, "force_umount" }, \
0463 { SHUTDOWN_CORRUPT_INCORE, "corruption" }
0464
0465
0466
0467
0468 #define XFS_MFSI_QUIET 0x40
0469
0470 static inline xfs_agnumber_t
0471 xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d)
0472 {
0473 xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
0474 do_div(ld, mp->m_sb.sb_agblocks);
0475 return (xfs_agnumber_t) ld;
0476 }
0477
0478 static inline xfs_agblock_t
0479 xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
0480 {
0481 xfs_rfsblock_t ld = XFS_BB_TO_FSBT(mp, d);
0482 return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
0483 }
0484
0485 int xfs_buf_hash_init(struct xfs_perag *pag);
0486 void xfs_buf_hash_destroy(struct xfs_perag *pag);
0487
0488 extern void xfs_uuid_table_free(void);
0489 extern uint64_t xfs_default_resblks(xfs_mount_t *mp);
0490 extern int xfs_mountfs(xfs_mount_t *mp);
0491 extern void xfs_unmountfs(xfs_mount_t *);
0492
0493
0494
0495
0496
0497
0498
0499
0500 #define XFS_FDBLOCKS_BATCH 1024
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510 static inline uint64_t
0511 xfs_fdblocks_unavailable(
0512 struct xfs_mount *mp)
0513 {
0514 return mp->m_alloc_set_aside + atomic64_read(&mp->m_allocbt_blks);
0515 }
0516
0517 int xfs_mod_freecounter(struct xfs_mount *mp, struct percpu_counter *counter,
0518 int64_t delta, bool rsvd);
0519
0520 static inline int
0521 xfs_mod_fdblocks(struct xfs_mount *mp, int64_t delta, bool reserved)
0522 {
0523 return xfs_mod_freecounter(mp, &mp->m_fdblocks, delta, reserved);
0524 }
0525
0526 static inline int
0527 xfs_mod_frextents(struct xfs_mount *mp, int64_t delta)
0528 {
0529 return xfs_mod_freecounter(mp, &mp->m_frextents, delta, false);
0530 }
0531
0532 extern int xfs_readsb(xfs_mount_t *, int);
0533 extern void xfs_freesb(xfs_mount_t *);
0534 extern bool xfs_fs_writable(struct xfs_mount *mp, int level);
0535 extern int xfs_sb_validate_fsb_count(struct xfs_sb *, uint64_t);
0536
0537 extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
0538
0539 extern void xfs_set_low_space_thresholds(struct xfs_mount *);
0540
0541 int xfs_zero_extent(struct xfs_inode *ip, xfs_fsblock_t start_fsb,
0542 xfs_off_t count_fsb);
0543
0544 struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp,
0545 int error_class, int error);
0546 void xfs_force_summary_recalc(struct xfs_mount *mp);
0547 int xfs_add_incompat_log_feature(struct xfs_mount *mp, uint32_t feature);
0548 bool xfs_clear_incompat_log_features(struct xfs_mount *mp);
0549 void xfs_mod_delalloc(struct xfs_mount *mp, int64_t delta);
0550
0551 #endif