Release 4.11 fs/hfs/attr.c
/*
* linux/fs/hfs/attr.c
*
* (C) 2003 Ardis Technologies <roman@ardistech.com>
*
* Export hfs data via xattr
*/
#include <linux/fs.h>
#include <linux/xattr.h>
#include "hfs_fs.h"
#include "btree.h"
enum hfs_xattr_type {
HFS_TYPE,
HFS_CREATOR,
};
static int __hfs_setxattr(struct inode *inode, enum hfs_xattr_type type,
const void *value, size_t size, int flags)
{
struct hfs_find_data fd;
hfs_cat_rec rec;
struct hfs_cat_file *file;
int res;
if (!S_ISREG(inode->i_mode) || HFS_IS_RSRC(inode))
return -EOPNOTSUPP;
res = hfs_find_init(HFS_SB(inode->i_sb)->cat_tree, &fd);
if (res)
return res;
fd.search_key->cat = HFS_I(inode)->cat_key;
res = hfs_brec_find(&fd);
if (res)
goto out;
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
sizeof(struct hfs_cat_file));
file = &rec.file;
switch (type) {
case HFS_TYPE:
if (size == 4)
memcpy(&file->UsrWds.fdType, value, 4);
else
res = -ERANGE;
break;
case HFS_CREATOR:
if (size == 4)
memcpy(&file->UsrWds.fdCreator, value, 4);
else
res = -ERANGE;
break;
}
if (!res)
hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
sizeof(struct hfs_cat_file));
out:
hfs_find_exit(&fd);
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Roman Zippel | 223 | 92.53% | 1 | 33.33% |
Andreas Gruenbacher | 15 | 6.22% | 1 | 33.33% |
Al Viro | 3 | 1.24% | 1 | 33.33% |
Total | 241 | 100.00% | 3 | 100.00% |
static ssize_t __hfs_getxattr(struct inode *inode, enum hfs_xattr_type type,
void *value, size_t size)
{
struct hfs_find_data fd;
hfs_cat_rec rec;
struct hfs_cat_file *file;
ssize_t res = 0;
if (!S_ISREG(inode->i_mode) || HFS_IS_RSRC(inode))
return -EOPNOTSUPP;
if (size) {
res = hfs_find_init(HFS_SB(inode->i_sb)->cat_tree, &fd);
if (res)
return res;
fd.search_key->cat = HFS_I(inode)->cat_key;
res = hfs_brec_find(&fd);
if (res)
goto out;
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
sizeof(struct hfs_cat_file));
}
file = &rec.file;
switch (type) {
case HFS_TYPE:
if (size >= 4) {
memcpy(value, &file->UsrWds.fdType, 4);
res = 4;
} else
res = size ? -ERANGE : 4;
break;
case HFS_CREATOR:
if (size >= 4) {
memcpy(value, &file->UsrWds.fdCreator, 4);
res = 4;
} else
res = size ? -ERANGE : 4;
break;
}
out:
if (size)
hfs_find_exit(&fd);
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Roman Zippel | 226 | 92.62% | 1 | 33.33% |
Andreas Gruenbacher | 15 | 6.15% | 1 | 33.33% |
Al Viro | 3 | 1.23% | 1 | 33.33% |
Total | 244 | 100.00% | 3 | 100.00% |
static int hfs_xattr_get(const struct xattr_handler *handler,
struct dentry *unused, struct inode *inode,
const char *name, void *value, size_t size)
{
return __hfs_getxattr(inode, handler->flags, value, size);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andreas Gruenbacher | 36 | 75.00% | 1 | 50.00% |
Roman Zippel | 12 | 25.00% | 1 | 50.00% |
Total | 48 | 100.00% | 2 | 100.00% |
static int hfs_xattr_set(const struct xattr_handler *handler,
struct dentry *unused, struct inode *inode,
const char *name, const void *value, size_t size,
int flags)
{
if (!value)
return -EOPNOTSUPP;
return __hfs_setxattr(inode, handler->flags, value, size, flags);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andreas Gruenbacher | 44 | 69.84% | 1 | 50.00% |
Roman Zippel | 19 | 30.16% | 1 | 50.00% |
Total | 63 | 100.00% | 2 | 100.00% |
static const struct xattr_handler hfs_creator_handler = {
.name = "hfs.creator",
.flags = HFS_CREATOR,
.get = hfs_xattr_get,
.set = hfs_xattr_set,
};
static const struct xattr_handler hfs_type_handler = {
.name = "hfs.type",
.flags = HFS_TYPE,
.get = hfs_xattr_get,
.set = hfs_xattr_set,
};
const struct xattr_handler *hfs_xattr_handlers[] = {
&hfs_creator_handler,
&hfs_type_handler,
NULL
};
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Roman Zippel | 493 | 71.45% | 1 | 25.00% |
Andreas Gruenbacher | 191 | 27.68% | 1 | 25.00% |
Al Viro | 6 | 0.87% | 2 | 50.00% |
Total | 690 | 100.00% | 4 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.