2 * linux/fs/hfsplus/posix_acl.c
4 * Vyacheslav Dubeyko <slava@dubeyko.com>
6 * Handler for Posix Access Control Lists (ACLs) support.
9 #include "hfsplus_fs.h"
13 struct posix_acl
*hfsplus_get_posix_acl(struct inode
*inode
, int type
)
15 struct posix_acl
*acl
;
20 hfs_dbg(ACL_MOD
, "[%s]: ino %lu\n", __func__
, inode
->i_ino
);
24 xattr_name
= POSIX_ACL_XATTR_ACCESS
;
26 case ACL_TYPE_DEFAULT
:
27 xattr_name
= POSIX_ACL_XATTR_DEFAULT
;
30 return ERR_PTR(-EINVAL
);
33 size
= __hfsplus_getxattr(inode
, xattr_name
, NULL
, 0);
36 value
= (char *)hfsplus_alloc_attr_entry();
38 return ERR_PTR(-ENOMEM
);
39 size
= __hfsplus_getxattr(inode
, xattr_name
, value
, size
);
43 acl
= posix_acl_from_xattr(&init_user_ns
, value
, size
);
44 else if (size
== -ENODATA
)
49 hfsplus_destroy_attr_entry((hfsplus_attr_entry
*)value
);
52 set_cached_acl(inode
, type
, acl
);
57 int hfsplus_set_posix_acl(struct inode
*inode
, struct posix_acl
*acl
,
65 hfs_dbg(ACL_MOD
, "[%s]: ino %lu\n", __func__
, inode
->i_ino
);
69 xattr_name
= POSIX_ACL_XATTR_ACCESS
;
71 err
= posix_acl_update_mode(inode
, &inode
->i_mode
, &acl
);
78 case ACL_TYPE_DEFAULT
:
79 xattr_name
= POSIX_ACL_XATTR_DEFAULT
;
80 if (!S_ISDIR(inode
->i_mode
))
81 return acl
? -EACCES
: 0;
89 size
= posix_acl_xattr_size(acl
->a_count
);
90 if (unlikely(size
> HFSPLUS_MAX_INLINE_DATA_SIZE
))
92 value
= (char *)hfsplus_alloc_attr_entry();
95 err
= posix_acl_to_xattr(&init_user_ns
, acl
, value
, size
);
96 if (unlikely(err
< 0))
100 err
= __hfsplus_setxattr(inode
, xattr_name
, value
, size
, 0);
103 hfsplus_destroy_attr_entry((hfsplus_attr_entry
*)value
);
106 set_cached_acl(inode
, type
, acl
);
111 int hfsplus_init_posix_acl(struct inode
*inode
, struct inode
*dir
)
114 struct posix_acl
*default_acl
, *acl
;
117 "[%s]: ino %lu, dir->ino %lu\n",
118 __func__
, inode
->i_ino
, dir
->i_ino
);
120 if (S_ISLNK(inode
->i_mode
))
123 err
= posix_acl_create(dir
, &inode
->i_mode
, &default_acl
, &acl
);
128 err
= hfsplus_set_posix_acl(inode
, default_acl
,
130 posix_acl_release(default_acl
);
135 err
= hfsplus_set_posix_acl(inode
, acl
,
137 posix_acl_release(acl
);