[GFS2] Fix problems relating to execution of files on GFS2
authorSteven Whitehouse <swhiteho@redhat.com>
Tue, 8 Jan 2008 08:14:30 +0000 (08:14 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Fri, 25 Jan 2008 08:17:31 +0000 (08:17 +0000)
This patch fixes a couple of problems which affected the execution of files
on GFS2. The first is that there was a corner case where inodes were not
always uptodate at the point at which permissions checks were being carried
out, this was resulting in refusal of execute permission, but only on the
first lookup, subsequent requests worked correctly. The second was a problem
relating to incorrect updating of file sizes which was introduced with the
write_begin/end code for GFS2 a little while back.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Cc: Abhijith Das <adas@redhat.com>
fs/gfs2/ops_address.c
fs/gfs2/ops_inode.c

index e16ad8104495bcca8d66869681701b4dd1080c13..37406a379e7abcf24ff541000713d7c59af837d6 100644 (file)
@@ -848,14 +848,11 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping,
 
        ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
 
-       if (likely(ret >= 0)) {
-               copied = ret;
-               if  ((pos + copied) > inode->i_size) {
-                       di = (struct gfs2_dinode *)dibh->b_data;
-                       ip->i_di.di_size = inode->i_size;
-                       di->di_size = cpu_to_be64(inode->i_size);
-                       mark_inode_dirty(inode);
-               }
+       if (likely(ret >= 0) && (inode->i_size > ip->i_di.di_size)) {
+               di = (struct gfs2_dinode *)dibh->b_data;
+               ip->i_di.di_size = inode->i_size;
+               di->di_size = cpu_to_be64(inode->i_size);
+               mark_inode_dirty(inode);
        }
 
        if (inode == sdp->sd_rindex)
index 291f0c7eaa3bcf8249876a73e43f8920dbfa1f24..8386ab323e33acfebf383c09e2775045c797c71a 100644 (file)
@@ -113,8 +113,18 @@ static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
        if (inode && IS_ERR(inode))
                return ERR_PTR(PTR_ERR(inode));
 
-       if (inode)
+       if (inode) {
+               struct gfs2_glock *gl = GFS2_I(inode)->i_gl;
+               struct gfs2_holder gh;
+               int error;
+               error = gfs2_glock_nq_init(gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
+               if (error) {
+                       iput(inode);
+                       return ERR_PTR(error);
+               }
+               gfs2_glock_dq_uninit(&gh);
                return d_splice_alias(inode, dentry);
+       }
        d_add(dentry, inode);
 
        return NULL;