if (err)
goto failed_find_attr;
err = hfs_brec_find(fd, hfs_find_rec_by_key);
- if (err)
+ if (err == -ENOENT) {
+ /* file exists but xattr is absent */
+ err = -ENODATA;
+ goto failed_find_attr;
+ } else if (err)
goto failed_find_attr;
} else {
err = hfsplus_attr_build_key(sb, fd->search_key, cnid, NULL);
if (err)
goto failed_find_attr;
err = hfs_brec_find(fd, hfs_find_1st_rec_by_cnid);
- if (err)
+ if (err == -ENOENT) {
+ /* file exists but xattr is absent */
+ err = -ENODATA;
+ goto failed_find_attr;
+ } else if (err)
goto failed_find_attr;
}
struct super_block *sb = inode->i_sb;
struct hfs_find_data fd;
+ hfs_dbg("name %s, ino %ld\n",
+ name ? name : NULL, inode->i_ino);
+
if (!HFSPLUS_SB(sb)->attr_tree)
return 0;
static int __hfsplus_delete_attr(struct inode *inode, u32 cnid,
struct hfs_find_data *fd)
{
- int err = 0;
+ int err;
__be32 found_cnid, record_type;
+ found_cnid = U32_MAX;
hfs_bnode_read(fd->bnode, &found_cnid,
fd->keyoffset +
offsetof(struct hfsplus_attr_key, cnid),
sizeof(__be32));
if (cnid != be32_to_cpu(found_cnid))
- return -ENOENT;
+ return -ENODATA;
hfs_bnode_read(fd->bnode, &record_type,
fd->entryoffset, sizeof(record_type));
hfsplus_mark_inode_dirty(HFSPLUS_ATTR_TREE_I(inode->i_sb),
HFSPLUS_I_ATTR_DIRTY);
hfsplus_mark_inode_dirty(inode, HFSPLUS_I_ATTR_DIRTY);
- return err;
+ return 0;
}
static
}
err = hfs_brec_find(fd, hfs_find_rec_by_key);
- if (err)
+ if (err == -ENOENT) {
+ /* file exists but xattr is absent */
+ return -ENODATA;
+ } else if (err)
return err;
err = __hfsplus_delete_attr(inode, inode->i_ino, fd);
for (;;) {
err = hfsplus_find_attr(dir->i_sb, cnid, NULL, &fd);
- if (err) {
- if (err != -ENOENT)
- pr_err("xattr search failed\n");
+ if (err == -ENOENT || err == -ENODATA) {
+ /*
+ * xattr has not been found
+ */
+ err = -ENODATA;
+ goto end_delete_all;
+ } else if (err) {
+ pr_err("xattr search failed\n");
goto end_delete_all;
}
res = hfsplus_find_attr(inode->i_sb, inode->i_ino, name, &fd);
if (res) {
- if (res == -ENOENT)
+ if (res == -ENOENT || res == -ENODATA)
res = -ENODATA;
else
- pr_err("xattr searching failed\n");
+ pr_err("xattr search failed\n");
goto out;
}
err = hfsplus_find_attr(inode->i_sb, inode->i_ino, NULL, &fd);
if (err) {
- if (err == -ENOENT) {
+ if (err == -ENOENT || err == -ENODATA) {
res = 0;
goto end_listxattr;
} else {