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}; |