From: S. Wendy Cheng <wcheng@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [GFS2 PATCH 2/3] Obtaining no_formal_ino from directory entry
Date: Mon, 25 Jun 2007 21:18:59 -0400 [thread overview]
Message-ID: <46806983.6060603@redhat.com> (raw)
In-Reply-To: <4680688D.6060608@redhat.com>
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 <wcheng@redhat.com>
>
> 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;
> }
>
>
>
next prev parent reply other threads:[~2007-06-26 1:18 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-26 1:14 [Cluster-devel] [GFS2 PATCH 1/3] Obtaining no_formal_ino from directory entry S. Wendy Cheng
2007-06-26 1:18 ` S. Wendy Cheng [this message]
2007-06-27 3:02 ` Steven Whitehouse
2007-06-27 5:15 ` [Cluster-devel] [GFS2 PATCH 2/3] " S. Wendy Cheng
2007-06-27 5:25 ` S. Wendy Cheng
2007-06-27 13:13 ` Steven Whitehouse
2007-06-27 21:07 ` Wendy Cheng
2007-06-27 22:49 ` Steven Whitehouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46806983.6060603@redhat.com \
--to=wcheng@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.