4 #include <linux/nfs3.h>
5 #include <linux/nfs_fs.h>
6 #include <linux/posix_acl_xattr.h>
7 #include <linux/nfsacl.h>
12 #define NFSDBG_FACILITY NFSDBG_PROC
14 struct posix_acl
*nfs3_get_acl(struct inode
*inode
, int type
)
16 struct nfs_server
*server
= NFS_SERVER(inode
);
17 struct page
*pages
[NFSACL_MAXPAGES
] = { };
18 struct nfs3_getaclargs args
= {
20 /* The xdr layer may allocate pages here. */
23 struct nfs3_getaclres res
= {
26 struct rpc_message msg
= {
32 if (!nfs_server_capable(inode
, NFS_CAP_ACLS
))
33 return ERR_PTR(-EOPNOTSUPP
);
35 status
= nfs_revalidate_inode(server
, inode
);
37 return ERR_PTR(status
);
40 * Only get the access acl when explicitly requested: We don't
41 * need it for access decisions, and only some applications use
42 * it. Applications which request the access acl first are not
43 * penalized from this optimization.
45 if (type
== ACL_TYPE_ACCESS
)
46 args
.mask
|= NFS_ACLCNT
|NFS_ACL
;
47 if (S_ISDIR(inode
->i_mode
))
48 args
.mask
|= NFS_DFACLCNT
|NFS_DFACL
;
52 dprintk("NFS call getacl\n");
53 msg
.rpc_proc
= &server
->client_acl
->cl_procinfo
[ACLPROC3_GETACL
];
54 res
.fattr
= nfs_alloc_fattr();
55 if (res
.fattr
== NULL
)
56 return ERR_PTR(-ENOMEM
);
58 status
= rpc_call_sync(server
->client_acl
, &msg
, 0);
59 dprintk("NFS reply getacl: %d\n", status
);
61 /* pages may have been allocated at the xdr layer. */
62 for (count
= 0; count
< NFSACL_MAXPAGES
&& args
.pages
[count
]; count
++)
63 __free_page(args
.pages
[count
]);
67 status
= nfs_refresh_inode(inode
, res
.fattr
);
70 case -EPROTONOSUPPORT
:
71 dprintk("NFS_V3_ACL extension not supported; disabling\n");
72 server
->caps
&= ~NFS_CAP_ACLS
;
78 if ((args
.mask
& res
.mask
) != args
.mask
) {
83 if (res
.acl_access
!= NULL
) {
84 if ((posix_acl_equiv_mode(res
.acl_access
, NULL
) == 0) ||
85 res
.acl_access
->a_count
== 0) {
86 posix_acl_release(res
.acl_access
);
87 res
.acl_access
= NULL
;
91 if (res
.mask
& NFS_ACL
)
92 set_cached_acl(inode
, ACL_TYPE_ACCESS
, res
.acl_access
);
94 forget_cached_acl(inode
, ACL_TYPE_ACCESS
);
96 if (res
.mask
& NFS_DFACL
)
97 set_cached_acl(inode
, ACL_TYPE_DEFAULT
, res
.acl_default
);
99 forget_cached_acl(inode
, ACL_TYPE_DEFAULT
);
101 nfs_free_fattr(res
.fattr
);
102 if (type
== ACL_TYPE_ACCESS
) {
103 posix_acl_release(res
.acl_default
);
104 return res
.acl_access
;
106 posix_acl_release(res
.acl_access
);
107 return res
.acl_default
;
111 posix_acl_release(res
.acl_access
);
112 posix_acl_release(res
.acl_default
);
113 nfs_free_fattr(res
.fattr
);
114 return ERR_PTR(status
);
117 static int __nfs3_proc_setacls(struct inode
*inode
, struct posix_acl
*acl
,
118 struct posix_acl
*dfacl
)
120 struct nfs_server
*server
= NFS_SERVER(inode
);
121 struct nfs_fattr
*fattr
;
122 struct page
*pages
[NFSACL_MAXPAGES
];
123 struct nfs3_setaclargs args
= {
129 struct rpc_message msg
= {
135 if (acl
== NULL
&& (!S_ISDIR(inode
->i_mode
) || dfacl
== NULL
))
138 status
= -EOPNOTSUPP
;
139 if (!nfs_server_capable(inode
, NFS_CAP_ACLS
))
142 /* We are doing this here because XDR marshalling does not
143 * return any results, it BUGs. */
145 if (acl
!= NULL
&& acl
->a_count
> NFS_ACL_MAX_ENTRIES
)
147 if (dfacl
!= NULL
&& dfacl
->a_count
> NFS_ACL_MAX_ENTRIES
)
149 if (S_ISDIR(inode
->i_mode
)) {
150 args
.mask
|= NFS_DFACL
;
151 args
.acl_default
= dfacl
;
152 args
.len
= nfsacl_size(acl
, dfacl
);
154 args
.len
= nfsacl_size(acl
, NULL
);
156 if (args
.len
> NFS_ACL_INLINE_BUFSIZE
) {
157 unsigned int npages
= 1 + ((args
.len
- 1) >> PAGE_SHIFT
);
161 args
.pages
[args
.npages
] = alloc_page(GFP_KERNEL
);
162 if (args
.pages
[args
.npages
] == NULL
)
165 } while (args
.npages
< npages
);
168 dprintk("NFS call setacl\n");
170 fattr
= nfs_alloc_fattr();
174 msg
.rpc_proc
= &server
->client_acl
->cl_procinfo
[ACLPROC3_SETACL
];
175 msg
.rpc_resp
= fattr
;
176 status
= rpc_call_sync(server
->client_acl
, &msg
, 0);
177 nfs_access_zap_cache(inode
);
178 nfs_zap_acl_cache(inode
);
179 dprintk("NFS reply setacl: %d\n", status
);
183 status
= nfs_refresh_inode(inode
, fattr
);
184 set_cached_acl(inode
, ACL_TYPE_ACCESS
, acl
);
185 set_cached_acl(inode
, ACL_TYPE_DEFAULT
, dfacl
);
188 case -EPROTONOSUPPORT
:
189 dprintk("NFS_V3_ACL SETACL RPC not supported"
190 "(will not retry)\n");
191 server
->caps
&= ~NFS_CAP_ACLS
;
193 status
= -EOPNOTSUPP
;
195 nfs_free_fattr(fattr
);
197 while (args
.npages
!= 0) {
199 __free_page(args
.pages
[args
.npages
]);
205 int nfs3_proc_setacls(struct inode
*inode
, struct posix_acl
*acl
,
206 struct posix_acl
*dfacl
)
209 ret
= __nfs3_proc_setacls(inode
, acl
, dfacl
);
210 return (ret
== -EOPNOTSUPP
) ? 0 : ret
;
214 int nfs3_set_acl(struct inode
*inode
, struct posix_acl
*acl
, int type
)
216 struct posix_acl
*orig
= acl
, *dfacl
= NULL
, *alloc
;
219 if (S_ISDIR(inode
->i_mode
)) {
221 case ACL_TYPE_ACCESS
:
222 alloc
= get_acl(inode
, ACL_TYPE_DEFAULT
);
228 case ACL_TYPE_DEFAULT
:
229 alloc
= get_acl(inode
, ACL_TYPE_ACCESS
);
239 alloc
= posix_acl_from_mode(inode
->i_mode
, GFP_KERNEL
);
244 status
= __nfs3_proc_setacls(inode
, acl
, dfacl
);
247 posix_acl_release(acl
);
249 posix_acl_release(dfacl
);
253 status
= PTR_ERR(alloc
);
257 const struct xattr_handler
*nfs3_xattr_handlers
[] = {
258 &posix_acl_access_xattr_handler
,
259 &posix_acl_default_xattr_handler
,
264 nfs3_list_one_acl(struct inode
*inode
, int type
, const char *name
, void *data
,
265 size_t size
, ssize_t
*result
)
267 struct posix_acl
*acl
;
268 char *p
= data
+ *result
;
270 acl
= get_acl(inode
, type
);
271 if (IS_ERR_OR_NULL(acl
))
274 posix_acl_release(acl
);
276 *result
+= strlen(name
);
288 nfs3_listxattr(struct dentry
*dentry
, char *data
, size_t size
)
290 struct inode
*inode
= d_inode(dentry
);
294 error
= nfs3_list_one_acl(inode
, ACL_TYPE_ACCESS
,
295 POSIX_ACL_XATTR_ACCESS
, data
, size
, &result
);
299 error
= nfs3_list_one_acl(inode
, ACL_TYPE_DEFAULT
,
300 POSIX_ACL_XATTR_DEFAULT
, data
, size
, &result
);