@@ -49,10 +49,6 @@ struct posix_acl *gfs2_get_acl(struct inode *inode, int type)
49
49
if (!ip -> i_eattr )
50
50
return NULL ;
51
51
52
- acl = get_cached_acl (& ip -> i_inode , type );
53
- if (acl != ACL_NOT_CACHED )
54
- return acl ;
55
-
56
52
name = gfs2_acl_name (type );
57
53
if (name == NULL )
58
54
return ERR_PTR (- EINVAL );
@@ -80,227 +76,57 @@ static int gfs2_set_mode(struct inode *inode, umode_t mode)
80
76
return error ;
81
77
}
82
78
83
- static int gfs2_acl_set (struct inode * inode , int type , struct posix_acl * acl )
79
+ int gfs2_set_acl (struct inode * inode , struct posix_acl * acl , int type )
84
80
{
85
81
int error ;
86
82
int len ;
87
83
char * data ;
88
84
const char * name = gfs2_acl_name (type );
89
85
90
86
BUG_ON (name == NULL );
91
- len = posix_acl_to_xattr (& init_user_ns , acl , NULL , 0 );
92
- if (len == 0 )
93
- return 0 ;
94
- data = kmalloc (len , GFP_NOFS );
95
- if (data == NULL )
96
- return - ENOMEM ;
97
- error = posix_acl_to_xattr (& init_user_ns , acl , data , len );
98
- if (error < 0 )
99
- goto out ;
100
- error = __gfs2_xattr_set (inode , name , data , len , 0 , GFS2_EATYPE_SYS );
101
- if (!error )
102
- set_cached_acl (inode , type , acl );
103
- out :
104
- kfree (data );
105
- return error ;
106
- }
107
-
108
- int gfs2_acl_create (struct gfs2_inode * dip , struct inode * inode )
109
- {
110
- struct gfs2_sbd * sdp = GFS2_SB (& dip -> i_inode );
111
- struct posix_acl * acl ;
112
- umode_t mode = inode -> i_mode ;
113
- int error = 0 ;
114
-
115
- if (!sdp -> sd_args .ar_posix_acl )
116
- return 0 ;
117
- if (S_ISLNK (inode -> i_mode ))
118
- return 0 ;
119
-
120
- acl = gfs2_get_acl (& dip -> i_inode , ACL_TYPE_DEFAULT );
121
- if (IS_ERR (acl ))
122
- return PTR_ERR (acl );
123
- if (!acl ) {
124
- mode &= ~current_umask ();
125
- return gfs2_set_mode (inode , mode );
126
- }
127
-
128
- if (S_ISDIR (inode -> i_mode )) {
129
- error = gfs2_acl_set (inode , ACL_TYPE_DEFAULT , acl );
130
- if (error )
131
- goto out ;
132
- }
133
-
134
- error = __posix_acl_create (& acl , GFP_NOFS , & mode );
135
- if (error < 0 )
136
- return error ;
137
87
138
- if (error == 0 )
139
- goto munge ;
140
-
141
- error = gfs2_acl_set (inode , ACL_TYPE_ACCESS , acl );
142
- if (error )
143
- goto out ;
144
- munge :
145
- error = gfs2_set_mode (inode , mode );
146
- out :
147
- posix_acl_release (acl );
148
- return error ;
149
- }
150
-
151
- int gfs2_acl_chmod (struct gfs2_inode * ip , struct iattr * attr )
152
- {
153
- struct inode * inode = & ip -> i_inode ;
154
- struct posix_acl * acl ;
155
- char * data ;
156
- unsigned int len ;
157
- int error ;
158
-
159
- acl = gfs2_get_acl (& ip -> i_inode , ACL_TYPE_ACCESS );
160
- if (IS_ERR (acl ))
161
- return PTR_ERR (acl );
162
- if (!acl )
163
- return gfs2_setattr_simple (inode , attr );
164
-
165
- error = __posix_acl_chmod (& acl , GFP_NOFS , attr -> ia_mode );
166
- if (error )
167
- return error ;
168
-
169
- len = posix_acl_to_xattr (& init_user_ns , acl , NULL , 0 );
170
- data = kmalloc (len , GFP_NOFS );
171
- error = - ENOMEM ;
172
- if (data == NULL )
173
- goto out ;
174
- posix_acl_to_xattr (& init_user_ns , acl , data , len );
175
- error = gfs2_xattr_acl_chmod (ip , attr , data );
176
- kfree (data );
177
- set_cached_acl (& ip -> i_inode , ACL_TYPE_ACCESS , acl );
178
-
179
- out :
180
- posix_acl_release (acl );
181
- return error ;
182
- }
183
-
184
- static int gfs2_acl_type (const char * name )
185
- {
186
- if (strcmp (name , GFS2_POSIX_ACL_ACCESS ) == 0 )
187
- return ACL_TYPE_ACCESS ;
188
- if (strcmp (name , GFS2_POSIX_ACL_DEFAULT ) == 0 )
189
- return ACL_TYPE_DEFAULT ;
190
- return - EINVAL ;
191
- }
192
-
193
- static int gfs2_xattr_system_get (struct dentry * dentry , const char * name ,
194
- void * buffer , size_t size , int xtype )
195
- {
196
- struct inode * inode = dentry -> d_inode ;
197
- struct gfs2_sbd * sdp = GFS2_SB (inode );
198
- struct posix_acl * acl ;
199
- int type ;
200
- int error ;
201
-
202
- if (!sdp -> sd_args .ar_posix_acl )
203
- return - EOPNOTSUPP ;
204
-
205
- type = gfs2_acl_type (name );
206
- if (type < 0 )
207
- return type ;
208
-
209
- acl = gfs2_get_acl (inode , type );
210
- if (IS_ERR (acl ))
211
- return PTR_ERR (acl );
212
- if (acl == NULL )
213
- return - ENODATA ;
214
-
215
- error = posix_acl_to_xattr (& init_user_ns , acl , buffer , size );
216
- posix_acl_release (acl );
217
-
218
- return error ;
219
- }
220
-
221
- static int gfs2_xattr_system_set (struct dentry * dentry , const char * name ,
222
- const void * value , size_t size , int flags ,
223
- int xtype )
224
- {
225
- struct inode * inode = dentry -> d_inode ;
226
- struct gfs2_sbd * sdp = GFS2_SB (inode );
227
- struct posix_acl * acl = NULL ;
228
- int error = 0 , type ;
229
-
230
- if (!sdp -> sd_args .ar_posix_acl )
231
- return - EOPNOTSUPP ;
232
-
233
- type = gfs2_acl_type (name );
234
- if (type < 0 )
235
- return type ;
236
- if (flags & XATTR_CREATE )
237
- return - EINVAL ;
238
- if (type == ACL_TYPE_DEFAULT && !S_ISDIR (inode -> i_mode ))
239
- return value ? - EACCES : 0 ;
240
- if (!uid_eq (current_fsuid (), inode -> i_uid ) && !capable (CAP_FOWNER ))
241
- return - EPERM ;
242
- if (S_ISLNK (inode -> i_mode ))
243
- return - EOPNOTSUPP ;
244
-
245
- if (!value )
246
- goto set_acl ;
247
-
248
- acl = posix_acl_from_xattr (& init_user_ns , value , size );
249
- if (!acl ) {
250
- /*
251
- * acl_set_file(3) may request that we set default ACLs with
252
- * zero length -- defend (gracefully) against that here.
253
- */
254
- goto out ;
255
- }
256
- if (IS_ERR (acl )) {
257
- error = PTR_ERR (acl );
258
- goto out ;
259
- }
260
-
261
- error = posix_acl_valid (acl );
262
- if (error )
263
- goto out_release ;
264
-
265
- error = - EINVAL ;
266
88
if (acl -> a_count > GFS2_ACL_MAX_ENTRIES )
267
- goto out_release ;
89
+ return - EINVAL ;
268
90
269
91
if (type == ACL_TYPE_ACCESS ) {
270
92
umode_t mode = inode -> i_mode ;
93
+
271
94
error = posix_acl_equiv_mode (acl , & mode );
95
+ if (error < 0 )
96
+ return error ;
272
97
273
- if (error <= 0 ) {
274
- posix_acl_release (acl );
98
+ if (error == 0 )
275
99
acl = NULL ;
276
100
277
- if (error < 0 )
278
- return error ;
279
- }
280
-
281
101
error = gfs2_set_mode (inode , mode );
282
102
if (error )
283
- goto out_release ;
103
+ return error ;
284
104
}
285
105
286
- set_acl :
287
- error = __gfs2_xattr_set (inode , name , value , size , 0 , GFS2_EATYPE_SYS );
288
- if (!error ) {
289
- if (acl )
290
- set_cached_acl (inode , type , acl );
291
- else
292
- forget_cached_acl (inode , type );
106
+ if (acl ) {
107
+ len = posix_acl_to_xattr (& init_user_ns , acl , NULL , 0 );
108
+ if (len == 0 )
109
+ return 0 ;
110
+ data = kmalloc (len , GFP_NOFS );
111
+ if (data == NULL )
112
+ return - ENOMEM ;
113
+ error = posix_acl_to_xattr (& init_user_ns , acl , data , len );
114
+ if (error < 0 )
115
+ goto out ;
116
+ } else {
117
+ data = NULL ;
118
+ len = 0 ;
293
119
}
294
- out_release :
295
- posix_acl_release (acl );
120
+
121
+ error = __gfs2_xattr_set (inode , name , data , len , 0 , GFS2_EATYPE_SYS );
122
+ if (error )
123
+ goto out ;
124
+
125
+ if (acl )
126
+ set_cached_acl (inode , type , acl );
127
+ else
128
+ forget_cached_acl (inode , type );
296
129
out :
130
+ kfree (data );
297
131
return error ;
298
132
}
299
-
300
- const struct xattr_handler gfs2_xattr_system_handler = {
301
- .prefix = XATTR_SYSTEM_PREFIX ,
302
- .flags = GFS2_EATYPE_SYS ,
303
- .get = gfs2_xattr_system_get ,
304
- .set = gfs2_xattr_system_set ,
305
- };
306
-
0 commit comments