diff options
author | Wendy Cheng <wcheng@redhat.com> | 2007-06-27 17:07:08 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2007-07-09 03:24:08 -0400 |
commit | bb9bcf061660661c57ddcf31337529f82414b937 (patch) | |
tree | 0876874e5252c4939b8e7bbd62a22a6eb4ad1abf /fs/gfs2/inode.c | |
parent | f4fadb23ca49abd2f1387a0b7e78b385ebc760ce (diff) |
[GFS2] Obtaining no_formal_ino from directory entry
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.
Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r-- | fs/gfs2/inode.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 792d64f69cc2..26aaf54959d9 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -86,7 +86,10 @@ static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr) | |||
86 | * Returns: A VFS inode, or an error | 86 | * Returns: A VFS inode, or an error |
87 | */ | 87 | */ |
88 | 88 | ||
89 | struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned int type) | 89 | struct inode *gfs2_inode_lookup(struct super_block *sb, |
90 | unsigned int type, | ||
91 | u64 no_addr, | ||
92 | u64 no_formal_ino) | ||
90 | { | 93 | { |
91 | struct inode *inode = gfs2_iget(sb, no_addr); | 94 | struct inode *inode = gfs2_iget(sb, no_addr); |
92 | struct gfs2_inode *ip = GFS2_I(inode); | 95 | struct gfs2_inode *ip = GFS2_I(inode); |
@@ -100,6 +103,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned in | |||
100 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 103 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
101 | umode_t mode; | 104 | umode_t mode; |
102 | inode->i_private = ip; | 105 | inode->i_private = ip; |
106 | ip->i_no_formal_ino = no_formal_ino; | ||
103 | 107 | ||
104 | error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); | 108 | error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); |
105 | if (unlikely(error)) | 109 | if (unlikely(error)) |
@@ -915,7 +919,9 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, | |||
915 | if (error) | 919 | if (error) |
916 | goto fail_gunlock2; | 920 | goto fail_gunlock2; |
917 | 921 | ||
918 | inode = gfs2_inode_lookup(dir->i_sb, inum.no_addr, IF2DT(mode)); | 922 | inode = gfs2_inode_lookup(dir->i_sb, IF2DT(mode), |
923 | inum.no_addr, | ||
924 | inum.no_formal_ino); | ||
919 | if (IS_ERR(inode)) | 925 | if (IS_ERR(inode)) |
920 | goto fail_gunlock2; | 926 | goto fail_gunlock2; |
921 | 927 | ||