aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_sb.h220
1 files changed, 76 insertions, 144 deletions
diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h
index f7b2fe77c5a5..57f6ba13d19f 100644
--- a/fs/xfs/xfs_sb.h
+++ b/fs/xfs/xfs_sb.h
@@ -36,8 +36,6 @@ struct xfs_trans;
36#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ 36#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */
37#define XFS_SB_VERSION_NUMBITS 0x000f 37#define XFS_SB_VERSION_NUMBITS 0x000f
38#define XFS_SB_VERSION_ALLFBITS 0xfff0 38#define XFS_SB_VERSION_ALLFBITS 0xfff0
39#define XFS_SB_VERSION_SASHFBITS 0xf000
40#define XFS_SB_VERSION_REALFBITS 0x0ff0
41#define XFS_SB_VERSION_ATTRBIT 0x0010 39#define XFS_SB_VERSION_ATTRBIT 0x0010
42#define XFS_SB_VERSION_NLINKBIT 0x0020 40#define XFS_SB_VERSION_NLINKBIT 0x0020
43#define XFS_SB_VERSION_QUOTABIT 0x0040 41#define XFS_SB_VERSION_QUOTABIT 0x0040
@@ -50,24 +48,14 @@ struct xfs_trans;
50#define XFS_SB_VERSION_DIRV2BIT 0x2000 48#define XFS_SB_VERSION_DIRV2BIT 0x2000
51#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ 49#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */
52#define XFS_SB_VERSION_MOREBITSBIT 0x8000 50#define XFS_SB_VERSION_MOREBITSBIT 0x8000
53#define XFS_SB_VERSION_OKSASHFBITS \ 51
54 (XFS_SB_VERSION_EXTFLGBIT | \ 52/*
55 XFS_SB_VERSION_DIRV2BIT | \ 53 * Supported feature bit list is just all bits in the versionnum field because
56 XFS_SB_VERSION_BORGBIT) 54 * we've used them all up and understand them all.
57#define XFS_SB_VERSION_OKREALFBITS \ 55 */
58 (XFS_SB_VERSION_ATTRBIT | \ 56#define XFS_SB_VERSION_OKBITS \
59 XFS_SB_VERSION_NLINKBIT | \ 57 (XFS_SB_VERSION_NUMBITS | \
60 XFS_SB_VERSION_QUOTABIT | \ 58 XFS_SB_VERSION_ALLFBITS)
61 XFS_SB_VERSION_ALIGNBIT | \
62 XFS_SB_VERSION_DALIGNBIT | \
63 XFS_SB_VERSION_SHAREDBIT | \
64 XFS_SB_VERSION_LOGV2BIT | \
65 XFS_SB_VERSION_SECTORBIT | \
66 XFS_SB_VERSION_MOREBITSBIT)
67#define XFS_SB_VERSION_OKREALBITS \
68 (XFS_SB_VERSION_NUMBITS | \
69 XFS_SB_VERSION_OKREALFBITS | \
70 XFS_SB_VERSION_OKSASHFBITS)
71 59
72/* 60/*
73 * There are two words to hold XFS "feature" bits: the original 61 * There are two words to hold XFS "feature" bits: the original
@@ -76,7 +64,6 @@ struct xfs_trans;
76 * 64 *
77 * These defines represent bits in sb_features2. 65 * These defines represent bits in sb_features2.
78 */ 66 */
79#define XFS_SB_VERSION2_REALFBITS 0x00ffffff /* Mask: features */
80#define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 67#define XFS_SB_VERSION2_RESERVED1BIT 0x00000001
81#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ 68#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */
82#define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 69#define XFS_SB_VERSION2_RESERVED4BIT 0x00000004
@@ -86,16 +73,11 @@ struct xfs_trans;
86#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ 73#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */
87#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ 74#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */
88 75
89#define XFS_SB_VERSION2_OKREALFBITS \ 76#define XFS_SB_VERSION2_OKBITS \
90 (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ 77 (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
91 XFS_SB_VERSION2_ATTR2BIT | \ 78 XFS_SB_VERSION2_ATTR2BIT | \
92 XFS_SB_VERSION2_PROJID32BIT | \ 79 XFS_SB_VERSION2_PROJID32BIT | \
93 XFS_SB_VERSION2_FTYPE) 80 XFS_SB_VERSION2_FTYPE)
94#define XFS_SB_VERSION2_OKSASHFBITS \
95 (0)
96#define XFS_SB_VERSION2_OKREALBITS \
97 (XFS_SB_VERSION2_OKREALFBITS | \
98 XFS_SB_VERSION2_OKSASHFBITS )
99 81
100/* 82/*
101 * Superblock - in core version. Must match the ondisk version below. 83 * Superblock - in core version. Must match the ondisk version below.
@@ -345,214 +327,164 @@ typedef enum {
345 327
346#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) 328#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
347 329
348static inline int xfs_sb_good_version(xfs_sb_t *sbp) 330/*
331 * The first XFS version we support is a v4 superblock with V2 directories.
332 */
333static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp)
349{ 334{
350 /* We always support version 1-3 */ 335 if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT))
351 if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && 336 return false;
352 sbp->sb_versionnum <= XFS_SB_VERSION_3)
353 return 1;
354 337
355 /* We support version 4 if all feature bits are supported */ 338 /* check for unknown features in the fs */
356 if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { 339 if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) ||
357 if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || 340 ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
358 ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && 341 (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))
359 (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) 342 return false;
360 return 0;
361 343
362 if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) 344 /* We don't support shared superblocks - nobody knows what it is */
363 return 0; 345 if (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT)
364 return 1; 346 return false;
365 }
366 if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5)
367 return 1;
368 347
369 return 0; 348 return true;
349}
350
351static inline bool xfs_sb_good_version(struct xfs_sb *sbp)
352{
353 if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5)
354 return true;
355 if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4)
356 return xfs_sb_good_v4_features(sbp);
357 return false;
370} 358}
371 359
372/* 360/*
373 * Detect a mismatched features2 field. Older kernels read/wrote 361 * Detect a mismatched features2 field. Older kernels read/wrote
374 * this into the wrong slot, so to be safe we keep them in sync. 362 * this into the wrong slot, so to be safe we keep them in sync.
375 */ 363 */
376static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) 364static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp)
377{
378 return (sbp->sb_bad_features2 != sbp->sb_features2);
379}
380
381static inline unsigned xfs_sb_version_tonew(unsigned v)
382{ 365{
383 if (v == XFS_SB_VERSION_1) 366 return sbp->sb_bad_features2 != sbp->sb_features2;
384 return XFS_SB_VERSION_4;
385
386 if (v == XFS_SB_VERSION_2)
387 return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT;
388
389 return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT |
390 XFS_SB_VERSION_NLINKBIT;
391} 367}
392 368
393static inline unsigned xfs_sb_version_toold(unsigned v) 369static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp)
394{ 370{
395 if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) 371 return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT);
396 return 0;
397 if (v & XFS_SB_VERSION_NLINKBIT)
398 return XFS_SB_VERSION_3;
399 if (v & XFS_SB_VERSION_ATTRBIT)
400 return XFS_SB_VERSION_2;
401 return XFS_SB_VERSION_1;
402} 372}
403 373
404static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) 374static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
405{ 375{
406 return sbp->sb_versionnum == XFS_SB_VERSION_2 || 376 sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
407 sbp->sb_versionnum == XFS_SB_VERSION_3 ||
408 (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
409 (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT));
410} 377}
411 378
412static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) 379static inline bool xfs_sb_version_hasnlink(struct xfs_sb *sbp)
413{ 380{
414 if (sbp->sb_versionnum == XFS_SB_VERSION_1) 381 return (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT);
415 sbp->sb_versionnum = XFS_SB_VERSION_2;
416 else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4)
417 sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
418 else
419 sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT;
420} 382}
421 383
422static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) 384static inline void xfs_sb_version_addnlink(struct xfs_sb *sbp)
423{ 385{
424 return sbp->sb_versionnum == XFS_SB_VERSION_3 || 386 sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT;
425 (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
426 (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT));
427} 387}
428 388
429static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) 389static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp)
430{ 390{
431 if (sbp->sb_versionnum <= XFS_SB_VERSION_2) 391 return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
432 sbp->sb_versionnum = XFS_SB_VERSION_3;
433 else
434 sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT;
435} 392}
436 393
437static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) 394static inline void xfs_sb_version_addquota(struct xfs_sb *sbp)
438{ 395{
439 return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && 396 sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
440 (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT);
441} 397}
442 398
443static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) 399static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp)
444{ 400{
445 if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) 401 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
446 sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
447 else
448 sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) |
449 XFS_SB_VERSION_QUOTABIT;
450}
451
452static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp)
453{
454 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
455 (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 &&
456 (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); 402 (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT));
457} 403}
458 404
459static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) 405static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp)
460{ 406{
461 return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && 407 return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
462 (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT);
463} 408}
464 409
465static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) 410static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp)
466{ 411{
467 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && 412 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 &&
468 (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); 413 (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT);
469} 414}
470 415
471static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) 416static inline bool xfs_sb_version_hasdirv2(struct xfs_sb *sbp)
472{ 417{
473 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 418 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
474 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && 419 (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT);
475 (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT));
476} 420}
477 421
478static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) 422static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp)
479{ 423{
480 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 424 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
481 (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && 425 (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT);
482 (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT));
483} 426}
484 427
485static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) 428static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp)
486{ 429{
487 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 430 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
488 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && 431 (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT);
489 (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT));
490} 432}
491 433
492static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) 434static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp)
493{ 435{
494 return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && 436 return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
495 (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT);
496} 437}
497 438
498static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) 439static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp)
499{ 440{
500 return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && 441 return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
501 (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT);
502} 442}
503 443
504static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) 444static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
505{ 445{
506 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 446 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
507 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && 447 (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
508 (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT));
509} 448}
510 449
511/* 450/*
512 * sb_features2 bit version macros. 451 * sb_features2 bit version macros.
513 *
514 * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro:
515 *
516 * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp)
517 * ((xfs_sb_version_hasmorebits(sbp) &&
518 * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT)
519 */ 452 */
520 453static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp)
521static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp)
522{ 454{
523 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 455 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
524 (xfs_sb_version_hasmorebits(sbp) && 456 (xfs_sb_version_hasmorebits(sbp) &&
525 (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); 457 (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT));
526} 458}
527 459
528static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) 460static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp)
529{ 461{
530 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 462 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
531 (xfs_sb_version_hasmorebits(sbp) && 463 (xfs_sb_version_hasmorebits(sbp) &&
532 (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); 464 (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT));
533} 465}
534 466
535static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) 467static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
536{ 468{
537 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; 469 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
538 sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; 470 sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
539} 471}
540 472
541static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) 473static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp)
542{ 474{
543 sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; 475 sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT;
544 if (!sbp->sb_features2) 476 if (!sbp->sb_features2)
545 sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; 477 sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT;
546} 478}
547 479
548static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) 480static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp)
549{ 481{
550 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || 482 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) ||
551 (xfs_sb_version_hasmorebits(sbp) && 483 (xfs_sb_version_hasmorebits(sbp) &&
552 (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); 484 (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT));
553} 485}
554 486
555static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) 487static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp)
556{ 488{
557 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; 489 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
558 sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; 490 sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
@@ -623,12 +555,12 @@ xfs_sb_has_incompat_log_feature(
623/* 555/*
624 * V5 superblock specific feature checks 556 * V5 superblock specific feature checks
625 */ 557 */
626static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) 558static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp)
627{ 559{
628 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; 560 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
629} 561}
630 562
631static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) 563static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp)
632{ 564{
633 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; 565 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
634} 566}