4 #include <linux/nfs3.h>
5 #include <linux/nfs_fs.h>
6 #include <linux/posix_acl_xattr.h>
7 #include <linux/nfsacl.h>
11 #define NFSDBG_FACILITY NFSDBG_PROC
13 struct posix_acl
*nfs3_get_acl(struct inode
*inode
, int type
)
15 struct nfs_server
*server
= NFS_SERVER(inode
);
16 struct page
*pages
[NFSACL_MAXPAGES
] = { };
17 struct nfs3_getaclargs args
= {
19 /* The xdr layer may allocate pages here. */
22 struct nfs3_getaclres res
= {
25 struct rpc_message msg
= {
31 if (!nfs_server_capable(inode
, NFS_CAP_ACLS
))
32 return ERR_PTR(-EOPNOTSUPP
);
34 status
= nfs_revalidate_inode(server
, inode
);
36 return ERR_PTR(status
);
39 * Only get the access acl when explicitly requested: We don't
40 * need it for access decisions, and only some applications use
41 * it. Applications which request the access acl first are not
42 * penalized from this optimization.
44 if (type
== ACL_TYPE_ACCESS
)
45 args
.mask
|= NFS_ACLCNT
|NFS_ACL
;
46 if (S_ISDIR(inode
->i_mode
))
47 args
.mask
|= NFS_DFACLCNT
|NFS_DFACL
;
51 dprintk("NFS call getacl\n");
52 msg
.rpc_proc
= &server
->client_acl
->cl_procinfo
[ACLPROC3_GETACL
];
53 res
.fattr
= nfs_alloc_fattr();
54 if (res
.fattr
== NULL
)
55 return ERR_PTR(-ENOMEM
);
57 status
= rpc_call_sync(server
->client_acl
, &msg
, 0);
58 dprintk("NFS reply getacl: %d\n", status
);
60 /* pages may have been allocated at the xdr layer. */
61 for (count
= 0; count
< NFSACL_MAXPAGES
&& args
.pages
[count
]; count
++)
62 __free_page(args
.pages
[count
]);
66 status
= nfs_refresh_inode(inode
, res
.fattr
);
69 case -EPROTONOSUPPORT
:
70 dprintk("NFS_V3_ACL extension not supported; disabling\n");
71 server
->caps
&= ~NFS_CAP_ACLS
;
77 if ((args
.mask
& res
.mask
) != args
.mask
) {
82 if (res
.acl_access
!= NULL
) {
83 if ((posix_acl_equiv_mode(res
.acl_access
, NULL
) == 0) ||
84 res
.acl_access
->a_count
== 0) {
85 posix_acl_release(res
.acl_access
);
86 res
.acl_access
= NULL
;
90 if (res
.mask
& NFS_ACL
)
91 set_cached_acl(inode
, ACL_TYPE_ACCESS
, res
.acl_access
);
93 forget_cached_acl(inode
, ACL_TYPE_ACCESS
);
95 if (res
.mask
& NFS_DFACL
)
96 set_cached_acl(inode
, ACL_TYPE_DEFAULT
, res
.acl_default
);
98 forget_cached_acl(inode
, ACL_TYPE_DEFAULT
);
100 nfs_free_fattr(res
.fattr
);
101 if (type
== ACL_TYPE_ACCESS
) {
102 posix_acl_release(res
.acl_default
);
103 return res
.acl_access
;
105 posix_acl_release(res
.acl_access
);
106 return res
.acl_default
;
110 posix_acl_release(res
.acl_access
);
111 posix_acl_release(res
.acl_default
);
112 nfs_free_fattr(res
.fattr
);
113 return ERR_PTR(status
);
116 static int __nfs3_proc_setacls(struct inode
*inode
, struct posix_acl
*acl
,
117 struct posix_acl
*dfacl
)
119 struct nfs_server
*server
= NFS_SERVER(inode
);
120 struct nfs_fattr
*fattr
;
121 struct page
*pages
[NFSACL_MAXPAGES
];
122 struct nfs3_setaclargs args
= {
128 struct rpc_message msg
= {
134 status
= -EOPNOTSUPP
;
135 if (!nfs_server_capable(inode
, NFS_CAP_ACLS
))
138 /* We are doing this here because XDR marshalling does not
139 * return any results, it BUGs. */
141 if (acl
!= NULL
&& acl
->a_count
> NFS_ACL_MAX_ENTRIES
)
143 if (dfacl
!= NULL
&& dfacl
->a_count
> NFS_ACL_MAX_ENTRIES
)
145 if (S_ISDIR(inode
->i_mode
)) {
146 args
.mask
|= NFS_DFACL
;
147 args
.acl_default
= dfacl
;
148 args
.len
= nfsacl_size(acl
, dfacl
);
150 args
.len
= nfsacl_size(acl
, NULL
);
152 if (args
.len
> NFS_ACL_INLINE_BUFSIZE
) {
153 unsigned int npages
= 1 + ((args
.len
- 1) >> PAGE_SHIFT
);
157 args
.pages
[args
.npages
] = alloc_page(GFP_KERNEL
);
158 if (args
.pages
[args
.npages
] == NULL
)
161 } while (args
.npages
< npages
);
164 dprintk("NFS call setacl\n");
166 fattr
= nfs_alloc_fattr();
170 msg
.rpc_proc
= &server
->client_acl
->cl_procinfo
[ACLPROC3_SETACL
];
171 msg
.rpc_resp
= fattr
;
172 status
= rpc_call_sync(server
->client_acl
, &msg
, 0);
173 nfs_access_zap_cache(inode
);
174 nfs_zap_acl_cache(inode
);
175 dprintk("NFS reply setacl: %d\n", status
);
179 status
= nfs_refresh_inode(inode
, fattr
);
180 set_cached_acl(inode
, ACL_TYPE_ACCESS
, acl
);
181 set_cached_acl(inode
, ACL_TYPE_DEFAULT
, dfacl
);
184 case -EPROTONOSUPPORT
:
185 dprintk("NFS_V3_ACL SETACL RPC not supported"
186 "(will not retry)\n");
187 server
->caps
&= ~NFS_CAP_ACLS
;
189 status
= -EOPNOTSUPP
;
191 nfs_free_fattr(fattr
);
193 while (args
.npages
!= 0) {
195 __free_page(args
.pages
[args
.npages
]);
201 int nfs3_proc_setacls(struct inode
*inode
, struct posix_acl
*acl
,
202 struct posix_acl
*dfacl
)
205 ret
= __nfs3_proc_setacls(inode
, acl
, dfacl
);
206 return (ret
== -EOPNOTSUPP
) ? 0 : ret
;
210 int nfs3_set_acl(struct inode
*inode
, struct posix_acl
*acl
, int type
)
212 struct posix_acl
*alloc
= NULL
, *dfacl
= NULL
;
215 if (S_ISDIR(inode
->i_mode
)) {
217 case ACL_TYPE_ACCESS
:
218 alloc
= dfacl
= get_acl(inode
, ACL_TYPE_DEFAULT
);
223 case ACL_TYPE_DEFAULT
:
225 alloc
= acl
= get_acl(inode
, ACL_TYPE_ACCESS
);
233 alloc
= acl
= posix_acl_from_mode(inode
->i_mode
, GFP_KERNEL
);
237 status
= __nfs3_proc_setacls(inode
, acl
, dfacl
);
238 posix_acl_release(alloc
);
242 return PTR_ERR(alloc
);
245 const struct xattr_handler
*nfs3_xattr_handlers
[] = {
246 &posix_acl_access_xattr_handler
,
247 &posix_acl_default_xattr_handler
,
252 nfs3_list_one_acl(struct inode
*inode
, int type
, const char *name
, void *data
,
253 size_t size
, ssize_t
*result
)
255 struct posix_acl
*acl
;
256 char *p
= data
+ *result
;
258 acl
= get_acl(inode
, type
);
259 if (IS_ERR_OR_NULL(acl
))
262 posix_acl_release(acl
);
264 *result
+= strlen(name
);
276 nfs3_listxattr(struct dentry
*dentry
, char *data
, size_t size
)
278 struct inode
*inode
= dentry
->d_inode
;
282 error
= nfs3_list_one_acl(inode
, ACL_TYPE_ACCESS
,
283 POSIX_ACL_XATTR_ACCESS
, data
, size
, &result
);
287 error
= nfs3_list_one_acl(inode
, ACL_TYPE_DEFAULT
,
288 POSIX_ACL_XATTR_DEFAULT
, data
, size
, &result
);