diff options
Diffstat (limited to 'fs/9p/acl.c')
-rw-r--r-- | fs/9p/acl.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/fs/9p/acl.c b/fs/9p/acl.c index a8c013615a22..4293b4599ff6 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c | |||
@@ -94,3 +94,44 @@ int v9fs_check_acl(struct inode *inode, int mask) | |||
94 | } | 94 | } |
95 | return -EAGAIN; | 95 | return -EAGAIN; |
96 | } | 96 | } |
97 | |||
98 | static int v9fs_xattr_get_acl(struct dentry *dentry, const char *name, | ||
99 | void *buffer, size_t size, int type) | ||
100 | { | ||
101 | struct posix_acl *acl; | ||
102 | int error; | ||
103 | |||
104 | if (strcmp(name, "") != 0) | ||
105 | return -EINVAL; | ||
106 | |||
107 | acl = v9fs_get_cached_acl(dentry->d_inode, type); | ||
108 | if (IS_ERR(acl)) | ||
109 | return PTR_ERR(acl); | ||
110 | if (acl == NULL) | ||
111 | return -ENODATA; | ||
112 | error = posix_acl_to_xattr(acl, buffer, size); | ||
113 | posix_acl_release(acl); | ||
114 | |||
115 | return error; | ||
116 | } | ||
117 | |||
118 | static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, | ||
119 | const void *value, size_t size, | ||
120 | int flags, int type) | ||
121 | { | ||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | const struct xattr_handler v9fs_xattr_acl_access_handler = { | ||
126 | .prefix = POSIX_ACL_XATTR_ACCESS, | ||
127 | .flags = ACL_TYPE_ACCESS, | ||
128 | .get = v9fs_xattr_get_acl, | ||
129 | .set = v9fs_xattr_set_acl, | ||
130 | }; | ||
131 | |||
132 | const struct xattr_handler v9fs_xattr_acl_default_handler = { | ||
133 | .prefix = POSIX_ACL_XATTR_DEFAULT, | ||
134 | .flags = ACL_TYPE_DEFAULT, | ||
135 | .get = v9fs_xattr_get_acl, | ||
136 | .set = v9fs_xattr_set_acl, | ||
137 | }; | ||