diff options
Diffstat (limited to 'fs/btrfs/xattr.c')
-rw-r--r-- | fs/btrfs/xattr.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 7f332e270894..b4fa5f4b6ad1 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c | |||
@@ -45,9 +45,12 @@ ssize_t __btrfs_getxattr(struct inode *inode, const char *name, | |||
45 | /* lookup the xattr by name */ | 45 | /* lookup the xattr by name */ |
46 | di = btrfs_lookup_xattr(NULL, root, path, inode->i_ino, name, | 46 | di = btrfs_lookup_xattr(NULL, root, path, inode->i_ino, name, |
47 | strlen(name), 0); | 47 | strlen(name), 0); |
48 | if (!di || IS_ERR(di)) { | 48 | if (!di) { |
49 | ret = -ENODATA; | 49 | ret = -ENODATA; |
50 | goto out; | 50 | goto out; |
51 | } else if (IS_ERR(di)) { | ||
52 | ret = PTR_ERR(di); | ||
53 | goto out; | ||
51 | } | 54 | } |
52 | 55 | ||
53 | leaf = path->nodes[0]; | 56 | leaf = path->nodes[0]; |
@@ -62,6 +65,14 @@ ssize_t __btrfs_getxattr(struct inode *inode, const char *name, | |||
62 | ret = -ERANGE; | 65 | ret = -ERANGE; |
63 | goto out; | 66 | goto out; |
64 | } | 67 | } |
68 | |||
69 | /* | ||
70 | * The way things are packed into the leaf is like this | ||
71 | * |struct btrfs_dir_item|name|data| | ||
72 | * where name is the xattr name, so security.foo, and data is the | ||
73 | * content of the xattr. data_ptr points to the location in memory | ||
74 | * where the data starts in the in memory leaf | ||
75 | */ | ||
65 | data_ptr = (unsigned long)((char *)(di + 1) + | 76 | data_ptr = (unsigned long)((char *)(di + 1) + |
66 | btrfs_dir_name_len(leaf, di)); | 77 | btrfs_dir_name_len(leaf, di)); |
67 | read_extent_buffer(leaf, buffer, data_ptr, | 78 | read_extent_buffer(leaf, buffer, data_ptr, |
@@ -176,7 +187,6 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
176 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 187 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
177 | if (ret < 0) | 188 | if (ret < 0) |
178 | goto err; | 189 | goto err; |
179 | ret = 0; | ||
180 | advance = 0; | 190 | advance = 0; |
181 | while (1) { | 191 | while (1) { |
182 | leaf = path->nodes[0]; | 192 | leaf = path->nodes[0]; |