From mboxrd@z Thu Jan 1 00:00:00 1970 From: S. Wendy Cheng Date: Wed, 27 Jun 2007 01:25:09 -0400 Subject: [Cluster-devel] [GFS2 PATCH 2/3] Obtaining no_formal_ino from directory entry In-Reply-To: <4681F257.5080100@redhat.com> References: <4680688D.6060608@redhat.com> <1182913346.3665.3.camel@localhost.localdomain> <4681F257.5080100@redhat.com> Message-ID: <4681F4B5.9060604@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Grr... there is a typo ... If we all agree with DT_WHT type, will re-submit the patch early tomorrow morning.. maybe we should hop on #sistina irc around 9:30 am EST to speed up the discussion ? Need to get this done and tested out (on RHEL 5.1) by noon tomorrow.. Kicked off the new kernel build now. G'night ! -- Wendy > Steven Whitehouse wrote: > >> Hi, >> >> On Mon, 2007-06-25 at 21:14 -0400, S. Wendy Cheng wrote: >> >> >>> GFS2 lookup code doesn't ask for inode shared glock. This implies >>> during in-memory inode creation for existing file, GFS2 will not >>> disk-read in the inode contents. This leaves no_formal_ino >>> un-initialized during lookup time. The un-initialized no_formal_ino >>> is subsequently encoded into file handle. Clients will get ESTALE >>> error whenever it tries to access these files. >>> >>> -- Wendy >>> >>> >> >> >> Generally this looks good. Please don't add back the _host structure >> though - just add an extra no_formal_ino argument to the lookup function >> which is a u64, >> >> > > The gfs2_inode_lookup() parameter set would be too long. How about > this ... we will never use DT_WHT (bit 14) anyway so let's define: > > struct inode *gfs2_inode_lookup(struct super_block *sb, > unsigned type, // if invoked from > gfs2_get_dentry by NFSD > // type would > be DT_WHT. > u64 no_addr, > u64 no_formal_ino); > > Then we would save one parameter in patch #3 that will use DT_WHT as > nfsbypass param ? Patch enclosed. > > -- Wendy > > > >------------------------------------------------------------------------ > > Signed-off-by: S. Wendy Cheng > > dir.c | 7 ++++--- > inode.c | 12 +++++++++--- > inode.h | 3 ++- > ops_export.c | 4 +++- > ops_fstype.c | 2 +- > rgrp.c | 11 ++++++----- > 6 files changed, 25 insertions(+), 14 deletions(-) > >--- gfs2-nfs1/fs/gfs2/inode.h 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/inode.h 2007-06-27 00:17:41.000000000 -0400 >@@ -47,7 +47,8 @@ static inline void gfs2_inum_out(const s > > > void gfs2_inode_attr_in(struct gfs2_inode *ip); >-struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned type); >+struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, >+ u64 no_addr, u64 no_formal_ino); > struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr); > > int gfs2_inode_refresh(struct gfs2_inode *ip); >--- gfs2-nfs1/fs/gfs2/inode.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/inode.c 2007-06-27 00:23:05.000000000 -0400 >@@ -86,9 +86,12 @@ static struct inode *gfs2_iget(struct su > * Returns: A VFS inode, or an error > */ > >-struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned int type) >+struct inode *gfs2_inode_lookup(struct super_block *sb, >+ unsigned int type, >+ u64 no_addr, >+ u64 no_formal_ino) > { >- struct inode *inode = gfs2_iget(sb, no_addr); >+ struct inode *inode = gfs2_iget(sb, ino->no_addr); > struct gfs2_inode *ip = GFS2_I(inode); > struct gfs2_glock *io_gl; > int error; >@@ -100,6 +103,7 @@ struct inode *gfs2_inode_lookup(struct s > struct gfs2_sbd *sdp = GFS2_SB(inode); > umode_t mode; > inode->i_private = ip; >+ ip->i_no_formal_ino = no_formal_ino; > > error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); > if (unlikely(error)) >@@ -915,7 +919,9 @@ struct inode *gfs2_createi(struct gfs2_h > if (error) > goto fail_gunlock2; > >- inode = gfs2_inode_lookup(dir->i_sb, inum.no_addr, IF2DT(mode)); >+ inode = gfs2_inode_lookup(dir->i_sb, IF2DT(mode), >+ inum.no_addr, >+ inum.no_formal_ino); > if (IS_ERR(inode)) > goto fail_gunlock2; > >--- gfs2-nfs1/fs/gfs2/dir.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/dir.c 2007-06-27 00:19:22.000000000 -0400 >@@ -1498,9 +1498,10 @@ struct inode *gfs2_dir_search(struct ino > if (dent) { > if (IS_ERR(dent)) > return ERR_PTR(PTR_ERR(dent)); >- inode = gfs2_inode_lookup(dir->i_sb, >- be64_to_cpu(dent->de_inum.no_addr), >- be16_to_cpu(dent->de_type)); >+ inode = gfs2_inode_lookup(dir->i_sb, >+ be16_to_cpu(dent->de_type), >+ be64_to_cpu(dent->de_inum.no_addr), >+ be64_to_cpu(dent->de_inum.no_formal_ino); > brelse(bh); > return inode; > } >--- gfs2-nfs1/fs/gfs2/ops_export.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/ops_export.c 2007-06-27 00:24:38.000000000 -0400 >@@ -245,7 +245,9 @@ static struct dentry *gfs2_get_dentry(st > gfs2_glock_dq_uninit(&rgd_gh); > gfs2_glock_dq_uninit(&ri_gh); > >- inode = gfs2_inode_lookup(sb, inum->no_addr, fh_obj->imode); >+ inode = gfs2_inode_lookup(sb, fh_obj->imode, >+ inum->no_addr, >+ inum->no_formal_ino); > if (!inode) > goto fail; > if (IS_ERR(inode)) { >--- gfs2-nfs1/fs/gfs2/ops_fstype.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/ops_fstype.c 2007-06-27 00:30:22.000000000 -0400 >@@ -236,7 +236,7 @@ fail: > static inline struct inode *gfs2_lookup_root(struct super_block *sb, > u64 no_addr) > { >- return gfs2_inode_lookup(sb, no_addr, DT_DIR); >+ return gfs2_inode_lookup(sb, DT_DIR, no_addr, 0); > } > > static int init_sb(struct gfs2_sbd *sdp, int silent, int undo) >--- gfs2-nfs1/fs/gfs2/rgrp.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/rgrp.c 2007-06-27 00:31:44.000000000 -0400 >@@ -861,18 +861,19 @@ static struct inode *try_rgrp_unlink(str > { > struct inode *inode; > u32 goal = 0; >- u64 ino; >+ u64 no_addr; > > for(;;) { > goal = rgblk_search(rgd, goal, GFS2_BLKST_UNLINKED, > GFS2_BLKST_UNLINKED); > if (goal == 0) > return 0; >- ino = goal + rgd->rd_data0; >- if (ino <= *last_unlinked) >+ no_addr = goal + rgd->rd_data0; >+ if (no_addr <= *last_unlinked) > continue; >- *last_unlinked = ino; >- inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, ino, DT_UNKNOWN); >+ *last_unlinked = ino.no_addr; >+ inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, DT_UNKNOWN, >+ no_addr, 0); > if (!IS_ERR(inode)) > return inode; > } > >