]>
Commit | Line | Data |
---|---|---|
4d1e5b62 AF |
1 | From: Tony Jones <tonyj@suse.de> |
2 | Subject: Add a struct vfsmount parameter to vfs_getxattr() | |
3 | ||
4 | The vfsmount will be passed down to the LSM hook so that LSMs can compute | |
5 | pathnames. | |
6 | ||
7 | Signed-off-by: Tony Jones <tonyj@suse.de> | |
8 | Signed-off-by: Andreas Gruenbacher <agruen@suse.de> | |
9 | Signed-off-by: John Johansen <jjohansen@suse.de> | |
10 | ||
11 | --- | |
12 | fs/nfsd/nfs4xdr.c | 2 +- | |
13 | fs/nfsd/vfs.c | 21 ++++++++++++--------- | |
14 | fs/xattr.c | 15 ++++++++------- | |
15 | include/linux/nfsd/nfsd.h | 3 ++- | |
16 | include/linux/xattr.h | 2 +- | |
17 | 5 files changed, 24 insertions(+), 19 deletions(-) | |
18 | ||
19 | --- a/fs/nfsd/nfs4xdr.c | |
20 | +++ b/fs/nfsd/nfs4xdr.c | |
21 | @@ -1446,7 +1446,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s | |
22 | } | |
23 | if (bmval0 & (FATTR4_WORD0_ACL | FATTR4_WORD0_ACLSUPPORT | |
24 | | FATTR4_WORD0_SUPPORTED_ATTRS)) { | |
25 | - err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl); | |
26 | + err = nfsd4_get_nfs4_acl(rqstp, dentry, exp->ex_path.mnt, &acl); | |
27 | aclsupport = (err == 0); | |
28 | if (bmval0 & FATTR4_WORD0_ACL) { | |
29 | if (err == -EOPNOTSUPP) | |
30 | --- a/fs/nfsd/vfs.c | |
31 | +++ b/fs/nfsd/vfs.c | |
32 | @@ -420,11 +420,12 @@ out_nfserr: | |
33 | #if defined(CONFIG_NFSD_V2_ACL) || \ | |
34 | defined(CONFIG_NFSD_V3_ACL) || \ | |
35 | defined(CONFIG_NFSD_V4) | |
36 | -static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf) | |
37 | +static ssize_t nfsd_getxattr(struct dentry *dentry, struct vfsmount *mnt, | |
38 | + char *key, void **buf) | |
39 | { | |
40 | ssize_t buflen; | |
41 | ||
42 | - buflen = vfs_getxattr(dentry, key, NULL, 0); | |
43 | + buflen = vfs_getxattr(dentry, mnt, key, NULL, 0); | |
44 | if (buflen <= 0) | |
45 | return buflen; | |
46 | ||
47 | @@ -432,7 +433,7 @@ static ssize_t nfsd_getxattr(struct dent | |
48 | if (!*buf) | |
49 | return -ENOMEM; | |
50 | ||
51 | - return vfs_getxattr(dentry, key, *buf, buflen); | |
52 | + return vfs_getxattr(dentry, mnt, key, *buf, buflen); | |
53 | } | |
54 | #endif | |
55 | ||
56 | @@ -513,13 +514,13 @@ out_nfserr: | |
57 | } | |
58 | ||
59 | static struct posix_acl * | |
60 | -_get_posix_acl(struct dentry *dentry, char *key) | |
61 | +_get_posix_acl(struct dentry *dentry, struct vfsmount *mnt, char *key) | |
62 | { | |
63 | void *buf = NULL; | |
64 | struct posix_acl *pacl = NULL; | |
65 | int buflen; | |
66 | ||
67 | - buflen = nfsd_getxattr(dentry, key, &buf); | |
68 | + buflen = nfsd_getxattr(dentry, mnt, key, &buf); | |
69 | if (!buflen) | |
70 | buflen = -ENODATA; | |
71 | if (buflen <= 0) | |
72 | @@ -531,14 +532,15 @@ _get_posix_acl(struct dentry *dentry, ch | |
73 | } | |
74 | ||
75 | int | |
76 | -nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_acl **acl) | |
77 | +nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, | |
78 | + struct vfsmount *mnt, struct nfs4_acl **acl) | |
79 | { | |
80 | struct inode *inode = dentry->d_inode; | |
81 | int error = 0; | |
82 | struct posix_acl *pacl = NULL, *dpacl = NULL; | |
83 | unsigned int flags = 0; | |
84 | ||
85 | - pacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_ACCESS); | |
86 | + pacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_ACCESS); | |
87 | if (IS_ERR(pacl) && PTR_ERR(pacl) == -ENODATA) | |
88 | pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL); | |
89 | if (IS_ERR(pacl)) { | |
90 | @@ -548,7 +550,7 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqst | |
91 | } | |
92 | ||
93 | if (S_ISDIR(inode->i_mode)) { | |
94 | - dpacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_DEFAULT); | |
95 | + dpacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_DEFAULT); | |
96 | if (IS_ERR(dpacl) && PTR_ERR(dpacl) == -ENODATA) | |
97 | dpacl = NULL; | |
98 | else if (IS_ERR(dpacl)) { | |
99 | @@ -2080,7 +2082,8 @@ nfsd_get_posix_acl(struct svc_fh *fhp, i | |
100 | return ERR_PTR(-EOPNOTSUPP); | |
101 | } | |
102 | ||
103 | - size = nfsd_getxattr(fhp->fh_dentry, name, &value); | |
104 | + size = nfsd_getxattr(fhp->fh_dentry, fhp->fh_export->ex_path.mnt, name, | |
105 | + &value); | |
106 | if (size < 0) | |
107 | return ERR_PTR(size); | |
108 | ||
109 | --- a/fs/xattr.c | |
110 | +++ b/fs/xattr.c | |
111 | @@ -131,7 +131,8 @@ out_noalloc: | |
112 | EXPORT_SYMBOL_GPL(xattr_getsecurity); | |
113 | ||
114 | ssize_t | |
115 | -vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) | |
116 | +vfs_getxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name, | |
117 | + void *value, size_t size) | |
118 | { | |
119 | struct inode *inode = dentry->d_inode; | |
120 | int error; | |
121 | @@ -314,8 +315,8 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, cons | |
122 | * Extended attribute GET operations | |
123 | */ | |
124 | static ssize_t | |
125 | -getxattr(struct dentry *d, const char __user *name, void __user *value, | |
126 | - size_t size) | |
127 | +getxattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name, | |
128 | + void __user *value, size_t size) | |
129 | { | |
130 | ssize_t error; | |
131 | void *kvalue = NULL; | |
132 | @@ -335,7 +336,7 @@ getxattr(struct dentry *d, const char __ | |
133 | return -ENOMEM; | |
134 | } | |
135 | ||
136 | - error = vfs_getxattr(d, kname, kvalue, size); | |
137 | + error = vfs_getxattr(dentry, mnt, kname, kvalue, size); | |
138 | if (error > 0) { | |
139 | if (size && copy_to_user(value, kvalue, error)) | |
140 | error = -EFAULT; | |
141 | @@ -357,7 +358,7 @@ SYSCALL_DEFINE4(getxattr, const char __u | |
142 | error = user_path(pathname, &path); | |
143 | if (error) | |
144 | return error; | |
145 | - error = getxattr(path.dentry, name, value, size); | |
146 | + error = getxattr(path.dentry, path.mnt, name, value, size); | |
147 | path_put(&path); | |
148 | return error; | |
149 | } | |
150 | @@ -371,7 +372,7 @@ SYSCALL_DEFINE4(lgetxattr, const char __ | |
151 | error = user_lpath(pathname, &path); | |
152 | if (error) | |
153 | return error; | |
154 | - error = getxattr(path.dentry, name, value, size); | |
155 | + error = getxattr(path.dentry, path.mnt, name, value, size); | |
156 | path_put(&path); | |
157 | return error; | |
158 | } | |
159 | @@ -386,7 +387,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, cons | |
160 | if (!f) | |
161 | return error; | |
162 | audit_inode(NULL, f->f_path.dentry); | |
163 | - error = getxattr(f->f_path.dentry, name, value, size); | |
164 | + error = getxattr(f->f_path.dentry, f->f_path.mnt, name, value, size); | |
165 | fput(f); | |
166 | return error; | |
167 | } | |
168 | --- a/include/linux/nfsd/nfsd.h | |
169 | +++ b/include/linux/nfsd/nfsd.h | |
170 | @@ -85,7 +85,8 @@ __be32 nfsd_setattr(struct svc_rqst *, | |
171 | #ifdef CONFIG_NFSD_V4 | |
172 | __be32 nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *, | |
173 | struct nfs4_acl *); | |
174 | -int nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **); | |
175 | +int nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, | |
176 | + struct vfsmount *mnt, struct nfs4_acl **); | |
177 | #endif /* CONFIG_NFSD_V4 */ | |
178 | __be32 nfsd_create(struct svc_rqst *, struct svc_fh *, | |
179 | char *name, int len, struct iattr *attrs, | |
180 | --- a/include/linux/xattr.h | |
181 | +++ b/include/linux/xattr.h | |
182 | @@ -48,7 +48,7 @@ struct xattr_handler { | |
183 | }; | |
184 | ||
185 | ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t); | |
186 | -ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); | |
187 | +ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t); | |
188 | ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); | |
189 | int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int); | |
190 | int vfs_removexattr(struct dentry *, const char *); |