summaryrefslogtreecommitdiff
path: root/fs/f2fs/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/xattr.c')
-rw-r--r--fs/f2fs/xattr.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c
index aa7a3f1..1ac8a5f 100644
--- a/fs/f2fs/xattr.c
+++ b/fs/f2fs/xattr.c
@@ -154,9 +154,6 @@ static int f2fs_xattr_advise_set(struct dentry *dentry, const char *name,
}
#ifdef CONFIG_F2FS_FS_SECURITY
-static int __f2fs_setxattr(struct inode *inode, int name_index,
- const char *name, const void *value, size_t value_len,
- struct page *ipage);
static int f2fs_initxattrs(struct inode *inode, const struct xattr *xattr_array,
void *page)
{
@@ -164,7 +161,7 @@ static int f2fs_initxattrs(struct inode *inode, const struct xattr *xattr_array,
int err = 0;
for (xattr = xattr_array; xattr->name != NULL; xattr++) {
- err = __f2fs_setxattr(inode, F2FS_XATTR_INDEX_SECURITY,
+ err = f2fs_setxattr(inode, F2FS_XATTR_INDEX_SECURITY,
xattr->name, xattr->value,
xattr->value_len, (struct page *)page);
if (err < 0)
@@ -372,7 +369,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
alloc_nid_failed(sbi, new_nid);
return PTR_ERR(xpage);
}
- f2fs_bug_on(new_nid);
+ BUG_ON(new_nid);
} else {
struct dnode_of_data dn;
set_new_dnode(&dn, inode, NULL, NULL, new_nid);
@@ -472,15 +469,16 @@ cleanup:
return error;
}
-static int __f2fs_setxattr(struct inode *inode, int name_index,
- const char *name, const void *value, size_t value_len,
- struct page *ipage)
+int f2fs_setxattr(struct inode *inode, int name_index, const char *name,
+ const void *value, size_t value_len, struct page *ipage)
{
+ struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
struct f2fs_inode_info *fi = F2FS_I(inode);
struct f2fs_xattr_entry *here, *last;
void *base_addr;
int found, newsize;
size_t name_len;
+ int ilock;
__u32 new_hsize;
int error = -ENOMEM;
@@ -495,6 +493,10 @@ static int __f2fs_setxattr(struct inode *inode, int name_index,
if (name_len > F2FS_NAME_LEN || value_len > MAX_VALUE_LEN(inode))
return -ERANGE;
+ f2fs_balance_fs(sbi);
+
+ ilock = mutex_lock_op(sbi);
+
base_addr = read_all_xattrs(inode, ipage);
if (!base_addr)
goto exit;
@@ -520,7 +522,7 @@ static int __f2fs_setxattr(struct inode *inode, int name_index,
*/
free = MIN_OFFSET(inode) - ((char *)last - (char *)base_addr);
if (found)
- free = free + ENTRY_SIZE(here);
+ free = free - ENTRY_SIZE(here);
if (free < newsize) {
error = -ENOSPC;
@@ -576,21 +578,7 @@ static int __f2fs_setxattr(struct inode *inode, int name_index,
else
update_inode_page(inode);
exit:
+ mutex_unlock_op(sbi, ilock);
kzfree(base_addr);
return error;
}
-
-int f2fs_setxattr(struct inode *inode, int name_index, const char *name,
- const void *value, size_t value_len, struct page *ipage)
-{
- struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
- int err;
-
- f2fs_balance_fs(sbi);
-
- f2fs_lock_op(sbi);
- err = __f2fs_setxattr(inode, name_index, name, value, value_len, ipage);
- f2fs_unlock_op(sbi);
-
- return err;
-}