Skip to content

Commit

Permalink
[GFS2] Fix attributes setting logic
Browse files Browse the repository at this point in the history
The attributes logic for immutable was wrong so that there was
not way to remove this attribute once set. This fixes the
bug.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed May 12, 2006
1 parent 9801f64 commit b9cb981
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions fs/gfs2/ops_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -611,8 +611,10 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)

gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
if (error)
if (error) {
gfs2_holder_uninit(&gh);
return error;
}

flags = ip->i_di.di_flags;
new_flags = (flags & ~mask) | (reqflags & mask);
Expand All @@ -635,9 +637,14 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)
goto out;
if (IS_APPEND(inode) && (new_flags & GFS2_DIF_APPENDONLY))
goto out;
error = gfs2_repermission(inode, MAY_WRITE, NULL);
if (error)
if (((new_flags ^ flags) & GFS2_DIF_IMMUTABLE) &&
!capable(CAP_LINUX_IMMUTABLE))
goto out;
if (!IS_IMMUTABLE(inode)) {
error = gfs2_repermission(inode, MAY_WRITE, NULL);
if (error)
goto out;
}

error = gfs2_trans_begin(sdp, RES_DINODE, 0);
if (error)
Expand Down

0 comments on commit b9cb981

Please sign in to comment.