@@ -90,7 +90,8 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type, bool rcu)
9090int ceph_set_acl (struct mnt_idmap * idmap , struct dentry * dentry ,
9191 struct posix_acl * acl , int type )
9292{
93- int ret = 0 , size = 0 ;
93+ int ret = 0 ;
94+ size_t size = 0 ;
9495 const char * name = NULL ;
9596 char * value = NULL ;
9697 struct iattr newattrs ;
@@ -126,16 +127,11 @@ int ceph_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
126127 }
127128
128129 if (acl ) {
129- size = posix_acl_xattr_size (acl -> a_count );
130- value = kmalloc (size , GFP_NOFS );
130+ value = posix_acl_to_xattr (& init_user_ns , acl , & size , GFP_NOFS );
131131 if (!value ) {
132132 ret = - ENOMEM ;
133133 goto out ;
134134 }
135-
136- ret = posix_acl_to_xattr (& init_user_ns , acl , value , size );
137- if (ret < 0 )
138- goto out_free ;
139135 }
140136
141137 if (new_mode != old_mode ) {
@@ -172,7 +168,7 @@ int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
172168 struct posix_acl * acl , * default_acl ;
173169 size_t val_size1 = 0 , val_size2 = 0 ;
174170 struct ceph_pagelist * pagelist = NULL ;
175- void * tmp_buf = NULL ;
171+ void * tmp_buf1 = NULL , * tmp_buf2 = NULL ;
176172 int err ;
177173
178174 err = posix_acl_create (dir , mode , & default_acl , & acl );
@@ -192,15 +188,7 @@ int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
192188 if (!default_acl && !acl )
193189 return 0 ;
194190
195- if (acl )
196- val_size1 = posix_acl_xattr_size (acl -> a_count );
197- if (default_acl )
198- val_size2 = posix_acl_xattr_size (default_acl -> a_count );
199-
200191 err = - ENOMEM ;
201- tmp_buf = kmalloc (max (val_size1 , val_size2 ), GFP_KERNEL );
202- if (!tmp_buf )
203- goto out_err ;
204192 pagelist = ceph_pagelist_alloc (GFP_KERNEL );
205193 if (!pagelist )
206194 goto out_err ;
@@ -213,34 +201,39 @@ int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
213201
214202 if (acl ) {
215203 size_t len = strlen (XATTR_NAME_POSIX_ACL_ACCESS );
204+
205+ err = - ENOMEM ;
206+ tmp_buf1 = posix_acl_to_xattr (& init_user_ns , acl ,
207+ & val_size1 , GFP_KERNEL );
208+ if (!tmp_buf1 )
209+ goto out_err ;
216210 err = ceph_pagelist_reserve (pagelist , len + val_size1 + 8 );
217211 if (err )
218212 goto out_err ;
219213 ceph_pagelist_encode_string (pagelist , XATTR_NAME_POSIX_ACL_ACCESS ,
220214 len );
221- err = posix_acl_to_xattr (& init_user_ns , acl ,
222- tmp_buf , val_size1 );
223- if (err < 0 )
224- goto out_err ;
225215 ceph_pagelist_encode_32 (pagelist , val_size1 );
226- ceph_pagelist_append (pagelist , tmp_buf , val_size1 );
216+ ceph_pagelist_append (pagelist , tmp_buf1 , val_size1 );
227217 }
228218 if (default_acl ) {
229219 size_t len = strlen (XATTR_NAME_POSIX_ACL_DEFAULT );
220+
221+ err = - ENOMEM ;
222+ tmp_buf2 = posix_acl_to_xattr (& init_user_ns , default_acl ,
223+ & val_size2 , GFP_KERNEL );
224+ if (!tmp_buf2 )
225+ goto out_err ;
230226 err = ceph_pagelist_reserve (pagelist , len + val_size2 + 8 );
231227 if (err )
232228 goto out_err ;
233229 ceph_pagelist_encode_string (pagelist ,
234230 XATTR_NAME_POSIX_ACL_DEFAULT , len );
235- err = posix_acl_to_xattr (& init_user_ns , default_acl ,
236- tmp_buf , val_size2 );
237- if (err < 0 )
238- goto out_err ;
239231 ceph_pagelist_encode_32 (pagelist , val_size2 );
240- ceph_pagelist_append (pagelist , tmp_buf , val_size2 );
232+ ceph_pagelist_append (pagelist , tmp_buf2 , val_size2 );
241233 }
242234
243- kfree (tmp_buf );
235+ kfree (tmp_buf1 );
236+ kfree (tmp_buf2 );
244237
245238 as_ctx -> acl = acl ;
246239 as_ctx -> default_acl = default_acl ;
@@ -250,7 +243,8 @@ int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
250243out_err :
251244 posix_acl_release (acl );
252245 posix_acl_release (default_acl );
253- kfree (tmp_buf );
246+ kfree (tmp_buf1 );
247+ kfree (tmp_buf2 );
254248 if (pagelist )
255249 ceph_pagelist_release (pagelist );
256250 return err ;
0 commit comments