diff options
author | Filipe Manana <fdmanana@suse.com> | 2015-02-23 20:50:49 +0100 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-03-02 23:04:45 +0100 |
commit | 5cdf83edb8e41cad1ec8eab2d402b4f9d9eb7ee0 (patch) | |
tree | 8585bd88705aebb17bb8114768d09fa46c092c43 /fs | |
parent | Btrfs: fix off-by-one logic error in btrfs_realloc_node (diff) | |
download | linux-5cdf83edb8e41cad1ec8eab2d402b4f9d9eb7ee0.tar.xz linux-5cdf83edb8e41cad1ec8eab2d402b4f9d9eb7ee0.zip |
Btrfs: do not ignore errors from btrfs_lookup_xattr in do_setxattr
The return value from btrfs_lookup_xattr() can be a pointer encoding an
error, therefore deal with it. This fixes commit 5f5bc6b1e2d5
("Btrfs: make xattr replace operations atomic").
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/xattr.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 47b19465f0dc..883b93623bc5 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c @@ -111,6 +111,8 @@ static int do_setxattr(struct btrfs_trans_handle *trans, name, name_len, -1); if (!di && (flags & XATTR_REPLACE)) ret = -ENODATA; + else if (IS_ERR(di)) + ret = PTR_ERR(di); else if (di) ret = btrfs_delete_one_dir_name(trans, root, path, di); goto out; @@ -127,10 +129,12 @@ static int do_setxattr(struct btrfs_trans_handle *trans, ASSERT(mutex_is_locked(&inode->i_mutex)); di = btrfs_lookup_xattr(NULL, root, path, btrfs_ino(inode), name, name_len, 0); - if (!di) { + if (!di) ret = -ENODATA; + else if (IS_ERR(di)) + ret = PTR_ERR(di); + if (ret) goto out; - } btrfs_release_path(path); di = NULL; } |