diff options
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_clnt.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 12 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_sb.h | 7 | ||||
-rw-r--r-- | fs/xfs/xfs_vfsops.c | 9 |
6 files changed, 29 insertions, 2 deletions
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 943381284e2e..1b60e46f527f 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -314,6 +314,7 @@ xfs_parseargs( | |||
314 | args->flags |= XFSMNT_ATTR2; | 314 | args->flags |= XFSMNT_ATTR2; |
315 | } else if (!strcmp(this_char, MNTOPT_NOATTR2)) { | 315 | } else if (!strcmp(this_char, MNTOPT_NOATTR2)) { |
316 | args->flags &= ~XFSMNT_ATTR2; | 316 | args->flags &= ~XFSMNT_ATTR2; |
317 | args->flags |= XFSMNT_NOATTR2; | ||
317 | } else if (!strcmp(this_char, MNTOPT_FILESTREAM)) { | 318 | } else if (!strcmp(this_char, MNTOPT_FILESTREAM)) { |
318 | args->flags2 |= XFSMNT2_FILESTREAMS; | 319 | args->flags2 |= XFSMNT2_FILESTREAMS; |
319 | } else if (!strcmp(this_char, MNTOPT_NOQUOTA)) { | 320 | } else if (!strcmp(this_char, MNTOPT_NOQUOTA)) { |
diff --git a/fs/xfs/xfs_clnt.h b/fs/xfs/xfs_clnt.h index d5d1e60ee224..d2ce5dd70d87 100644 --- a/fs/xfs/xfs_clnt.h +++ b/fs/xfs/xfs_clnt.h | |||
@@ -78,6 +78,7 @@ struct xfs_mount_args { | |||
78 | #define XFSMNT_IOSIZE 0x00002000 /* optimize for I/O size */ | 78 | #define XFSMNT_IOSIZE 0x00002000 /* optimize for I/O size */ |
79 | #define XFSMNT_OSYNCISOSYNC 0x00004000 /* o_sync is REALLY o_sync */ | 79 | #define XFSMNT_OSYNCISOSYNC 0x00004000 /* o_sync is REALLY o_sync */ |
80 | /* (osyncisdsync is default) */ | 80 | /* (osyncisdsync is default) */ |
81 | #define XFSMNT_NOATTR2 0x00008000 /* turn off ATTR2 EA format */ | ||
81 | #define XFSMNT_32BITINODES 0x00200000 /* restrict inodes to 32 | 82 | #define XFSMNT_32BITINODES 0x00200000 /* restrict inodes to 32 |
82 | * bits of address space */ | 83 | * bits of address space */ |
83 | #define XFSMNT_GQUOTA 0x00400000 /* group quota accounting */ | 84 | #define XFSMNT_GQUOTA 0x00400000 /* group quota accounting */ |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index da3988453b71..361c7a755a07 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
@@ -994,9 +994,19 @@ xfs_mountfs( | |||
994 | * Re-check for ATTR2 in case it was found in bad_features2 | 994 | * Re-check for ATTR2 in case it was found in bad_features2 |
995 | * slot. | 995 | * slot. |
996 | */ | 996 | */ |
997 | if (xfs_sb_version_hasattr2(&mp->m_sb)) | 997 | if (xfs_sb_version_hasattr2(&mp->m_sb) && |
998 | !(mp->m_flags & XFS_MOUNT_NOATTR2)) | ||
998 | mp->m_flags |= XFS_MOUNT_ATTR2; | 999 | mp->m_flags |= XFS_MOUNT_ATTR2; |
1000 | } | ||
1001 | |||
1002 | if (xfs_sb_version_hasattr2(&mp->m_sb) && | ||
1003 | (mp->m_flags & XFS_MOUNT_NOATTR2)) { | ||
1004 | xfs_sb_version_removeattr2(&mp->m_sb); | ||
1005 | update_flags |= XFS_SB_FEATURES2; | ||
999 | 1006 | ||
1007 | /* update sb_versionnum for the clearing of the morebits */ | ||
1008 | if (!sbp->sb_features2) | ||
1009 | update_flags |= XFS_SB_VERSIONNUM; | ||
1000 | } | 1010 | } |
1001 | 1011 | ||
1002 | /* | 1012 | /* |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 63e0693a358a..4aff0c125ad3 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
@@ -378,6 +378,7 @@ typedef struct xfs_mount { | |||
378 | counters */ | 378 | counters */ |
379 | #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams | 379 | #define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams |
380 | allocator */ | 380 | allocator */ |
381 | #define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ | ||
381 | 382 | ||
382 | 383 | ||
383 | /* | 384 | /* |
diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index d904efe7f871..e3204a36a222 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h | |||
@@ -473,6 +473,13 @@ static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) | |||
473 | ((sbp)->sb_features2 | XFS_SB_VERSION2_ATTR2BIT))); | 473 | ((sbp)->sb_features2 | XFS_SB_VERSION2_ATTR2BIT))); |
474 | } | 474 | } |
475 | 475 | ||
476 | static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) | ||
477 | { | ||
478 | sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; | ||
479 | if (!sbp->sb_features2) | ||
480 | sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; | ||
481 | } | ||
482 | |||
476 | /* | 483 | /* |
477 | * end of superblock version macros | 484 | * end of superblock version macros |
478 | */ | 485 | */ |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 30bacd8bb0e5..bbc911720d81 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -284,6 +284,8 @@ xfs_start_flags( | |||
284 | mp->m_flags |= XFS_MOUNT_DIRSYNC; | 284 | mp->m_flags |= XFS_MOUNT_DIRSYNC; |
285 | if (ap->flags & XFSMNT_ATTR2) | 285 | if (ap->flags & XFSMNT_ATTR2) |
286 | mp->m_flags |= XFS_MOUNT_ATTR2; | 286 | mp->m_flags |= XFS_MOUNT_ATTR2; |
287 | if (ap->flags & XFSMNT_NOATTR2) | ||
288 | mp->m_flags |= XFS_MOUNT_NOATTR2; | ||
287 | 289 | ||
288 | if (ap->flags2 & XFSMNT2_COMPAT_IOSIZE) | 290 | if (ap->flags2 & XFSMNT2_COMPAT_IOSIZE) |
289 | mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; | 291 | mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; |
@@ -346,7 +348,12 @@ xfs_finish_flags( | |||
346 | } | 348 | } |
347 | } | 349 | } |
348 | 350 | ||
349 | if (xfs_sb_version_hasattr2(&mp->m_sb)) | 351 | /* |
352 | * mkfs'ed attr2 will turn on attr2 mount unless explicitly | ||
353 | * told by noattr2 to turn it off | ||
354 | */ | ||
355 | if (xfs_sb_version_hasattr2(&mp->m_sb) && | ||
356 | !(ap->flags & XFSMNT_NOATTR2)) | ||
350 | mp->m_flags |= XFS_MOUNT_ATTR2; | 357 | mp->m_flags |= XFS_MOUNT_ATTR2; |
351 | 358 | ||
352 | /* | 359 | /* |