Skip to content

Commit

Permalink
[GFS2] Fix problems relating to execution of files on GFS2
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Abhijith Das <[email protected]>
  • Loading branch information
swhiteho committed Jan 25, 2008
1 parent 0811a12 commit 9656b2c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
13 changes: 5 additions & 8 deletions fs/gfs2/ops_address.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 11 additions & 1 deletion fs/gfs2/ops_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 9656b2c

Please sign in to comment.