Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6

* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6:
[XFS] Ensure "both" features2 slots are consistent
[XFS] Fix superblock features2 field alignment problem
[XFS] remove shouting-indirection macros from xfs_sb.h

+153 -148
+1 -1
fs/xfs/linux-2.6/xfs_ioctl.c
··· 732 * Only allow the sys admin to reserve space unless 733 * unwritten extents are enabled. 734 */ 735 - if (!XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb) && 736 !capable(CAP_SYS_ADMIN)) 737 return -EPERM; 738
··· 732 * Only allow the sys admin to reserve space unless 733 * unwritten extents are enabled. 734 */ 735 + if (!xfs_sb_version_hasextflgbit(&mp->m_sb) && 736 !capable(CAP_SYS_ADMIN)) 737 return -EPERM; 738
+3 -3
fs/xfs/quota/xfs_qm.c
··· 1405 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY) 1406 unsigned oldv = mp->m_sb.sb_versionnum; 1407 #endif 1408 - ASSERT(!XFS_SB_VERSION_HASQUOTA(&mp->m_sb)); 1409 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 1410 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)) == 1411 (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 1412 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)); 1413 1414 - XFS_SB_VERSION_ADDQUOTA(&mp->m_sb); 1415 mp->m_sb.sb_uquotino = NULLFSINO; 1416 mp->m_sb.sb_gquotino = NULLFSINO; 1417 ··· 1954 /* 1955 * Get the uquota and gquota inodes 1956 */ 1957 - if (XFS_SB_VERSION_HASQUOTA(&mp->m_sb)) { 1958 if (XFS_IS_UQUOTA_ON(mp) && 1959 mp->m_sb.sb_uquotino != NULLFSINO) { 1960 ASSERT(mp->m_sb.sb_uquotino > 0);
··· 1405 #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY) 1406 unsigned oldv = mp->m_sb.sb_versionnum; 1407 #endif 1408 + ASSERT(!xfs_sb_version_hasquota(&mp->m_sb)); 1409 ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 1410 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)) == 1411 (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | 1412 XFS_SB_GQUOTINO | XFS_SB_QFLAGS)); 1413 1414 + xfs_sb_version_addquota(&mp->m_sb); 1415 mp->m_sb.sb_uquotino = NULLFSINO; 1416 mp->m_sb.sb_gquotino = NULLFSINO; 1417 ··· 1954 /* 1955 * Get the uquota and gquota inodes 1956 */ 1957 + if (xfs_sb_version_hasquota(&mp->m_sb)) { 1958 if (XFS_IS_UQUOTA_ON(mp) && 1959 mp->m_sb.sb_uquotino != NULLFSINO) { 1960 ASSERT(mp->m_sb.sb_uquotino > 0);
+1 -1
fs/xfs/quota/xfs_qm_bhv.c
··· 118 *quotaflags = 0; 119 *needquotamount = B_FALSE; 120 121 - quotaondisk = XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && 122 (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); 123 124 if (quotaondisk) {
··· 118 *quotaflags = 0; 119 *needquotamount = B_FALSE; 120 121 + quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) && 122 (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); 123 124 if (quotaondisk) {
+2 -2
fs/xfs/quota/xfs_qm_syscalls.c
··· 377 if (!capable(CAP_SYS_ADMIN)) 378 return XFS_ERROR(EPERM); 379 error = 0; 380 - if (!XFS_SB_VERSION_HASQUOTA(&mp->m_sb) || flags == 0) { 381 qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags); 382 return XFS_ERROR(EINVAL); 383 } ··· 522 memset(out, 0, sizeof(fs_quota_stat_t)); 523 524 out->qs_version = FS_QSTAT_VERSION; 525 - if (! XFS_SB_VERSION_HASQUOTA(&mp->m_sb)) { 526 out->qs_uquota.qfs_ino = NULLFSINO; 527 out->qs_gquota.qfs_ino = NULLFSINO; 528 return (0);
··· 377 if (!capable(CAP_SYS_ADMIN)) 378 return XFS_ERROR(EPERM); 379 error = 0; 380 + if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { 381 qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags); 382 return XFS_ERROR(EINVAL); 383 } ··· 522 memset(out, 0, sizeof(fs_quota_stat_t)); 523 524 out->qs_version = FS_QSTAT_VERSION; 525 + if (!xfs_sb_version_hasquota(&mp->m_sb)) { 526 out->qs_uquota.qfs_ino = NULLFSINO; 527 out->qs_gquota.qfs_ino = NULLFSINO; 528 return (0);
+3 -3
fs/xfs/xfs_attr_leaf.c
··· 227 xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) 228 { 229 if ((mp->m_flags & XFS_MOUNT_ATTR2) && 230 - !(XFS_SB_VERSION_HASATTR2(&mp->m_sb))) { 231 spin_lock(&mp->m_sb_lock); 232 - if (!XFS_SB_VERSION_HASATTR2(&mp->m_sb)) { 233 - XFS_SB_VERSION_ADDATTR2(&mp->m_sb); 234 spin_unlock(&mp->m_sb_lock); 235 xfs_mod_sb(tp, XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); 236 } else
··· 227 xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) 228 { 229 if ((mp->m_flags & XFS_MOUNT_ATTR2) && 230 + !(xfs_sb_version_hasattr2(&mp->m_sb))) { 231 spin_lock(&mp->m_sb_lock); 232 + if (!xfs_sb_version_hasattr2(&mp->m_sb)) { 233 + xfs_sb_version_addattr2(&mp->m_sb); 234 spin_unlock(&mp->m_sb_lock); 235 xfs_mod_sb(tp, XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); 236 } else
+9 -9
fs/xfs/xfs_bmap.c
··· 4047 xfs_trans_log_inode(tp, ip, logflags); 4048 if (error) 4049 goto error2; 4050 - if (!XFS_SB_VERSION_HASATTR(&mp->m_sb) || 4051 - (!XFS_SB_VERSION_HASATTR2(&mp->m_sb) && version == 2)) { 4052 __int64_t sbfields = 0; 4053 4054 spin_lock(&mp->m_sb_lock); 4055 - if (!XFS_SB_VERSION_HASATTR(&mp->m_sb)) { 4056 - XFS_SB_VERSION_ADDATTR(&mp->m_sb); 4057 sbfields |= XFS_SB_VERSIONNUM; 4058 } 4059 - if (!XFS_SB_VERSION_HASATTR2(&mp->m_sb) && version == 2) { 4060 - XFS_SB_VERSION_ADDATTR2(&mp->m_sb); 4061 sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); 4062 } 4063 if (sbfields) { ··· 5043 * A wasdelay extent has been initialized, so 5044 * shouldn't be flagged as unwritten. 5045 */ 5046 - if (wr && XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { 5047 if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) 5048 got.br_state = XFS_EXT_UNWRITTEN; 5049 } ··· 5483 * get rid of part of a realtime extent. 5484 */ 5485 if (del.br_state == XFS_EXT_UNWRITTEN || 5486 - !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { 5487 /* 5488 * This piece is unwritten, or we're not 5489 * using unwritten extents. Skip over it. ··· 5535 } else if ((del.br_startoff == start && 5536 (del.br_state == XFS_EXT_UNWRITTEN || 5537 xfs_trans_get_block_res(tp) == 0)) || 5538 - !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { 5539 /* 5540 * Can't make it unwritten. There isn't 5541 * a full extent here so just skip it.
··· 4047 xfs_trans_log_inode(tp, ip, logflags); 4048 if (error) 4049 goto error2; 4050 + if (!xfs_sb_version_hasattr(&mp->m_sb) || 4051 + (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { 4052 __int64_t sbfields = 0; 4053 4054 spin_lock(&mp->m_sb_lock); 4055 + if (!xfs_sb_version_hasattr(&mp->m_sb)) { 4056 + xfs_sb_version_addattr(&mp->m_sb); 4057 sbfields |= XFS_SB_VERSIONNUM; 4058 } 4059 + if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { 4060 + xfs_sb_version_addattr2(&mp->m_sb); 4061 sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); 4062 } 4063 if (sbfields) { ··· 5043 * A wasdelay extent has been initialized, so 5044 * shouldn't be flagged as unwritten. 5045 */ 5046 + if (wr && xfs_sb_version_hasextflgbit(&mp->m_sb)) { 5047 if (!wasdelay && (flags & XFS_BMAPI_PREALLOC)) 5048 got.br_state = XFS_EXT_UNWRITTEN; 5049 } ··· 5483 * get rid of part of a realtime extent. 5484 */ 5485 if (del.br_state == XFS_EXT_UNWRITTEN || 5486 + !xfs_sb_version_hasextflgbit(&mp->m_sb)) { 5487 /* 5488 * This piece is unwritten, or we're not 5489 * using unwritten extents. Skip over it. ··· 5535 } else if ((del.br_startoff == start && 5536 (del.br_state == XFS_EXT_UNWRITTEN || 5537 xfs_trans_get_block_res(tp) == 0)) || 5538 + !xfs_sb_version_hasextflgbit(&mp->m_sb)) { 5539 /* 5540 * Can't make it unwritten. There isn't 5541 * a full extent here so just skip it.
+1 -1
fs/xfs/xfs_bmap_btree.h
··· 120 * Extent state and extent format macros. 121 */ 122 #define XFS_EXTFMT_INODE(x) \ 123 - (XFS_SB_VERSION_HASEXTFLGBIT(&((x)->i_mount->m_sb)) ? \ 124 XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE) 125 #define ISUNWRITTEN(x) ((x)->br_state == XFS_EXT_UNWRITTEN) 126
··· 120 * Extent state and extent format macros. 121 */ 122 #define XFS_EXTFMT_INODE(x) \ 123 + (xfs_sb_version_hasextflgbit(&((x)->i_mount->m_sb)) ? \ 124 XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE) 125 #define ISUNWRITTEN(x) ((x)->br_state == XFS_EXT_UNWRITTEN) 126
+1 -1
fs/xfs/xfs_dir2.c
··· 49 xfs_dir_mount( 50 xfs_mount_t *mp) 51 { 52 - ASSERT(XFS_SB_VERSION_HASDIRV2(&mp->m_sb)); 53 ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= 54 XFS_MAX_BLOCKSIZE); 55 mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog);
··· 49 xfs_dir_mount( 50 xfs_mount_t *mp) 51 { 52 + ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); 53 ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= 54 XFS_MAX_BLOCKSIZE); 55 mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog);
+12 -12
fs/xfs/xfs_fsops.c
··· 77 if (new_version >= 3) { 78 geo->version = XFS_FSOP_GEOM_VERSION; 79 geo->flags = 80 - (XFS_SB_VERSION_HASATTR(&mp->m_sb) ? 81 XFS_FSOP_GEOM_FLAGS_ATTR : 0) | 82 - (XFS_SB_VERSION_HASNLINK(&mp->m_sb) ? 83 XFS_FSOP_GEOM_FLAGS_NLINK : 0) | 84 - (XFS_SB_VERSION_HASQUOTA(&mp->m_sb) ? 85 XFS_FSOP_GEOM_FLAGS_QUOTA : 0) | 86 - (XFS_SB_VERSION_HASALIGN(&mp->m_sb) ? 87 XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | 88 - (XFS_SB_VERSION_HASDALIGN(&mp->m_sb) ? 89 XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | 90 - (XFS_SB_VERSION_HASSHARED(&mp->m_sb) ? 91 XFS_FSOP_GEOM_FLAGS_SHARED : 0) | 92 - (XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb) ? 93 XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | 94 - (XFS_SB_VERSION_HASDIRV2(&mp->m_sb) ? 95 XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) | 96 - (XFS_SB_VERSION_HASSECTOR(&mp->m_sb) ? 97 XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | 98 (xfs_sb_version_haslazysbcount(&mp->m_sb) ? 99 XFS_FSOP_GEOM_FLAGS_LAZYSB : 0) | 100 - (XFS_SB_VERSION_HASATTR2(&mp->m_sb) ? 101 XFS_FSOP_GEOM_FLAGS_ATTR2 : 0); 102 - geo->logsectsize = XFS_SB_VERSION_HASSECTOR(&mp->m_sb) ? 103 mp->m_sb.sb_logsectsize : BBSIZE; 104 geo->rtsectsize = mp->m_sb.sb_blocksize; 105 geo->dirblocksize = mp->m_dirblksize; 106 } 107 if (new_version >= 4) { 108 geo->flags |= 109 - (XFS_SB_VERSION_HASLOGV2(&mp->m_sb) ? 110 XFS_FSOP_GEOM_FLAGS_LOGV2 : 0); 111 geo->logsunit = mp->m_sb.sb_logsunit; 112 }
··· 77 if (new_version >= 3) { 78 geo->version = XFS_FSOP_GEOM_VERSION; 79 geo->flags = 80 + (xfs_sb_version_hasattr(&mp->m_sb) ? 81 XFS_FSOP_GEOM_FLAGS_ATTR : 0) | 82 + (xfs_sb_version_hasnlink(&mp->m_sb) ? 83 XFS_FSOP_GEOM_FLAGS_NLINK : 0) | 84 + (xfs_sb_version_hasquota(&mp->m_sb) ? 85 XFS_FSOP_GEOM_FLAGS_QUOTA : 0) | 86 + (xfs_sb_version_hasalign(&mp->m_sb) ? 87 XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | 88 + (xfs_sb_version_hasdalign(&mp->m_sb) ? 89 XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | 90 + (xfs_sb_version_hasshared(&mp->m_sb) ? 91 XFS_FSOP_GEOM_FLAGS_SHARED : 0) | 92 + (xfs_sb_version_hasextflgbit(&mp->m_sb) ? 93 XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | 94 + (xfs_sb_version_hasdirv2(&mp->m_sb) ? 95 XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) | 96 + (xfs_sb_version_hassector(&mp->m_sb) ? 97 XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | 98 (xfs_sb_version_haslazysbcount(&mp->m_sb) ? 99 XFS_FSOP_GEOM_FLAGS_LAZYSB : 0) | 100 + (xfs_sb_version_hasattr2(&mp->m_sb) ? 101 XFS_FSOP_GEOM_FLAGS_ATTR2 : 0); 102 + geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? 103 mp->m_sb.sb_logsectsize : BBSIZE; 104 geo->rtsectsize = mp->m_sb.sb_blocksize; 105 geo->dirblocksize = mp->m_dirblksize; 106 } 107 if (new_version >= 4) { 108 geo->flags |= 109 + (xfs_sb_version_haslogv2(&mp->m_sb) ? 110 XFS_FSOP_GEOM_FLAGS_LOGV2 : 0); 111 geo->logsunit = mp->m_sb.sb_logsunit; 112 }
+3 -3
fs/xfs/xfs_ialloc.c
··· 191 ASSERT(!(args.mp->m_flags & XFS_MOUNT_NOALIGN)); 192 args.alignment = args.mp->m_dalign; 193 isaligned = 1; 194 - } else if (XFS_SB_VERSION_HASALIGN(&args.mp->m_sb) && 195 args.mp->m_sb.sb_inoalignmt >= 196 XFS_B_TO_FSBT(args.mp, 197 XFS_INODE_CLUSTER_SIZE(args.mp))) ··· 230 args.agbno = be32_to_cpu(agi->agi_root); 231 args.fsbno = XFS_AGB_TO_FSB(args.mp, 232 be32_to_cpu(agi->agi_seqno), args.agbno); 233 - if (XFS_SB_VERSION_HASALIGN(&args.mp->m_sb) && 234 args.mp->m_sb.sb_inoalignmt >= 235 XFS_B_TO_FSBT(args.mp, XFS_INODE_CLUSTER_SIZE(args.mp))) 236 args.alignment = args.mp->m_sb.sb_inoalignmt; ··· 271 * use the old version so that old kernels will continue to be 272 * able to use the file system. 273 */ 274 - if (XFS_SB_VERSION_HASNLINK(&args.mp->m_sb)) 275 version = XFS_DINODE_VERSION_2; 276 else 277 version = XFS_DINODE_VERSION_1;
··· 191 ASSERT(!(args.mp->m_flags & XFS_MOUNT_NOALIGN)); 192 args.alignment = args.mp->m_dalign; 193 isaligned = 1; 194 + } else if (xfs_sb_version_hasalign(&args.mp->m_sb) && 195 args.mp->m_sb.sb_inoalignmt >= 196 XFS_B_TO_FSBT(args.mp, 197 XFS_INODE_CLUSTER_SIZE(args.mp))) ··· 230 args.agbno = be32_to_cpu(agi->agi_root); 231 args.fsbno = XFS_AGB_TO_FSB(args.mp, 232 be32_to_cpu(agi->agi_seqno), args.agbno); 233 + if (xfs_sb_version_hasalign(&args.mp->m_sb) && 234 args.mp->m_sb.sb_inoalignmt >= 235 XFS_B_TO_FSBT(args.mp, XFS_INODE_CLUSTER_SIZE(args.mp))) 236 args.alignment = args.mp->m_sb.sb_inoalignmt; ··· 271 * use the old version so that old kernels will continue to be 272 * able to use the file system. 273 */ 274 + if (xfs_sb_version_hasnlink(&args.mp->m_sb)) 275 version = XFS_DINODE_VERSION_2; 276 else 277 version = XFS_DINODE_VERSION_1;
+3 -3
fs/xfs/xfs_inode.c
··· 1147 * the inode version number now. This way we only do the conversion 1148 * here rather than here and in the flush/logging code. 1149 */ 1150 - if (XFS_SB_VERSION_HASNLINK(&tp->t_mountp->m_sb) && 1151 ip->i_d.di_version == XFS_DINODE_VERSION_1) { 1152 ip->i_d.di_version = XFS_DINODE_VERSION_2; 1153 /* ··· 3434 * has been updated, then make the conversion permanent. 3435 */ 3436 ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || 3437 - XFS_SB_VERSION_HASNLINK(&mp->m_sb)); 3438 if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { 3439 - if (!XFS_SB_VERSION_HASNLINK(&mp->m_sb)) { 3440 /* 3441 * Convert it back. 3442 */
··· 1147 * the inode version number now. This way we only do the conversion 1148 * here rather than here and in the flush/logging code. 1149 */ 1150 + if (xfs_sb_version_hasnlink(&tp->t_mountp->m_sb) && 1151 ip->i_d.di_version == XFS_DINODE_VERSION_1) { 1152 ip->i_d.di_version = XFS_DINODE_VERSION_2; 1153 /* ··· 3434 * has been updated, then make the conversion permanent. 3435 */ 3436 ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || 3437 + xfs_sb_version_hasnlink(&mp->m_sb)); 3438 if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { 3439 + if (!xfs_sb_version_hasnlink(&mp->m_sb)) { 3440 /* 3441 * Convert it back. 3442 */
+2 -2
fs/xfs/xfs_inode_item.c
··· 296 */ 297 mp = ip->i_mount; 298 ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || 299 - XFS_SB_VERSION_HASNLINK(&mp->m_sb)); 300 if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { 301 - if (!XFS_SB_VERSION_HASNLINK(&mp->m_sb)) { 302 /* 303 * Convert it back. 304 */
··· 296 */ 297 mp = ip->i_mount; 298 ASSERT(ip->i_d.di_version == XFS_DINODE_VERSION_1 || 299 + xfs_sb_version_hasnlink(&mp->m_sb)); 300 if (ip->i_d.di_version == XFS_DINODE_VERSION_1) { 301 + if (!xfs_sb_version_hasnlink(&mp->m_sb)) { 302 /* 303 * Convert it back. 304 */
+1 -1
fs/xfs/xfs_itable.c
··· 45 xfs_ino_t ino) 46 { 47 return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || 48 - (XFS_SB_VERSION_HASQUOTA(&mp->m_sb) && 49 (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); 50 } 51
··· 45 xfs_ino_t ino) 46 { 47 return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || 48 + (xfs_sb_version_hasquota(&mp->m_sb) && 49 (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino))); 50 } 51
+7 -7
fs/xfs/xfs_log.c
··· 1090 size >>= 1; 1091 } 1092 1093 - if (XFS_SB_VERSION_HASLOGV2(&mp->m_sb)) { 1094 /* # headers = size / 32K 1095 * one header holds cycles from 32K of data 1096 */ ··· 1186 log->l_grant_reserve_cycle = 1; 1187 log->l_grant_write_cycle = 1; 1188 1189 - if (XFS_SB_VERSION_HASSECTOR(&mp->m_sb)) { 1190 log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; 1191 ASSERT(log->l_sectbb_log <= mp->m_sectbb_log); 1192 /* for larger sector sizes, must have v2 or external log */ 1193 ASSERT(log->l_sectbb_log == 0 || 1194 log->l_logBBstart == 0 || 1195 - XFS_SB_VERSION_HASLOGV2(&mp->m_sb)); 1196 ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT); 1197 } 1198 log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1; ··· 1247 memset(head, 0, sizeof(xlog_rec_header_t)); 1248 head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); 1249 head->h_version = cpu_to_be32( 1250 - XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1); 1251 head->h_size = cpu_to_be32(log->l_iclog_size); 1252 /* new fields */ 1253 head->h_fmt = cpu_to_be32(XLOG_FMT); ··· 1402 int roundoff; /* roundoff to BB or stripe */ 1403 int split = 0; /* split write into two regions */ 1404 int error; 1405 - int v2 = XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb); 1406 1407 XFS_STATS_INC(xs_log_writes); 1408 ASSERT(iclog->ic_refcnt == 0); ··· 2881 log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize); 2882 2883 /* Round up to next log-sunit */ 2884 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) && 2885 log->l_mp->m_sb.sb_logsunit > 1) { 2886 __uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit); 2887 log->l_curr_block = roundup(log->l_curr_block, sunit_bb); ··· 3334 unit_bytes += sizeof(xlog_op_header_t) * num_headers; 3335 3336 /* for roundoff padding for transaction data and one for commit record */ 3337 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) && 3338 log->l_mp->m_sb.sb_logsunit > 1) { 3339 /* log su roundoff */ 3340 unit_bytes += 2*log->l_mp->m_sb.sb_logsunit;
··· 1090 size >>= 1; 1091 } 1092 1093 + if (xfs_sb_version_haslogv2(&mp->m_sb)) { 1094 /* # headers = size / 32K 1095 * one header holds cycles from 32K of data 1096 */ ··· 1186 log->l_grant_reserve_cycle = 1; 1187 log->l_grant_write_cycle = 1; 1188 1189 + if (xfs_sb_version_hassector(&mp->m_sb)) { 1190 log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; 1191 ASSERT(log->l_sectbb_log <= mp->m_sectbb_log); 1192 /* for larger sector sizes, must have v2 or external log */ 1193 ASSERT(log->l_sectbb_log == 0 || 1194 log->l_logBBstart == 0 || 1195 + xfs_sb_version_haslogv2(&mp->m_sb)); 1196 ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT); 1197 } 1198 log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1; ··· 1247 memset(head, 0, sizeof(xlog_rec_header_t)); 1248 head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); 1249 head->h_version = cpu_to_be32( 1250 + xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? 2 : 1); 1251 head->h_size = cpu_to_be32(log->l_iclog_size); 1252 /* new fields */ 1253 head->h_fmt = cpu_to_be32(XLOG_FMT); ··· 1402 int roundoff; /* roundoff to BB or stripe */ 1403 int split = 0; /* split write into two regions */ 1404 int error; 1405 + int v2 = xfs_sb_version_haslogv2(&log->l_mp->m_sb); 1406 1407 XFS_STATS_INC(xs_log_writes); 1408 ASSERT(iclog->ic_refcnt == 0); ··· 2881 log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize); 2882 2883 /* Round up to next log-sunit */ 2884 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) && 2885 log->l_mp->m_sb.sb_logsunit > 1) { 2886 __uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit); 2887 log->l_curr_block = roundup(log->l_curr_block, sunit_bb); ··· 3334 unit_bytes += sizeof(xlog_op_header_t) * num_headers; 3335 3336 /* for roundoff padding for transaction data and one for commit record */ 3337 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) && 3338 log->l_mp->m_sb.sb_logsunit > 1) { 3339 /* log su roundoff */ 3340 unit_bytes += 2*log->l_mp->m_sb.sb_logsunit;
+2 -2
fs/xfs/xfs_log_priv.h
··· 49 #define XLOG_HEADER_SIZE 512 50 51 #define XLOG_REC_SHIFT(log) \ 52 - BTOBB(1 << (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? \ 53 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) 54 #define XLOG_TOTAL_REC_SHIFT(log) \ 55 - BTOBB(XLOG_MAX_ICLOGS << (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? \ 56 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) 57 58
··· 49 #define XLOG_HEADER_SIZE 512 50 51 #define XLOG_REC_SHIFT(log) \ 52 + BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ 53 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) 54 #define XLOG_TOTAL_REC_SHIFT(log) \ 55 + BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ 56 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) 57 58
+8 -8
fs/xfs/xfs_log_recover.c
··· 478 * reset last_blk. Only when last_blk points in the middle of a log 479 * record do we update last_blk. 480 */ 481 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 482 uint h_size = be32_to_cpu(head->h_size); 483 484 xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE; ··· 888 * unmount record if there is one, so we pass the lsn of the 889 * unmount record rather than the block after it. 890 */ 891 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 892 int h_size = be32_to_cpu(rhead->h_size); 893 int h_version = be32_to_cpu(rhead->h_version); 894 ··· 1101 recp->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); 1102 recp->h_cycle = cpu_to_be32(cycle); 1103 recp->h_version = cpu_to_be32( 1104 - XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb) ? 2 : 1); 1105 recp->h_lsn = cpu_to_be64(xlog_assign_lsn(cycle, block)); 1106 recp->h_tail_lsn = cpu_to_be64(xlog_assign_lsn(tail_cycle, tail_block)); 1107 recp->h_fmt = cpu_to_be32(XLOG_FMT); ··· 3348 dp += BBSIZE; 3349 } 3350 3351 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 3352 xhdr = (xlog_in_core_2_t *)&iclog->ic_header; 3353 for ( ; i < BTOBB(size); i++) { 3354 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); ··· 3388 be32_to_cpu(rhead->h_chksum), chksum); 3389 cmn_err(CE_DEBUG, 3390 "XFS: Disregard message if filesystem was created with non-DEBUG kernel"); 3391 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 3392 cmn_err(CE_DEBUG, 3393 "XFS: LogR this is a LogV2 filesystem\n"); 3394 } ··· 3415 dp += BBSIZE; 3416 } 3417 3418 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 3419 xhdr = (xlog_in_core_2_t *)rhead; 3420 for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { 3421 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); ··· 3494 * Read the header of the tail block and get the iclog buffer size from 3495 * h_size. Use this to tell how many sectors make up the log header. 3496 */ 3497 - if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 3498 /* 3499 * When using variable length iclogs, read first sector of 3500 * iclog header and extract the header size from it. Get a ··· 3838 sbp = &log->l_mp->m_sb; 3839 xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); 3840 ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); 3841 - ASSERT(XFS_SB_GOOD_VERSION(sbp)); 3842 xfs_buf_relse(bp); 3843 3844 /* We've re-read the superblock so re-initialize per-cpu counters */
··· 478 * reset last_blk. Only when last_blk points in the middle of a log 479 * record do we update last_blk. 480 */ 481 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 482 uint h_size = be32_to_cpu(head->h_size); 483 484 xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE; ··· 888 * unmount record if there is one, so we pass the lsn of the 889 * unmount record rather than the block after it. 890 */ 891 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 892 int h_size = be32_to_cpu(rhead->h_size); 893 int h_version = be32_to_cpu(rhead->h_version); 894 ··· 1101 recp->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); 1102 recp->h_cycle = cpu_to_be32(cycle); 1103 recp->h_version = cpu_to_be32( 1104 + xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? 2 : 1); 1105 recp->h_lsn = cpu_to_be64(xlog_assign_lsn(cycle, block)); 1106 recp->h_tail_lsn = cpu_to_be64(xlog_assign_lsn(tail_cycle, tail_block)); 1107 recp->h_fmt = cpu_to_be32(XLOG_FMT); ··· 3348 dp += BBSIZE; 3349 } 3350 3351 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 3352 xhdr = (xlog_in_core_2_t *)&iclog->ic_header; 3353 for ( ; i < BTOBB(size); i++) { 3354 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); ··· 3388 be32_to_cpu(rhead->h_chksum), chksum); 3389 cmn_err(CE_DEBUG, 3390 "XFS: Disregard message if filesystem was created with non-DEBUG kernel"); 3391 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 3392 cmn_err(CE_DEBUG, 3393 "XFS: LogR this is a LogV2 filesystem\n"); 3394 } ··· 3415 dp += BBSIZE; 3416 } 3417 3418 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 3419 xhdr = (xlog_in_core_2_t *)rhead; 3420 for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { 3421 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); ··· 3494 * Read the header of the tail block and get the iclog buffer size from 3495 * h_size. Use this to tell how many sectors make up the log header. 3496 */ 3497 + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { 3498 /* 3499 * When using variable length iclogs, read first sector of 3500 * iclog header and extract the header size from it. Get a ··· 3838 sbp = &log->l_mp->m_sb; 3839 xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); 3840 ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); 3841 + ASSERT(xfs_sb_good_version(sbp)); 3842 xfs_buf_relse(bp); 3843 3844 /* We've re-read the superblock so re-initialize per-cpu counters */
+47 -12
fs/xfs/xfs_mount.c
··· 44 #include "xfs_quota.h" 45 #include "xfs_fsops.h" 46 47 - STATIC void xfs_mount_log_sbunit(xfs_mount_t *, __int64_t); 48 STATIC int xfs_uuid_mount(xfs_mount_t *); 49 STATIC void xfs_uuid_unmount(xfs_mount_t *mp); 50 STATIC void xfs_unmountfs_wait(xfs_mount_t *); ··· 119 { offsetof(xfs_sb_t, sb_logsectsize),0 }, 120 { offsetof(xfs_sb_t, sb_logsunit), 0 }, 121 { offsetof(xfs_sb_t, sb_features2), 0 }, 122 { sizeof(xfs_sb_t), 0 } 123 }; 124 ··· 226 return XFS_ERROR(EWRONGFS); 227 } 228 229 - if (!XFS_SB_GOOD_VERSION(sbp)) { 230 xfs_fs_mount_cmn_err(flags, "bad version"); 231 return XFS_ERROR(EWRONGFS); 232 } ··· 301 /* 302 * Version 1 directory format has never worked on Linux. 303 */ 304 - if (unlikely(!XFS_SB_VERSION_HASDIRV2(sbp))) { 305 xfs_fs_mount_cmn_err(flags, 306 "file system using version 1 directory format"); 307 return XFS_ERROR(ENOSYS); ··· 450 to->sb_logsectsize = be16_to_cpu(from->sb_logsectsize); 451 to->sb_logsunit = be32_to_cpu(from->sb_logsunit); 452 to->sb_features2 = be32_to_cpu(from->sb_features2); 453 } 454 455 /* ··· 783 * Update superblock with new values 784 * and log changes 785 */ 786 - if (XFS_SB_VERSION_HASDALIGN(sbp)) { 787 if (sbp->sb_unit != mp->m_dalign) { 788 sbp->sb_unit = mp->m_dalign; 789 *update_flags |= XFS_SB_UNIT; ··· 794 } 795 } 796 } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN && 797 - XFS_SB_VERSION_HASDALIGN(&mp->m_sb)) { 798 mp->m_dalign = sbp->sb_unit; 799 mp->m_swidth = sbp->sb_width; 800 } ··· 871 STATIC void 872 xfs_set_inoalignment(xfs_mount_t *mp) 873 { 874 - if (XFS_SB_VERSION_HASALIGN(&mp->m_sb) && 875 mp->m_sb.sb_inoalignmt >= 876 XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) 877 mp->m_inoalign_mask = mp->m_sb.sb_inoalignmt - 1; ··· 970 return error; 971 } 972 xfs_mount_common(mp, sbp); 973 974 /* 975 * Check if sb_agblocks is aligned at stripe boundary ··· 1193 } 1194 1195 /* 1196 - * If fs is not mounted readonly, then update the superblock 1197 - * unit and width changes. 1198 */ 1199 if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) 1200 - xfs_mount_log_sbunit(mp, update_flags); 1201 1202 /* 1203 * Initialise the XFS quota management subsystem for this mount ··· 1908 1909 /* 1910 * Used to log changes to the superblock unit and width fields which could 1911 - * be altered by the mount options. Only the first superblock is updated. 1912 */ 1913 STATIC void 1914 - xfs_mount_log_sbunit( 1915 xfs_mount_t *mp, 1916 __int64_t fields) 1917 { 1918 xfs_trans_t *tp; 1919 1920 - ASSERT(fields & (XFS_SB_UNIT|XFS_SB_WIDTH|XFS_SB_UUID)); 1921 1922 tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); 1923 if (xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
··· 44 #include "xfs_quota.h" 45 #include "xfs_fsops.h" 46 47 + STATIC void xfs_mount_log_sb(xfs_mount_t *, __int64_t); 48 STATIC int xfs_uuid_mount(xfs_mount_t *); 49 STATIC void xfs_uuid_unmount(xfs_mount_t *mp); 50 STATIC void xfs_unmountfs_wait(xfs_mount_t *); ··· 119 { offsetof(xfs_sb_t, sb_logsectsize),0 }, 120 { offsetof(xfs_sb_t, sb_logsunit), 0 }, 121 { offsetof(xfs_sb_t, sb_features2), 0 }, 122 + { offsetof(xfs_sb_t, sb_bad_features2), 0 }, 123 { sizeof(xfs_sb_t), 0 } 124 }; 125 ··· 225 return XFS_ERROR(EWRONGFS); 226 } 227 228 + if (!xfs_sb_good_version(sbp)) { 229 xfs_fs_mount_cmn_err(flags, "bad version"); 230 return XFS_ERROR(EWRONGFS); 231 } ··· 300 /* 301 * Version 1 directory format has never worked on Linux. 302 */ 303 + if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { 304 xfs_fs_mount_cmn_err(flags, 305 "file system using version 1 directory format"); 306 return XFS_ERROR(ENOSYS); ··· 449 to->sb_logsectsize = be16_to_cpu(from->sb_logsectsize); 450 to->sb_logsunit = be32_to_cpu(from->sb_logsunit); 451 to->sb_features2 = be32_to_cpu(from->sb_features2); 452 + to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); 453 } 454 455 /* ··· 781 * Update superblock with new values 782 * and log changes 783 */ 784 + if (xfs_sb_version_hasdalign(sbp)) { 785 if (sbp->sb_unit != mp->m_dalign) { 786 sbp->sb_unit = mp->m_dalign; 787 *update_flags |= XFS_SB_UNIT; ··· 792 } 793 } 794 } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN && 795 + xfs_sb_version_hasdalign(&mp->m_sb)) { 796 mp->m_dalign = sbp->sb_unit; 797 mp->m_swidth = sbp->sb_width; 798 } ··· 869 STATIC void 870 xfs_set_inoalignment(xfs_mount_t *mp) 871 { 872 + if (xfs_sb_version_hasalign(&mp->m_sb) && 873 mp->m_sb.sb_inoalignmt >= 874 XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) 875 mp->m_inoalign_mask = mp->m_sb.sb_inoalignmt - 1; ··· 968 return error; 969 } 970 xfs_mount_common(mp, sbp); 971 + 972 + /* 973 + * Check for a mismatched features2 values. Older kernels 974 + * read & wrote into the wrong sb offset for sb_features2 975 + * on some platforms due to xfs_sb_t not being 64bit size aligned 976 + * when sb_features2 was added, which made older superblock 977 + * reading/writing routines swap it as a 64-bit value. 978 + * 979 + * For backwards compatibility, we make both slots equal. 980 + * 981 + * If we detect a mismatched field, we OR the set bits into the 982 + * existing features2 field in case it has already been modified; we 983 + * don't want to lose any features. We then update the bad location 984 + * with the ORed value so that older kernels will see any features2 985 + * flags, and mark the two fields as needing updates once the 986 + * transaction subsystem is online. 987 + */ 988 + if (xfs_sb_has_mismatched_features2(sbp)) { 989 + cmn_err(CE_WARN, 990 + "XFS: correcting sb_features alignment problem"); 991 + sbp->sb_features2 |= sbp->sb_bad_features2; 992 + sbp->sb_bad_features2 = sbp->sb_features2; 993 + update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; 994 + 995 + /* 996 + * Re-check for ATTR2 in case it was found in bad_features2 997 + * slot. 998 + */ 999 + if (xfs_sb_version_hasattr2(&mp->m_sb)) 1000 + mp->m_flags |= XFS_MOUNT_ATTR2; 1001 + 1002 + } 1003 1004 /* 1005 * Check if sb_agblocks is aligned at stripe boundary ··· 1159 } 1160 1161 /* 1162 + * If fs is not mounted readonly, then update the superblock changes. 1163 */ 1164 if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) 1165 + xfs_mount_log_sb(mp, update_flags); 1166 1167 /* 1168 * Initialise the XFS quota management subsystem for this mount ··· 1875 1876 /* 1877 * Used to log changes to the superblock unit and width fields which could 1878 + * be altered by the mount options, as well as any potential sb_features2 1879 + * fixup. Only the first superblock is updated. 1880 */ 1881 STATIC void 1882 + xfs_mount_log_sb( 1883 xfs_mount_t *mp, 1884 __int64_t fields) 1885 { 1886 xfs_trans_t *tp; 1887 1888 + ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID | 1889 + XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2)); 1890 1891 tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); 1892 if (xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
+39 -68
fs/xfs/xfs_sb.h
··· 89 90 /* 91 * Superblock - in core version. Must match the ondisk version below. 92 */ 93 typedef struct xfs_sb { 94 __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ ··· 146 __uint16_t sb_logsectsize; /* sector size for the log, bytes */ 147 __uint32_t sb_logsunit; /* stripe unit size for the log */ 148 __uint32_t sb_features2; /* additional feature bits */ 149 } xfs_sb_t; 150 151 /* 152 - * Superblock - on disk version. Must match the in core version below. 153 */ 154 typedef struct xfs_dsb { 155 __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ ··· 217 __be16 sb_logsectsize; /* sector size for the log, bytes */ 218 __be32 sb_logsunit; /* stripe unit size for the log */ 219 __be32 sb_features2; /* additional feature bits */ 220 } xfs_dsb_t; 221 222 /* ··· 244 XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, 245 XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, 246 XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, 247 - XFS_SBS_FEATURES2, 248 XFS_SBS_FIELDCOUNT 249 } xfs_sb_field_t; 250 ··· 269 #define XFS_SB_IFREE XFS_SB_MVAL(IFREE) 270 #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) 271 #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) 272 #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) 273 #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) 274 #define XFS_SB_MOD_BITS \ 275 (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ 276 XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ 277 XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ 278 - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2) 279 280 281 /* ··· 294 295 #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) 296 297 - #define XFS_SB_GOOD_VERSION(sbp) xfs_sb_good_version(sbp) 298 #ifdef __KERNEL__ 299 static inline int xfs_sb_good_version(xfs_sb_t *sbp) 300 { ··· 319 } 320 #endif /* __KERNEL__ */ 321 322 - #define XFS_SB_VERSION_TONEW(v) xfs_sb_version_tonew(v) 323 static inline unsigned xfs_sb_version_tonew(unsigned v) 324 { 325 return ((((v) == XFS_SB_VERSION_1) ? \ ··· 338 XFS_SB_VERSION_4); 339 } 340 341 - #define XFS_SB_VERSION_TOOLD(v) xfs_sb_version_toold(v) 342 static inline unsigned xfs_sb_version_toold(unsigned v) 343 { 344 return (((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \ ··· 349 XFS_SB_VERSION_1))); 350 } 351 352 - #define XFS_SB_VERSION_HASATTR(sbp) xfs_sb_version_hasattr(sbp) 353 static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) 354 { 355 return ((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \ ··· 357 ((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); 358 } 359 360 - #define XFS_SB_VERSION_ADDATTR(sbp) xfs_sb_version_addattr(sbp) 361 static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) 362 { 363 (sbp)->sb_versionnum = (((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \ ··· 366 (XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT))); 367 } 368 369 - #define XFS_SB_VERSION_HASNLINK(sbp) xfs_sb_version_hasnlink(sbp) 370 static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) 371 { 372 return ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ ··· 373 ((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); 374 } 375 376 - #define XFS_SB_VERSION_ADDNLINK(sbp) xfs_sb_version_addnlink(sbp) 377 static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) 378 { 379 (sbp)->sb_versionnum = ((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \ ··· 380 ((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT)); 381 } 382 383 - #define XFS_SB_VERSION_HASQUOTA(sbp) xfs_sb_version_hasquota(sbp) 384 static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) 385 { 386 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 387 ((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT); 388 } 389 390 - #define XFS_SB_VERSION_ADDQUOTA(sbp) xfs_sb_version_addquota(sbp) 391 static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) 392 { 393 (sbp)->sb_versionnum = \ 394 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \ 395 ((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \ 396 - (XFS_SB_VERSION_TONEW((sbp)->sb_versionnum) | \ 397 XFS_SB_VERSION_QUOTABIT)); 398 } 399 400 - #define XFS_SB_VERSION_HASALIGN(sbp) xfs_sb_version_hasalign(sbp) 401 static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) 402 { 403 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 404 ((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); 405 } 406 407 - #define XFS_SB_VERSION_SUBALIGN(sbp) xfs_sb_version_subalign(sbp) 408 - static inline void xfs_sb_version_subalign(xfs_sb_t *sbp) 409 - { 410 - (sbp)->sb_versionnum = \ 411 - XFS_SB_VERSION_TOOLD((sbp)->sb_versionnum & ~XFS_SB_VERSION_ALIGNBIT); 412 - } 413 - 414 - #define XFS_SB_VERSION_HASDALIGN(sbp) xfs_sb_version_hasdalign(sbp) 415 static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) 416 { 417 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 418 ((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); 419 } 420 421 - #define XFS_SB_VERSION_ADDDALIGN(sbp) xfs_sb_version_adddalign(sbp) 422 - static inline int xfs_sb_version_adddalign(xfs_sb_t *sbp) 423 - { 424 - return (sbp)->sb_versionnum = \ 425 - ((sbp)->sb_versionnum | XFS_SB_VERSION_DALIGNBIT); 426 - } 427 - 428 - #define XFS_SB_VERSION_HASSHARED(sbp) xfs_sb_version_hasshared(sbp) 429 static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) 430 { 431 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 432 ((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); 433 } 434 435 - #define XFS_SB_VERSION_ADDSHARED(sbp) xfs_sb_version_addshared(sbp) 436 - static inline int xfs_sb_version_addshared(xfs_sb_t *sbp) 437 - { 438 - return (sbp)->sb_versionnum = \ 439 - ((sbp)->sb_versionnum | XFS_SB_VERSION_SHAREDBIT); 440 - } 441 - 442 - #define XFS_SB_VERSION_SUBSHARED(sbp) xfs_sb_version_subshared(sbp) 443 - static inline int xfs_sb_version_subshared(xfs_sb_t *sbp) 444 - { 445 - return (sbp)->sb_versionnum = \ 446 - ((sbp)->sb_versionnum & ~XFS_SB_VERSION_SHAREDBIT); 447 - } 448 - 449 - #define XFS_SB_VERSION_HASDIRV2(sbp) xfs_sb_version_hasdirv2(sbp) 450 static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) 451 { 452 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 453 ((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); 454 } 455 456 - #define XFS_SB_VERSION_HASLOGV2(sbp) xfs_sb_version_haslogv2(sbp) 457 static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) 458 { 459 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 460 ((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); 461 } 462 463 - #define XFS_SB_VERSION_HASEXTFLGBIT(sbp) xfs_sb_version_hasextflgbit(sbp) 464 static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) 465 { 466 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 467 ((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); 468 } 469 470 - #define XFS_SB_VERSION_ADDEXTFLGBIT(sbp) xfs_sb_version_addextflgbit(sbp) 471 - static inline int xfs_sb_version_addextflgbit(xfs_sb_t *sbp) 472 - { 473 - return (sbp)->sb_versionnum = \ 474 - ((sbp)->sb_versionnum | XFS_SB_VERSION_EXTFLGBIT); 475 - } 476 - 477 - #define XFS_SB_VERSION_SUBEXTFLGBIT(sbp) xfs_sb_version_subextflgbit(sbp) 478 - static inline int xfs_sb_version_subextflgbit(xfs_sb_t *sbp) 479 - { 480 - return (sbp)->sb_versionnum = \ 481 - ((sbp)->sb_versionnum & ~XFS_SB_VERSION_EXTFLGBIT); 482 - } 483 - 484 - #define XFS_SB_VERSION_HASSECTOR(sbp) xfs_sb_version_hassector(sbp) 485 static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) 486 { 487 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 488 ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT); 489 } 490 491 - #define XFS_SB_VERSION_HASMOREBITS(sbp) xfs_sb_version_hasmorebits(sbp) 492 static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) 493 { 494 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ ··· 449 * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: 450 * 451 * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) 452 - * ((XFS_SB_VERSION_HASMOREBITS(sbp) && 453 * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) 454 */ 455 456 static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) 457 { 458 - return (XFS_SB_VERSION_HASMOREBITS(sbp) && \ 459 ((sbp)->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); 460 } 461 462 - #define XFS_SB_VERSION_HASATTR2(sbp) xfs_sb_version_hasattr2(sbp) 463 static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) 464 { 465 - return (XFS_SB_VERSION_HASMOREBITS(sbp)) && \ 466 ((sbp)->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); 467 } 468 469 - #define XFS_SB_VERSION_ADDATTR2(sbp) xfs_sb_version_addattr2(sbp) 470 static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) 471 { 472 ((sbp)->sb_versionnum = \
··· 89 90 /* 91 * Superblock - in core version. Must match the ondisk version below. 92 + * Must be padded to 64 bit alignment. 93 */ 94 typedef struct xfs_sb { 95 __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ ··· 145 __uint16_t sb_logsectsize; /* sector size for the log, bytes */ 146 __uint32_t sb_logsunit; /* stripe unit size for the log */ 147 __uint32_t sb_features2; /* additional feature bits */ 148 + 149 + /* 150 + * bad features2 field as a result of failing to pad the sb 151 + * structure to 64 bits. Some machines will be using this field 152 + * for features2 bits. Easiest just to mark it bad and not use 153 + * it for anything else. 154 + */ 155 + __uint32_t sb_bad_features2; 156 + 157 + /* must be padded to 64 bit alignment */ 158 } xfs_sb_t; 159 160 /* 161 + * Superblock - on disk version. Must match the in core version above. 162 + * Must be padded to 64 bit alignment. 163 */ 164 typedef struct xfs_dsb { 165 __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ ··· 205 __be16 sb_logsectsize; /* sector size for the log, bytes */ 206 __be32 sb_logsunit; /* stripe unit size for the log */ 207 __be32 sb_features2; /* additional feature bits */ 208 + /* 209 + * bad features2 field as a result of failing to pad the sb 210 + * structure to 64 bits. Some machines will be using this field 211 + * for features2 bits. Easiest just to mark it bad and not use 212 + * it for anything else. 213 + */ 214 + __be32 sb_bad_features2; 215 + 216 + /* must be padded to 64 bit alignment */ 217 } xfs_dsb_t; 218 219 /* ··· 223 XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, 224 XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, 225 XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, 226 + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, 227 XFS_SBS_FIELDCOUNT 228 } xfs_sb_field_t; 229 ··· 248 #define XFS_SB_IFREE XFS_SB_MVAL(IFREE) 249 #define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) 250 #define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) 251 + #define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) 252 #define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) 253 #define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) 254 #define XFS_SB_MOD_BITS \ 255 (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ 256 XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ 257 XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ 258 + XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ 259 + XFS_SB_BAD_FEATURES2) 260 261 262 /* ··· 271 272 #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) 273 274 #ifdef __KERNEL__ 275 static inline int xfs_sb_good_version(xfs_sb_t *sbp) 276 { ··· 297 } 298 #endif /* __KERNEL__ */ 299 300 + /* 301 + * Detect a mismatched features2 field. Older kernels read/wrote 302 + * this into the wrong slot, so to be safe we keep them in sync. 303 + */ 304 + static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) 305 + { 306 + return (sbp->sb_bad_features2 != sbp->sb_features2); 307 + } 308 + 309 static inline unsigned xfs_sb_version_tonew(unsigned v) 310 { 311 return ((((v) == XFS_SB_VERSION_1) ? \ ··· 308 XFS_SB_VERSION_4); 309 } 310 311 static inline unsigned xfs_sb_version_toold(unsigned v) 312 { 313 return (((v) & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) ? \ ··· 320 XFS_SB_VERSION_1))); 321 } 322 323 static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) 324 { 325 return ((sbp)->sb_versionnum == XFS_SB_VERSION_2) || \ ··· 329 ((sbp)->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); 330 } 331 332 static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) 333 { 334 (sbp)->sb_versionnum = (((sbp)->sb_versionnum == XFS_SB_VERSION_1) ? \ ··· 339 (XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT))); 340 } 341 342 static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) 343 { 344 return ((sbp)->sb_versionnum == XFS_SB_VERSION_3) || \ ··· 347 ((sbp)->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); 348 } 349 350 static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) 351 { 352 (sbp)->sb_versionnum = ((sbp)->sb_versionnum <= XFS_SB_VERSION_2 ? \ ··· 355 ((sbp)->sb_versionnum | XFS_SB_VERSION_NLINKBIT)); 356 } 357 358 static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) 359 { 360 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 361 ((sbp)->sb_versionnum & XFS_SB_VERSION_QUOTABIT); 362 } 363 364 static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) 365 { 366 (sbp)->sb_versionnum = \ 367 (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 ? \ 368 ((sbp)->sb_versionnum | XFS_SB_VERSION_QUOTABIT) : \ 369 + (xfs_sb_version_tonew((sbp)->sb_versionnum) | \ 370 XFS_SB_VERSION_QUOTABIT)); 371 } 372 373 static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) 374 { 375 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 376 ((sbp)->sb_versionnum & XFS_SB_VERSION_ALIGNBIT); 377 } 378 379 static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) 380 { 381 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 382 ((sbp)->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); 383 } 384 385 static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) 386 { 387 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 388 ((sbp)->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); 389 } 390 391 static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) 392 { 393 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 394 ((sbp)->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); 395 } 396 397 static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) 398 { 399 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 400 ((sbp)->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); 401 } 402 403 static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) 404 { 405 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 406 ((sbp)->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); 407 } 408 409 static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) 410 { 411 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ 412 ((sbp)->sb_versionnum & XFS_SB_VERSION_SECTORBIT); 413 } 414 415 static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) 416 { 417 return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) && \ ··· 476 * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: 477 * 478 * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) 479 + * ((xfs_sb_version_hasmorebits(sbp) && 480 * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) 481 */ 482 483 static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) 484 { 485 + return (xfs_sb_version_hasmorebits(sbp) && \ 486 ((sbp)->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); 487 } 488 489 static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) 490 { 491 + return (xfs_sb_version_hasmorebits(sbp)) && \ 492 ((sbp)->sb_features2 & XFS_SB_VERSION2_ATTR2BIT); 493 } 494 495 static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) 496 { 497 ((sbp)->sb_versionnum = \
+3 -3
fs/xfs/xfs_utils.c
··· 339 ip->i_d.di_onlink = 0; 340 memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); 341 mp = tp->t_mountp; 342 - if (!XFS_SB_VERSION_HASNLINK(&mp->m_sb)) { 343 spin_lock(&mp->m_sb_lock); 344 - if (!XFS_SB_VERSION_HASNLINK(&mp->m_sb)) { 345 - XFS_SB_VERSION_ADDNLINK(&mp->m_sb); 346 spin_unlock(&mp->m_sb_lock); 347 xfs_mod_sb(tp, XFS_SB_VERSIONNUM); 348 } else {
··· 339 ip->i_d.di_onlink = 0; 340 memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); 341 mp = tp->t_mountp; 342 + if (!xfs_sb_version_hasnlink(&mp->m_sb)) { 343 spin_lock(&mp->m_sb_lock); 344 + if (!xfs_sb_version_hasnlink(&mp->m_sb)) { 345 + xfs_sb_version_addnlink(&mp->m_sb); 346 spin_unlock(&mp->m_sb_lock); 347 xfs_mod_sb(tp, XFS_SB_VERSIONNUM); 348 } else {
+4 -5
fs/xfs/xfs_vfsops.c
··· 330 int ronly = (mp->m_flags & XFS_MOUNT_RDONLY); 331 332 /* Fail a mount where the logbuf is smaller then the log stripe */ 333 - if (XFS_SB_VERSION_HASLOGV2(&mp->m_sb)) { 334 if ((ap->logbufsize <= 0) && 335 (mp->m_sb.sb_logsunit > XLOG_BIG_RECORD_BSIZE)) { 336 mp->m_logbsize = mp->m_sb.sb_logsunit; ··· 349 } 350 } 351 352 - if (XFS_SB_VERSION_HASATTR2(&mp->m_sb)) { 353 mp->m_flags |= XFS_MOUNT_ATTR2; 354 - } 355 356 /* 357 * prohibit r/w mounts of read-only filesystems ··· 365 * check for shared mount. 366 */ 367 if (ap->flags & XFSMNT_SHARED) { 368 - if (!XFS_SB_VERSION_HASSHARED(&mp->m_sb)) 369 return XFS_ERROR(EINVAL); 370 371 /* ··· 511 if (!error && logdev && logdev != ddev) { 512 unsigned int log_sector_size = BBSIZE; 513 514 - if (XFS_SB_VERSION_HASSECTOR(&mp->m_sb)) 515 log_sector_size = mp->m_sb.sb_logsectsize; 516 error = xfs_setsize_buftarg(mp->m_logdev_targp, 517 mp->m_sb.sb_blocksize,
··· 330 int ronly = (mp->m_flags & XFS_MOUNT_RDONLY); 331 332 /* Fail a mount where the logbuf is smaller then the log stripe */ 333 + if (xfs_sb_version_haslogv2(&mp->m_sb)) { 334 if ((ap->logbufsize <= 0) && 335 (mp->m_sb.sb_logsunit > XLOG_BIG_RECORD_BSIZE)) { 336 mp->m_logbsize = mp->m_sb.sb_logsunit; ··· 349 } 350 } 351 352 + if (xfs_sb_version_hasattr2(&mp->m_sb)) 353 mp->m_flags |= XFS_MOUNT_ATTR2; 354 355 /* 356 * prohibit r/w mounts of read-only filesystems ··· 366 * check for shared mount. 367 */ 368 if (ap->flags & XFSMNT_SHARED) { 369 + if (!xfs_sb_version_hasshared(&mp->m_sb)) 370 return XFS_ERROR(EINVAL); 371 372 /* ··· 512 if (!error && logdev && logdev != ddev) { 513 unsigned int log_sector_size = BBSIZE; 514 515 + if (xfs_sb_version_hassector(&mp->m_sb)) 516 log_sector_size = mp->m_sb.sb_logsectsize; 517 error = xfs_setsize_buftarg(mp->m_logdev_targp, 518 mp->m_sb.sb_blocksize,
+1 -1
fs/xfs/xfs_vnodeops.c
··· 4132 * actually need to zero the extent edges. Otherwise xfs_bunmapi 4133 * will take care of it for us. 4134 */ 4135 - if (rt && !XFS_SB_VERSION_HASEXTFLGBIT(&mp->m_sb)) { 4136 nimap = 1; 4137 error = xfs_bmapi(NULL, ip, startoffset_fsb, 4138 1, 0, NULL, 0, &imap, &nimap, NULL, NULL);
··· 4132 * actually need to zero the extent edges. Otherwise xfs_bunmapi 4133 * will take care of it for us. 4134 */ 4135 + if (rt && !xfs_sb_version_hasextflgbit(&mp->m_sb)) { 4136 nimap = 1; 4137 error = xfs_bmapi(NULL, ip, startoffset_fsb, 4138 1, 0, NULL, 0, &imap, &nimap, NULL, NULL);