GFS2: Fix gfs2_xattr_acl_chmod()
authorSteven Whitehouse <swhiteho@redhat.com>
Mon, 21 Dec 2009 13:55:28 +0000 (13:55 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Fri, 8 Jan 2010 13:42:59 +0000 (13:42 +0000)
The ref counting for the bh returned by gfs2_ea_find() was
wrong. This patch ensures that we always drop the ref count
to that bh correctly.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/xattr.c

index 8a04108e0c22fff076b8dbae79ad87dab98f8eff..c2ebdf2c01d4fb2d4018e76fe8506d8ce04bd155 100644 (file)
@@ -1296,6 +1296,7 @@ fail:
 
 int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data)
 {
+       struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
        struct gfs2_ea_location el;
        struct buffer_head *dibh;
        int error;
@@ -1305,16 +1306,17 @@ int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data)
                return error;
 
        if (GFS2_EA_IS_STUFFED(el.el_ea)) {
-               error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), RES_DINODE + RES_EATTR, 0);
-               if (error)
-                       return error;
-
-               gfs2_trans_add_bh(ip->i_gl, el.el_bh, 1);
-               memcpy(GFS2_EA2DATA(el.el_ea), data,
-                      GFS2_EA_DATA_LEN(el.el_ea));
-       } else
+               error = gfs2_trans_begin(sdp, RES_DINODE + RES_EATTR, 0);
+               if (error == 0) {
+                       gfs2_trans_add_bh(ip->i_gl, el.el_bh, 1);
+                       memcpy(GFS2_EA2DATA(el.el_ea), data,
+                              GFS2_EA_DATA_LEN(el.el_ea));
+               }
+       } else {
                error = ea_acl_chmod_unstuffed(ip, el.el_ea, data);
+       }
 
+       brelse(el.el_bh);
        if (error)
                return error;
 
@@ -1327,8 +1329,7 @@ int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data)
                brelse(dibh);
        }
 
-       gfs2_trans_end(GFS2_SB(&ip->i_inode));
-
+       gfs2_trans_end(sdp);
        return error;
 }