aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/ops_inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/ops_inode.c')
-rw-r--r--fs/gfs2/ops_inode.c83
1 files changed, 37 insertions, 46 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index f8bd20baf99c..247436c10deb 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -12,7 +12,6 @@
12#include <linux/completion.h> 12#include <linux/completion.h>
13#include <linux/buffer_head.h> 13#include <linux/buffer_head.h>
14#include <linux/namei.h> 14#include <linux/namei.h>
15#include <linux/utsname.h>
16#include <linux/mm.h> 15#include <linux/mm.h>
17#include <linux/xattr.h> 16#include <linux/xattr.h>
18#include <linux/posix_acl.h> 17#include <linux/posix_acl.h>
@@ -26,8 +25,7 @@
26#include "acl.h" 25#include "acl.h"
27#include "bmap.h" 26#include "bmap.h"
28#include "dir.h" 27#include "dir.h"
29#include "eaops.h" 28#include "xattr.h"
30#include "eattr.h"
31#include "glock.h" 29#include "glock.h"
32#include "inode.h" 30#include "inode.h"
33#include "meta_io.h" 31#include "meta_io.h"
@@ -349,7 +347,7 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
349 347
350 error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0); 348 error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0);
351 if (error) 349 if (error)
352 goto out_rgrp; 350 goto out_gunlock;
353 351
354 error = gfs2_dir_del(dip, &dentry->d_name); 352 error = gfs2_dir_del(dip, &dentry->d_name);
355 if (error) 353 if (error)
@@ -1302,60 +1300,53 @@ static int gfs2_setxattr(struct dentry *dentry, const char *name,
1302 const void *data, size_t size, int flags) 1300 const void *data, size_t size, int flags)
1303{ 1301{
1304 struct inode *inode = dentry->d_inode; 1302 struct inode *inode = dentry->d_inode;
1305 struct gfs2_ea_request er; 1303 struct gfs2_inode *ip = GFS2_I(inode);
1306 1304 struct gfs2_holder gh;
1307 memset(&er, 0, sizeof(struct gfs2_ea_request)); 1305 int ret;
1308 er.er_type = gfs2_ea_name2type(name, &er.er_name);
1309 if (er.er_type == GFS2_EATYPE_UNUSED)
1310 return -EOPNOTSUPP;
1311 er.er_data = (char *)data;
1312 er.er_name_len = strlen(er.er_name);
1313 er.er_data_len = size;
1314 er.er_flags = flags;
1315
1316 gfs2_assert_warn(GFS2_SB(inode), !(er.er_flags & GFS2_ERF_MODE));
1317 1306
1318 return gfs2_ea_set(GFS2_I(inode), &er); 1307 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1308 ret = gfs2_glock_nq(&gh);
1309 if (ret == 0) {
1310 ret = generic_setxattr(dentry, name, data, size, flags);
1311 gfs2_glock_dq(&gh);
1312 }
1313 gfs2_holder_uninit(&gh);
1314 return ret;
1319} 1315}
1320 1316
1321static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, 1317static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
1322 void *data, size_t size) 1318 void *data, size_t size)
1323{ 1319{
1324 struct gfs2_ea_request er; 1320 struct inode *inode = dentry->d_inode;
1325 1321 struct gfs2_inode *ip = GFS2_I(inode);
1326 memset(&er, 0, sizeof(struct gfs2_ea_request)); 1322 struct gfs2_holder gh;
1327 er.er_type = gfs2_ea_name2type(name, &er.er_name); 1323 int ret;
1328 if (er.er_type == GFS2_EATYPE_UNUSED)
1329 return -EOPNOTSUPP;
1330 er.er_data = data;
1331 er.er_name_len = strlen(er.er_name);
1332 er.er_data_len = size;
1333
1334 return gfs2_ea_get(GFS2_I(dentry->d_inode), &er);
1335}
1336
1337static ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
1338{
1339 struct gfs2_ea_request er;
1340
1341 memset(&er, 0, sizeof(struct gfs2_ea_request));
1342 er.er_data = (size) ? buffer : NULL;
1343 er.er_data_len = size;
1344 1324
1345 return gfs2_ea_list(GFS2_I(dentry->d_inode), &er); 1325 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1326 ret = gfs2_glock_nq(&gh);
1327 if (ret == 0) {
1328 ret = generic_getxattr(dentry, name, data, size);
1329 gfs2_glock_dq(&gh);
1330 }
1331 gfs2_holder_uninit(&gh);
1332 return ret;
1346} 1333}
1347 1334
1348static int gfs2_removexattr(struct dentry *dentry, const char *name) 1335static int gfs2_removexattr(struct dentry *dentry, const char *name)
1349{ 1336{
1350 struct gfs2_ea_request er; 1337 struct inode *inode = dentry->d_inode;
1351 1338 struct gfs2_inode *ip = GFS2_I(inode);
1352 memset(&er, 0, sizeof(struct gfs2_ea_request)); 1339 struct gfs2_holder gh;
1353 er.er_type = gfs2_ea_name2type(name, &er.er_name); 1340 int ret;
1354 if (er.er_type == GFS2_EATYPE_UNUSED)
1355 return -EOPNOTSUPP;
1356 er.er_name_len = strlen(er.er_name);
1357 1341
1358 return gfs2_ea_remove(GFS2_I(dentry->d_inode), &er); 1342 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
1343 ret = gfs2_glock_nq(&gh);
1344 if (ret == 0) {
1345 ret = generic_removexattr(dentry, name);
1346 gfs2_glock_dq(&gh);
1347 }
1348 gfs2_holder_uninit(&gh);
1349 return ret;
1359} 1350}
1360 1351
1361static int gfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, 1352static int gfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,