From mboxrd@z Thu Jan 1 00:00:00 1970 From: S. Wendy Cheng Date: Mon, 25 Jun 2007 21:18:59 -0400 Subject: [Cluster-devel] [GFS2 PATCH 2/3] Obtaining no_formal_ino from directory entry In-Reply-To: <4680688D.6060608@redhat.com> References: <4680688D.6060608@redhat.com> Message-ID: <46806983.6060603@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sorry, correct subject line from [GFS2 PATCH 1/3] to [GFS2 PATCH 2/3] ... > 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 > >------------------------------------------------------------------------ > > Signed-off-by: S. Wendy Cheng > > dir.c | 6 ++++-- > inode.c | 13 ++++++++----- > inode.h | 3 ++- > ops_export.c | 2 +- > ops_fstype.c | 19 ++++++++++++------- > rgrp.c | 10 +++++----- > 6 files changed, 32 insertions(+), 21 deletions(-) > >--- gfs2-nfs1/fs/gfs2/inode.h 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/inode.h 2007-06-23 01:24:22.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, >+ struct gfs2_inum_host *ino, unsigned type); > struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr); > > int gfs2_inode_refresh(struct gfs2_inode *ip); >--- gfs2-nfs1/fs/gfs2/dir.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/dir.c 2007-06-23 01:24:22.000000000 -0400 >@@ -1493,13 +1493,15 @@ struct inode *gfs2_dir_search(struct ino > struct buffer_head *bh; > struct gfs2_dirent *dent; > struct inode *inode; >+ struct gfs2_inum_host ino; > > dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh); > 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), >+ ino.no_formal_ino = be64_to_cpu(dent->de_inum.no_formal_ino); >+ ino.no_addr = be64_to_cpu(dent->de_inum.no_addr); >+ inode = gfs2_inode_lookup(dir->i_sb, &ino, > be16_to_cpu(dent->de_type)); > brelse(bh); > return inode; >--- gfs2-nfs1/fs/gfs2/inode.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/inode.c 2007-06-23 01:24:22.000000000 -0400 >@@ -86,9 +86,11 @@ 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, >+ struct gfs2_inum_host *ino, >+ unsigned int type) > { >- 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,13 +102,14 @@ 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 = ino->no_formal_ino; > >- error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); >+ error = gfs2_glock_get(sdp, ino->no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); > if (unlikely(error)) > goto fail; > ip->i_gl->gl_object = ip; > >- error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl); >+ error = gfs2_glock_get(sdp, ino->no_addr, &gfs2_iopen_glops, CREATE, &io_gl); > if (unlikely(error)) > goto fail_put; > >@@ -915,7 +918,7 @@ 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, &inum, IF2DT(mode)); > if (IS_ERR(inode)) > goto fail_gunlock2; > >--- gfs2-nfs1/fs/gfs2/ops_export.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/ops_export.c 2007-06-23 23:43:45.000000000 -0400 >@@ -245,7 +245,7 @@ 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, inum, fh_obj->imode); > 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-23 23:42:38.000000000 -0400 >@@ -234,16 +234,16 @@ fail: > } > > static inline struct inode *gfs2_lookup_root(struct super_block *sb, >- u64 no_addr) >+ struct gfs2_inum_host *ino) > { >- return gfs2_inode_lookup(sb, no_addr, DT_DIR); >+ return gfs2_inode_lookup(sb, ino, DT_DIR); > } > > static int init_sb(struct gfs2_sbd *sdp, int silent, int undo) > { > struct super_block *sb = sdp->sd_vfs; > struct gfs2_holder sb_gh; >- u64 no_addr; >+ struct gfs2_inum_host ino; > struct inode *inode; > int error = 0; > >@@ -286,10 +286,12 @@ static int init_sb(struct gfs2_sbd *sdp, > sb_set_blocksize(sb, sdp->sd_sb.sb_bsize); > > /* Get the root inode */ >- no_addr = sdp->sd_sb.sb_root_dir.no_addr; >+ ino.no_formal_ino = 0; > if (sb->s_type == &gfs2meta_fs_type) >- no_addr = sdp->sd_sb.sb_master_dir.no_addr; >- inode = gfs2_lookup_root(sb, no_addr); >+ ino.no_addr = sdp->sd_sb.sb_master_dir.no_addr; >+ else >+ ino.no_addr = sdp->sd_sb.sb_root_dir.no_addr; >+ inode = gfs2_lookup_root(sb, &ino); > if (IS_ERR(inode)) { > error = PTR_ERR(inode); > fs_err(sdp, "can't read in root inode: %d\n", error); >@@ -442,11 +444,14 @@ static int init_inodes(struct gfs2_sbd * > int error = 0; > struct gfs2_inode *ip; > struct inode *inode; >+ struct gfs2_inum_host ino; > > if (undo) > goto fail_qinode; > >- inode = gfs2_lookup_root(sdp->sd_vfs, sdp->sd_sb.sb_master_dir.no_addr); >+ ino.no_formal_ino = 0; >+ ino.no_addr = sdp->sd_sb.sb_master_dir.no_addr; >+ inode = gfs2_lookup_root(sdp->sd_vfs, &ino); > if (IS_ERR(inode)) { > error = PTR_ERR(inode); > fs_err(sdp, "can't read in master directory: %d\n", error); >--- gfs2-nfs1/fs/gfs2/rgrp.c 2007-06-22 22:11:42.000000000 -0400 >+++ gfs2-nfs2/fs/gfs2/rgrp.c 2007-06-23 01:24:22.000000000 -0400 >@@ -861,18 +861,18 @@ static struct inode *try_rgrp_unlink(str > { > struct inode *inode; > u32 goal = 0; >- u64 ino; >+ struct gfs2_inum_host ino = {.no_formal_ino = 0}; > > 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) >+ ino.no_addr = goal + rgd->rd_data0; >+ if (ino.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, &ino, DT_UNKNOWN); > if (!IS_ERR(inode)) > return inode; > } > > >