aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/inode.c
diff options
context:
space:
mode:
authorWendy Cheng <wcheng@redhat.com>2007-06-27 17:07:08 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2007-07-09 03:24:08 -0400
commitbb9bcf061660661c57ddcf31337529f82414b937 (patch)
tree0876874e5252c4939b8e7bbd62a22a6eb4ad1abf /fs/gfs2/inode.c
parentf4fadb23ca49abd2f1387a0b7e78b385ebc760ce (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.c10
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
89struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned int type) 89struct 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