acl.c (7a4566b0b8fa67c7cd7be9f2969a085920356abb) acl.c (22d8dcdf8f8a3882d98757e78169014bb0bc6b23)
1/*
2 * Copyright IBM Corporation, 2010
3 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2.1 of the GNU Lesser General Public License
7 * as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 *
13 */
14
15#include <linux/module.h>
16#include <linux/fs.h>
17#include <net/9p/9p.h>
18#include <net/9p/client.h>
19#include <linux/slab.h>
1/*
2 * Copyright IBM Corporation, 2010
3 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2.1 of the GNU Lesser General Public License
7 * as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 *
13 */
14
15#include <linux/module.h>
16#include <linux/fs.h>
17#include <net/9p/9p.h>
18#include <net/9p/client.h>
19#include <linux/slab.h>
20#include <linux/sched.h>
20#include <linux/posix_acl_xattr.h>
21#include "xattr.h"
22#include "acl.h"
21#include <linux/posix_acl_xattr.h>
22#include "xattr.h"
23#include "acl.h"
24#include "v9fs_vfs.h"
23
24static struct posix_acl *__v9fs_get_acl(struct p9_fid *fid, char *name)
25{
26 ssize_t size;
27 void *value = NULL;
28 struct posix_acl *acl = NULL;;
29
30 size = v9fs_fid_xattr_get(fid, name, NULL, 0);

--- 83 unchanged lines hidden (view full) ---

114
115 return error;
116}
117
118static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name,
119 const void *value, size_t size,
120 int flags, int type)
121{
25
26static struct posix_acl *__v9fs_get_acl(struct p9_fid *fid, char *name)
27{
28 ssize_t size;
29 void *value = NULL;
30 struct posix_acl *acl = NULL;;
31
32 size = v9fs_fid_xattr_get(fid, name, NULL, 0);

--- 83 unchanged lines hidden (view full) ---

116
117 return error;
118}
119
120static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name,
121 const void *value, size_t size,
122 int flags, int type)
123{
122 return 0;
124 int retval;
125 struct posix_acl *acl;
126 struct inode *inode = dentry->d_inode;
127
128 if (strcmp(name, "") != 0)
129 return -EINVAL;
130 if (S_ISLNK(inode->i_mode))
131 return -EOPNOTSUPP;
132 if (!is_owner_or_cap(inode))
133 return -EPERM;
134 if (value) {
135 /* update the cached acl value */
136 acl = posix_acl_from_xattr(value, size);
137 if (IS_ERR(acl))
138 return PTR_ERR(acl);
139 else if (acl) {
140 retval = posix_acl_valid(acl);
141 if (retval)
142 goto err_out;
143 }
144 } else
145 acl = NULL;
146
147 switch (type) {
148 case ACL_TYPE_ACCESS:
149 name = POSIX_ACL_XATTR_ACCESS;
150 if (acl) {
151 mode_t mode = inode->i_mode;
152 retval = posix_acl_equiv_mode(acl, &mode);
153 if (retval < 0)
154 goto err_out;
155 else {
156 struct iattr iattr;
157 if (retval == 0) {
158 /*
159 * ACL can be represented
160 * by the mode bits. So don't
161 * update ACL.
162 */
163 acl = NULL;
164 value = NULL;
165 size = 0;
166 }
167 /* Updte the mode bits */
168 iattr.ia_mode = ((mode & S_IALLUGO) |
169 (inode->i_mode & ~S_IALLUGO));
170 iattr.ia_valid = ATTR_MODE;
171 /* FIXME should we update ctime ?
172 * What is the following setxattr update the
173 * mode ?
174 */
175 v9fs_vfs_setattr_dotl(dentry, &iattr);
176 }
177 }
178 break;
179 case ACL_TYPE_DEFAULT:
180 name = POSIX_ACL_XATTR_DEFAULT;
181 if (!S_ISDIR(inode->i_mode)) {
182 retval = -EINVAL;
183 goto err_out;
184 }
185 break;
186 default:
187 BUG();
188 }
189 retval = v9fs_xattr_set(dentry, name, value, size, flags);
190 if (!retval)
191 set_cached_acl(inode, type, acl);
192err_out:
193 posix_acl_release(acl);
194 return retval;
123}
124
125const 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
132const 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};
195}
196
197const struct xattr_handler v9fs_xattr_acl_access_handler = {
198 .prefix = POSIX_ACL_XATTR_ACCESS,
199 .flags = ACL_TYPE_ACCESS,
200 .get = v9fs_xattr_get_acl,
201 .set = v9fs_xattr_set_acl,
202};
203
204const struct xattr_handler v9fs_xattr_acl_default_handler = {
205 .prefix = POSIX_ACL_XATTR_DEFAULT,
206 .flags = ACL_TYPE_DEFAULT,
207 .get = v9fs_xattr_get_acl,
208 .set = v9fs_xattr_set_acl,
209};