diff options
Diffstat (limited to 'fs/gfs2/xattr.c')
| -rw-r--r-- | fs/gfs2/xattr.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c index c2ebdf2c01d4..776af6eb4bcb 100644 --- a/fs/gfs2/xattr.c +++ b/fs/gfs2/xattr.c | |||
| @@ -1296,6 +1296,7 @@ fail: | |||
| 1296 | 1296 | ||
| 1297 | int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data) | 1297 | int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data) |
| 1298 | { | 1298 | { |
| 1299 | struct inode *inode = &ip->i_inode; | ||
| 1299 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 1300 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
| 1300 | struct gfs2_ea_location el; | 1301 | struct gfs2_ea_location el; |
| 1301 | struct buffer_head *dibh; | 1302 | struct buffer_head *dibh; |
| @@ -1321,14 +1322,25 @@ int gfs2_xattr_acl_chmod(struct gfs2_inode *ip, struct iattr *attr, char *data) | |||
| 1321 | return error; | 1322 | return error; |
| 1322 | 1323 | ||
| 1323 | error = gfs2_meta_inode_buffer(ip, &dibh); | 1324 | error = gfs2_meta_inode_buffer(ip, &dibh); |
| 1324 | if (!error) { | 1325 | if (error) |
| 1325 | error = inode_setattr(&ip->i_inode, attr); | 1326 | goto out_trans_end; |
| 1326 | gfs2_assert_warn(GFS2_SB(&ip->i_inode), !error); | 1327 | |
| 1327 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | 1328 | if ((attr->ia_valid & ATTR_SIZE) && |
| 1328 | gfs2_dinode_out(ip, dibh->b_data); | 1329 | attr->ia_size != i_size_read(inode)) { |
| 1329 | brelse(dibh); | 1330 | int error; |
| 1331 | |||
| 1332 | error = vmtruncate(inode, attr->ia_size); | ||
| 1333 | gfs2_assert_warn(GFS2_SB(inode), !error); | ||
| 1330 | } | 1334 | } |
| 1331 | 1335 | ||
| 1336 | setattr_copy(inode, attr); | ||
| 1337 | mark_inode_dirty(inode); | ||
| 1338 | |||
| 1339 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | ||
| 1340 | gfs2_dinode_out(ip, dibh->b_data); | ||
| 1341 | brelse(dibh); | ||
| 1342 | |||
| 1343 | out_trans_end: | ||
| 1332 | gfs2_trans_end(sdp); | 1344 | gfs2_trans_end(sdp); |
| 1333 | return error; | 1345 | return error; |
| 1334 | } | 1346 | } |
| @@ -1535,21 +1547,21 @@ out_alloc: | |||
| 1535 | return error; | 1547 | return error; |
| 1536 | } | 1548 | } |
| 1537 | 1549 | ||
| 1538 | static struct xattr_handler gfs2_xattr_user_handler = { | 1550 | static const struct xattr_handler gfs2_xattr_user_handler = { |
| 1539 | .prefix = XATTR_USER_PREFIX, | 1551 | .prefix = XATTR_USER_PREFIX, |
| 1540 | .flags = GFS2_EATYPE_USR, | 1552 | .flags = GFS2_EATYPE_USR, |
| 1541 | .get = gfs2_xattr_get, | 1553 | .get = gfs2_xattr_get, |
| 1542 | .set = gfs2_xattr_set, | 1554 | .set = gfs2_xattr_set, |
| 1543 | }; | 1555 | }; |
| 1544 | 1556 | ||
| 1545 | static struct xattr_handler gfs2_xattr_security_handler = { | 1557 | static const struct xattr_handler gfs2_xattr_security_handler = { |
| 1546 | .prefix = XATTR_SECURITY_PREFIX, | 1558 | .prefix = XATTR_SECURITY_PREFIX, |
| 1547 | .flags = GFS2_EATYPE_SECURITY, | 1559 | .flags = GFS2_EATYPE_SECURITY, |
| 1548 | .get = gfs2_xattr_get, | 1560 | .get = gfs2_xattr_get, |
| 1549 | .set = gfs2_xattr_set, | 1561 | .set = gfs2_xattr_set, |
| 1550 | }; | 1562 | }; |
| 1551 | 1563 | ||
| 1552 | struct xattr_handler *gfs2_xattr_handlers[] = { | 1564 | const struct xattr_handler *gfs2_xattr_handlers[] = { |
| 1553 | &gfs2_xattr_user_handler, | 1565 | &gfs2_xattr_user_handler, |
| 1554 | &gfs2_xattr_security_handler, | 1566 | &gfs2_xattr_security_handler, |
| 1555 | &gfs2_xattr_system_handler, | 1567 | &gfs2_xattr_system_handler, |
