.fileattr_set = hfsplus_fileattr_set,
};
+const struct inode_operations hfsplus_symlink_inode_operations = {
+ .get_link = page_get_link,
+ .setattr = hfsplus_setattr,
+ .getattr = hfsplus_getattr,
+ .listxattr = hfsplus_listxattr,
+};
+
+const struct inode_operations hfsplus_special_inode_operations = {
+ .setattr = hfsplus_setattr,
+ .getattr = hfsplus_getattr,
+ .listxattr = hfsplus_listxattr,
+};
+
static const struct file_operations hfsplus_file_operations = {
.llseek = generic_file_llseek,
.read_iter = generic_file_read_iter,
hip->clump_blocks = sbi->data_clump_blocks;
} else if (S_ISLNK(inode->i_mode)) {
sbi->file_count++;
- inode->i_op = &page_symlink_inode_operations;
+ inode->i_op = &hfsplus_symlink_inode_operations;
inode_nohighmem(inode);
inode->i_mapping->a_ops = &hfsplus_aops;
hip->clump_blocks = 1;
+ } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
+ S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
+ sbi->file_count++;
+ inode->i_op = &hfsplus_special_inode_operations;
} else
sbi->file_count++;
+
insert_inode_hash(inode);
mark_inode_dirty(inode);
hfsplus_mark_mdb_dirty(sb);
inode->i_fop = &hfsplus_file_operations;
inode->i_mapping->a_ops = &hfsplus_aops;
} else if (S_ISLNK(inode->i_mode)) {
- inode->i_op = &page_symlink_inode_operations;
+ inode->i_op = &hfsplus_symlink_inode_operations;
inode_nohighmem(inode);
inode->i_mapping->a_ops = &hfsplus_aops;
} else {
+ inode->i_op = &hfsplus_special_inode_operations;
init_special_inode(inode, inode->i_mode,
be32_to_cpu(file->permissions.dev));
}
return err;
}
+static inline
+bool is_xattr_operation_supported(struct inode *inode)
+{
+ if (HFSPLUS_IS_RSRC(inode))
+ return false;
+
+ return true;
+}
+
int __hfsplus_setxattr(struct inode *inode, const char *name,
const void *value, size_t size, int flags)
{
u16 folder_finderinfo_len = sizeof(DInfo) + sizeof(DXInfo);
u16 file_finderinfo_len = sizeof(FInfo) + sizeof(FXInfo);
- if ((!S_ISREG(inode->i_mode) &&
- !S_ISDIR(inode->i_mode)) ||
- HFSPLUS_IS_RSRC(inode))
+ hfs_dbg("ino %lu, name %s, value %p, size %zu\n",
+ inode->i_ino, name ? name : NULL,
+ value, size);
+
+ if (!is_xattr_operation_supported(inode))
return -EOPNOTSUPP;
if (value == NULL)
end_setxattr:
hfs_find_exit(&cat_fd);
+ hfs_dbg("finished: res %d\n", err);
return err;
}
u16 record_length = 0;
ssize_t res;
- if ((!S_ISREG(inode->i_mode) &&
- !S_ISDIR(inode->i_mode)) ||
- HFSPLUS_IS_RSRC(inode))
+ if (!is_xattr_operation_supported(inode))
return -EOPNOTSUPP;
if (!strcmp_xattr_finder_info(name))
hfs_dbg("ino %lu\n", inode->i_ino);
- if ((!S_ISREG(inode->i_mode) &&
- !S_ISDIR(inode->i_mode)) ||
- HFSPLUS_IS_RSRC(inode))
+ if (!is_xattr_operation_supported(inode))
return -EOPNOTSUPP;
res = hfsplus_listxattr_finder_info(dentry, buffer, size);
err = hfsplus_find_attr(inode->i_sb, inode->i_ino, NULL, &fd);
if (err) {
if (err == -ENOENT) {
- if (res == 0)
- res = -ENODATA;
+ res = 0;
goto end_listxattr;
} else {
res = err;