xfs: gut the struct xfs_icdinode
v3 cover xfs: gut the struct xfs_icdinode
Hi folks,
This is the thrid version of this patchset, the second version is here:
http://oss.sgi.com/archives/xfs/2016-01/msg00459.html
There is no change to the space savings the series gives us; it is an update to address Brian's review comments. Testing over the past couple of weeks indicates no new regressions, so hopefully this is the final review posting. :)
Version 3
- fix typos/comments and use sb_meta_uuid (patch 3)
- introduce new patch for reclaimable inode core reinitialisation infrastructure (patch 5)
- remove typedefs (patch 6)
- added field reinitialisation to function introduced in patch 5 (patches 6-9)
- removed stray debug hunk (patch 9)
- added reviewed-by tags to patches that have been reviewed already.
Version 2
- timestamps are signed, so need casting to int before being stored in a 64 bit variable when read from disk. Fixes generic/258 failure (patch 2).
- nlink wasn't being accounted correctly for O_TMPFILE files and rename whiteouts. Fixes generic/078 and others. (patch 5)
- VFS does not initialise i_mode, ever, so we need to initialise it directly after slab allocation to ensure that we correctly detect new file creates and hence don't add the inode the sb list twice, corrupting it. (busy inodes after unmount, self destruct in 5 seconds, have a nice day!) (patch 8)
- when reallocating a reclaimable inode, we need to save the variables that hold on-disk values across the inode_init_always() call, otherwise we lose them. This results in corruption of these fields. (patch 8)
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 1/9 xfs: introduce inode log format object
From: Dave Chinner <[email protected]>
We currently carry around and log an entire inode core in the struct xfs_inode. A lot of the information in the inode core is duplicated in the VFS inode, but we cannot remove this duplication of infomration because the inode core is logged directly in xfs_inode_item_format().
Add a new function xfs_inode_item_format_core() that copies the inode core data into a struct xfs_icdinode that is pulled directly from the log vector buffer. This means we no longer directly copy the inode core, but copy the structures one member at a time. This will be slightly less efficient than copying, but will allow us to remove duplicate and unnecessary items from the struct xfs_inode.
To enable us to do this, call the new structure a xfs_log_dinode, so that we know it's different to the physical xfs_dinode and the in-core xfs_icdinode.
--- fs/xfs/libxfs/xfs_inode_buf.c | 8 +-- fs/xfs/libxfs/xfs_inode_buf.h | 53 ++++++++++++++++- fs/xfs/libxfs/xfs_log_format.h | 15 ++--- fs/xfs/xfs_icache.c | 2 +- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_inode_item.c | 128 +++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_inode_item.h | 2 + fs/xfs/xfs_log_recover.c | 52 +++++++++-------- 8 files changed, 218 insertions(+), 44 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +4 -4
@@ -196,8 +196,8 @@ xfs_imap_to_bp(void xfs_dinode_from_disk ( -xfs_icdinode_t *to, -xfs_dinode_t *from) +struct xfs_icdinode *to, +struct xfs_dinode *from) { to->di_magic =be16_to_cpu (from->di_magic); to->di_mode =be16_to_cpu (from->di_mode);
@@ -243,8 +243,8 @@ xfs_dinode_from_disk(void xfs_dinode_to_disk ( -xfs_dinode_t *to, -xfs_icdinode_t *from) +struct xfs_dinode *to, +struct xfs_icdinode *from) { to->di_magic =cpu_to_be16 (from->di_magic); to->di_mode =cpu_to_be16 (from->di_mode);
fs/xfs/libxfs/xfs_inode_buf.h +52 -1
59 lines not on this page · raw message
fs/xfs/libxfs/xfs_log_format.h +8 -7
@@ -290,6 +290,7 @@ typedef struct xfs_inode_log_format_64 {__int32_t ilf_boffset;/* off of inode in buffer */ } xfs_inode_log_format_64_t; +/* * Flags for xfs_trans_log_inode flags field. */
@@ -360,10 +361,10 @@ typedef struct xfs_ictimestamp { } xfs_ictimestamp_t;/* -* NOTE: This structure must be kept identical to struct xfs_dinode -* except for the endianness annotations. +* Define the format of the inode core that is logged. This structure must be +* kept identical to struct xfs_dinode except for the endianness annotations. */ -typedef struct xfs_icdinode { +struct xfs_log_dinode {__uint16_t di_magic;/* inode magic # = XFS_DINODE_MAGIC */ __uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */
@@ -407,13 +408,13 @@ typedef struct xfs_icdinode {uuid_t di_uuid;/* UUID of the filesystem */ /* structure must be padded to 64 bit alignment */ -} xfs_icdinode_t; +}; -static inline uint xfs_icdinode_size (int version) +static inline uint xfs_log_dinode_size (int version) {if (version ==3 ) -return sizeof (struct xfs_icdinode ); -return offsetof(struct xfs_icdinode , di_next_unlinked); +return sizeof (struct xfs_log_dinode ); +return offsetof(struct xfs_log_dinode , di_next_unlinked); }/*
fs/xfs/xfs_icache.c +1 -1
@@ -79,7 +79,7 @@ xfs_inode_alloc(memset (&ip->i_df,0 ,sizeof (xfs_ifork_t)); ip->i_flags =0 ; ip->i_delayed_blks =0 ; -memset (&ip->i_d,0 ,sizeof (xfs_icdinode_t)); +memset (&ip->i_d,0 ,sizeof (ip->i_d));return ip; }
fs/xfs/xfs_inode.h +1 -1
@@ -63,7 +63,7 @@ typedef struct xfs_inode {unsigned long i_flags;/* see defined flags below */ unsigned int i_delayed_blks;/* count of delay alloc blks */ -xfs_icdinode_t i_d;/* most of ondisk inode */ +struct xfs_icdinode i_d;/* most of ondisk inode */ /* VFS inode */ struct inode i_vnode;/* embedded VFS inode */
fs/xfs/xfs_inode_item.c +123 -5
146 lines not on this page · raw message
fs/xfs/xfs_inode_item.h +2 -0
@@ -49,6 +49,8 @@ extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *);extern void xfs_iflush_abort (struct xfs_inode *,bool );extern int xfs_inode_item_format_convert (xfs_log_iovec_t *,xfs_inode_log_format_t *); +extern void xfs_log_dinode_to_icdinode (struct xfs_log_dinode *from, +struct xfs_icdinode *to);extern struct kmem_zone *xfs_ili_zone;
fs/xfs/xfs_log_recover.c +27 -25
119 lines not on this page · raw message
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 1/9] xfs: introduce inode log format object
This looks fine in general:
But: this now introduce struct inode to libxfs code, what's your plan to deal with that in xfsprogs?
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 1/9] xfs: introduce inode log format object
Quoted 6 lines · Christoph Hellwig
This looks fine in general:
Reviewed-by Christoph Hellwig <[email protected]>But: this now introduce struct inode to libxfs code, what's your plan to deal with that in xfsprogs?
The struct xfs_inode is already unique between user and kernel space, so I was simply going to define all the new fields directly inside the struct xfs_inode and:
#define VFS_I(ip) (ip)
Or If I can't get that to work without somehow defining a struct inode, then put all the fields in a struct inode private to the struct xfs_inode and just do the same conversion as the kernel.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 2/9 xfs: remove timestamps from incore inode
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
The struct xfs_inode has two copies of the current timestamps in it, one in the vfs inode and one in the struct xfs_icdinode. Now that we no longer log the struct xfs_icdinode directly, we don't need to keep the timestamps in this structure. instead we can copy them straight out of the VFS inode when formatting the inode log item or the on-disk inode.
This reduces the struct xfs_inode in size by 24 bytes.
--- fs/xfs/libxfs/xfs_inode_buf.c | 91 +++++++++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_inode_buf.h | 9 ++--- fs/xfs/libxfs/xfs_rtbitmap.c | 2 +- fs/xfs/xfs_inode.c | 21 +++++----- fs/xfs/xfs_inode_item.c | 73 ++++++---------------------------- fs/xfs/xfs_inode_item.h | 2 - fs/xfs/xfs_iops.c | 37 ++++-------------- fs/xfs/xfs_itable.c | 16 +++++--- fs/xfs/xfs_log_recover.c | 8 ++-- fs/xfs/xfs_rtalloc.c | 2 +- fs/xfs/xfs_trans_inode.c | 12 +----- 11 files changed, 130 insertions(+), 143 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +79 -12
@@ -195,10 +195,13 @@ xfs_imap_to_bp( }void -xfs_dinode_from_disk ( -struct xfs_icdinode *to, +xfs_inode_from_disk ( +struct xfs_inode *ip,struct xfs_dinode *from) { +struct xfs_icdinode *to = &ip->i_d; +struct inode *inode =VFS_I (ip); + to->di_magic =be16_to_cpu (from->di_magic); to->di_mode =be16_to_cpu (from->di_mode); to->di_version = from ->di_version;
@@ -211,12 +214,20 @@ xfs_dinode_from_disk( to->di_projid_hi =be16_to_cpu (from->di_projid_hi);memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); to->di_flushiter =be16_to_cpu (from->di_flushiter); - to->di_atime.t_sec =be32_to_cpu (from->di_atime.t_sec); - to->di_atime.t_nsec =be32_to_cpu (from->di_atime.t_nsec); - to->di_mtime.t_sec =be32_to_cpu (from->di_mtime.t_sec); - to->di_mtime.t_nsec =be32_to_cpu (from->di_mtime.t_nsec); - to->di_ctime.t_sec =be32_to_cpu (from->di_ctime.t_sec); - to->di_ctime.t_nsec =be32_to_cpu (from->di_ctime.t_nsec); + +/* +* time is signed, so need to convert to signed 32 bit before +* storing in inode timestamp which may be 64 bit. Otherwise +* a time before epoch is converted to a time long after epoch +* on 64 bit systems. +*/ + inode->i_atime.tv_sec = (int )be32_to_cpu (from->di_atime.t_sec); + inode->i_atime.tv_nsec = (int )be32_to_cpu (from->di_atime.t_nsec); + inode->i_mtime.tv_sec = (int )be32_to_cpu (from->di_mtime.t_sec); + inode->i_mtime.tv_nsec = (int )be32_to_cpu (from->di_mtime.t_nsec); + inode->i_ctime.tv_sec = (int )be32_to_cpu (from->di_ctime.t_sec); + inode->i_ctime.tv_nsec = (int )be32_to_cpu (from->di_ctime.t_nsec); + to->di_size =be64_to_cpu (from->di_size); to->di_nblocks =be64_to_cpu (from->di_nblocks); to->di_extsize =be32_to_cpu (from->di_extsize);
@@ -242,9 +253,63 @@ xfs_dinode_from_disk( }void -xfs_dinode_to_disk ( -struct xfs_dinode *to, -struct xfs_icdinode *from) +xfs_inode_to_disk ( +struct xfs_inode *ip, +struct xfs_dinode *to) +{ +struct xfs_icdinode *from = &ip->i_d; +struct inode *inode =VFS_I (ip); + + to->di_magic =cpu_to_be16 (from->di_magic); + to->di_mode =cpu_to_be16 (from->di_mode); + to->di_version = from ->di_version; + to->di_format = from->di_format; + to->di_onlink =cpu_to_be16 (from->di_onlink); + to->di_uid =cpu_to_be32 (from->di_uid); + to->di_gid =cpu_to_be32 (from->di_gid); + to->di_nlink =cpu_to_be32 (from->di_nlink); + to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); + to->di_projid_hi =cpu_to_be16 (from->di_projid_hi); +memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); + + to->di_atime.t_sec =cpu_to_be32 (inode->i_atime.tv_sec); + to->di_atime.t_nsec =cpu_to_be32 (inode->i_atime.tv_nsec); + to->di_mtime.t_sec =cpu_to_be32 (inode->i_mtime.tv_sec); + to->di_mtime.t_nsec =cpu_to_be32 (inode->i_mtime.tv_nsec); + to->di_ctime.t_sec =cpu_to_be32 (inode->i_ctime.tv_sec); + to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); + + to->di_size =cpu_to_be64 (from->di_size); + to->di_nblocks =cpu_to_be64 (from->di_nblocks); + to->di_extsize =cpu_to_be32 (from->di_extsize); + to->di_nextents =cpu_to_be32 (from->di_nextents); + to->di_anextents =cpu_to_be16 (from->di_anextents); + to->di_forkoff = from->di_forkoff; + to->di_aformat = from->di_aformat; + to->di_dmevmask =cpu_to_be32 (from->di_dmevmask); + to->di_dmstate =cpu_to_be16 (from->di_dmstate); + to->di_flags =cpu_to_be16 (from->di_flags); + to->di_gen =cpu_to_be32 (from->di_gen); + +if (from->di_version ==3 ) { + to->di_changecount =cpu_to_be64 (from->di_changecount); + to->di_crtime.t_sec =cpu_to_be32 (from->di_crtime.t_sec); + to->di_crtime.t_nsec =cpu_to_be32 (from->di_crtime.t_nsec); + to->di_flags2 =cpu_to_be64 (from->di_flags2); + to->di_ino =cpu_to_be64 (from->di_ino); + to->di_lsn =cpu_to_be64 (from->di_lsn); +memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); +uuid_copy (&to->di_uuid, &from->di_uuid); + to->di_flushiter =0 ; + }else { + to->di_flushiter =cpu_to_be16 (from->di_flushiter); + } +} + +void +xfs_log_dinode_to_disk ( +struct xfs_log_dinode *from, +struct xfs_dinode *to) { to->di_magic =cpu_to_be16 (from->di_magic); to->di_mode =cpu_to_be16 (from->di_mode);
@@ -257,12 +322,14 @@ xfs_dinode_to_disk( to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); to->di_projid_hi =cpu_to_be16 (from->di_projid_hi);memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); + to->di_atime.t_sec =cpu_to_be32 (from->di_atime.t_sec); to->di_atime.t_nsec =cpu_to_be32 (from->di_atime.t_nsec); to->di_mtime.t_sec =cpu_to_be32 (from->di_mtime.t_sec); to->di_mtime.t_nsec =cpu_to_be32 (from->di_mtime.t_nsec); to->di_ctime.t_sec =cpu_to_be32 (from->di_ctime.t_sec); to->di_ctime.t_nsec =cpu_to_be32 (from->di_ctime.t_nsec); + to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks); to->di_extsize =cpu_to_be32 (from->di_extsize);
@@ -403,7 +470,7 @@ xfs_iread(* Otherwise, just get the truly permanent information. */ if (dip->di_mode) { -xfs_dinode_from_disk (&ip->i_d, dip); +xfs_inode_from_disk (ip, dip); error =xfs_iformat_fork (ip, dip);if (error) {#ifdef DEBUG
fs/xfs/libxfs/xfs_inode_buf.h +4 -5
@@ -40,9 +40,6 @@ struct xfs_icdinode {__uint16_t di_projid_hi;/* higher part of owner's project id */ __uint8_t di_pad[6 ];/* unused, zeroed space */ __uint16_t di_flushiter;/* incremented on flush */ -xfs_ictimestamp_t di_atime;/* time last accessed */ -xfs_ictimestamp_t di_mtime;/* time last modified */ -xfs_ictimestamp_t di_ctime;/* time created/inode modified */ xfs_fsize_t di_size;/* number of bytes in file */ xfs_rfsblock_t di_nblocks;/* # of direct & btree blocks used */ xfs_extlen_t di_extsize;/* basic/minimum extent size for file */
@@ -89,8 +86,10 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,int xfs_iread (struct xfs_mount *,struct xfs_trans *,struct xfs_inode *,uint );void xfs_dinode_calc_crc (struct xfs_mount *,struct xfs_dinode *); -void xfs_dinode_to_disk (struct xfs_dinode *to,struct xfs_icdinode *from); -void xfs_dinode_from_disk (struct xfs_icdinode *to,struct xfs_dinode *from); +void xfs_inode_to_disk (struct xfs_inode *ip,struct xfs_dinode *to); +void xfs_inode_from_disk (struct xfs_inode *ip,struct xfs_dinode *from); +void xfs_log_dinode_to_disk (struct xfs_log_dinode *from, +struct xfs_dinode *to);#if defined(DEBUG )void xfs_inobp_check (struct xfs_mount *,struct xfs_buf *);
fs/xfs/libxfs/xfs_rtbitmap.c +1 -1
@@ -1011,7 +1011,7 @@ xfs_rtfree_extent( mp->m_sb.sb_rextents) {if (!(mp->m_rbmip->i_d.di_flags &XFS_DIFLAG_NEWRTBM )) mp->m_rbmip->i_d.di_flags |=XFS_DIFLAG_NEWRTBM ; - *(__uint64_t *)&mp->m_rbmip->i_d.di_atime =0 ; + *(__uint64_t *)&VFS_I (mp->m_rbmip)->i_atime =0 ;xfs_trans_log_inode (tp, mp->m_rbmip,XFS_ILOG_CORE ); }return 0 ;
fs/xfs/xfs_inode.c +11 -10
@@ -766,6 +766,7 @@ xfs_ialloc(uint flags;int error;struct timespec tv; +struct inode *inode;/* * Call the space management code to pick
@@ -791,6 +792,7 @@ xfs_ialloc(if (error)return error;ASSERT (ip !=NULL ); + inode =VFS_I (ip);/* * We always convert v1 inodes to v2 now - we only support filesystems
@@ -832,10 +834,9 @@ xfs_ialloc(ASSERT (ip->i_d.di_nblocks ==0 ); tv =current_fs_time (mp->m_super); - ip->i_d.di_mtime.t_sec = (__int32_t )tv.tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t )tv.tv_nsec; - ip->i_d.di_atime = ip->i_d.di_mtime; - ip->i_d.di_ctime = ip->i_d.di_mtime; + inode->i_mtime = tv; + inode->i_atime = tv; + inode->i_ctime = tv;/* * di_gen will have been taken care of in xfs_iread.
@@ -853,7 +854,8 @@ xfs_ialloc( ip->i_d.di_lsn =0 ; ip->i_d.di_flags2 =0 ;memset (&(ip->i_d.di_pad2[0 ]),0 ,sizeof (ip->i_d.di_pad2)); - ip->i_d.di_crtime = ip->i_d.di_mtime; + ip->i_d.di_crtime.t_sec = (__int32_t )tv.tv_sec; + ip->i_d.di_crtime.t_nsec = (__int32_t )tv.tv_nsec; }
@@ -3523,12 +3525,11 @@ xfs_iflush_int( ip->i_d.di_flushiter++;/* -* Copy the dirty parts of the inode into the on-disk -* inode. We always copy out the core of the inode, -* because if the inode is dirty at all the core must -* be. +* Copy the dirty parts of the inode into the on-disk inode. We always +* copy out the core of the inode, because if the inode is dirty at all +* the core must be. */ -xfs_dinode_to_disk (dip, &ip->i_d); +xfs_inode_to_disk (ip, dip);/* Wrap, we never let the log put out DI_MAX_FLUSH */ if (ip->i_d.di_flushiter ==DI_MAX_FLUSH )
fs/xfs/xfs_inode_item.c +12 -61
95 lines not on this page · raw message
fs/xfs/xfs_inode_item.h +0 -2
@@ -49,8 +49,6 @@ extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *);extern void xfs_iflush_abort (struct xfs_inode *,bool );extern int xfs_inode_item_format_convert (xfs_log_iovec_t *,xfs_inode_log_format_t *); -extern void xfs_log_dinode_to_icdinode (struct xfs_log_dinode *from, -struct xfs_icdinode *to);extern struct kmem_zone *xfs_ili_zone;
fs/xfs/xfs_iops.c +7 -30
@@ -522,21 +522,12 @@ xfs_setattr_time(ASSERT (xfs_isilocked (ip,XFS_ILOCK_EXCL )); -if (iattr->ia_valid &ATTR_ATIME ) { +if (iattr->ia_valid &ATTR_ATIME ) inode->i_atime = iattr->ia_atime; - ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec; - ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec; - } -if (iattr->ia_valid &ATTR_CTIME ) { +if (iattr->ia_valid &ATTR_CTIME ) inode->i_ctime = iattr->ia_ctime; - ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; - ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec; - } -if (iattr->ia_valid &ATTR_MTIME ) { +if (iattr->ia_valid &ATTR_MTIME ) inode->i_mtime = iattr->ia_mtime; - ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec; - ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec; - } }int
@@ -991,21 +982,13 @@ xfs_vn_update_time( }xfs_ilock (ip,XFS_ILOCK_EXCL ); -if (flags &S_CTIME ) { +if (flags &S_CTIME ) inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t )now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t )now->tv_nsec; - } -if (flags &S_MTIME ) { +if (flags &S_MTIME ) inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t )now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t )now->tv_nsec; - } -if (flags &S_ATIME ) { +if (flags &S_ATIME ) inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t )now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t )now->tv_nsec; - } +xfs_trans_ijoin (tp, ip,XFS_ILOCK_EXCL );xfs_trans_log_inode (tp, ip,XFS_ILOG_TIMESTAMP );return xfs_trans_commit (tp);
@@ -1251,12 +1234,6 @@ xfs_setup_inode( inode->i_generation = ip->i_d.di_gen;i_size_write (inode, ip->i_d.di_size); - inode->i_atime.tv_sec = ip->i_d.di_atime.t_sec; - inode->i_atime.tv_nsec = ip->i_d.di_atime.t_nsec; - inode->i_mtime.tv_sec = ip->i_d.di_mtime.t_sec; - inode->i_mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; - inode->i_ctime.tv_sec = ip->i_d.di_ctime.t_sec; - inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec;xfs_diflags_to_iflags (inode, ip); ip->d_ops = ip->i_mount->m_nondir_inode_ops;
fs/xfs/xfs_itable.c +10 -6
@@ -57,6 +57,7 @@ xfs_bulkstat_one_int( {struct xfs_icdinode *dic;/* dinode core info pointer */ struct xfs_inode *ip;/* incore inode pointer */ +struct inode *inode;struct xfs_bstat *buf;/* return buffer */ int error =0 ;/* error value */
@@ -77,6 +78,7 @@ xfs_bulkstat_one_int(ASSERT (ip !=NULL );ASSERT (ip->i_imap.im_blkno !=0 ); + inode =VFS_I (ip); dic = &ip->i_d;
@@ -91,12 +93,14 @@ xfs_bulkstat_one_int( buf->bs_uid = dic->di_uid; buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size; - buf->bs_atime.tv_sec = dic->di_atime.t_sec; - buf->bs_atime.tv_nsec = dic->di_atime.t_nsec; - buf->bs_mtime.tv_sec = dic->di_mtime.t_sec; - buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec; - buf->bs_ctime.tv_sec = dic->di_ctime.t_sec; - buf->bs_ctime.tv_nsec = dic->di_ctime.t_nsec; + + buf->bs_atime.tv_sec = inode->i_atime.tv_sec; + buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec; + buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec; + buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec; + buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; + buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; + buf->bs_xflags =xfs_ip2xflags (ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; buf->bs_extents = dic->di_nextents;
fs/xfs/xfs_log_recover.c +3 -5
@@ -2798,7 +2798,7 @@ xfs_recover_inode_owner_change(return -ENOMEM ;/* instantiate the inode */ -xfs_dinode_from_disk (&ip->i_d, dip); +xfs_inode_from_disk (ip, dip);ASSERT (ip->i_d.di_version >=3 ); error =xfs_iformat_fork (ip, dip);
@@ -2845,7 +2845,6 @@ xlog_recover_inode_pass2(int attr_index;uint fields;struct xfs_log_dinode *ldip; -struct xfs_icdinode icic;uint isize;int need_free =0 ;
@@ -3012,9 +3011,8 @@ xlog_recover_inode_pass2( goto out_release; } -/* The core is in in-core format */ -xfs_log_dinode_to_icdinode (ldip, &icic); -xfs_dinode_to_disk (dip, &icic); +/* recover the log dinode inode into the on disk inode */ +xfs_log_dinode_to_disk (ldip, dip);/* the rest is in on-disk format */ if (item->ri_buf[1 ].i_len > isize) {
fs/xfs/xfs_rtalloc.c +1 -1
@@ -1272,7 +1272,7 @@ xfs_rtpick_extent(ASSERT (xfs_isilocked (mp->m_rbmip,XFS_ILOCK_EXCL )); - seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime; + seqp = (__uint64_t *)&VFS_I (mp->m_rbmip)->i_atime;if (!(mp->m_rbmip->i_d.di_flags &XFS_DIFLAG_NEWRTBM )) { mp->m_rbmip->i_d.di_flags |=XFS_DIFLAG_NEWRTBM ; *seqp =0 ;
fs/xfs/xfs_trans_inode.c +2 -10
@@ -75,18 +75,10 @@ xfs_trans_ichgtime( tv =current_fs_time (inode->i_sb); -if ((flags &XFS_ICHGTIME_MOD ) && - !timespec_equal (&inode->i_mtime, &tv)) { +if (flags &XFS_ICHGTIME_MOD ) inode->i_mtime = tv; - ip->i_d.di_mtime.t_sec = tv.tv_sec; - ip->i_d.di_mtime.t_nsec = tv.tv_nsec; - } -if ((flags &XFS_ICHGTIME_CHG ) && - !timespec_equal (&inode->i_ctime, &tv)) { +if (flags &XFS_ICHGTIME_CHG ) inode->i_ctime = tv; - ip->i_d.di_ctime.t_sec = tv.tv_sec; - ip->i_d.di_ctime.t_nsec = tv.tv_nsec; - } }/*
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 2/9] xfs: remove timestamps from incore inode
fs/xfs/libxfs/xfs_inode_buf.c xfs_dinode_from_disk( · line 223
Quoted 6 lines
fs/xfs/libxfs/xfs_inode_buf.c +6
-0+/* +* time is signed, so need to convert to signed 32 bit before +* storing in inode timestamp which may be 64 bit. Otherwise +* a time before epoch is converted to a time long after epoch +* on 64 bit systems. +*/
Time should be captizalized at the beginning of the comment.
Otherwise looks fine:
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 3/9 xfs: cull unnecessary icdinode fields
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Now that the struct xfs_icdinode is not directly related to the on-disk format, we can cull things in it we really don't need to store:
- magic number never changes
- padding is not necessary
- next_unlinked is never used
- inode number is redundant
- uuid is redundant
- lsn is accessed directly from dinode
- inode CRC is only accessed directly from dinode
Hence we can remove these from the struct xfs_icdinode and redirect the code that uses them to the xfs_dinode appripriately. This reduces the size of the struct icdinode from 152 bytes to 88 bytes, and removes a fair chunk of unnecessary code, too.
--- fs/xfs/libxfs/xfs_inode_buf.c | 39 +++++++++++++-------------------------- fs/xfs/libxfs/xfs_inode_buf.h | 25 ++++++------------------- fs/xfs/xfs_inode.c | 19 +------------------ fs/xfs/xfs_inode_item.c | 19 +++++++++++-------- 4 files changed, 31 insertions(+), 71 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +13 -26
@@ -202,7 +202,6 @@ xfs_inode_from_disk(struct xfs_icdinode *to = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic =be16_to_cpu (from->di_magic); to->di_mode =be16_to_cpu (from->di_mode); to->di_version = from ->di_version; to->di_format = from->di_format;
@@ -212,7 +211,6 @@ xfs_inode_from_disk( to->di_nlink =be32_to_cpu (from->di_nlink); to->di_projid_lo =be16_to_cpu (from->di_projid_lo); to->di_projid_hi =be16_to_cpu (from->di_projid_hi); -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); to->di_flushiter =be16_to_cpu (from->di_flushiter);/*
@@ -245,24 +243,22 @@ xfs_inode_from_disk( to->di_crtime.t_sec =be32_to_cpu (from->di_crtime.t_sec); to->di_crtime.t_nsec =be32_to_cpu (from->di_crtime.t_nsec); to->di_flags2 =be64_to_cpu (from->di_flags2); - to->di_ino =be64_to_cpu (from->di_ino); - to->di_lsn =be64_to_cpu (from->di_lsn); -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); } }void xfs_inode_to_disk (struct xfs_inode *ip, -struct xfs_dinode *to) +struct xfs_dinode *to, +xfs_lsn_t lsn) {struct xfs_icdinode *from = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic =cpu_to_be16 (from->di_magic); + to->di_magic =cpu_to_be16 (XFS_DINODE_MAGIC ); + to->di_mode =cpu_to_be16 (from->di_mode); - to->di_version = from ->di_version; + to->di_version = from->di_version; to->di_format = from->di_format; to->di_onlink =cpu_to_be16 (from->di_onlink); to->di_uid =cpu_to_be32 (from->di_uid);
@@ -270,8 +266,8 @@ xfs_inode_to_disk( to->di_nlink =cpu_to_be32 (from->di_nlink); to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); to->di_projid_hi =cpu_to_be16 (from->di_projid_hi); -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); +memset (to->di_pad,0 ,sizeof (to->di_pad)); to->di_atime.t_sec =cpu_to_be32 (inode->i_atime.tv_sec); to->di_atime.t_nsec =cpu_to_be32 (inode->i_atime.tv_nsec); to->di_mtime.t_sec =cpu_to_be32 (inode->i_mtime.tv_sec);
@@ -296,10 +292,11 @@ xfs_inode_to_disk( to->di_crtime.t_sec =cpu_to_be32 (from->di_crtime.t_sec); to->di_crtime.t_nsec =cpu_to_be32 (from->di_crtime.t_nsec); to->di_flags2 =cpu_to_be64 (from->di_flags2); - to->di_ino =cpu_to_be64 (from->di_ino); - to->di_lsn =cpu_to_be64 (from->di_lsn); -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); + + to->di_ino =cpu_to_be64 (ip->i_ino); + to->di_lsn =cpu_to_be64 (lsn); +memset (to->di_pad2,0 ,sizeof (to->di_pad2)); +uuid_copy (&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); to->di_flushiter =0 ; }else { to->di_flushiter =cpu_to_be16 (from->di_flushiter);
@@ -434,13 +431,10 @@ xfs_iread( !(mp->m_flags & XFS_MOUNT_IKEEP)) {/* initialise the on-disk inode core */ memset (&ip->i_d,0 ,sizeof (ip->i_d)); - ip->i_d.di_magic =XFS_DINODE_MAGIC ; ip->i_d.di_gen =prandom_u32 (); -if (xfs_sb_version_hascrc (&mp->m_sb)) { +if (xfs_sb_version_hascrc (&mp->m_sb)) ip->i_d.di_version =3 ; - ip->i_d.di_ino = ip->i_ino; -uuid_copy (&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid); - }else +else ip->i_d.di_version =2 ;return 0 ; }
@@ -484,16 +478,10 @@ xfs_iread(* Partial initialisation of the in-core inode. Just the bits * that xfs_ialloc won't overwrite or relies on being correct. */ - ip->i_d.di_magic =be16_to_cpu (dip->di_magic); ip->i_d.di_version = dip->di_version; ip->i_d.di_gen =be32_to_cpu (dip->di_gen); ip->i_d.di_flushiter =be16_to_cpu (dip->di_flushiter); -if (dip->di_version ==3 ) { - ip->i_d.di_ino =be64_to_cpu (dip->di_ino); -uuid_copy (&ip->i_d.di_uuid, &dip->di_uuid); - } -/* * Make sure to pull in the mode here as well in * case the inode is released without being used.
@@ -514,7 +502,6 @@ xfs_iread(*/ 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/libxfs/xfs_inode_buf.h +6 -19
@@ -22,24 +22,22 @@ struct xfs_inode;struct xfs_dinode ;/* -* In memory representation of the XFS inode. This is held in the in-core -* struct xfs_inode to represent the on disk values, but no longer needs to be -* identical to the on-disk structure as it is always translated to on-disk +* In memory representation of the XFS inode. This is held in the in-core struct +* xfs_inode and represents the current on disk values but the structure is not +* in on-disk format. That is, this structure is always translated to on-disk * format specific structures at the appropriate time. */ struct xfs_icdinode { -__uint16_t di_magic;/* inode magic # = XFS_DINODE_MAGIC */ __uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ __uint16_t di_onlink;/* old number of links to file */ +__uint16_t di_flushiter;/* incremented on flush */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */ __uint32_t di_nlink;/* number of links to file */ __uint16_t di_projid_lo;/* lower part of owner's project id */ __uint16_t di_projid_hi;/* higher part of owner's project id */ -__uint8_t di_pad[6 ];/* unused, zeroed space */ -__uint16_t di_flushiter;/* incremented on flush */ xfs_fsize_t di_size;/* number of bytes in file */ xfs_rfsblock_t di_nblocks;/* # of direct & btree blocks used */ xfs_extlen_t di_extsize;/* basic/minimum extent size for file */
@@ -52,22 +50,10 @@ struct xfs_icdinode {__uint16_t di_flags;/* random flags, XFS_DIFLAG_... */ __uint32_t di_gen;/* generation number */ -/* di_next_unlinked is the only non-core field in the old dinode */ -xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ - -/* start of the extended dinode, writable fields */ -__uint32_t di_crc;/* CRC of the inode */ __uint64_t di_changecount;/* number of attribute changes */ -xfs_lsn_t di_lsn;/* flush sequence */ __uint64_t di_flags2;/* more random flags */ -__uint8_t di_pad2[16 ];/* more padding for future expansion */ -/* fields only written to during inode creation */ xfs_ictimestamp_t di_crtime;/* time created */ -xfs_ino_t di_ino;/* inode number */ -uuid_t di_uuid;/* UUID of the filesystem */ - -/* structure must be padded to 64 bit alignment */ };/*
@@ -86,7 +72,8 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,int xfs_iread (struct xfs_mount *,struct xfs_trans *,struct xfs_inode *,uint );void xfs_dinode_calc_crc (struct xfs_mount *,struct xfs_dinode *); -void xfs_inode_to_disk (struct xfs_inode *ip,struct xfs_dinode *to); +void xfs_inode_to_disk (struct xfs_inode *ip,struct xfs_dinode *to, +xfs_lsn_t lsn);void xfs_inode_from_disk (struct xfs_inode *ip,struct xfs_dinode *from);void xfs_log_dinode_to_disk (struct xfs_log_dinode *from,struct xfs_dinode *to);
fs/xfs/xfs_inode.c +1 -18
@@ -809,7 +809,6 @@ xfs_ialloc( ip->i_d.di_uid =xfs_kuid_to_uid (current_fsuid ()); ip->i_d.di_gid =xfs_kgid_to_gid (current_fsgid ());xfs_set_projid (ip, prid); -memset (&(ip->i_d.di_pad[0 ]),0 ,sizeof (ip->i_d.di_pad));if (pip &&XFS_INHERIT_GID (pip)) { ip->i_d.di_gid = pip->i_d.di_gid;
@@ -847,13 +846,8 @@ xfs_ialloc( ip->i_d.di_flags =0 ;if (ip->i_d.di_version ==3 ) { -ASSERT (ip->i_d.di_ino == ino); -ASSERT (uuid_equal (&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); - ip->i_d.di_crc =0 ; ip->i_d.di_changecount =1 ; - ip->i_d.di_lsn =0 ; ip->i_d.di_flags2 =0 ; -memset (&(ip->i_d.di_pad2[0 ]),0 ,sizeof (ip->i_d.di_pad2)); ip->i_d.di_crtime.t_sec = (__int32_t )tv.tv_sec; ip->i_d.di_crtime.t_nsec = (__int32_t )tv.tv_nsec; }
@@ -3464,13 +3458,6 @@ xfs_iflush_int( __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip); goto corrupt_out; } -if (XFS_TEST_ERROR (ip->i_d.di_magic !=XFS_DINODE_MAGIC , - mp,XFS_ERRTAG_IFLUSH_2 ,XFS_RANDOM_IFLUSH_2 )) { -xfs_alert_tag (mp,XFS_PTAG_IFLUSH , -"%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x" , - __func__, ip->i_ino, ip, ip->i_d.di_magic); - goto corrupt_out; - }if (S_ISREG (ip->i_d.di_mode)) { if (XFS_TEST_ERROR( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
@@ -3529,7 +3516,7 @@ xfs_iflush_int(* copy out the core of the inode, because if the inode is dirty at all * the core must be. */ -xfs_inode_to_disk (ip, dip); +xfs_inode_to_disk (ip, dip, iip->ili_item.li_lsn);/* Wrap, we never let the log put out DI_MAX_FLUSH */ if (ip->i_d.di_flushiter ==DI_MAX_FLUSH )
@@ -3581,10 +3568,6 @@ xfs_iflush_int(*/ xfs_buf_attach_iodone (bp, xfs_iflush_done, &iip->ili_item); -/* update the lsn in the on disk inode if required */ -if (ip->i_d.di_version ==3 ) - dip->di_lsn =cpu_to_be64 (iip->ili_item.li_lsn); -/* generate the checksum. */ xfs_dinode_calc_crc (mp, dip);
fs/xfs/xfs_inode_item.c +11 -8
@@ -325,12 +325,14 @@ xfs_inode_item_format_attr_fork(static void xfs_inode_to_log_dinode (struct xfs_inode *ip, -struct xfs_log_dinode *to) +struct xfs_log_dinode *to, +xfs_lsn_t lsn) {struct xfs_icdinode *from = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic = from->di_magic; + to->di_magic =XFS_DINODE_MAGIC ; + to->di_mode = from->di_mode; to->di_version = from->di_version; to->di_format = from->di_format;
@@ -340,8 +342,8 @@ xfs_inode_to_log_dinode( to->di_nlink = from->di_nlink; to->di_projid_lo = from->di_projid_lo; to->di_projid_hi = from->di_projid_hi; -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); +memset (to->di_pad,0 ,sizeof (to->di_pad)); to->di_atime.t_sec = inode->i_atime.tv_sec; to->di_atime.t_nsec = inode->i_atime.tv_nsec; to->di_mtime.t_sec = inode->i_mtime.tv_sec;
@@ -366,10 +368,11 @@ xfs_inode_to_log_dinode( to->di_crtime.t_sec = from->di_crtime.t_sec; to->di_crtime.t_nsec = from->di_crtime.t_nsec; to->di_flags2 = from->di_flags2; - to->di_ino = from->di_ino; - to->di_lsn = from->di_lsn; -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); + + to->di_ino = ip->i_ino; + to->di_lsn = lsn; +memset (to->di_pad2,0 ,sizeof (to->di_pad2)); +uuid_copy (&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); to->di_flushiter =0 ; }else { to->di_flushiter = from->di_flushiter;
@@ -390,7 +393,7 @@ xfs_inode_item_format_core(struct xfs_log_dinode *dic; dic =xlog_prepare_iovec (lv, vecp,XLOG_REG_TYPE_ICORE ); -xfs_inode_to_log_dinode (ip, dic); +xfs_inode_to_log_dinode (ip, dic, ip->i_itemp->ili_item.li_lsn);xlog_finish_iovec (lv, *vecp,xfs_log_dinode_size (ip->i_d.di_version)); }
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 3/9] xfs: cull unnecessary icdinode fields
Looks fine,
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 3/9] xfs: cull unnecessary icdinode fields
In reply to Dave ChinnerQuoted 14 lines · Dave Chinner
From: Dave Chinner <[email protected]>
Now that the struct
xfs_icdinodeis not directly related to the on-disk format, we can cull things in it we really don't need to store:- magic number never changes
- padding is not necessary
-next_unlinkedis never used
- inode number is redundant
- uuid is redundant
- lsn is accessed directly from dinode
- inode CRC is only accessed directly from dinode
Quoted 7 lines
Hence we can remove these from the struct
xfs_icdinodeand redirect the code that uses them to thexfs_dinodeappripriately. This reduces the size of the struct icdinode from 152 bytes to 88 bytes, and removes a fair chunk of unnecessary code, too.Signed-off-by Dave Chinner <[email protected]>---
Quoted 312 lines
fs/xfs/libxfs/xfs_inode_buf.c | 39 +++++++++++++-------------------------- fs/xfs/libxfs/xfs_inode_buf.h | 25 ++++++------------------- fs/xfs/xfs_inode.c | 19 +------------------ fs/xfs/xfs_inode_item.c | 19 +++++++++++-------- 4 files changed, 31 insertions(+), 71 deletions(-)fs/xfs/libxfs/xfs_inode_buf.c +13
-26@@ -202,7 +202,6 @@ xfs_inode_from_disk(struct xfs_icdinode *to = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic =be16_to_cpu (from->di_magic); to->di_mode =be16_to_cpu (from->di_mode); to->di_version = from ->di_version; to->di_format = from->di_format;@@ -212,7 +211,6 @@ xfs_inode_from_disk( to->di_nlink =be32_to_cpu (from->di_nlink); to->di_projid_lo =be16_to_cpu (from->di_projid_lo); to->di_projid_hi =be16_to_cpu (from->di_projid_hi); -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); to->di_flushiter =be16_to_cpu (from->di_flushiter);/* @@ -245,24 +243,22 @@ xfs_inode_from_disk( to->di_crtime.t_sec =be32_to_cpu (from->di_crtime.t_sec); to->di_crtime.t_nsec =be32_to_cpu (from->di_crtime.t_nsec); to->di_flags2 =be64_to_cpu (from->di_flags2); - to->di_ino =be64_to_cpu (from->di_ino); - to->di_lsn =be64_to_cpu (from->di_lsn); -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); } }void xfs_inode_to_disk (struct xfs_inode *ip, -struct xfs_dinode *to) +struct xfs_dinode *to, +xfs_lsn_t lsn) {struct xfs_icdinode *from = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic =cpu_to_be16 (from->di_magic); + to->di_magic =cpu_to_be16 (XFS_DINODE_MAGIC ); + to->di_mode =cpu_to_be16 (from->di_mode); - to->di_version = from ->di_version; + to->di_version = from->di_version; to->di_format = from->di_format; to->di_onlink =cpu_to_be16 (from->di_onlink); to->di_uid =cpu_to_be32 (from->di_uid);@@ -270,8 +266,8 @@ xfs_inode_to_disk( to->di_nlink =cpu_to_be32 (from->di_nlink); to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); to->di_projid_hi =cpu_to_be16 (from->di_projid_hi); -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); +memset (to->di_pad,0 ,sizeof (to->di_pad)); to->di_atime.t_sec =cpu_to_be32 (inode->i_atime.tv_sec); to->di_atime.t_nsec =cpu_to_be32 (inode->i_atime.tv_nsec); to->di_mtime.t_sec =cpu_to_be32 (inode->i_mtime.tv_sec);@@ -296,10 +292,11 @@ xfs_inode_to_disk( to->di_crtime.t_sec =cpu_to_be32 (from->di_crtime.t_sec); to->di_crtime.t_nsec =cpu_to_be32 (from->di_crtime.t_nsec); to->di_flags2 =cpu_to_be64 (from->di_flags2); - to->di_ino =cpu_to_be64 (from->di_ino); - to->di_lsn =cpu_to_be64 (from->di_lsn); -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); + + to->di_ino =cpu_to_be64 (ip->i_ino); + to->di_lsn =cpu_to_be64 (lsn); +memset (to->di_pad2,0 ,sizeof (to->di_pad2)); +uuid_copy (&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); to->di_flushiter =0 ; }else { to->di_flushiter =cpu_to_be16 (from->di_flushiter);@@ -434,13 +431,10 @@ xfs_iread( !(mp->m_flags & XFS_MOUNT_IKEEP)) {/* initialise the on-disk inode core */ memset (&ip->i_d,0 ,sizeof (ip->i_d)); - ip->i_d.di_magic =XFS_DINODE_MAGIC ; ip->i_d.di_gen =prandom_u32 (); -if (xfs_sb_version_hascrc (&mp->m_sb)) { +if (xfs_sb_version_hascrc (&mp->m_sb)) ip->i_d.di_version =3 ; - ip->i_d.di_ino = ip->i_ino; -uuid_copy (&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid); - }else +else ip->i_d.di_version =2 ;return 0 ; }@@ -484,16 +478,10 @@ xfs_iread(* Partial initialisation of the in-core inode. Just the bits * that xfs_ialloc won't overwrite or relies on being correct. */ - ip->i_d.di_magic =be16_to_cpu (dip->di_magic); ip->i_d.di_version = dip->di_version; ip->i_d.di_gen =be32_to_cpu (dip->di_gen); ip->i_d.di_flushiter =be16_to_cpu (dip->di_flushiter); -if (dip->di_version ==3 ) { - ip->i_d.di_ino =be64_to_cpu (dip->di_ino); -uuid_copy (&ip->i_d.di_uuid, &dip->di_uuid); - } -/* * Make sure to pull in the mode here as well in * case the inode is released without being used. @@ -514,7 +502,6 @@ xfs_iread(*/ 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/libxfs/xfs_inode_buf.h +6
-19@@ -22,24 +22,22 @@ struct xfs_inode;struct xfs_dinode ;/* -* In memory representation of the XFS inode. This is held in the in-core -* struct xfs_inode to represent the on disk values, but no longer needs to be -* identical to the on-disk structure as it is always translated to on-disk +* In memory representation of the XFS inode. This is held in the in-core struct +* xfs_inode and represents the current on disk values but the structure is not +* in on-disk format. That is, this structure is always translated to on-disk * format specific structures at the appropriate time. */ struct xfs_icdinode { -__uint16_t di_magic;/* inode magic # = XFS_DINODE_MAGIC */ __uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ __uint16_t di_onlink;/* old number of links to file */ +__uint16_t di_flushiter;/* incremented on flush */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */ __uint32_t di_nlink;/* number of links to file */ __uint16_t di_projid_lo;/* lower part of owner's project id */ __uint16_t di_projid_hi;/* higher part of owner's project id */ -__uint8_t di_pad[6 ];/* unused, zeroed space */ -__uint16_t di_flushiter;/* incremented on flush */ xfs_fsize_t di_size;/* number of bytes in file */ xfs_rfsblock_t di_nblocks;/* # of direct & btree blocks used */ xfs_extlen_t di_extsize;/* basic/minimum extent size for file */ @@ -52,22 +50,10 @@ struct xfs_icdinode {__uint16_t di_flags;/* random flags, XFS_DIFLAG_... */ __uint32_t di_gen;/* generation number */ -/* di_next_unlinked is the only non-core field in the old dinode */ -xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ - -/* start of the extended dinode, writable fields */ -__uint32_t di_crc;/* CRC of the inode */ __uint64_t di_changecount;/* number of attribute changes */ -xfs_lsn_t di_lsn;/* flush sequence */ __uint64_t di_flags2;/* more random flags */ -__uint8_t di_pad2[16 ];/* more padding for future expansion */ -/* fields only written to during inode creation */ xfs_ictimestamp_t di_crtime;/* time created */ -xfs_ino_t di_ino;/* inode number */ -uuid_t di_uuid;/* UUID of the filesystem */ - -/* structure must be padded to 64 bit alignment */ };/* @@ -86,7 +72,8 @@ int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,int xfs_iread (struct xfs_mount *,struct xfs_trans *,struct xfs_inode *,uint );void xfs_dinode_calc_crc (struct xfs_mount *,struct xfs_dinode *); -void xfs_inode_to_disk (struct xfs_inode *ip,struct xfs_dinode *to); +void xfs_inode_to_disk (struct xfs_inode *ip,struct xfs_dinode *to, +xfs_lsn_t lsn);void xfs_inode_from_disk (struct xfs_inode *ip,struct xfs_dinode *from);void xfs_log_dinode_to_disk (struct xfs_log_dinode *from,struct xfs_dinode *to);fs/xfs/xfs_inode.c +1
-18@@ -809,7 +809,6 @@ xfs_ialloc( ip->i_d.di_uid =xfs_kuid_to_uid (current_fsuid ()); ip->i_d.di_gid =xfs_kgid_to_gid (current_fsgid ());xfs_set_projid (ip, prid); -memset (&(ip->i_d.di_pad[0 ]),0 ,sizeof (ip->i_d.di_pad));if (pip &&XFS_INHERIT_GID (pip)) { ip->i_d.di_gid = pip->i_d.di_gid;@@ -847,13 +846,8 @@ xfs_ialloc( ip->i_d.di_flags =0 ;if (ip->i_d.di_version ==3 ) { -ASSERT (ip->i_d.di_ino == ino); -ASSERT (uuid_equal (&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); - ip->i_d.di_crc =0 ; ip->i_d.di_changecount =1 ; - ip->i_d.di_lsn =0 ; ip->i_d.di_flags2 =0 ; -memset (&(ip->i_d.di_pad2[0 ]),0 ,sizeof (ip->i_d.di_pad2)); ip->i_d.di_crtime.t_sec = (__int32_t )tv.tv_sec; ip->i_d.di_crtime.t_nsec = (__int32_t )tv.tv_nsec; }@@ -3464,13 +3458,6 @@ xfs_iflush_int( __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip); goto corrupt_out; } -if (XFS_TEST_ERROR (ip->i_d.di_magic !=XFS_DINODE_MAGIC , - mp,XFS_ERRTAG_IFLUSH_2 ,XFS_RANDOM_IFLUSH_2 )) { -xfs_alert_tag (mp,XFS_PTAG_IFLUSH , -"%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x" , - __func__, ip->i_ino, ip, ip->i_d.di_magic); - goto corrupt_out; - }if (S_ISREG (ip->i_d.di_mode)) { if (XFS_TEST_ERROR( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&@@ -3529,7 +3516,7 @@ xfs_iflush_int(* copy out the core of the inode, because if the inode is dirty at all * the core must be. */ -xfs_inode_to_disk (ip, dip); +xfs_inode_to_disk (ip, dip, iip->ili_item.li_lsn);/* Wrap, we never let the log put out DI_MAX_FLUSH */ if (ip->i_d.di_flushiter ==DI_MAX_FLUSH )@@ -3581,10 +3568,6 @@ xfs_iflush_int(*/ xfs_buf_attach_iodone (bp, xfs_iflush_done, &iip->ili_item); -/* update the lsn in the on disk inode if required */ -if (ip->i_d.di_version ==3 ) - dip->di_lsn =cpu_to_be64 (iip->ili_item.li_lsn); -/* generate the checksum. */ xfs_dinode_calc_crc (mp, dip);fs/xfs/xfs_inode_item.c +11
-8@@ -325,12 +325,14 @@ xfs_inode_item_format_attr_fork(static void xfs_inode_to_log_dinode (struct xfs_inode *ip, -struct xfs_log_dinode *to) +struct xfs_log_dinode *to, +xfs_lsn_t lsn) {struct xfs_icdinode *from = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_magic = from->di_magic; + to->di_magic =XFS_DINODE_MAGIC ; + to->di_mode = from->di_mode; to->di_version = from->di_version; to->di_format = from->di_format;@@ -340,8 +342,8 @@ xfs_inode_to_log_dinode( to->di_nlink = from->di_nlink; to->di_projid_lo = from->di_projid_lo; to->di_projid_hi = from->di_projid_hi; -memcpy (to->di_pad, from->di_pad,sizeof (to->di_pad)); +memset (to->di_pad,0 ,sizeof (to->di_pad)); to->di_atime.t_sec = inode->i_atime.tv_sec; to->di_atime.t_nsec = inode->i_atime.tv_nsec; to->di_mtime.t_sec = inode->i_mtime.tv_sec;@@ -366,10 +368,11 @@ xfs_inode_to_log_dinode( to->di_crtime.t_sec = from->di_crtime.t_sec; to->di_crtime.t_nsec = from->di_crtime.t_nsec; to->di_flags2 = from->di_flags2; - to->di_ino = from->di_ino; - to->di_lsn = from->di_lsn; -memcpy (to->di_pad2, from->di_pad2,sizeof (to->di_pad2)); -uuid_copy (&to->di_uuid, &from->di_uuid); + + to->di_ino = ip->i_ino; + to->di_lsn = lsn; +memset (to->di_pad2,0 ,sizeof (to->di_pad2)); +uuid_copy (&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); to->di_flushiter =0 ; }else { to->di_flushiter = from->di_flushiter;@@ -390,7 +393,7 @@ xfs_inode_item_format_core(struct xfs_log_dinode *dic; dic =xlog_prepare_iovec (lv, vecp,XLOG_REG_TYPE_ICORE ); -xfs_inode_to_log_dinode (ip, dic); +xfs_inode_to_log_dinode (ip, dic, ip->i_itemp->ili_item.li_lsn);xlog_finish_iovec (lv, *vecp,xfs_log_dinode_size (ip->i_d.di_version)); }Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 4/9 xfs: move v1 inode conversion to xfs_inode_from_disk
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
So we don't have to carry an di_onlink variable around anymore, move the inode conversion from v1 inode format to v2 inode format into xfs_inode_from_disk(). This means we can remove the di_onlink fields from the struct xfs_icdinode.
--- fs/xfs/libxfs/xfs_inode_buf.c | 42 ++++++++++++++++++++---------------------- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/libxfs/xfs_log_format.h | 2 +- fs/xfs/xfs_inode.c | 2 -- fs/xfs/xfs_inode_item.c | 2 +- 5 files changed, 22 insertions(+), 27 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +20 -22
@@ -204,13 +204,25 @@ xfs_inode_from_disk( to->di_mode =be16_to_cpu (from->di_mode); to->di_version = from ->di_version; + +/* +* Convert v1 inodes immediately to v2 inode format as this is the +* minimum inode version format we support in the rest of the code. +*/ +if (to->di_version ==1 ) { + to->di_nlink =be16_to_cpu (from->di_onlink); + to->di_projid_lo =0 ; + to->di_projid_hi =0 ; + to->di_version =2 ; + }else { + to->di_nlink =be32_to_cpu (from->di_nlink); + to->di_projid_lo =be16_to_cpu (from->di_projid_lo); + to->di_projid_hi =be16_to_cpu (from->di_projid_hi); + } + to->di_format = from->di_format; - to->di_onlink =be16_to_cpu (from->di_onlink); to->di_uid =be32_to_cpu (from->di_uid); to->di_gid =be32_to_cpu (from->di_gid); - to->di_nlink =be32_to_cpu (from->di_nlink); - to->di_projid_lo =be16_to_cpu (from->di_projid_lo); - to->di_projid_hi =be16_to_cpu (from->di_projid_hi); to->di_flushiter =be16_to_cpu (from->di_flushiter);/*
@@ -256,11 +268,11 @@ xfs_inode_to_disk(struct inode *inode =VFS_I (ip); to->di_magic =cpu_to_be16 (XFS_DINODE_MAGIC ); + to->di_onlink =0 ; to->di_mode =cpu_to_be16 (from->di_mode); to->di_version = from->di_version; to->di_format = from->di_format; - to->di_onlink =cpu_to_be16 (from->di_onlink); to->di_uid =cpu_to_be32 (from->di_uid); to->di_gid =cpu_to_be32 (from->di_gid); to->di_nlink =cpu_to_be32 (from->di_nlink);
@@ -310,9 +322,9 @@ xfs_log_dinode_to_disk( { to->di_magic =cpu_to_be16 (from->di_magic); to->di_mode =cpu_to_be16 (from->di_mode); - to->di_version = from ->di_version; + to->di_version = from->di_version; to->di_format = from->di_format; - to->di_onlink =cpu_to_be16 (from->di_onlink); + to->di_onlink =0 ; to->di_uid =cpu_to_be32 (from->di_uid); to->di_gid =cpu_to_be32 (from->di_gid); to->di_nlink =cpu_to_be32 (from->di_nlink);
@@ -492,21 +504,7 @@ xfs_iread( ip->i_d.di_mode =0 ; } -/* -* 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 ; - ip->i_d.di_nlink = ip->i_d.di_onlink; - ip->i_d.di_onlink =0 ; -xfs_set_projid (ip,0 ); - } - +ASSERT (ip->i_d.di_version >=2 ); ip->i_delayed_blks =0 ;/*
fs/xfs/libxfs/xfs_inode_buf.h +0 -1
@@ -31,7 +31,6 @@ struct xfs_icdinode {__uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ -__uint16_t di_onlink;/* old number of links to file */ __uint16_t di_flushiter;/* incremented on flush */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */
fs/xfs/libxfs/xfs_log_format.h +1 -1
@@ -369,7 +369,7 @@ struct xfs_log_dinode {__uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ -__uint16_t di_onlink;/* old number of links to file */ +__uint8_t di_pad3[2 ];/* unused in v2/3 inodes */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */ __uint32_t di_nlink;/* number of links to file */
fs/xfs/xfs_inode.c +0 -2
@@ -803,9 +803,7 @@ xfs_ialloc( ip->i_d.di_version =2 ; ip->i_d.di_mode = mode; - ip->i_d.di_onlink =0 ; ip->i_d.di_nlink = nlink; -ASSERT (ip->i_d.di_nlink == nlink); ip->i_d.di_uid =xfs_kuid_to_uid (current_fsuid ()); ip->i_d.di_gid =xfs_kgid_to_gid (current_fsgid ());xfs_set_projid (ip, prid);
fs/xfs/xfs_inode_item.c +1 -1
@@ -336,7 +336,6 @@ xfs_inode_to_log_dinode( to->di_mode = from->di_mode; to->di_version = from->di_version; to->di_format = from->di_format; - to->di_onlink = from->di_onlink; to->di_uid = from->di_uid; to->di_gid = from->di_gid; to->di_nlink = from->di_nlink;
@@ -344,6 +343,7 @@ xfs_inode_to_log_dinode( to->di_projid_hi = from->di_projid_hi;memset (to->di_pad,0 ,sizeof (to->di_pad)); +memset (to->di_pad3,0 ,sizeof (to->di_pad3)); to->di_atime.t_sec = inode->i_atime.tv_sec; to->di_atime.t_nsec = inode->i_atime.tv_nsec; to->di_mtime.t_sec = inode->i_mtime.tv_sec;
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 4/9] xfs: move v1 inode conversion to xfs_inode_from_disk
Looks fine,
Shouldn't we be able to kill off di_version as well? version 3 inodes only happen on crc enabled file systems, and version 2 only on version 4 file systems.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 4/9] xfs: move v1 inode conversion to xfs_inode_from_disk
Quoted 7 lines · Christoph Hellwig
Looks fine,
Reviewed-by Christoph Hellwig <[email protected]>Shouldn't we be able to kill off
di_versionas well? version 3 inodes only happen on crc enabled file systems, and version 2 only on version 4 file systems.
In theory, yes, though there is a lot of code that checks the di_version field and the superblock version checks are more heavyweight.
I think it's also a cleaner design to base general inode formatting decisions on the inode version number and it's internal flags, because then we don't have to rely on external code to determine exactly what to do. e.g. in userspace there is no guarantee we have a superblock context we can access, even if we have a struct xfs_inode or a struct xfs_icdinode...
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 5/9 xfs: reinitialise recycled VFS inode correctly
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Now that we keep certain on-disk information in the VFS inode rather than in a separate XFS specific stucture, we have to be careful of the VFS code clearing that information when we re-initialise reclaimable cached inodes during lookup. If we don't do this, then we lose critical information from the inode and that results in corruption being detected.
--- fs/xfs/xfs_icache.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
fs/xfs/xfs_icache.c +21 -1
@@ -135,6 +135,26 @@ xfs_inode_free( }/* +* When we recycle a reclaimable inode, we need to re-initialise the VFS inode +* part of the structure. This is made more complex by the fact we store +* information about the on-disk values in the VFS inode and so we can't just +* overwrite it's values unconditionally. Hence we save the parameters we +* need to retain across reinitialisation, and rewrite them into the VFS inode +* after resetting it's state even if resetting fails. +*/ +static int +xfs_reinit_inode ( +struct xfs_mount *mp, +struct inode *inode) +{ +int error; + + error =inode_init_always (mp->m_super, inode); + +return error; +} + +/* * Check the validity of the inode we just found it the cache */ static int
@@ -208,7 +228,7 @@ xfs_iget_cache_hit(spin_unlock (&ip->i_flags_lock);rcu_read_unlock (); - error =inode_init_always (mp->m_super, inode); + error =xfs_reinit_inode (mp, inode);if (error) {/* * Re-initializing the inode failed, and we are in deep
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 5/9] xfs: reinitialise recycled VFS inode correctly
Quoted 8 lines · Dave Chinner
From: Dave Chinner <[email protected]>
Now that we keep certain on-disk information in the VFS inode rather than in a separate XFS specific stucture, we have to be careful of the VFS code clearing that information when we re-initialise reclaimable cached inodes during lookup. If we don't do this, then we lose critical information from the inode and that results in corruption being detected.
Might be worth to use future tense here? Or maybe just fold it into the next patch.
Either way:
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 5/9] xfs: reinitialise recycled VFS inode correctly
In reply to Dave ChinnerQuoted 11 lines · Dave Chinner
From: Dave Chinner <[email protected]>
Now that we keep certain on-disk information in the VFS inode rather than in a separate XFS specific stucture, we have to be careful of the VFS code clearing that information when we re-initialise reclaimable cached inodes during lookup. If we don't do this, then we lose critical information from the inode and that results in corruption being detected.
Signed-off-by Dave Chinner <[email protected]>---
Quoted 50 lines
fs/xfs/xfs_icache.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)fs/xfs/xfs_icache.c +21
-1@@ -135,6 +135,26 @@ xfs_inode_free( }/* +* When we recycle a reclaimable inode, we need to re-initialise the VFS inode +* part of the structure. This is made more complex by the fact we store +* information about the on-disk values in the VFS inode and so we can't just +* overwrite it's values unconditionally. Hence we save the parameters we +* need to retain across reinitialisation, and rewrite them into the VFS inode +* after resetting it's state even if resetting fails. +*/ +static int +xfs_reinit_inode ( +struct xfs_mount *mp, +struct inode *inode) +{ +int error; + + error =inode_init_always (mp->m_super, inode); + +return error; +} + +/* * Check the validity of the inode we just found it the cache */ static int@@ -208,7 +228,7 @@ xfs_iget_cache_hit(spin_unlock (&ip->i_flags_lock);rcu_read_unlock (); - error =inode_init_always (mp->m_super, inode); + error =xfs_reinit_inode (mp, inode);if (error) {/* * Re-initializing the inode failed, and we are in deep Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 6/9 xfs: use vfs inode nlink field everywhere
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
The Vfs tracks the inodenlink just like the xfs_icdinode. We can remove the variable from the icdinode and use the vfs inode variable everywhere, reducing the size of the xfs_icdinode by a further 4 bytes.
--- fs/xfs/libxfs/xfs_inode_buf.c | 6 ++-- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/xfs_icache.c | 2 ++ fs/xfs/xfs_inode.c | 77 ++++++++++++++++++++----------------------- fs/xfs/xfs_inode.h | 2 -- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_iops.c | 3 +- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- 9 files changed, 45 insertions(+), 52 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +3 -3
@@ -210,12 +210,12 @@ xfs_inode_from_disk(* minimum inode version format we support in the rest of the code. */ if (to->di_version ==1 ) { - to->di_nlink =be16_to_cpu (from->di_onlink); +set_nlink (inode,be16_to_cpu (from->di_onlink)); to->di_projid_lo =0 ; to->di_projid_hi =0 ; to->di_version =2 ; }else { - to->di_nlink =be32_to_cpu (from->di_nlink); +set_nlink (inode,be32_to_cpu (from->di_nlink)); to->di_projid_lo =be16_to_cpu (from->di_projid_lo); to->di_projid_hi =be16_to_cpu (from->di_projid_hi); }
@@ -275,7 +275,6 @@ xfs_inode_to_disk( to->di_format = from->di_format; to->di_uid =cpu_to_be32 (from->di_uid); to->di_gid =cpu_to_be32 (from->di_gid); - to->di_nlink =cpu_to_be32 (from->di_nlink); to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); to->di_projid_hi =cpu_to_be16 (from->di_projid_hi);
@@ -286,6 +285,7 @@ xfs_inode_to_disk( to->di_mtime.t_nsec =cpu_to_be32 (inode->i_mtime.tv_nsec); to->di_ctime.t_sec =cpu_to_be32 (inode->i_ctime.tv_sec); to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); + to->di_nlink =cpu_to_be32 (inode->i_nlink); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);
fs/xfs/libxfs/xfs_inode_buf.h +0 -1
@@ -34,7 +34,6 @@ struct xfs_icdinode {__uint16_t di_flushiter;/* incremented on flush */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */ -__uint32_t di_nlink;/* number of links to file */ __uint16_t di_projid_lo;/* lower part of owner's project id */ __uint16_t di_projid_hi;/* higher part of owner's project id */ xfs_fsize_t di_size;/* number of bytes in file */
fs/xfs/xfs_icache.c +2 -0
@@ -148,9 +148,11 @@ xfs_reinit_inode( struct inode *inode) {int error; +uint32_t nlink = inode->i_nlink; error =inode_init_always (mp->m_super, inode); +set_nlink (inode, nlink);return error; }
fs/xfs/xfs_inode.c +36 -41
174 lines not on this page · raw message
fs/xfs/xfs_inode.h +0 -2
@@ -405,8 +405,6 @@ int xfs_ifree(struct xfs_trans *, xfs_inode_t *, struct xfs_bmap_free *);int xfs_itruncate_extents (struct xfs_trans **,struct xfs_inode *,int ,xfs_fsize_t ); -int xfs_iunlink (struct xfs_trans *,xfs_inode_t *); -void xfs_iext_realloc (xfs_inode_t *,int ,int );void xfs_iunpin_wait (xfs_inode_t *);
fs/xfs/xfs_inode_item.c +1 -1
@@ -338,7 +338,6 @@ xfs_inode_to_log_dinode( to->di_format = from->di_format; to->di_uid = from->di_uid; to->di_gid = from->di_gid; - to->di_nlink = from->di_nlink; to->di_projid_lo = from->di_projid_lo; to->di_projid_hi = from->di_projid_hi;
@@ -350,6 +349,7 @@ xfs_inode_to_log_dinode( to->di_mtime.t_nsec = inode->i_mtime.tv_nsec; to->di_ctime.t_sec = inode->i_ctime.tv_sec; to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; + to->di_nlink = inode->i_nlink; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;
fs/xfs/xfs_iops.c +1 -2
@@ -460,7 +460,7 @@ xfs_vn_getattr( stat->size =XFS_ISIZE (ip); stat->dev = inode->i_sb->s_dev; stat->mode = ip->i_d.di_mode; - stat->nlink = ip->i_d.di_nlink; + stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; stat->gid = inode->i_gid; stat->ino = ip->i_ino;
@@ -1216,7 +1216,6 @@ xfs_setup_inode(hlist_add_fake (&inode->i_hash); inode->i_mode = ip->i_d.di_mode; -set_nlink (inode, ip->i_d.di_nlink); inode->i_uid =xfs_uid_to_kuid (ip->i_d.di_uid); inode->i_gid =xfs_gid_to_kgid (ip->i_d.di_gid);
fs/xfs/xfs_itable.c +1 -1
@@ -85,7 +85,6 @@ xfs_bulkstat_one_int(/* xfs_iget returns the following without needing * further change. */ - buf->bs_nlink = dic->di_nlink; buf->bs_projid_lo = dic->di_projid_lo; buf->bs_projid_hi = dic->di_projid_hi; buf->bs_ino = ino;
@@ -94,6 +93,7 @@ xfs_bulkstat_one_int( buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size; + buf->bs_nlink = inode->i_nlink; buf->bs_atime.tv_sec = inode->i_atime.tv_sec; buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec; buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec;
fs/xfs/xfs_log_recover.c +1 -1
@@ -4342,7 +4342,7 @@ xlog_recover_process_one_iunlink(if (error) goto fail_iput; -ASSERT (ip->i_d.di_nlink ==0 ); +ASSERT (VFS_I (ip)->i_nlink ==0 );ASSERT (ip->i_d.di_mode !=0 );/* setup for the next pass */
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 6/9] xfs: use vfs inode nlink field everywhere
Quoted 3 lines · Dave Chinner
From: Dave Chinner <[email protected]>
The Vfs tracks the inodenlink just like the
xfs_icdinode. We can
s/Vfs/VFS/
fs/xfs/xfs_inode.c xfs_inactive( · line 1951
Quoted 7 lines
fs/xfs/xfs_inode.c +4
-2+STATIC intxfs_iunlink ( - xfs_trans_t *tp, - xfs_inode_t *ip) +struct xfs_trans *tp, +struct xfs_inode *ip, +bool ignore_linkcount)
I'd say kill the ignore_linkcount parameter and the assert depending on it. There are just two callers: xfs_droplink checks for i_nlink just before the call, and xfs_create_tmpfile has to set the override flag.
Otherwise looks fine:
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 6/9] xfs: use vfs inode nlink field everywhere
Quoted 7 lines · Christoph Hellwig
Quoted 3 lines · Dave Chinner
From: Dave Chinner <[email protected]>
The Vfs tracks the inodenlink just like the
xfs_icdinode. We cans/Vfs/VFS/
Quoted 11 lines
fs/xfs/xfs_inode.c xfs_inactive( · line 1951
Quoted 7 lines
fs/xfs/xfs_inode.c +4
-2+STATIC intxfs_iunlink ( - xfs_trans_t *tp, - xfs_inode_t *ip) +struct xfs_trans *tp, +struct xfs_inode *ip, +bool ignore_linkcount)I'd say kill the
ignore_linkcountparameter and the assert depending on it. There are just two callers:xfs_droplinkchecks fori_nlinkjust before the call, andxfs_create_tmpfilehas to set the override flag.
Will do, I think I added that when trying to track down a busy inodes after unmount bug in this patch, and then never removed it again.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 6/9] xfs: use vfs inode nlink field everywhere
In reply to Dave ChinnerQuoted 9 lines · Dave Chinner
From: Dave Chinner <[email protected]>
The Vfs tracks the inodenlink just like the
xfs_icdinode. We can remove the variable from the icdinode and use the vfs inode variable everywhere, reducing the size of thexfs_icdinodeby a further 4 bytes.Signed-off-by Dave Chinner <[email protected]>---
Quoted 360 lines
fs/xfs/libxfs/xfs_inode_buf.c | 6 ++-- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/xfs_icache.c | 2 ++ fs/xfs/xfs_inode.c | 77 ++++++++++++++++++++----------------------- fs/xfs/xfs_inode.h | 2 -- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_iops.c | 3 +- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- 9 files changed, 45 insertions(+), 52 deletions(-)fs/xfs/libxfs/xfs_inode_buf.c +3
-3@@ -210,12 +210,12 @@ xfs_inode_from_disk(* minimum inode version format we support in the rest of the code. */ if (to->di_version ==1 ) { - to->di_nlink =be16_to_cpu (from->di_onlink); +set_nlink (inode,be16_to_cpu (from->di_onlink)); to->di_projid_lo =0 ; to->di_projid_hi =0 ; to->di_version =2 ; }else { - to->di_nlink =be32_to_cpu (from->di_nlink); +set_nlink (inode,be32_to_cpu (from->di_nlink)); to->di_projid_lo =be16_to_cpu (from->di_projid_lo); to->di_projid_hi =be16_to_cpu (from->di_projid_hi); }@@ -275,7 +275,6 @@ xfs_inode_to_disk( to->di_format = from->di_format; to->di_uid =cpu_to_be32 (from->di_uid); to->di_gid =cpu_to_be32 (from->di_gid); - to->di_nlink =cpu_to_be32 (from->di_nlink); to->di_projid_lo =cpu_to_be16 (from->di_projid_lo); to->di_projid_hi =cpu_to_be16 (from->di_projid_hi);@@ -286,6 +285,7 @@ xfs_inode_to_disk( to->di_mtime.t_nsec =cpu_to_be32 (inode->i_mtime.tv_nsec); to->di_ctime.t_sec =cpu_to_be32 (inode->i_ctime.tv_sec); to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); + to->di_nlink =cpu_to_be32 (inode->i_nlink); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);fs/xfs/libxfs/xfs_inode_buf.h +0
-1@@ -34,7 +34,6 @@ struct xfs_icdinode {__uint16_t di_flushiter;/* incremented on flush */ __uint32_t di_uid;/* owner's user id */ __uint32_t di_gid;/* owner's group id */ -__uint32_t di_nlink;/* number of links to file */ __uint16_t di_projid_lo;/* lower part of owner's project id */ __uint16_t di_projid_hi;/* higher part of owner's project id */ xfs_fsize_t di_size;/* number of bytes in file */ fs/xfs/xfs_icache.c +2
-0@@ -148,9 +148,11 @@ xfs_reinit_inode( struct inode *inode) {int error; +uint32_t nlink = inode->i_nlink; error =inode_init_always (mp->m_super, inode); +set_nlink (inode, nlink);return error; }fs/xfs/xfs_inode.c +36
-41@@ -57,9 +57,9 @@ kmem_zone_t *xfs_inode_zone;*/ #define XFS_ITRUNC_MAX_EXTENTS 2 -STATIC int xfs_iflush_int(xfs_inode_t *, xfs_buf_t *); - -STATIC int xfs_iunlink_remove(xfs_trans_t *, xfs_inode_t *); +STATIC int xfs_iflush_int(struct xfs_inode *, struct xfs_buf *); +STATIC int xfs_iunlink(struct xfs_trans *, struct xfs_inode *, bool); +STATIC int xfs_iunlink_remove(struct xfs_trans *, struct xfs_inode *);/* * helper function to extract extent size hint from inode @@ -803,7 +803,7 @@ xfs_ialloc( ip->i_d.di_version =2 ; ip->i_d.di_mode = mode; - ip->i_d.di_nlink = nlink; +set_nlink (inode, nlink); ip->i_d.di_uid =xfs_kuid_to_uid (current_fsuid ()); ip->i_d.di_gid =xfs_kgid_to_gid (current_fsgid ());xfs_set_projid (ip, prid);@@ -1086,35 +1086,24 @@ xfs_dir_ialloc( }/* -* Decrement the link count on an inode & log the change. -* If this causes the link count to go to zero, initiate the -* logging activity required to truncate a file. +* Decrement the link count on an inode & log the change. If this causes the +* link count to go to zero, move the inode to AGI unlinked list so that it can +* be freed when the last active reference goes away via xfs_inactive(). */ int /* error */ xfs_droplink (xfs_trans_t *tp,xfs_inode_t *ip) { -int error; -xfs_trans_ichgtime (tp, ip,XFS_ICHGTIME_CHG ); -ASSERT (ip->i_d.di_nlink >0 ); - ip->i_d.di_nlink--;drop_nlink (VFS_I (ip));xfs_trans_log_inode (tp, ip,XFS_ILOG_CORE ); - error =0 ; -if (ip->i_d.di_nlink ==0 ) { -/* -* We're dropping the last link to this file. -* Move the on-disk inode to the AGI unlinked list. -* From xfs_inactive() we will pull the inode from -* the list and free it. -*/ - error =xfs_iunlink (tp, ip); - } -return error; +if (VFS_I (ip)->i_nlink) +return 0 ; + +return xfs_iunlink (tp, ip, false); }/* @@ -1128,8 +1117,6 @@ xfs_bumplink(xfs_trans_ichgtime (tp, ip,XFS_ICHGTIME_CHG );ASSERT (ip->i_d.di_version >1 ); -ASSERT (ip->i_d.di_nlink >0 || (VFS_I (ip)->i_state &I_LINKABLE )); - ip->i_d.di_nlink++;inc_nlink (VFS_I (ip));xfs_trans_log_inode (tp, ip,XFS_ILOG_CORE );return 0 ;@@ -1387,8 +1374,7 @@ xfs_create_tmpfile(*/ xfs_qm_vop_create_dqattach (tp, ip, udqp, gdqp, pdqp); - ip->i_d.di_nlink--; - error =xfs_iunlink (tp, ip); + error =xfs_iunlink (tp, ip, true);if (error) goto out_trans_cancel;@@ -1486,7 +1472,10 @@ xfs_link(xfs_bmap_init (&free_list, &first_block); -if (sip->i_d.di_nlink ==0 ) { +/* +* Handle initial link state of O_TMPFILE inode +*/ +if (VFS_I (sip)->i_nlink ==0 ) { error =xfs_iunlink_remove (tp, sip);if (error) goto error_return;@@ -1673,7 +1662,7 @@ xfs_release( } } -if (ip->i_d.di_nlink ==0 ) +if (VFS_I (ip)->i_nlink ==0 )return 0 ;if (xfs_can_free_eofblocks (ip, false)) {@@ -1889,7 +1878,7 @@ xfs_inactive(if (mp->m_flags &XFS_MOUNT_RDONLY )return ; -if (ip->i_d.di_nlink !=0 ) { +if (VFS_I (ip)->i_nlink !=0 ) {/* * force is true because we are evicting an inode from the * cache. Post-eof blocks must be freed, lest we end up with @@ -1946,14 +1935,20 @@ xfs_inactive( }/* -* This is called when the inode's link count goes to 0. -* We place the on-disk inode on a list in the AGI. It -* will be pulled from this list when the inode is freed. +* This is called when the inode's link count goes to 0 or we are creating a +* tmpfile via O_TMPFILE. In the case of a tmpfile, @ignore_linkcount will be +* set to true as the link count is dropped to zero by the VFS after we've +* created the file successfully, so we have to add it to the unlinked list +* while the link count is non-zero. +* +* We place the on-disk inode on a list in the AGI. It will be pulled from this +* list when the inode is freed. */ -int +STATIC intxfs_iunlink ( -xfs_trans_t *tp, -xfs_inode_t *ip) +struct xfs_trans *tp, +struct xfs_inode *ip, +bool ignore_linkcount) {xfs_mount_t *mp;xfs_agi_t *agi;@@ -1965,7 +1960,7 @@ xfs_iunlink(int offset;int error; -ASSERT (ip->i_d.di_nlink ==0 ); +ASSERT (VFS_I (ip)->i_nlink ==0 || ignore_linkcount);ASSERT (ip->i_d.di_mode !=0 ); mp = tp->t_mountp;@@ -2406,7 +2401,7 @@ xfs_ifree(struct xfs_icluster xic = {0 };ASSERT (xfs_isilocked (ip,XFS_ILOCK_EXCL )); -ASSERT (ip->i_d.di_nlink ==0 ); +ASSERT (VFS_I (ip)->i_nlink ==0 );ASSERT (ip->i_d.di_nextents ==0 );ASSERT (ip->i_d.di_anextents ==0 );ASSERT (ip->i_d.di_size ==0 || !S_ISREG (ip->i_d.di_mode));@@ -2574,8 +2569,8 @@ xfs_remove(* If we're removing a directory perform some additional validation. */ if (is_dir) { -ASSERT (ip->i_d.di_nlink >=2 ); -if (ip->i_d.di_nlink !=2 ) { +ASSERT (VFS_I (ip)->i_nlink >=2 ); +if (VFS_I (ip)->i_nlink !=2 ) { error = -ENOTEMPTY ; goto out_trans_cancel; }@@ -3031,7 +3026,7 @@ xfs_rename(* Make sure target dir is empty. */ if (!(xfs_dir_isempty (target_ip)) || - (target_ip->i_d.di_nlink >2 )) { + (VFS_I (target_ip)->i_nlink >2 )) { error = -EEXIST ; goto out_trans_cancel; }@@ -3138,7 +3133,7 @@ xfs_rename(* intermediate state on disk. */ if (wip) { -ASSERT (VFS_I (wip)->i_nlink ==0 && wip->i_d.di_nlink ==0 ); +ASSERT (VFS_I (wip)->i_nlink ==0 ); error =xfs_bumplink (tp, wip);if (error) goto out_bmap_cancel;fs/xfs/xfs_inode.h +0
-2@@ -405,8 +405,6 @@ int xfs_ifree(struct xfs_trans *, xfs_inode_t *, struct xfs_bmap_free *);int xfs_itruncate_extents (struct xfs_trans **,struct xfs_inode *,int ,xfs_fsize_t ); -int xfs_iunlink (struct xfs_trans *,xfs_inode_t *); -void xfs_iext_realloc (xfs_inode_t *,int ,int );void xfs_iunpin_wait (xfs_inode_t *);fs/xfs/xfs_inode_item.c +1
-1@@ -338,7 +338,6 @@ xfs_inode_to_log_dinode( to->di_format = from->di_format; to->di_uid = from->di_uid; to->di_gid = from->di_gid; - to->di_nlink = from->di_nlink; to->di_projid_lo = from->di_projid_lo; to->di_projid_hi = from->di_projid_hi;@@ -350,6 +349,7 @@ xfs_inode_to_log_dinode( to->di_mtime.t_nsec = inode->i_mtime.tv_nsec; to->di_ctime.t_sec = inode->i_ctime.tv_sec; to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; + to->di_nlink = inode->i_nlink; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;fs/xfs/xfs_iops.c +1
-2@@ -460,7 +460,7 @@ xfs_vn_getattr( stat->size =XFS_ISIZE (ip); stat->dev = inode->i_sb->s_dev; stat->mode = ip->i_d.di_mode; - stat->nlink = ip->i_d.di_nlink; + stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; stat->gid = inode->i_gid; stat->ino = ip->i_ino;@@ -1216,7 +1216,6 @@ xfs_setup_inode(hlist_add_fake (&inode->i_hash); inode->i_mode = ip->i_d.di_mode; -set_nlink (inode, ip->i_d.di_nlink); inode->i_uid =xfs_uid_to_kuid (ip->i_d.di_uid); inode->i_gid =xfs_gid_to_kgid (ip->i_d.di_gid);fs/xfs/xfs_itable.c +1
-1@@ -85,7 +85,6 @@ xfs_bulkstat_one_int(/* xfs_iget returns the following without needing * further change. */ - buf->bs_nlink = dic->di_nlink; buf->bs_projid_lo = dic->di_projid_lo; buf->bs_projid_hi = dic->di_projid_hi; buf->bs_ino = ino;@@ -94,6 +93,7 @@ xfs_bulkstat_one_int( buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size; + buf->bs_nlink = inode->i_nlink; buf->bs_atime.tv_sec = inode->i_atime.tv_sec; buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec; buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec;fs/xfs/xfs_log_recover.c +1
-1@@ -4342,7 +4342,7 @@ xlog_recover_process_one_iunlink(if (error) goto fail_iput; -ASSERT (ip->i_d.di_nlink ==0 ); +ASSERT (VFS_I (ip)->i_nlink ==0 );ASSERT (ip->i_d.di_mode !=0 );/* setup for the next pass */ Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 7/9 xfs: move inode generation count to VFS inode
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Pull another 4 bytes out of the xfs_icdinode.
--- fs/xfs/libxfs/xfs_inode_buf.c | 8 ++++---- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_icache.c | 2 ++ fs/xfs/xfs_inode.c | 5 +---- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 1 - fs/xfs/xfs_itable.c | 2 +- 9 files changed, 11 insertions(+), 14 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +4 -4
@@ -237,6 +237,7 @@ xfs_inode_from_disk( inode->i_mtime.tv_nsec = (int )be32_to_cpu (from->di_mtime.t_nsec); inode->i_ctime.tv_sec = (int )be32_to_cpu (from->di_ctime.t_sec); inode->i_ctime.tv_nsec = (int )be32_to_cpu (from->di_ctime.t_nsec); + inode->i_generation =be32_to_cpu (from->di_gen); to->di_size =be64_to_cpu (from->di_size); to->di_nblocks =be64_to_cpu (from->di_nblocks);
@@ -248,7 +249,6 @@ xfs_inode_from_disk( to->di_dmevmask =be32_to_cpu (from->di_dmevmask); to->di_dmstate =be16_to_cpu (from->di_dmstate); to->di_flags =be16_to_cpu (from->di_flags); - to->di_gen =be32_to_cpu (from->di_gen);if (to->di_version ==3 ) { to->di_changecount =be64_to_cpu (from->di_changecount);
@@ -286,6 +286,7 @@ xfs_inode_to_disk( to->di_ctime.t_sec =cpu_to_be32 (inode->i_ctime.tv_sec); to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); to->di_nlink =cpu_to_be32 (inode->i_nlink); + to->di_gen =cpu_to_be32 (inode->i_generation); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);
@@ -297,7 +298,6 @@ xfs_inode_to_disk( to->di_dmevmask =cpu_to_be32 (from->di_dmevmask); to->di_dmstate =cpu_to_be16 (from->di_dmstate); to->di_flags =cpu_to_be16 (from->di_flags); - to->di_gen =cpu_to_be32 (from->di_gen);if (from->di_version ==3 ) { to->di_changecount =cpu_to_be64 (from->di_changecount);
@@ -443,7 +443,7 @@ xfs_iread( !(mp->m_flags & XFS_MOUNT_IKEEP)) {/* initialise the on-disk inode core */ memset (&ip->i_d,0 ,sizeof (ip->i_d)); - ip->i_d.di_gen =prandom_u32 (); +VFS_I (ip)->i_generation =prandom_u32 ();if (xfs_sb_version_hascrc (&mp->m_sb)) ip->i_d.di_version =3 ;else
@@ -491,7 +491,7 @@ xfs_iread(* that xfs_ialloc won't overwrite or relies on being correct. */ ip->i_d.di_version = dip->di_version; - ip->i_d.di_gen =be32_to_cpu (dip->di_gen); +VFS_I (ip)->i_generation =be32_to_cpu (dip->di_gen); ip->i_d.di_flushiter =be16_to_cpu (dip->di_flushiter);/*
fs/xfs/libxfs/xfs_inode_buf.h +0 -1
@@ -46,7 +46,6 @@ struct xfs_icdinode {__uint32_t di_dmevmask;/* DMIG event mask */ __uint16_t di_dmstate;/* DMIG state info */ __uint16_t di_flags;/* random flags, XFS_DIFLAG_... */ -__uint32_t di_gen;/* generation number */ __uint64_t di_changecount;/* number of attribute changes */ __uint64_t di_flags2;/* more random flags */
fs/xfs/xfs_export.c +1 -1
@@ -152,7 +152,7 @@ xfs_nfs_get_inode(return ERR_PTR (error); } -if (ip->i_d.di_gen != generation) { +if (VFS_I (ip)->i_generation != generation) {IRELE (ip);return ERR_PTR (-ESTALE ); }
fs/xfs/xfs_icache.c +2 -0
@@ -149,10 +149,12 @@ xfs_reinit_inode( {int error;uint32_t nlink = inode->i_nlink; +uint32_t generation = inode->i_generation; error =inode_init_always (mp->m_super, inode);set_nlink (inode, nlink); + inode->i_generation = generation;return error; }
fs/xfs/xfs_inode.c +1 -4
@@ -835,9 +835,6 @@ xfs_ialloc( inode->i_atime = tv; inode->i_ctime = tv; -/* -* di_gen will have been taken care of in xfs_iread. -*/ ip->i_d.di_extsize =0 ; ip->i_d.di_dmevmask =0 ; ip->i_d.di_dmstate =0 ;
@@ -2428,7 +2425,7 @@ xfs_ifree(* Bump the generation count so no one will be confused * by reincarnations of this inode. */ - ip->i_d.di_gen++; +VFS_I (ip)->i_generation++;xfs_trans_log_inode (tp, ip,XFS_ILOG_CORE );if (xic.deleted)
fs/xfs/xfs_inode_item.c +1 -1
@@ -350,6 +350,7 @@ xfs_inode_to_log_dinode( to->di_ctime.t_sec = inode->i_ctime.tv_sec; to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; to->di_nlink = inode->i_nlink; + to->di_gen = inode->i_generation; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;
@@ -361,7 +362,6 @@ xfs_inode_to_log_dinode( to->di_dmevmask = from->di_dmevmask; to->di_dmstate = from->di_dmstate; to->di_flags = from->di_flags; - to->di_gen = from->di_gen;if (from->di_version ==3 ) { to->di_changecount = from->di_changecount;
fs/xfs/xfs_ioctl.c +1 -1
@@ -114,7 +114,7 @@ xfs_find_handle( handle.ha_fid.fid_len =sizeof (xfs_fid_t) -sizeof (handle.ha_fid.fid_len); handle.ha_fid.fid_pad =0 ; - handle.ha_fid.fid_gen = ip->i_d.di_gen; + handle.ha_fid.fid_gen = inode->i_generation; handle.ha_fid.fid_ino = ip->i_ino; hsize =XFS_HSIZE (handle);
fs/xfs/xfs_iops.c +0 -1
@@ -1231,7 +1231,6 @@ xfs_setup_inode(break ; } - inode->i_generation = ip->i_d.di_gen;i_size_write (inode, ip->i_d.di_size);xfs_diflags_to_iflags (inode, ip);
fs/xfs/xfs_itable.c +1 -1
@@ -100,11 +100,11 @@ xfs_bulkstat_one_int( buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec; buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; + buf->bs_gen = inode->i_generation; buf->bs_xflags =xfs_ip2xflags (ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; buf->bs_extents = dic->di_nextents; - buf->bs_gen = dic->di_gen;memset (buf->bs_pad,0 ,sizeof (buf->bs_pad)); buf->bs_dmevmask = dic->di_dmevmask; buf->bs_dmstate = dic->di_dmstate;
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 7/9] xfs: move inode generation count to VFS inode
Looks fine,
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 7/9] xfs: move inode generation count to VFS inode
In reply to Dave ChinnerQuoted 6 lines · Dave Chinner
From: Dave Chinner <[email protected]>
Pull another 4 bytes out of the
xfs_icdinode.Signed-off-by Dave Chinner <[email protected]>---
Quoted 199 lines
fs/xfs/libxfs/xfs_inode_buf.c | 8 ++++---- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_icache.c | 2 ++ fs/xfs/xfs_inode.c | 5 +---- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 1 - fs/xfs/xfs_itable.c | 2 +- 9 files changed, 11 insertions(+), 14 deletions(-)fs/xfs/libxfs/xfs_inode_buf.c +4
-4@@ -237,6 +237,7 @@ xfs_inode_from_disk( inode->i_mtime.tv_nsec = (int )be32_to_cpu (from->di_mtime.t_nsec); inode->i_ctime.tv_sec = (int )be32_to_cpu (from->di_ctime.t_sec); inode->i_ctime.tv_nsec = (int )be32_to_cpu (from->di_ctime.t_nsec); + inode->i_generation =be32_to_cpu (from->di_gen); to->di_size =be64_to_cpu (from->di_size); to->di_nblocks =be64_to_cpu (from->di_nblocks);@@ -248,7 +249,6 @@ xfs_inode_from_disk( to->di_dmevmask =be32_to_cpu (from->di_dmevmask); to->di_dmstate =be16_to_cpu (from->di_dmstate); to->di_flags =be16_to_cpu (from->di_flags); - to->di_gen =be32_to_cpu (from->di_gen);if (to->di_version ==3 ) { to->di_changecount =be64_to_cpu (from->di_changecount);@@ -286,6 +286,7 @@ xfs_inode_to_disk( to->di_ctime.t_sec =cpu_to_be32 (inode->i_ctime.tv_sec); to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); to->di_nlink =cpu_to_be32 (inode->i_nlink); + to->di_gen =cpu_to_be32 (inode->i_generation); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);@@ -297,7 +298,6 @@ xfs_inode_to_disk( to->di_dmevmask =cpu_to_be32 (from->di_dmevmask); to->di_dmstate =cpu_to_be16 (from->di_dmstate); to->di_flags =cpu_to_be16 (from->di_flags); - to->di_gen =cpu_to_be32 (from->di_gen);if (from->di_version ==3 ) { to->di_changecount =cpu_to_be64 (from->di_changecount);@@ -443,7 +443,7 @@ xfs_iread( !(mp->m_flags & XFS_MOUNT_IKEEP)) {/* initialise the on-disk inode core */ memset (&ip->i_d,0 ,sizeof (ip->i_d)); - ip->i_d.di_gen =prandom_u32 (); +VFS_I (ip)->i_generation =prandom_u32 ();if (xfs_sb_version_hascrc (&mp->m_sb)) ip->i_d.di_version =3 ;else @@ -491,7 +491,7 @@ xfs_iread(* that xfs_ialloc won't overwrite or relies on being correct. */ ip->i_d.di_version = dip->di_version; - ip->i_d.di_gen =be32_to_cpu (dip->di_gen); +VFS_I (ip)->i_generation =be32_to_cpu (dip->di_gen); ip->i_d.di_flushiter =be16_to_cpu (dip->di_flushiter);/* fs/xfs/libxfs/xfs_inode_buf.h +0
-1@@ -46,7 +46,6 @@ struct xfs_icdinode {__uint32_t di_dmevmask;/* DMIG event mask */ __uint16_t di_dmstate;/* DMIG state info */ __uint16_t di_flags;/* random flags, XFS_DIFLAG_... */ -__uint32_t di_gen;/* generation number */ __uint64_t di_changecount;/* number of attribute changes */ __uint64_t di_flags2;/* more random flags */ fs/xfs/xfs_export.c +1
-1@@ -152,7 +152,7 @@ xfs_nfs_get_inode(return ERR_PTR (error); } -if (ip->i_d.di_gen != generation) { +if (VFS_I (ip)->i_generation != generation) {IRELE (ip);return ERR_PTR (-ESTALE ); }fs/xfs/xfs_icache.c +2
-0@@ -149,10 +149,12 @@ xfs_reinit_inode( {int error;uint32_t nlink = inode->i_nlink; +uint32_t generation = inode->i_generation; error =inode_init_always (mp->m_super, inode);set_nlink (inode, nlink); + inode->i_generation = generation;return error; }fs/xfs/xfs_inode.c +1
-4@@ -835,9 +835,6 @@ xfs_ialloc( inode->i_atime = tv; inode->i_ctime = tv; -/* -* di_gen will have been taken care of in xfs_iread. -*/ ip->i_d.di_extsize =0 ; ip->i_d.di_dmevmask =0 ; ip->i_d.di_dmstate =0 ;@@ -2428,7 +2425,7 @@ xfs_ifree(* Bump the generation count so no one will be confused * by reincarnations of this inode. */ - ip->i_d.di_gen++; +VFS_I (ip)->i_generation++;xfs_trans_log_inode (tp, ip,XFS_ILOG_CORE );if (xic.deleted)fs/xfs/xfs_inode_item.c +1
-1@@ -350,6 +350,7 @@ xfs_inode_to_log_dinode( to->di_ctime.t_sec = inode->i_ctime.tv_sec; to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; to->di_nlink = inode->i_nlink; + to->di_gen = inode->i_generation; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;@@ -361,7 +362,6 @@ xfs_inode_to_log_dinode( to->di_dmevmask = from->di_dmevmask; to->di_dmstate = from->di_dmstate; to->di_flags = from->di_flags; - to->di_gen = from->di_gen;if (from->di_version ==3 ) { to->di_changecount = from->di_changecount;fs/xfs/xfs_ioctl.c +1
-1@@ -114,7 +114,7 @@ xfs_find_handle( handle.ha_fid.fid_len =sizeof (xfs_fid_t) -sizeof (handle.ha_fid.fid_len); handle.ha_fid.fid_pad =0 ; - handle.ha_fid.fid_gen = ip->i_d.di_gen; + handle.ha_fid.fid_gen = inode->i_generation; handle.ha_fid.fid_ino = ip->i_ino; hsize =XFS_HSIZE (handle);fs/xfs/xfs_iops.c +0
-1@@ -1231,7 +1231,6 @@ xfs_setup_inode(break ; } - inode->i_generation = ip->i_d.di_gen;i_size_write (inode, ip->i_d.di_size);xfs_diflags_to_iflags (inode, ip);fs/xfs/xfs_itable.c +1
-1@@ -100,11 +100,11 @@ xfs_bulkstat_one_int( buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec; buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; + buf->bs_gen = inode->i_generation; buf->bs_xflags =xfs_ip2xflags (ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; buf->bs_extents = dic->di_nextents; - buf->bs_gen = dic->di_gen;memset (buf->bs_pad,0 ,sizeof (buf->bs_pad)); buf->bs_dmevmask = dic->di_dmevmask; buf->bs_dmstate = dic->di_dmstate;Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 8/9 xfs: move di_changecount to VFS inode
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
We can store the di_changecount in the i_version field of the VFS inode and remove another 8 bytes from the xfs_icdinode.
--- fs/xfs/libxfs/xfs_inode_buf.c | 4 ++-- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/xfs_icache.c | 6 ++++-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_trans_inode.c | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-)
fs/xfs/libxfs/xfs_inode_buf.c +2 -2
@@ -251,7 +251,7 @@ xfs_inode_from_disk( to->di_flags =be16_to_cpu (from->di_flags);if (to->di_version ==3 ) { - to->di_changecount =be64_to_cpu (from->di_changecount); + inode->i_version =be64_to_cpu (from->di_changecount); to->di_crtime.t_sec =be32_to_cpu (from->di_crtime.t_sec); to->di_crtime.t_nsec =be32_to_cpu (from->di_crtime.t_nsec); to->di_flags2 =be64_to_cpu (from->di_flags2);
@@ -300,7 +300,7 @@ xfs_inode_to_disk( to->di_flags =cpu_to_be16 (from->di_flags);if (from->di_version ==3 ) { - to->di_changecount =cpu_to_be64 (from->di_changecount); + to->di_changecount =cpu_to_be64 (inode->i_version); to->di_crtime.t_sec =cpu_to_be32 (from->di_crtime.t_sec); to->di_crtime.t_nsec =cpu_to_be32 (from->di_crtime.t_nsec); to->di_flags2 =cpu_to_be64 (from->di_flags2);
fs/xfs/libxfs/xfs_inode_buf.h +0 -1
@@ -47,7 +47,6 @@ struct xfs_icdinode {__uint16_t di_dmstate;/* DMIG state info */ __uint16_t di_flags;/* random flags, XFS_DIFLAG_... */ -__uint64_t di_changecount;/* number of attribute changes */ __uint64_t di_flags2;/* more random flags */ xfs_ictimestamp_t di_crtime;/* time created */
fs/xfs/xfs_icache.c +4 -2
@@ -138,9 +138,9 @@ xfs_inode_free(* When we recycle a reclaimable inode, we need to re-initialise the VFS inode * part of the structure. This is made more complex by the fact we store * information about the on-disk values in the VFS inode and so we can't just -* overwrite it's values unconditionally. Hence we save the parameters we +* overwrite the values unconditionally. Hence we save the parameters we * need to retain across reinitialisation, and rewrite them into the VFS inode -* after resetting it's state even if resetting fails. +* after reinitialisation even if it fails. */ static int xfs_reinit_inode(
@@ -150,11 +150,13 @@ xfs_reinit_inode(int error;uint32_t nlink = inode->i_nlink;uint32_t generation = inode->i_generation; +uint64_t version = inode->i_version; error =inode_init_always (mp->m_super, inode);set_nlink (inode, nlink); inode->i_generation = generation; + inode->i_version = version;return error; }
fs/xfs/xfs_inode.c +1 -1
@@ -841,7 +841,7 @@ xfs_ialloc( ip->i_d.di_flags =0 ;if (ip->i_d.di_version ==3 ) { - ip->i_d.di_changecount =1 ; + inode->i_version =1 ; ip->i_d.di_flags2 =0 ; ip->i_d.di_crtime.t_sec = (__int32_t )tv.tv_sec; ip->i_d.di_crtime.t_nsec = (__int32_t )tv.tv_nsec;
fs/xfs/xfs_inode_item.c +1 -1
@@ -364,7 +364,7 @@ xfs_inode_to_log_dinode( to->di_flags = from->di_flags;if (from->di_version ==3 ) { - to->di_changecount = from->di_changecount; + to->di_changecount = inode->i_version; to->di_crtime.t_sec = from->di_crtime.t_sec; to->di_crtime.t_nsec = from->di_crtime.t_nsec; to->di_flags2 = from->di_flags2;
fs/xfs/xfs_trans_inode.c +1 -1
@@ -117,7 +117,7 @@ xfs_trans_log_inode(*/ if (!(ip->i_itemp->ili_item.li_desc->lid_flags &XFS_LID_DIRTY ) &&IS_I_VERSION (VFS_I (ip))) { - ip->i_d.di_changecount = ++VFS_I (ip)->i_version; +VFS_I (ip)->i_version++; flags |=XFS_ILOG_CORE ; }
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 8/9] xfs: move di_changecount to VFS inode
Looks fine,
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH v3 9/9 xfs: mode di_mode to vfs inode
In reply to Dave ChinnerFrom: Dave Chinner <[email protected]>
Move the di_mode value from the xfs_icdinode to the VFS inode, reducing the xfs_icdinode byte another 2 bytes and collapsing another 2 byte hole in the structure.
--- fs/xfs/libxfs/xfs_bmap.c | 6 +++--- fs/xfs/libxfs/xfs_dir2.c | 12 +++++------ fs/xfs/libxfs/xfs_inode_buf.c | 8 +++---- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 2 +- fs/xfs/xfs_bmap_util.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_file.c | 6 +++--- fs/xfs/xfs_filestream.c | 4 ++-- fs/xfs/xfs_icache.c | 13 ++++++++---- fs/xfs/xfs_inode.c | 48 ++++++++++++++++++++---------------------- fs/xfs/xfs_inode.h | 4 ++-- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 14 ++++++------ fs/xfs/xfs_iops.c | 12 ++++------- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 2 +- 18 files changed, 71 insertions(+), 73 deletions(-)
fs/xfs/libxfs/xfs_bmap.c +3 -3
@@ -912,7 +912,7 @@ xfs_bmap_local_to_extents(* We don't want to deal with the case of keeping inode data inline yet. * So sending the data fork of a regular inode is invalid. */ -ASSERT (!(S_ISREG (ip->i_d.di_mode) && whichfork ==XFS_DATA_FORK )); +ASSERT (!(S_ISREG (VFS_I (ip)->i_mode) && whichfork ==XFS_DATA_FORK )); ifp =XFS_IFORK_PTR (ip, whichfork);ASSERT (XFS_IFORK_FORMAT (ip, whichfork) ==XFS_DINODE_FMT_LOCAL );
@@ -1079,7 +1079,7 @@ xfs_bmap_add_attrfork_local(if (ip->i_df.if_bytes <=XFS_IFORK_DSIZE (ip))return 0 ; -if (S_ISDIR (ip->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip)->i_mode)) {memset (&dargs,0 ,sizeof (dargs)); dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip;
@@ -1091,7 +1091,7 @@ xfs_bmap_add_attrfork_local(return xfs_dir2_sf_to_block (&dargs); } -if (S_ISLNK (ip->i_d.di_mode)) +if (S_ISLNK (VFS_I (ip)->i_mode))return xfs_bmap_local_to_extents (tp, ip, firstblock,1 , flags,XFS_DATA_FORK , xfs_symlink_local_to_remote);
fs/xfs/libxfs/xfs_dir2.c +6 -6
@@ -176,7 +176,7 @@ xfs_dir_isempty( {xfs_dir2_sf_hdr_t *sfp; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));if (dp->i_d.di_size ==0 )/* might happen during shutdown. */ return 1 ;if (dp->i_d.di_size >XFS_IFORK_DSIZE (dp))
@@ -231,7 +231,7 @@ xfs_dir_init(struct xfs_da_args *args;int error; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode)); error =xfs_dir_ino_validate (tp->t_mountp, pdp->i_ino);if (error)return error;
@@ -266,7 +266,7 @@ xfs_dir_createname(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));if (inum) { rval =xfs_dir_ino_validate (tp->t_mountp, inum);if (rval)
@@ -364,7 +364,7 @@ xfs_dir_lookup(int v;/* type-checking value */ int lock_mode; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_lookup);/*
@@ -443,7 +443,7 @@ xfs_dir_removename(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_remove); args =kmem_zalloc (sizeof (*args),KM_SLEEP |KM_NOFS );
@@ -505,7 +505,7 @@ xfs_dir_replace(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode)); rval =xfs_dir_ino_validate (tp->t_mountp, inum);if (rval)
fs/xfs/libxfs/xfs_inode_buf.c +4 -4
@@ -202,13 +202,12 @@ xfs_inode_from_disk(struct xfs_icdinode *to = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_mode =be16_to_cpu (from->di_mode); - to->di_version = from ->di_version;/* * Convert v1 inodes immediately to v2 inode format as this is the * minimum inode version format we support in the rest of the code. */ + to->di_version = from->di_version;if (to->di_version ==1 ) {set_nlink (inode,be16_to_cpu (from->di_onlink)); to->di_projid_lo =0 ;
@@ -238,6 +237,7 @@ xfs_inode_from_disk( inode->i_ctime.tv_sec = (int )be32_to_cpu (from->di_ctime.t_sec); inode->i_ctime.tv_nsec = (int )be32_to_cpu (from->di_ctime.t_nsec); inode->i_generation =be32_to_cpu (from->di_gen); + inode->i_mode =be16_to_cpu (from->di_mode); to->di_size =be64_to_cpu (from->di_size); to->di_nblocks =be64_to_cpu (from->di_nblocks);
@@ -270,7 +270,6 @@ xfs_inode_to_disk( to->di_magic =cpu_to_be16 (XFS_DINODE_MAGIC ); to->di_onlink =0 ; - to->di_mode =cpu_to_be16 (from->di_mode); to->di_version = from->di_version; to->di_format = from->di_format; to->di_uid =cpu_to_be32 (from->di_uid);
@@ -287,6 +286,7 @@ xfs_inode_to_disk( to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); to->di_nlink =cpu_to_be32 (inode->i_nlink); to->di_gen =cpu_to_be32 (inode->i_generation); + to->di_mode =cpu_to_be16 (inode->i_mode); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);
@@ -501,7 +501,7 @@ xfs_iread(* the inode is already free and not try to mess * with the uninitialized part of it. */ - ip->i_d.di_mode =0 ; +VFS_I (ip)->i_mode =0 ; }ASSERT (ip->i_d.di_version >=2 );
fs/xfs/libxfs/xfs_inode_buf.h +0 -1
@@ -28,7 +28,6 @@ struct xfs_dinode;* format specific structures at the appropriate time. */ struct xfs_icdinode { -__uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ __uint16_t di_flushiter;/* incremented on flush */
fs/xfs/libxfs/xfs_inode_fork.c +1 -1
@@ -121,7 +121,7 @@ xfs_iformat_fork(return -EFSCORRUPTED ; } -switch (ip->i_d.di_mode &S_IFMT ) { +switch (VFS_I (ip)->i_mode &S_IFMT ) {case S_IFIFO :case S_IFCHR :case S_IFBLK :
fs/xfs/xfs_bmap_util.c +2 -2
@@ -823,7 +823,7 @@ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) {/* prealloc/delalloc exists only on regular files */ -if (!S_ISREG (ip->i_d.di_mode)) +if (!S_ISREG (VFS_I (ip)->i_mode))return false;/*
@@ -1728,7 +1728,7 @@ xfs_swap_extents(xfs_lock_two_inodes (ip, tip,XFS_MMAPLOCK_EXCL );/* Verify that both files have the same format */ -if ((ip->i_d.di_mode &S_IFMT ) != (tip->i_d.di_mode &S_IFMT )) { +if ((VFS_I (ip)->i_mode &S_IFMT ) != (VFS_I (tip)->i_mode &S_IFMT )) { error = -EINVAL ; goto out_unlock; }
fs/xfs/xfs_dir2_readdir.c +1 -1
@@ -665,7 +665,7 @@ xfs_readdir(if (XFS_FORCED_SHUTDOWN (dp->i_mount))return -EIO ; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_getdents); args.dp = dp;
fs/xfs/xfs_file.c +3 -3
@@ -156,9 +156,9 @@ xfs_update_prealloc_flags(xfs_trans_ijoin (tp, ip,XFS_ILOCK_EXCL );if (!(flags &XFS_PREALLOC_INVISIBLE )) { - ip->i_d.di_mode &= ~S_ISUID ; -if (ip->i_d.di_mode &S_IXGRP ) - ip->i_d.di_mode &= ~S_ISGID ; +VFS_I (ip)->i_mode &= ~S_ISUID ; +if (VFS_I (ip)->i_mode &S_IXGRP ) +VFS_I (ip)->i_mode &= ~S_ISGID ;xfs_trans_ichgtime (tp, ip,XFS_ICHGTIME_MOD |XFS_ICHGTIME_CHG ); }
fs/xfs/xfs_filestream.c +2 -2
@@ -151,7 +151,7 @@ xfs_filestream_pick_ag(xfs_agnumber_t ag, max_ag =NULLAGNUMBER ;int err, trylock, nscan; -ASSERT (S_ISDIR (ip->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (ip)->i_mode));/* 2% of an AG's blocks must be free for it to be chosen. */ minfree = mp->m_sb.sb_agblocks /50 ;
@@ -319,7 +319,7 @@ xfs_filestream_lookup_ag(xfs_agnumber_t startag, ag =NULLAGNUMBER ;struct xfs_mru_cache_elem *mru; -ASSERT (S_ISREG (ip->i_d.di_mode)); +ASSERT (S_ISREG (VFS_I (ip)->i_mode)); pip =xfs_filestream_get_parent (ip);if (!pip)
fs/xfs/xfs_icache.c +9 -4
@@ -63,6 +63,9 @@ xfs_inode_alloc(return NULL ; } +/* VFS doesn't initialise i_mode! */ +VFS_I (ip)->i_mode =0 ; +XFS_STATS_INC (mp, vn_active);ASSERT (atomic_read (&ip->i_pincount) ==0 );ASSERT (!spin_is_locked (&ip->i_flags_lock));
@@ -98,7 +101,7 @@ voidxfs_inode_free ( struct xfs_inode *ip) { -switch (ip->i_d.di_mode &S_IFMT ) { +switch (VFS_I (ip)->i_mode &S_IFMT ) {case S_IFREG :case S_IFDIR :case S_IFLNK :
@@ -151,12 +154,14 @@ xfs_reinit_inode(uint32_t nlink = inode->i_nlink;uint32_t generation = inode->i_generation;uint64_t version = inode->i_version; +umode_t mode = inode->i_mode; error =inode_init_always (mp->m_super, inode);set_nlink (inode, nlink); inode->i_generation = generation; inode->i_version = version; + inode->i_mode = mode;return error; }
@@ -211,7 +216,7 @@ xfs_iget_cache_hit(/* * If lookup is racing with unlink return an error immediately. */ -if (ip->i_d.di_mode ==0 && !(flags &XFS_IGET_CREATE )) { +if (VFS_I (ip)->i_mode ==0 && !(flags &XFS_IGET_CREATE )) { error = -ENOENT ; goto out_error; }
@@ -321,7 +326,7 @@ xfs_iget_cache_miss(trace_xfs_iget_miss (ip); -if ((ip->i_d.di_mode ==0 ) && !(flags &XFS_IGET_CREATE )) { +if ((VFS_I (ip)->i_mode ==0 ) && !(flags &XFS_IGET_CREATE )) { error = -ENOENT ; goto out_destroy; }
@@ -470,7 +475,7 @@ again:* If we have a real type for an on-disk inode, we can setup the inode * now. If it's a new inode being created, xfs_ialloc will handle it. */ -if (xfs_iflags_test (ip,XFS_INEW ) && ip->i_d.di_mode !=0 ) +if (xfs_iflags_test (ip,XFS_INEW ) &&VFS_I (ip)->i_mode !=0 )xfs_setup_existing_inode (ip);return 0 ;
fs/xfs/xfs_inode.c +23 -25
168 lines not on this page · raw message
fs/xfs/xfs_inode.h +2 -2
@@ -88,7 +88,7 @@ static inline struct inode *VFS_I(struct xfs_inode *ip)*/ static inline xfs_fsize_t XFS_ISIZE (struct xfs_inode *ip) { -if (S_ISREG (ip->i_d.di_mode)) +if (S_ISREG (VFS_I (ip)->i_mode))return i_size_read (VFS_I (ip));return ip->i_d.di_size; }
@@ -369,7 +369,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip)*/ #define XFS_INHERIT_GID (pip) \ (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ - ((pip)->i_d.di_mode & S_ISGID)) + (VFS_I(pip)->i_mode & S_ISGID))int xfs_release (struct xfs_inode *ip);void xfs_inactive (struct xfs_inode *ip);
fs/xfs/xfs_inode_item.c +1 -1
@@ -333,7 +333,6 @@ xfs_inode_to_log_dinode( to->di_magic =XFS_DINODE_MAGIC ; - to->di_mode = from->di_mode; to->di_version = from->di_version; to->di_format = from->di_format; to->di_uid = from->di_uid;
@@ -351,6 +350,7 @@ xfs_inode_to_log_dinode( to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; to->di_nlink = inode->i_nlink; to->di_gen = inode->i_generation; + to->di_mode = inode->i_mode; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;
fs/xfs/xfs_ioctl.c +7 -7
@@ -963,7 +963,7 @@ xfs_set_diflags( di_flags |=XFS_DIFLAG_NODEFRAG ;if (xflags &FS_XFLAG_FILESTREAM ) di_flags |=XFS_DIFLAG_FILESTREAM ; -if (S_ISDIR (ip->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip)->i_mode)) {if (xflags &FS_XFLAG_RTINHERIT ) di_flags |=XFS_DIFLAG_RTINHERIT ;if (xflags &FS_XFLAG_NOSYMLINKS )
@@ -972,7 +972,7 @@ xfs_set_diflags( di_flags |=XFS_DIFLAG_EXTSZINHERIT ;if (xflags &FS_XFLAG_PROJINHERIT ) di_flags |=XFS_DIFLAG_PROJINHERIT ; - }else if (S_ISREG (ip->i_d.di_mode)) { + }else if (S_ISREG (VFS_I (ip)->i_mode)) {if (xflags &FS_XFLAG_REALTIME ) di_flags |=XFS_DIFLAG_REALTIME ;if (xflags &FS_XFLAG_EXTSIZE )
@@ -1128,14 +1128,14 @@ xfs_ioctl_setattr_check_extsize( {struct xfs_mount *mp = ip->i_mount; -if ((fa->fsx_xflags &FS_XFLAG_EXTSIZE ) && !S_ISREG (ip->i_d.di_mode)) +if ((fa->fsx_xflags &FS_XFLAG_EXTSIZE ) && !S_ISREG (VFS_I (ip)->i_mode))return -EINVAL ;if ((fa->fsx_xflags &FS_XFLAG_EXTSZINHERIT ) && - !S_ISDIR (ip->i_d.di_mode)) + !S_ISDIR (VFS_I (ip)->i_mode))return -EINVAL ; -if (S_ISREG (ip->i_d.di_mode) && ip->i_d.di_nextents && +if (S_ISREG (VFS_I (ip)->i_mode) && ip->i_d.di_nextents && ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))return -EINVAL ;
@@ -1256,9 +1256,9 @@ xfs_ioctl_setattr(* successful return from chown() */ -if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && +if ((VFS_I (ip)->i_mode & (S_ISUID |S_ISGID )) && !capable_wrt_inode_uidgid (VFS_I (ip),CAP_FSETID )) - ip->i_d.di_mode &= ~(S_ISUID |S_ISGID ); +VFS_I (ip)->i_mode &= ~(S_ISUID |S_ISGID );/* Change the ownerships and register project quota modifications */ if (xfs_get_projid (ip) != fa->fsx_projid) {
fs/xfs/xfs_iops.c +4 -8
@@ -459,7 +459,7 @@ xfs_vn_getattr( stat->size =XFS_ISIZE (ip); stat->dev = inode->i_sb->s_dev; - stat->mode = ip->i_d.di_mode; + stat->mode = inode->i_mode; stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; stat->gid = inode->i_gid;
@@ -506,9 +506,6 @@ xfs_setattr_mode(ASSERT (xfs_isilocked (ip,XFS_ILOCK_EXCL )); - ip->i_d.di_mode &=S_IFMT ; - ip->i_d.di_mode |= mode & ~S_IFMT ; - inode->i_mode &=S_IFMT ; inode->i_mode |= mode & ~S_IFMT ; }
@@ -652,9 +649,9 @@ xfs_setattr_nonsize(* The set-user-ID and set-group-ID bits of a file will be * cleared upon successful return from chown() */ -if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && +if ((inode->i_mode & (S_ISUID |S_ISGID )) && !capable (CAP_FSETID )) - ip->i_d.di_mode &= ~(S_ISUID |S_ISGID ); + inode->i_mode &= ~(S_ISUID |S_ISGID );/* * Change the ownerships and register quota modifications
@@ -764,7 +761,7 @@ xfs_setattr_size(ASSERT (xfs_isilocked (ip,XFS_IOLOCK_EXCL ));ASSERT (xfs_isilocked (ip,XFS_MMAPLOCK_EXCL )); -ASSERT (S_ISREG (ip->i_d.di_mode)); +ASSERT (S_ISREG (inode->i_mode));ASSERT ((iattr->ia_valid & (ATTR_UID |ATTR_GID |ATTR_ATIME |ATTR_ATIME_SET |ATTR_MTIME_SET |ATTR_KILL_PRIV |ATTR_TIMES_SET )) ==0 );
@@ -1215,7 +1212,6 @@ xfs_setup_inode(/* make the inode look hashed for the writeback code */ hlist_add_fake (&inode->i_hash); - inode->i_mode = ip->i_d.di_mode; inode->i_uid =xfs_uid_to_kuid (ip->i_d.di_uid); inode->i_gid =xfs_gid_to_kgid (ip->i_d.di_gid);
fs/xfs/xfs_itable.c +1 -1
@@ -88,7 +88,6 @@ xfs_bulkstat_one_int( buf->bs_projid_lo = dic->di_projid_lo; buf->bs_projid_hi = dic->di_projid_hi; buf->bs_ino = ino; - buf->bs_mode = dic->di_mode; buf->bs_uid = dic->di_uid; buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size;
@@ -101,6 +100,7 @@ xfs_bulkstat_one_int( buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; buf->bs_gen = inode->i_generation; + buf->bs_mode = inode->i_mode; buf->bs_xflags =xfs_ip2xflags (ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog;
fs/xfs/xfs_log_recover.c +1 -1
@@ -4343,7 +4343,7 @@ xlog_recover_process_one_iunlink( goto fail_iput;ASSERT (VFS_I (ip)->i_nlink ==0 ); -ASSERT (ip->i_d.di_mode !=0 ); +ASSERT (VFS_I (ip)->i_mode !=0 );/* setup for the next pass */ agino =be32_to_cpu (dip->di_next_unlinked);
fs/xfs/xfs_mount.c +1 -1
@@ -865,7 +865,7 @@ xfs_mountfs(ASSERT (rip !=NULL ); -if (unlikely (!S_ISDIR (rip->i_d.di_mode))) { +if (unlikely (!S_ISDIR (VFS_I (rip)->i_mode))) {xfs_warn (mp,"corrupted root inode %llu: not a directory" , (unsigned long long )rip->i_ino);xfs_iunlock (rip,XFS_ILOCK_EXCL );
Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 9/9] xfs: mode di_mode to vfs inode
fs/xfs/libxfs/xfs_bmap.c xfs_bmap_local_to_extents( · line 915
Quoted 2 lines · Dave Chinner
fs/xfs/libxfs/xfs_bmap.c +1
-1-ASSERT (!(S_ISREG (ip->i_d.di_mode) && whichfork ==XFS_DATA_FORK )); +ASSERT (!(S_ISREG (VFS_I (ip)->i_mode) && whichfork ==XFS_DATA_FORK ));
Maybe it's worth adding XFS_ISDIR/REG/.. helpers for all these checks?
Otherwise looks fine:
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 9/9] xfs: mode di_mode to vfs inode
Quoted 5 lines · Christoph Hellwig
fs/xfs/libxfs/xfs_bmap.c xfs_bmap_local_to_extents( · line 915
Quoted 2 lines · Dave Chinner
fs/xfs/libxfs/xfs_bmap.c +1
-1-ASSERT (!(S_ISREG (ip->i_d.di_mode) && whichfork ==XFS_DATA_FORK )); +ASSERT (!(S_ISREG (VFS_I (ip)->i_mode) && whichfork ==XFS_DATA_FORK ));Maybe it's worth adding XFS_ISDIR/REG/.. helpers for all these checks?
Makes sense - I think I'll do that as a followup patch, though, along with further icdinode cleanups.
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 9/9] xfs: mode di_mode to vfs inode
In reply to Dave ChinnerQuoted 8 lines · Dave Chinner
From: Dave Chinner <[email protected]>
Move the
di_modevalue from thexfs_icdinodeto the VFS inode, reducing thexfs_icdinodebyte another 2 bytes and collapsing another 2 byte hole in the structure.Signed-off-by Dave Chinner <[email protected]>---
Quoted 716 lines
fs/xfs/libxfs/xfs_bmap.c | 6 +++--- fs/xfs/libxfs/xfs_dir2.c | 12 +++++------ fs/xfs/libxfs/xfs_inode_buf.c | 8 +++---- fs/xfs/libxfs/xfs_inode_buf.h | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 2 +- fs/xfs/xfs_bmap_util.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_file.c | 6 +++--- fs/xfs/xfs_filestream.c | 4 ++-- fs/xfs/xfs_icache.c | 13 ++++++++---- fs/xfs/xfs_inode.c | 48 ++++++++++++++++++++---------------------- fs/xfs/xfs_inode.h | 4 ++-- fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 14 ++++++------ fs/xfs/xfs_iops.c | 12 ++++------- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 2 +- 18 files changed, 71 insertions(+), 73 deletions(-)fs/xfs/libxfs/xfs_bmap.c +3
-3@@ -912,7 +912,7 @@ xfs_bmap_local_to_extents(* We don't want to deal with the case of keeping inode data inline yet. * So sending the data fork of a regular inode is invalid. */ -ASSERT (!(S_ISREG (ip->i_d.di_mode) && whichfork ==XFS_DATA_FORK )); +ASSERT (!(S_ISREG (VFS_I (ip)->i_mode) && whichfork ==XFS_DATA_FORK )); ifp =XFS_IFORK_PTR (ip, whichfork);ASSERT (XFS_IFORK_FORMAT (ip, whichfork) ==XFS_DINODE_FMT_LOCAL );@@ -1079,7 +1079,7 @@ xfs_bmap_add_attrfork_local(if (ip->i_df.if_bytes <=XFS_IFORK_DSIZE (ip))return 0 ; -if (S_ISDIR (ip->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip)->i_mode)) {memset (&dargs,0 ,sizeof (dargs)); dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip;@@ -1091,7 +1091,7 @@ xfs_bmap_add_attrfork_local(return xfs_dir2_sf_to_block (&dargs); } -if (S_ISLNK (ip->i_d.di_mode)) +if (S_ISLNK (VFS_I (ip)->i_mode))return xfs_bmap_local_to_extents (tp, ip, firstblock,1 , flags,XFS_DATA_FORK , xfs_symlink_local_to_remote);fs/xfs/libxfs/xfs_dir2.c +6
-6@@ -176,7 +176,7 @@ xfs_dir_isempty( {xfs_dir2_sf_hdr_t *sfp; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));if (dp->i_d.di_size ==0 )/* might happen during shutdown. */ return 1 ;if (dp->i_d.di_size >XFS_IFORK_DSIZE (dp))@@ -231,7 +231,7 @@ xfs_dir_init(struct xfs_da_args *args;int error; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode)); error =xfs_dir_ino_validate (tp->t_mountp, pdp->i_ino);if (error)return error;@@ -266,7 +266,7 @@ xfs_dir_createname(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));if (inum) { rval =xfs_dir_ino_validate (tp->t_mountp, inum);if (rval)@@ -364,7 +364,7 @@ xfs_dir_lookup(int v;/* type-checking value */ int lock_mode; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_lookup);/* @@ -443,7 +443,7 @@ xfs_dir_removename(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_remove); args =kmem_zalloc (sizeof (*args),KM_SLEEP |KM_NOFS );@@ -505,7 +505,7 @@ xfs_dir_replace(int rval;int v;/* type-checking value */ -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode)); rval =xfs_dir_ino_validate (tp->t_mountp, inum);if (rval)fs/xfs/libxfs/xfs_inode_buf.c +4
-4@@ -202,13 +202,12 @@ xfs_inode_from_disk(struct xfs_icdinode *to = &ip->i_d;struct inode *inode =VFS_I (ip); - to->di_mode =be16_to_cpu (from->di_mode); - to->di_version = from ->di_version;/* * Convert v1 inodes immediately to v2 inode format as this is the * minimum inode version format we support in the rest of the code. */ + to->di_version = from->di_version;if (to->di_version ==1 ) {set_nlink (inode,be16_to_cpu (from->di_onlink)); to->di_projid_lo =0 ;@@ -238,6 +237,7 @@ xfs_inode_from_disk( inode->i_ctime.tv_sec = (int )be32_to_cpu (from->di_ctime.t_sec); inode->i_ctime.tv_nsec = (int )be32_to_cpu (from->di_ctime.t_nsec); inode->i_generation =be32_to_cpu (from->di_gen); + inode->i_mode =be16_to_cpu (from->di_mode); to->di_size =be64_to_cpu (from->di_size); to->di_nblocks =be64_to_cpu (from->di_nblocks);@@ -270,7 +270,6 @@ xfs_inode_to_disk( to->di_magic =cpu_to_be16 (XFS_DINODE_MAGIC ); to->di_onlink =0 ; - to->di_mode =cpu_to_be16 (from->di_mode); to->di_version = from->di_version; to->di_format = from->di_format; to->di_uid =cpu_to_be32 (from->di_uid);@@ -287,6 +286,7 @@ xfs_inode_to_disk( to->di_ctime.t_nsec =cpu_to_be32 (inode->i_ctime.tv_nsec); to->di_nlink =cpu_to_be32 (inode->i_nlink); to->di_gen =cpu_to_be32 (inode->i_generation); + to->di_mode =cpu_to_be16 (inode->i_mode); to->di_size =cpu_to_be64 (from->di_size); to->di_nblocks =cpu_to_be64 (from->di_nblocks);@@ -501,7 +501,7 @@ xfs_iread(* the inode is already free and not try to mess * with the uninitialized part of it. */ - ip->i_d.di_mode =0 ; +VFS_I (ip)->i_mode =0 ; }ASSERT (ip->i_d.di_version >=2 );fs/xfs/libxfs/xfs_inode_buf.h +0
-1@@ -28,7 +28,6 @@ struct xfs_dinode;* format specific structures at the appropriate time. */ struct xfs_icdinode { -__uint16_t di_mode;/* mode and type of file */ __int8_t di_version;/* inode version */ __int8_t di_format;/* format of di_c data */ __uint16_t di_flushiter;/* incremented on flush */ fs/xfs/libxfs/xfs_inode_fork.c +1
-1@@ -121,7 +121,7 @@ xfs_iformat_fork(return -EFSCORRUPTED ; } -switch (ip->i_d.di_mode &S_IFMT ) { +switch (VFS_I (ip)->i_mode &S_IFMT ) {case S_IFIFO :case S_IFCHR :case S_IFBLK :fs/xfs/xfs_bmap_util.c +2
-2@@ -823,7 +823,7 @@ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) {/* prealloc/delalloc exists only on regular files */ -if (!S_ISREG (ip->i_d.di_mode)) +if (!S_ISREG (VFS_I (ip)->i_mode))return false;/* @@ -1728,7 +1728,7 @@ xfs_swap_extents(xfs_lock_two_inodes (ip, tip,XFS_MMAPLOCK_EXCL );/* Verify that both files have the same format */ -if ((ip->i_d.di_mode &S_IFMT ) != (tip->i_d.di_mode &S_IFMT )) { +if ((VFS_I (ip)->i_mode &S_IFMT ) != (VFS_I (tip)->i_mode &S_IFMT )) { error = -EINVAL ; goto out_unlock; }fs/xfs/xfs_dir2_readdir.c +1
-1@@ -665,7 +665,7 @@ xfs_readdir(if (XFS_FORCED_SHUTDOWN (dp->i_mount))return -EIO ; -ASSERT (S_ISDIR (dp->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (dp)->i_mode));XFS_STATS_INC (dp->i_mount, xs_dir_getdents); args.dp = dp;fs/xfs/xfs_file.c +3
-3@@ -156,9 +156,9 @@ xfs_update_prealloc_flags(xfs_trans_ijoin (tp, ip,XFS_ILOCK_EXCL );if (!(flags &XFS_PREALLOC_INVISIBLE )) { - ip->i_d.di_mode &= ~S_ISUID ; -if (ip->i_d.di_mode &S_IXGRP ) - ip->i_d.di_mode &= ~S_ISGID ; +VFS_I (ip)->i_mode &= ~S_ISUID ; +if (VFS_I (ip)->i_mode &S_IXGRP ) +VFS_I (ip)->i_mode &= ~S_ISGID ;xfs_trans_ichgtime (tp, ip,XFS_ICHGTIME_MOD |XFS_ICHGTIME_CHG ); }fs/xfs/xfs_filestream.c +2
-2@@ -151,7 +151,7 @@ xfs_filestream_pick_ag(xfs_agnumber_t ag, max_ag =NULLAGNUMBER ;int err, trylock, nscan; -ASSERT (S_ISDIR (ip->i_d.di_mode)); +ASSERT (S_ISDIR (VFS_I (ip)->i_mode));/* 2% of an AG's blocks must be free for it to be chosen. */ minfree = mp->m_sb.sb_agblocks /50 ;@@ -319,7 +319,7 @@ xfs_filestream_lookup_ag(xfs_agnumber_t startag, ag =NULLAGNUMBER ;struct xfs_mru_cache_elem *mru; -ASSERT (S_ISREG (ip->i_d.di_mode)); +ASSERT (S_ISREG (VFS_I (ip)->i_mode)); pip =xfs_filestream_get_parent (ip);if (!pip)fs/xfs/xfs_icache.c +9
-4@@ -63,6 +63,9 @@ xfs_inode_alloc(return NULL ; } +/* VFS doesn't initialise i_mode! */ +VFS_I (ip)->i_mode =0 ; +XFS_STATS_INC (mp, vn_active);ASSERT (atomic_read (&ip->i_pincount) ==0 );ASSERT (!spin_is_locked (&ip->i_flags_lock));@@ -98,7 +101,7 @@ voidxfs_inode_free ( struct xfs_inode *ip) { -switch (ip->i_d.di_mode &S_IFMT ) { +switch (VFS_I (ip)->i_mode &S_IFMT ) {case S_IFREG :case S_IFDIR :case S_IFLNK :@@ -151,12 +154,14 @@ xfs_reinit_inode(uint32_t nlink = inode->i_nlink;uint32_t generation = inode->i_generation;uint64_t version = inode->i_version; +umode_t mode = inode->i_mode; error =inode_init_always (mp->m_super, inode);set_nlink (inode, nlink); inode->i_generation = generation; inode->i_version = version; + inode->i_mode = mode;return error; }@@ -211,7 +216,7 @@ xfs_iget_cache_hit(/* * If lookup is racing with unlink return an error immediately. */ -if (ip->i_d.di_mode ==0 && !(flags &XFS_IGET_CREATE )) { +if (VFS_I (ip)->i_mode ==0 && !(flags &XFS_IGET_CREATE )) { error = -ENOENT ; goto out_error; }@@ -321,7 +326,7 @@ xfs_iget_cache_miss(trace_xfs_iget_miss (ip); -if ((ip->i_d.di_mode ==0 ) && !(flags &XFS_IGET_CREATE )) { +if ((VFS_I (ip)->i_mode ==0 ) && !(flags &XFS_IGET_CREATE )) { error = -ENOENT ; goto out_destroy; }@@ -470,7 +475,7 @@ again:* If we have a real type for an on-disk inode, we can setup the inode * now. If it's a new inode being created, xfs_ialloc will handle it. */ -if (xfs_iflags_test (ip,XFS_INEW ) && ip->i_d.di_mode !=0 ) +if (xfs_iflags_test (ip,XFS_INEW ) &&VFS_I (ip)->i_mode !=0 )xfs_setup_existing_inode (ip);return 0 ;fs/xfs/xfs_inode.c +23
-25@@ -802,7 +802,7 @@ xfs_ialloc(if (ip->i_d.di_version ==1 ) ip->i_d.di_version =2 ; - ip->i_d.di_mode = mode; + inode->i_mode = mode;set_nlink (inode, nlink); ip->i_d.di_uid =xfs_kuid_to_uid (current_fsuid ()); ip->i_d.di_gid =xfs_kgid_to_gid (current_fsgid ());@@ -810,9 +810,8 @@ xfs_ialloc(if (pip &&XFS_INHERIT_GID (pip)) { ip->i_d.di_gid = pip->i_d.di_gid; -if ((pip->i_d.di_mode &S_ISGID ) &&S_ISDIR (mode)) { - ip->i_d.di_mode |=S_ISGID ; - } +if ((VFS_I (pip)->i_mode &S_ISGID ) &&S_ISDIR (mode)) + inode->i_mode |=S_ISGID ; }/* @@ -821,10 +820,9 @@ xfs_ialloc(* (and only if the irix_sgid_inherit compatibility variable is set). */ if ((irix_sgid_inherit) && - (ip->i_d.di_mode &S_ISGID ) && - (!in_group_p (xfs_gid_to_kgid (ip->i_d.di_gid)))) { - ip->i_d.di_mode &= ~S_ISGID ; - } + (inode->i_mode &S_ISGID ) && + (!in_group_p (xfs_gid_to_kgid (ip->i_d.di_gid)))) + inode->i_mode &= ~S_ISGID ; ip->i_d.di_size =0 ; ip->i_d.di_nextents =0 ;@@ -1421,7 +1419,7 @@ xfs_link(trace_xfs_link (tdp, target_name); -ASSERT (!S_ISDIR (sip->i_d.di_mode)); +ASSERT (!S_ISDIR (VFS_I (sip)->i_mode));if (XFS_FORCED_SHUTDOWN (mp))return -EIO ;@@ -1628,7 +1626,7 @@ xfs_release(xfs_mount_t *mp = ip->i_mount;int error; -if (!S_ISREG (ip->i_d.di_mode) || (ip->i_d.di_mode ==0 )) +if (!S_ISREG (VFS_I (ip)->i_mode) || (VFS_I (ip)->i_mode ==0 ))return 0 ;/* If this is a read-only mount, don't do this (would generate I/O) */ @@ -1863,7 +1861,7 @@ xfs_inactive(* If the inode is already free, then there can be nothing * to clean up here. */ -if (ip->i_d.di_mode ==0 ) { +if (VFS_I (ip)->i_mode ==0 ) {ASSERT (ip->i_df.if_real_bytes ==0 );ASSERT (ip->i_df.if_broot_bytes ==0 );return ;@@ -1887,7 +1885,7 @@ xfs_inactive(return ; } -if (S_ISREG (ip->i_d.di_mode) && +if (S_ISREG (VFS_I (ip)->i_mode) && (ip->i_d.di_size !=0 ||XFS_ISIZE (ip) !=0 || ip->i_d.di_nextents >0 || ip->i_delayed_blks >0 )) truncate =1 ;@@ -1896,7 +1894,7 @@ xfs_inactive(if (error)return ; -if (S_ISLNK (ip->i_d.di_mode)) +if (S_ISLNK (VFS_I (ip)->i_mode)) error =xfs_inactive_symlink (ip);else if (truncate) error =xfs_inactive_truncate (ip);@@ -1958,7 +1956,7 @@ xfs_iunlink(int error;ASSERT (VFS_I (ip)->i_nlink ==0 || ignore_linkcount); -ASSERT (ip->i_d.di_mode !=0 ); +ASSERT (VFS_I (ip)->i_mode !=0 ); mp = tp->t_mountp;@@ -2401,7 +2399,7 @@ xfs_ifree(ASSERT (VFS_I (ip)->i_nlink ==0 );ASSERT (ip->i_d.di_nextents ==0 );ASSERT (ip->i_d.di_anextents ==0 ); -ASSERT (ip->i_d.di_size ==0 || !S_ISREG (ip->i_d.di_mode)); +ASSERT (ip->i_d.di_size ==0 || !S_ISREG (VFS_I (ip)->i_mode));ASSERT (ip->i_d.di_nblocks ==0 );/* @@ -2415,7 +2413,7 @@ xfs_ifree(if (error)return error; - ip->i_d.di_mode =0 ;/* mark incore inode as free */ +VFS_I (ip)->i_mode =0 ;/* mark incore inode as free */ ip->i_d.di_flags =0 ; ip->i_d.di_dmevmask =0 ; ip->i_d.di_forkoff =0 ;/* mark the attr fork not in use */ @@ -2512,7 +2510,7 @@ xfs_remove( {xfs_mount_t *mp = dp->i_mount;xfs_trans_t *tp =NULL ; -int is_dir =S_ISDIR (ip->i_d.di_mode); +int is_dir =S_ISDIR (VFS_I (ip)->i_mode);int error =0 ;xfs_bmap_free_t free_list;xfs_fsblock_t first_block;@@ -2757,7 +2755,7 @@ xfs_cross_rename(if (dp1 != dp2) { dp2_flags =XFS_ICHGTIME_MOD |XFS_ICHGTIME_CHG ; -if (S_ISDIR (ip2->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip2)->i_mode)) { error =xfs_dir_replace (tp, ip2, &xfs_name_dotdot, dp1->i_ino, first_block, free_list, spaceres);@@ -2765,7 +2763,7 @@ xfs_cross_rename( goto out_trans_abort;/* transfer ip2 ".." reference to dp1 */ -if (!S_ISDIR (ip1->i_d.di_mode)) { +if (!S_ISDIR (VFS_I (ip1)->i_mode)) { error =xfs_droplink (tp, dp2);if (error) goto out_trans_abort;@@ -2784,7 +2782,7 @@ xfs_cross_rename( ip2_flags |=XFS_ICHGTIME_MOD |XFS_ICHGTIME_CHG ; } -if (S_ISDIR (ip1->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip1)->i_mode)) { error =xfs_dir_replace (tp, ip1, &xfs_name_dotdot, dp2->i_ino, first_block, free_list, spaceres);@@ -2792,7 +2790,7 @@ xfs_cross_rename( goto out_trans_abort;/* transfer ip1 ".." reference to dp2 */ -if (!S_ISDIR (ip2->i_d.di_mode)) { +if (!S_ISDIR (VFS_I (ip2)->i_mode)) { error =xfs_droplink (tp, dp1);if (error) goto out_trans_abort;@@ -2889,7 +2887,7 @@ xfs_rename(struct xfs_inode *inodes[__XFS_SORT_INODES];int num_inodes = __XFS_SORT_INODES;bool new_parent = (src_dp != target_dp); -bool src_is_directory =S_ISDIR (src_ip->i_d.di_mode); +bool src_is_directory =S_ISDIR (VFS_I (src_ip)->i_mode);int spaceres;int error;@@ -3018,7 +3016,7 @@ xfs_rename(* target and source are directories and that target can be * destroyed, or that neither is a directory. */ -if (S_ISDIR (target_ip->i_d.di_mode)) { +if (S_ISDIR (VFS_I (target_ip)->i_mode)) {/* * Make sure target dir is empty. */ @@ -3448,7 +3446,7 @@ xfs_iflush_int( __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip); goto corrupt_out; } -if (S_ISREG (ip->i_d.di_mode)) { +if (S_ISREG (VFS_I (ip)->i_mode)) { if (XFS_TEST_ERROR( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),@@ -3458,7 +3456,7 @@ xfs_iflush_int( __func__, ip->i_ino, ip); goto corrupt_out; } - }else if (S_ISDIR (ip->i_d.di_mode)) { + }else if (S_ISDIR (VFS_I (ip)->i_mode)) { if (XFS_TEST_ERROR( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&fs/xfs/xfs_inode.h +2
-2@@ -88,7 +88,7 @@ static inline struct inode *VFS_I(struct xfs_inode *ip)*/ static inline xfs_fsize_t XFS_ISIZE (struct xfs_inode *ip) { -if (S_ISREG (ip->i_d.di_mode)) +if (S_ISREG (VFS_I (ip)->i_mode))return i_size_read (VFS_I (ip));return ip->i_d.di_size; }@@ -369,7 +369,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip)*/ #define XFS_INHERIT_GID (pip) \ (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ - ((pip)->i_d.di_mode & S_ISGID)) + (VFS_I(pip)->i_mode & S_ISGID))int xfs_release (struct xfs_inode *ip);void xfs_inactive (struct xfs_inode *ip);fs/xfs/xfs_inode_item.c +1
-1@@ -333,7 +333,6 @@ xfs_inode_to_log_dinode( to->di_magic =XFS_DINODE_MAGIC ; - to->di_mode = from->di_mode; to->di_version = from->di_version; to->di_format = from->di_format; to->di_uid = from->di_uid;@@ -351,6 +350,7 @@ xfs_inode_to_log_dinode( to->di_ctime.t_nsec = inode->i_ctime.tv_nsec; to->di_nlink = inode->i_nlink; to->di_gen = inode->i_generation; + to->di_mode = inode->i_mode; to->di_size = from->di_size; to->di_nblocks = from->di_nblocks;fs/xfs/xfs_ioctl.c +7
-7@@ -963,7 +963,7 @@ xfs_set_diflags( di_flags |=XFS_DIFLAG_NODEFRAG ;if (xflags &FS_XFLAG_FILESTREAM ) di_flags |=XFS_DIFLAG_FILESTREAM ; -if (S_ISDIR (ip->i_d.di_mode)) { +if (S_ISDIR (VFS_I (ip)->i_mode)) {if (xflags &FS_XFLAG_RTINHERIT ) di_flags |=XFS_DIFLAG_RTINHERIT ;if (xflags &FS_XFLAG_NOSYMLINKS )@@ -972,7 +972,7 @@ xfs_set_diflags( di_flags |=XFS_DIFLAG_EXTSZINHERIT ;if (xflags &FS_XFLAG_PROJINHERIT ) di_flags |=XFS_DIFLAG_PROJINHERIT ; - }else if (S_ISREG (ip->i_d.di_mode)) { + }else if (S_ISREG (VFS_I (ip)->i_mode)) {if (xflags &FS_XFLAG_REALTIME ) di_flags |=XFS_DIFLAG_REALTIME ;if (xflags &FS_XFLAG_EXTSIZE )@@ -1128,14 +1128,14 @@ xfs_ioctl_setattr_check_extsize( {struct xfs_mount *mp = ip->i_mount; -if ((fa->fsx_xflags &FS_XFLAG_EXTSIZE ) && !S_ISREG (ip->i_d.di_mode)) +if ((fa->fsx_xflags &FS_XFLAG_EXTSIZE ) && !S_ISREG (VFS_I (ip)->i_mode))return -EINVAL ;if ((fa->fsx_xflags &FS_XFLAG_EXTSZINHERIT ) && - !S_ISDIR (ip->i_d.di_mode)) + !S_ISDIR (VFS_I (ip)->i_mode))return -EINVAL ; -if (S_ISREG (ip->i_d.di_mode) && ip->i_d.di_nextents && +if (S_ISREG (VFS_I (ip)->i_mode) && ip->i_d.di_nextents && ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))return -EINVAL ;@@ -1256,9 +1256,9 @@ xfs_ioctl_setattr(* successful return from chown() */ -if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && +if ((VFS_I (ip)->i_mode & (S_ISUID |S_ISGID )) && !capable_wrt_inode_uidgid (VFS_I (ip),CAP_FSETID )) - ip->i_d.di_mode &= ~(S_ISUID |S_ISGID ); +VFS_I (ip)->i_mode &= ~(S_ISUID |S_ISGID );/* Change the ownerships and register project quota modifications */ if (xfs_get_projid (ip) != fa->fsx_projid) {fs/xfs/xfs_iops.c +4
-8@@ -459,7 +459,7 @@ xfs_vn_getattr( stat->size =XFS_ISIZE (ip); stat->dev = inode->i_sb->s_dev; - stat->mode = ip->i_d.di_mode; + stat->mode = inode->i_mode; stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; stat->gid = inode->i_gid;@@ -506,9 +506,6 @@ xfs_setattr_mode(ASSERT (xfs_isilocked (ip,XFS_ILOCK_EXCL )); - ip->i_d.di_mode &=S_IFMT ; - ip->i_d.di_mode |= mode & ~S_IFMT ; - inode->i_mode &=S_IFMT ; inode->i_mode |= mode & ~S_IFMT ; }@@ -652,9 +649,9 @@ xfs_setattr_nonsize(* The set-user-ID and set-group-ID bits of a file will be * cleared upon successful return from chown() */ -if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && +if ((inode->i_mode & (S_ISUID |S_ISGID )) && !capable (CAP_FSETID )) - ip->i_d.di_mode &= ~(S_ISUID |S_ISGID ); + inode->i_mode &= ~(S_ISUID |S_ISGID );/* * Change the ownerships and register quota modifications @@ -764,7 +761,7 @@ xfs_setattr_size(ASSERT (xfs_isilocked (ip,XFS_IOLOCK_EXCL ));ASSERT (xfs_isilocked (ip,XFS_MMAPLOCK_EXCL )); -ASSERT (S_ISREG (ip->i_d.di_mode)); +ASSERT (S_ISREG (inode->i_mode));ASSERT ((iattr->ia_valid & (ATTR_UID |ATTR_GID |ATTR_ATIME |ATTR_ATIME_SET |ATTR_MTIME_SET |ATTR_KILL_PRIV |ATTR_TIMES_SET )) ==0 );@@ -1215,7 +1212,6 @@ xfs_setup_inode(/* make the inode look hashed for the writeback code */ hlist_add_fake (&inode->i_hash); - inode->i_mode = ip->i_d.di_mode; inode->i_uid =xfs_uid_to_kuid (ip->i_d.di_uid); inode->i_gid =xfs_gid_to_kgid (ip->i_d.di_gid);fs/xfs/xfs_itable.c +1
-1@@ -88,7 +88,6 @@ xfs_bulkstat_one_int( buf->bs_projid_lo = dic->di_projid_lo; buf->bs_projid_hi = dic->di_projid_hi; buf->bs_ino = ino; - buf->bs_mode = dic->di_mode; buf->bs_uid = dic->di_uid; buf->bs_gid = dic->di_gid; buf->bs_size = dic->di_size;@@ -101,6 +100,7 @@ xfs_bulkstat_one_int( buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; buf->bs_gen = inode->i_generation; + buf->bs_mode = inode->i_mode; buf->bs_xflags =xfs_ip2xflags (ip); buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog;fs/xfs/xfs_log_recover.c +1
-1@@ -4343,7 +4343,7 @@ xlog_recover_process_one_iunlink( goto fail_iput;ASSERT (VFS_I (ip)->i_nlink ==0 ); -ASSERT (ip->i_d.di_mode !=0 ); +ASSERT (VFS_I (ip)->i_mode !=0 );/* setup for the next pass */ agino =be32_to_cpu (dip->di_next_unlinked);fs/xfs/xfs_mount.c +1
-1@@ -865,7 +865,7 @@ xfs_mountfs(ASSERT (rip !=NULL ); -if (unlikely (!S_ISDIR (rip->i_d.di_mode))) { +if (unlikely (!S_ISDIR (VFS_I (rip)->i_mode))) {xfs_warn (mp,"corrupted root inode %llu: not a directory" , (unsigned long long )rip->i_ino);xfs_iunlock (rip,XFS_ILOCK_EXCL );Signature · 6 lines
2.5.0 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs