xfs: sanitise superblock feature bit support
v2 cover xfs: sanitise superblock feature bit support
Hi folks,
This is a followup series that addresses the review comments made for this version:
http://oss.sgi.com/pipermail/xfs/2014-May/036025.html
The main change is to the NLINK/inode version handling (patch 3) where xfs_iread() now unconditionally converts inodes to v2 format in memory, so that if they are logged and written back they always get converted to v2 format. This means there is no more bumping of inode versions when link counts change, and xfs_iflush_int() no longer writes v1 inodes at all.
Comments, testing, etc all welcome.
Version 2:
- rework inode version handling
- remove fetaure bit template comment in xfs_sb.h
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 1/5 xfs: make superblock version checks reflect reality
From: Dave Chinner <[email protected]>
We only support filesystems that have v2 directory support, and than means all the checking and handling of superblock versions prior to this support being added is completely unnecessary overhead.
Strip out all the version 1-3 support, sanitise the good version checking to reflect the supported versions, update all the feature supported functions and clean up all the support bit definitions to reflect the fact that we no longer care about Irix bootloader flag regions for v4 feature bits. Also, convert the return values to boolean types and remove typedefs from function declarations to clean up calling conventions, too.
Because the feature bit checking is all inline code, this relatively small cleanup has a noticable impact on code size:
text data bss dec hex filename 785195 100867 616 886678 d8796 fs/xfs/xfs.o.orig 783595 100867 616 885078 d8156 fs/xfs/xfs.o.patched
i.e. it reduces it by 1600 bytes.
--- fs/xfs/xfs_sb.h | 220 ++++++++++++++++++++------------------------------------ 1 file changed, 76 insertions(+), 144 deletions(-)
fs/xfs/xfs_sb.h +76 -144
@@ -36,8 +36,6 @@ struct xfs_trans;#define XFS_SB_VERSION_5 5/* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f#define XFS_SB_VERSION_ALLFBITS 0xfff0 -#define XFS_SB_VERSION_SASHFBITS 0xf000 -#define XFS_SB_VERSION_REALFBITS 0x0ff0#define XFS_SB_VERSION_ATTRBIT 0x0010#define XFS_SB_VERSION_NLINKBIT 0x0020#define XFS_SB_VERSION_QUOTABIT 0x0040
@@ -50,24 +48,14 @@ struct xfs_trans;#define XFS_SB_VERSION_DIRV2BIT 0x2000#define XFS_SB_VERSION_BORGBIT 0x4000/* ASCII only case-insens. */ #define XFS_SB_VERSION_MOREBITSBIT 0x8000 -#define XFS_SB_VERSION_OKSASHFBITS \ - (XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT | \ - XFS_SB_VERSION_BORGBIT) -#define XFS_SB_VERSION_OKREALFBITS \ - (XFS_SB_VERSION_ATTRBIT | \ - XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_QUOTABIT | \ - XFS_SB_VERSION_ALIGNBIT | \ - XFS_SB_VERSION_DALIGNBIT | \ - XFS_SB_VERSION_SHAREDBIT | \ - XFS_SB_VERSION_LOGV2BIT | \ - XFS_SB_VERSION_SECTORBIT | \ - XFS_SB_VERSION_MOREBITSBIT) -#define XFS_SB_VERSION_OKREALBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_OKREALFBITS | \ - XFS_SB_VERSION_OKSASHFBITS) + +/* +* Supported feature bit list is just all bits in the versionnum field because +* we've used them all up and understand them all. +*/ +#define XFS_SB_VERSION_OKBITS \ + (XFS_SB_VERSION_NUMBITS | \ + XFS_SB_VERSION_ALLFBITS)/* * There are two words to hold XFS "feature" bits: the original
@@ -76,7 +64,6 @@ struct xfs_trans;* * These defines represent bits in sb_features2. */ -#define XFS_SB_VERSION2_REALFBITS 0x00ffffff/* Mask: features */ #define XFS_SB_VERSION2_RESERVED1BIT 0x00000001#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002/* Superblk counters */ #define XFS_SB_VERSION2_RESERVED4BIT 0x00000004
@@ -86,16 +73,11 @@ struct xfs_trans;#define XFS_SB_VERSION2_CRCBIT 0x00000100/* metadata CRCs */ #define XFS_SB_VERSION2_FTYPE 0x00000200/* inode type in dir */ -#define XFS_SB_VERSION2_OKREALFBITS \ +#define XFS_SB_VERSION2_OKBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ XFS_SB_VERSION2_PROJID32BIT | \ XFS_SB_VERSION2_FTYPE) -#define XFS_SB_VERSION2_OKSASHFBITS \ - (0) -#define XFS_SB_VERSION2_OKREALBITS \ - (XFS_SB_VERSION2_OKREALFBITS | \ - XFS_SB_VERSION2_OKSASHFBITS )/* * Superblock - in core version. Must match the ondisk version below.
@@ -345,214 +327,164 @@ typedef enum {#define XFS_SB_VERSION_NUM (sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) -static inline int xfs_sb_good_version (xfs_sb_t *sbp) +/* +* The first XFS version we support is a v4 superblock with V2 directories. +*/ +static inline bool xfs_sb_good_v4_features (struct xfs_sb *sbp) { -/* We always support version 1-3 */ -if (sbp->sb_versionnum >=XFS_SB_VERSION_1 && - sbp->sb_versionnum <=XFS_SB_VERSION_3 ) -return 1 ; +if (!(sbp->sb_versionnum &XFS_SB_VERSION_DIRV2BIT )) +return false; -/* We support version 4 if all feature bits are supported */ -if (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 ) { -if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS ) || - ((sbp->sb_versionnum &XFS_SB_VERSION_MOREBITSBIT ) && - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS ))) -return 0 ; +/* check for unknown features in the fs */ +if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS ) || + ((sbp->sb_versionnum &XFS_SB_VERSION_MOREBITSBIT ) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS ))) +return false; -if (sbp->sb_shared_vn >XFS_SB_MAX_SHARED_VN ) -return 0 ; -return 1 ; - } -if (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) -return 1 ; +/* We don't support shared superblocks - nobody knows what it is */ +if (sbp->sb_versionnum &XFS_SB_VERSION_SHAREDBIT ) +return false; -return 0 ; +return true; +} + +static inline bool xfs_sb_good_version (struct xfs_sb *sbp) +{ +if (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) +return true; +if (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 ) +return xfs_sb_good_v4_features (sbp); +return false; }/* * Detect a mismatched features2 field. Older kernels read/wrote * this into the wrong slot, so to be safe we keep them in sync. */ -static inline int xfs_sb_has_mismatched_features2 (xfs_sb_t *sbp) -{ -return (sbp->sb_bad_features2 != sbp->sb_features2); -} - -static inline unsigned xfs_sb_version_tonew (unsigned v) +static inline bool xfs_sb_has_mismatched_features2 (struct xfs_sb *sbp) { -if (v ==XFS_SB_VERSION_1 ) -return XFS_SB_VERSION_4 ; - -if (v ==XFS_SB_VERSION_2 ) -return XFS_SB_VERSION_4 |XFS_SB_VERSION_ATTRBIT ; - -return XFS_SB_VERSION_4 |XFS_SB_VERSION_ATTRBIT | -XFS_SB_VERSION_NLINKBIT ; +return sbp->sb_bad_features2 != sbp->sb_features2; } -static inline unsigned xfs_sb_version_toold (unsigned v) +static inline bool xfs_sb_version_hasattr (struct xfs_sb *sbp) { -if (v & (XFS_SB_VERSION_QUOTABIT |XFS_SB_VERSION_ALIGNBIT )) -return 0 ; -if (v &XFS_SB_VERSION_NLINKBIT ) -return XFS_SB_VERSION_3 ; -if (v &XFS_SB_VERSION_ATTRBIT ) -return XFS_SB_VERSION_2 ; -return XFS_SB_VERSION_1 ; +return (sbp->sb_versionnum &XFS_SB_VERSION_ATTRBIT ); } -static inline int xfs_sb_version_hasattr (xfs_sb_t *sbp) +static inline void xfs_sb_version_addattr (struct xfs_sb *sbp) { -return sbp->sb_versionnum ==XFS_SB_VERSION_2 || - sbp->sb_versionnum ==XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_ATTRBIT )); + sbp->sb_versionnum |=XFS_SB_VERSION_ATTRBIT ; } -static inline void xfs_sb_version_addattr (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasnlink (struct xfs_sb *sbp) { -if (sbp->sb_versionnum ==XFS_SB_VERSION_1 ) - sbp->sb_versionnum =XFS_SB_VERSION_2 ; -else if (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 ) - sbp->sb_versionnum |=XFS_SB_VERSION_ATTRBIT ; -else - sbp->sb_versionnum =XFS_SB_VERSION_4 |XFS_SB_VERSION_ATTRBIT ; +return (sbp->sb_versionnum &XFS_SB_VERSION_NLINKBIT ); } -static inline int xfs_sb_version_hasnlink (xfs_sb_t *sbp) +static inline void xfs_sb_version_addnlink (struct xfs_sb *sbp) { -return sbp->sb_versionnum ==XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_NLINKBIT )); + sbp->sb_versionnum |=XFS_SB_VERSION_NLINKBIT ; } -static inline void xfs_sb_version_addnlink (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasquota (struct xfs_sb *sbp) { -if (sbp->sb_versionnum <=XFS_SB_VERSION_2 ) - sbp->sb_versionnum =XFS_SB_VERSION_3 ; -else - sbp->sb_versionnum |=XFS_SB_VERSION_NLINKBIT ; +return (sbp->sb_versionnum &XFS_SB_VERSION_QUOTABIT ); } -static inline int xfs_sb_version_hasquota (xfs_sb_t *sbp) +static inline void xfs_sb_version_addquota (struct xfs_sb *sbp) { -return XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_QUOTABIT ); + sbp->sb_versionnum |=XFS_SB_VERSION_QUOTABIT ; } -static inline void xfs_sb_version_addquota (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasalign (struct xfs_sb *sbp) { -if (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 ) - sbp->sb_versionnum |=XFS_SB_VERSION_QUOTABIT ; -else - sbp->sb_versionnum =xfs_sb_version_tonew (sbp->sb_versionnum) | -XFS_SB_VERSION_QUOTABIT ; -} - -static inline int xfs_sb_version_hasalign (xfs_sb_t *sbp) -{ -return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || - (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && +return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || (sbp->sb_versionnum &XFS_SB_VERSION_ALIGNBIT )); } -static inline int xfs_sb_version_hasdalign (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdalign (struct xfs_sb *sbp) { -return XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_DALIGNBIT ); +return (sbp->sb_versionnum &XFS_SB_VERSION_DALIGNBIT ); } -static inline int xfs_sb_version_hasshared (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasshared (struct xfs_sb *sbp) {return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 && (sbp->sb_versionnum &XFS_SB_VERSION_SHAREDBIT ); } -static inline int xfs_sb_version_hasdirv2 (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdirv2 (struct xfs_sb *sbp) { -return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || - (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_DIRV2BIT )); +return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || + (sbp->sb_versionnum &XFS_SB_VERSION_DIRV2BIT ); } -static inline int xfs_sb_version_haslogv2 (xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslogv2 (struct xfs_sb *sbp) { -return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || - (XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_LOGV2BIT )); +return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || + (sbp->sb_versionnum &XFS_SB_VERSION_LOGV2BIT ); } -static inline int xfs_sb_version_hasextflgbit (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasextflgbit (struct xfs_sb *sbp) { -return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || - (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_EXTFLGBIT )); +return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || + (sbp->sb_versionnum &XFS_SB_VERSION_EXTFLGBIT ); } -static inline int xfs_sb_version_hassector (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hassector (struct xfs_sb *sbp) { -return XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_SECTORBIT ); +return (sbp->sb_versionnum &XFS_SB_VERSION_SECTORBIT ); } -static inline int xfs_sb_version_hasasciici (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasasciici (struct xfs_sb *sbp) { -return XFS_SB_VERSION_NUM (sbp) >=XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_BORGBIT ); +return (sbp->sb_versionnum &XFS_SB_VERSION_BORGBIT ); } -static inline int xfs_sb_version_hasmorebits (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasmorebits (struct xfs_sb *sbp) { -return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || - (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_MOREBITSBIT )); +return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || + (sbp->sb_versionnum &XFS_SB_VERSION_MOREBITSBIT ); }/* * sb_features2 bit version macros. -* -* For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: -* -* SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) -* ((xfs_sb_version_hasmorebits(sbp) && -* ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) */ - -static inline int xfs_sb_version_haslazysbcount (xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslazysbcount (struct xfs_sb *sbp) {return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || (xfs_sb_version_hasmorebits (sbp) && (sbp->sb_features2 &XFS_SB_VERSION2_LAZYSBCOUNTBIT )); } -static inline int xfs_sb_version_hasattr2 (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasattr2 (struct xfs_sb *sbp) {return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || (xfs_sb_version_hasmorebits (sbp) && (sbp->sb_features2 &XFS_SB_VERSION2_ATTR2BIT )); } -static inline void xfs_sb_version_addattr2 (xfs_sb_t *sbp) +static inline void xfs_sb_version_addattr2 (struct xfs_sb *sbp) { sbp->sb_versionnum |=XFS_SB_VERSION_MOREBITSBIT ; sbp->sb_features2 |=XFS_SB_VERSION2_ATTR2BIT ; } -static inline void xfs_sb_version_removeattr2 (xfs_sb_t *sbp) +static inline void xfs_sb_version_removeattr2 (struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT ;if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT ; } -static inline int xfs_sb_version_hasprojid32bit (xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasprojid32bit (struct xfs_sb *sbp) {return (XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ) || (xfs_sb_version_hasmorebits (sbp) && (sbp->sb_features2 &XFS_SB_VERSION2_PROJID32BIT )); } -static inline void xfs_sb_version_addprojid32bit (xfs_sb_t *sbp) +static inline void xfs_sb_version_addprojid32bit (struct xfs_sb *sbp) { sbp->sb_versionnum |=XFS_SB_VERSION_MOREBITSBIT ; sbp->sb_features2 |=XFS_SB_VERSION2_PROJID32BIT ;
@@ -625,12 +557,12 @@ xfs_sb_has_incompat_log_feature(/* * V5 superblock specific feature checks */ -static inline int xfs_sb_version_hascrc (xfs_sb_t *sbp) +static inline int xfs_sb_version_hascrc (struct xfs_sb *sbp) {return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ; } -static inline int xfs_sb_version_has_pquotino (xfs_sb_t *sbp) +static inline int xfs_sb_version_has_pquotino (struct xfs_sb *sbp) {return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 ; }
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 2/5 xfs: keep sb_bad_features2 the same a sb_features2
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Whenever we update sb_features2, we need to update sb_bad_features2 so that they remain identical on disk. This prevents future mounts or userspace utilities from getting confused over which features the filesystem supports.
--- fs/xfs/xfs_sb.h | 2 ++ 1 file changed, 2 insertions(+)
fs/xfs/xfs_sb.h +2 -0
@@ -468,11 +468,13 @@ static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) { sbp->sb_versionnum |=XFS_SB_VERSION_MOREBITSBIT ; sbp->sb_features2 |=XFS_SB_VERSION2_ATTR2BIT ; + sbp->sb_bad_features2 |=XFS_SB_VERSION2_ATTR2BIT ; }static inline void xfs_sb_version_removeattr2 (struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT ; + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT ;if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT ; }
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 3/5 xfs: turn NLINK feature on by default
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
mkfs has turned on the XFS_SB_VERSION_NLINKBIT feature bit by default since November 2007. It's about time we simply made the kernel code turn it on by default and so always convert v1 inodes to v2 inodes when reading them in from disk or allocating them. This This removes needless version checks and modification when bumping link counts on inodes, and will take code out of a few common code paths.
text data bss dec hex filename 783251 100867 616 884734 d7ffe fs/xfs/xfs.o.orig 782664 100867 616 884147 d7db3 fs/xfs/xfs.o.patched
--- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_ialloc.c | 4 +- fs/xfs/xfs_inode.c | 111 +++++------------------------------------------- fs/xfs/xfs_inode.h | 1 - fs/xfs/xfs_inode_buf.c | 17 ++++---- fs/xfs/xfs_inode_item.c | 32 +------------- fs/xfs/xfs_ioctl.c | 9 +--- fs/xfs/xfs_mount.c | 6 +++ fs/xfs/xfs_sb.h | 10 ----- 9 files changed, 30 insertions(+), 164 deletions(-)
fs/xfs/xfs_fsops.c +1 -3
@@ -74,11 +74,9 @@ xfs_fs_geometry( }if (new_version >=3 ) { geo->version =XFS_FSOP_GEOM_VERSION ; - geo->flags = + geo->flags =XFS_FSOP_GEOM_FLAGS_NLINK | (xfs_sb_version_hasattr (&mp->m_sb) ?XFS_FSOP_GEOM_FLAGS_ATTR :0 ) | - (xfs_sb_version_hasnlink (&mp->m_sb) ? -XFS_FSOP_GEOM_FLAGS_NLINK :0 ) | (xfs_sb_version_hasquota (&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_QUOTA : 0) | (xfs_sb_version_hasalign(&mp->m_sb) ?
fs/xfs/xfs_ialloc.c +1 -3
@@ -280,10 +280,8 @@ xfs_ialloc_inode_init(if (tp)xfs_icreate_log (tp, agno, agbno, mp->m_ialloc_inos, mp->m_sb.sb_inodesize, length, gen); - }else if (xfs_sb_version_hasnlink (&mp->m_sb)) + }else version =2 ; -else - version =1 ;for (j =0 ; j < nbufs; j++) {/*
fs/xfs/xfs_inode.c +11 -100
156 lines not on this page · raw message
fs/xfs/xfs_inode.h +0 -1
@@ -377,7 +377,6 @@ int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t, struct xfs_inode **, int *);int xfs_droplink (struct xfs_trans *,struct xfs_inode *);int xfs_bumplink (struct xfs_trans *,struct xfs_inode *); -void xfs_bump_ino_vers2 (struct xfs_trans *,struct xfs_inode *);/* from xfs_file.c */ int xfs_zero_eof (struct xfs_inode *,xfs_off_t ,xfs_fsize_t );
fs/xfs/xfs_inode_buf.c +8 -9
@@ -437,17 +437,16 @@ xfs_iread( }/* -* The inode format changed when we moved the link count and -* made it 32 bits long. If this is an old format inode, -* convert it in memory to look like a new one. If it gets -* flushed to disk we will convert back before flushing or -* logging it. We zero out the new projid field and the old link -* count field. We'll handle clearing the pad field (the remains -* of the old uuid field) when we actually convert the inode to -* the new format. We don't change the version number so that we -* can distinguish this from a real new format inode. +* Automatically convert version 1 inode formats in memory to version 2 +* inode format. If the inode is modified, it will get logged and +* rewritten as a version 2 inode. We can do this because we set the +* superblock feature bit for v2 inodes unconditionally during mount +* and it means the reast of the code can assume the inode version is 2 +* or higher. */ if (ip->i_d.di_version ==1 ) { + ip->i_d.di_version =2 ; +memset (&(ip->i_d.di_pad[0 ]),0 ,sizeof (ip->i_d.di_pad)); ip->i_d.di_nlink = ip->i_d.di_onlink; ip->i_d.di_onlink =0 ;xfs_set_projid (ip,0 );
fs/xfs/xfs_inode_item.c +2 -30
@@ -145,34 +145,6 @@ xfs_inode_item_size(xfs_inode_item_attr_fork_size (iip, nvecs, nbytes); } -/* -* If this is a v1 format inode, then we need to log it as such. This means -* that we have to copy the link count from the new field to the old. We -* don't have to worry about the new fields, because nothing trusts them as -* long as the old inode version number is there. -*/ -STATIC void -xfs_inode_item_format_v1_inode ( -struct xfs_inode *ip) -{ -if (!xfs_sb_version_hasnlink (&ip->i_mount->m_sb)) { -/* -* Convert it back. -*/ -ASSERT (ip->i_d.di_nlink <=XFS_MAXLINK_1 ); - ip->i_d.di_onlink = ip->i_d.di_nlink; - }else { -/* -* The superblock version has already been bumped, -* so just make the conversion to the new inode -* format permanent. -*/ - ip->i_d.di_version =2 ; - ip->i_d.di_onlink =0 ; -memset (&(ip->i_d.di_pad[0 ]),0 ,sizeof (ip->i_d.di_pad)); - } -} - STATIC void xfs_inode_item_format_data_fork( struct xfs_inode_log_item *iip,
@@ -370,6 +342,8 @@ xfs_inode_item_format(struct xfs_inode_log_format *ilf;struct xfs_log_iovec *vecp =NULL ; +ASSERT (ip->i_d.di_version >1 ); + ilf =xlog_prepare_iovec (lv, &vecp,XLOG_REG_TYPE_IFORMAT ); ilf->ilf_type =XFS_LI_INODE ; ilf->ilf_ino = ip->i_ino;
@@ -380,8 +354,6 @@ xfs_inode_item_format( ilf->ilf_size =2 ;/* format + core */ xlog_finish_iovec (lv, vecp,sizeof (struct xfs_inode_log_format )); -if (ip->i_d.di_version ==1 ) -xfs_inode_item_format_v1_inode (ip);xlog_copy_iovec (lv, &vecp,XLOG_REG_TYPE_ICORE , &ip->i_d,xfs_icdinode_size (ip->i_d.di_version));
fs/xfs/xfs_ioctl.c +1 -8
@@ -1228,15 +1228,8 @@ xfs_ioctl_setattr( olddquot =xfs_qm_vop_chown (tp, ip, &ip->i_pdquot, pdqp); } +ASSERT (ip->i_d.di_version >1 );xfs_set_projid (ip, fa->fsx_projid); - -/* -* We may have to rev the inode as well as -* the superblock version number since projids didn't -* exist before DINODE_VERSION_2 and SB_VERSION_NLINK. -*/ -if (ip->i_d.di_version ==1 ) -xfs_bump_ino_vers2 (tp, ip); } }
fs/xfs/xfs_mount.c +6 -0
@@ -697,6 +697,12 @@ xfs_mountfs( mp->m_update_flags |=XFS_SB_VERSIONNUM ; } +/* always use v2 inodes by default now */ +if (!(mp->m_sb.sb_versionnum &XFS_SB_VERSION_NLINKBIT )) { + mp->m_sb.sb_versionnum |=XFS_SB_VERSION_NLINKBIT ; + mp->m_update_flags |=XFS_SB_VERSIONNUM ; + } +/* * Check if sb_agblocks is aligned at stripe boundary * If sb_agblocks is NOT aligned turn off m_dalign since
fs/xfs/xfs_sb.h +0 -10
@@ -376,16 +376,6 @@ static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) sbp->sb_versionnum |=XFS_SB_VERSION_ATTRBIT ; } -static inline bool xfs_sb_version_hasnlink (struct xfs_sb *sbp) -{ -return (sbp->sb_versionnum &XFS_SB_VERSION_NLINKBIT ); -} - -static inline void xfs_sb_version_addnlink (struct xfs_sb *sbp) -{ - sbp->sb_versionnum |=XFS_SB_VERSION_NLINKBIT ; -} -static inline bool xfs_sb_version_hasquota (struct xfs_sb *sbp) {return (sbp->sb_versionnum &XFS_SB_VERSION_QUOTABIT );
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 3/5] xfs: turn NLINK feature on by default
fs/xfs/xfs_mount.c xfs_mountfs( · line 704
Quoted 13 lines
fs/xfs/xfs_mount.c +5
-0@@ -697,6 +697,12 @@ xfs_mountfs( mp->m_update_flags |=XFS_SB_VERSIONNUM ; } +/* always use v2 inodes by default now */ +if (!(mp->m_sb.sb_versionnum &XFS_SB_VERSION_NLINKBIT )) { + mp->m_sb.sb_versionnum |=XFS_SB_VERSION_NLINKBIT ; + mp->m_update_flags |=XFS_SB_VERSIONNUM ; + }
This probably should print a message for the user.
Otherwise looks fine,
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 4/5 xfs: don't need dirv2 checks anymore
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
If the the V2 directory feature bit is not set in the superblock feature mask the filesystem will fail the good version check. Hence we don't need any other version checking on the dir2 feature bit in the code as the filesystem will not mount without it set. Remove the checking code.
--- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_fsops.c | 3 +-- fs/xfs/xfs_sb.c | 9 --------- fs/xfs/xfs_sb.h | 6 ------ 4 files changed, 2 insertions(+), 18 deletions(-)
fs/xfs/xfs_dir2.c +1 -1
@@ -92,7 +92,7 @@ xfs_dir_mount(int nodehdr_size; -ASSERT (xfs_sb_version_hasdirv2 (&mp->m_sb)); +ASSERT (mp->m_sb.sb_versionnum &XFS_SB_VERSION_DIRV2BIT );ASSERT ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <=XFS_MAX_BLOCKSIZE );
fs/xfs/xfs_fsops.c +1 -2
@@ -75,6 +75,7 @@ xfs_fs_geometry(if (new_version >=3 ) { geo->version =XFS_FSOP_GEOM_VERSION ; geo->flags =XFS_FSOP_GEOM_FLAGS_NLINK | +XFS_FSOP_GEOM_FLAGS_DIRV2 | (xfs_sb_version_hasattr (&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_ATTR : 0) | (xfs_sb_version_hasquota(&mp->m_sb) ?
@@ -87,8 +88,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_SHARED : 0) | (xfs_sb_version_hasextflgbit (&mp->m_sb) ?XFS_FSOP_GEOM_FLAGS_EXTFLG :0 ) | - (xfs_sb_version_hasdirv2 (&mp->m_sb) ? -XFS_FSOP_GEOM_FLAGS_DIRV2 :0 ) | (xfs_sb_version_hassector (&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | (xfs_sb_version_hasasciici(&mp->m_sb) ?
fs/xfs/xfs_sb.c +0 -9
@@ -333,15 +333,6 @@ xfs_mount_validate_sb(xfs_warn (mp,"Offline file system operation in progress!" );return XFS_ERROR (EFSCORRUPTED ); } - -/* -* Version 1 directory format has never worked on Linux. -*/ -if (unlikely (!xfs_sb_version_hasdirv2 (sbp))) { -xfs_warn (mp,"file system using version 1 directory format" ); -return XFS_ERROR (ENOSYS ); - } -return 0 ; }
fs/xfs/xfs_sb.h +0 -6
@@ -403,12 +403,6 @@ static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) (sbp->sb_versionnum &XFS_SB_VERSION_SHAREDBIT ); } -static inline bool xfs_sb_version_hasdirv2 (struct xfs_sb *sbp) -{ -return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_5 || - (sbp->sb_versionnum &XFS_SB_VERSION_DIRV2BIT ); -} -static inline bool xfs_sb_version_haslogv2 (struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 5/5 xfs: remove shared supberlock feature checking
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
We reject any filesystem that is mounted with this feature bit set, so we don't need to check for it anywhere else. Remove the function for checking if the feature bit is set and any code that uses it.
--- fs/xfs/xfs_fsops.c | 2 -- fs/xfs/xfs_sb.c | 3 ++- fs/xfs/xfs_sb.h | 17 ++++------------- 3 files changed, 6 insertions(+), 16 deletions(-)
fs/xfs/xfs_fsops.c +0 -2
@@ -84,8 +84,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | (xfs_sb_version_hasdalign (&mp->m_sb) ?XFS_FSOP_GEOM_FLAGS_DALIGN :0 ) | - (xfs_sb_version_hasshared (&mp->m_sb) ? -XFS_FSOP_GEOM_FLAGS_SHARED :0 ) | (xfs_sb_version_hasextflgbit (&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | (xfs_sb_version_hassector(&mp->m_sb) ?
fs/xfs/xfs_sb.c +2 -1
@@ -291,7 +291,8 @@ xfs_mount_validate_sb( (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || sbp->sb_dblocks == 0 || sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || - sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp) || + sbp->sb_shared_vn != 0)) {xfs_notice (mp,"SB sanity check failed" );return XFS_ERROR (EFSCORRUPTED ); }
fs/xfs/xfs_sb.h +4 -13
@@ -51,11 +51,12 @@ struct xfs_trans;/* * Supported feature bit list is just all bits in the versionnum field because -* we've used them all up and understand them all. +* we've used them all up and understand them all. Except, of course, for the +* shared superblock bit, which nobody knows what it does and so is unsupported. */ #define XFS_SB_VERSION_OKBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_ALLFBITS) + ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ + ~XFS_SB_VERSION_SHAREDBIT)/* * There are two words to hold XFS "feature" bits: the original
@@ -341,10 +342,6 @@ static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))return false; -/* We don't support shared superblocks - nobody knows what it is */ -if (sbp->sb_versionnum &XFS_SB_VERSION_SHAREDBIT ) -return false; -return true; }
@@ -397,12 +394,6 @@ static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp)return (sbp->sb_versionnum &XFS_SB_VERSION_DALIGNBIT ); } -static inline bool xfs_sb_version_hasshared (struct xfs_sb *sbp) -{ -return XFS_SB_VERSION_NUM (sbp) ==XFS_SB_VERSION_4 && - (sbp->sb_versionnum &XFS_SB_VERSION_SHAREDBIT ); -} -static inline bool xfs_sb_version_haslogv2 (struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 ||
Signature · 6 lines
1.9.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs