diff options
| -rw-r--r-- | fs/9p/acl.c | 13 | ||||
| -rw-r--r-- | fs/btrfs/acl.c | 16 | ||||
| -rw-r--r-- | fs/ext2/acl.c | 13 | ||||
| -rw-r--r-- | fs/ext3/acl.c | 43 | ||||
| -rw-r--r-- | fs/ext4/acl.c | 44 | ||||
| -rw-r--r-- | fs/generic_acl.c | 13 | ||||
| -rw-r--r-- | fs/gfs2/acl.c | 30 | ||||
| -rw-r--r-- | fs/jffs2/acl.c | 13 | ||||
| -rw-r--r-- | fs/jfs/acl.c | 31 | ||||
| -rw-r--r-- | fs/ocfs2/acl.c | 15 | ||||
| -rw-r--r-- | fs/posix_acl.c | 18 | ||||
| -rw-r--r-- | fs/reiserfs/xattr_acl.c | 41 | ||||
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_acl.c | 16 | ||||
| -rw-r--r-- | include/linux/posix_acl.h | 1 |
14 files changed, 139 insertions, 168 deletions
diff --git a/fs/9p/acl.c b/fs/9p/acl.c index df4d7a171d7f..d7211e28c0d1 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c | |||
| @@ -162,21 +162,18 @@ err_free_out: | |||
| 162 | int v9fs_acl_chmod(struct dentry *dentry) | 162 | int v9fs_acl_chmod(struct dentry *dentry) |
| 163 | { | 163 | { |
| 164 | int retval = 0; | 164 | int retval = 0; |
| 165 | struct posix_acl *acl, *clone; | 165 | struct posix_acl *acl; |
| 166 | struct inode *inode = dentry->d_inode; | 166 | struct inode *inode = dentry->d_inode; |
| 167 | 167 | ||
| 168 | if (S_ISLNK(inode->i_mode)) | 168 | if (S_ISLNK(inode->i_mode)) |
| 169 | return -EOPNOTSUPP; | 169 | return -EOPNOTSUPP; |
| 170 | acl = v9fs_get_cached_acl(inode, ACL_TYPE_ACCESS); | 170 | acl = v9fs_get_cached_acl(inode, ACL_TYPE_ACCESS); |
| 171 | if (acl) { | 171 | if (acl) { |
| 172 | clone = posix_acl_clone(acl, GFP_KERNEL); | 172 | retval = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 173 | if (retval) | ||
| 174 | return retval; | ||
| 175 | retval = v9fs_set_acl(dentry, ACL_TYPE_ACCESS, acl); | ||
| 173 | posix_acl_release(acl); | 176 | posix_acl_release(acl); |
| 174 | if (!clone) | ||
| 175 | return -ENOMEM; | ||
| 176 | retval = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 177 | if (!retval) | ||
| 178 | retval = v9fs_set_acl(dentry, ACL_TYPE_ACCESS, clone); | ||
| 179 | posix_acl_release(clone); | ||
| 180 | } | 177 | } |
| 181 | return retval; | 178 | return retval; |
| 182 | } | 179 | } |
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index c13ea9fbf36b..88bca53b302a 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -272,7 +272,7 @@ failed: | |||
| 272 | 272 | ||
| 273 | int btrfs_acl_chmod(struct inode *inode) | 273 | int btrfs_acl_chmod(struct inode *inode) |
| 274 | { | 274 | { |
| 275 | struct posix_acl *acl, *clone; | 275 | struct posix_acl *acl; |
| 276 | int ret = 0; | 276 | int ret = 0; |
| 277 | 277 | ||
| 278 | if (S_ISLNK(inode->i_mode)) | 278 | if (S_ISLNK(inode->i_mode)) |
| @@ -285,17 +285,11 @@ int btrfs_acl_chmod(struct inode *inode) | |||
| 285 | if (IS_ERR_OR_NULL(acl)) | 285 | if (IS_ERR_OR_NULL(acl)) |
| 286 | return PTR_ERR(acl); | 286 | return PTR_ERR(acl); |
| 287 | 287 | ||
| 288 | clone = posix_acl_clone(acl, GFP_KERNEL); | 288 | ret = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 289 | if (ret) | ||
| 290 | return ret; | ||
| 291 | ret = btrfs_set_acl(NULL, inode, acl, ACL_TYPE_ACCESS); | ||
| 289 | posix_acl_release(acl); | 292 | posix_acl_release(acl); |
| 290 | if (!clone) | ||
| 291 | return -ENOMEM; | ||
| 292 | |||
| 293 | ret = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 294 | if (!ret) | ||
| 295 | ret = btrfs_set_acl(NULL, inode, clone, ACL_TYPE_ACCESS); | ||
| 296 | |||
| 297 | posix_acl_release(clone); | ||
| 298 | |||
| 299 | return ret; | 293 | return ret; |
| 300 | } | 294 | } |
| 301 | 295 | ||
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index ced1c478ebdb..1226dbcc66f5 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c | |||
| @@ -316,7 +316,7 @@ cleanup: | |||
| 316 | int | 316 | int |
| 317 | ext2_acl_chmod(struct inode *inode) | 317 | ext2_acl_chmod(struct inode *inode) |
| 318 | { | 318 | { |
| 319 | struct posix_acl *acl, *clone; | 319 | struct posix_acl *acl; |
| 320 | int error; | 320 | int error; |
| 321 | 321 | ||
| 322 | if (!test_opt(inode->i_sb, POSIX_ACL)) | 322 | if (!test_opt(inode->i_sb, POSIX_ACL)) |
| @@ -326,14 +326,11 @@ ext2_acl_chmod(struct inode *inode) | |||
| 326 | acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); | 326 | acl = ext2_get_acl(inode, ACL_TYPE_ACCESS); |
| 327 | if (IS_ERR(acl) || !acl) | 327 | if (IS_ERR(acl) || !acl) |
| 328 | return PTR_ERR(acl); | 328 | return PTR_ERR(acl); |
| 329 | clone = posix_acl_clone(acl, GFP_KERNEL); | 329 | error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 330 | if (error) | ||
| 331 | return error; | ||
| 332 | error = ext2_set_acl(inode, ACL_TYPE_ACCESS, acl); | ||
| 330 | posix_acl_release(acl); | 333 | posix_acl_release(acl); |
| 331 | if (!clone) | ||
| 332 | return -ENOMEM; | ||
| 333 | error = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 334 | if (!error) | ||
| 335 | error = ext2_set_acl(inode, ACL_TYPE_ACCESS, clone); | ||
| 336 | posix_acl_release(clone); | ||
| 337 | return error; | 334 | return error; |
| 338 | } | 335 | } |
| 339 | 336 | ||
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c index 5326038e8536..7ea638acaecf 100644 --- a/fs/ext3/acl.c +++ b/fs/ext3/acl.c | |||
| @@ -326,7 +326,9 @@ cleanup: | |||
| 326 | int | 326 | int |
| 327 | ext3_acl_chmod(struct inode *inode) | 327 | ext3_acl_chmod(struct inode *inode) |
| 328 | { | 328 | { |
| 329 | struct posix_acl *acl, *clone; | 329 | struct posix_acl *acl; |
| 330 | handle_t *handle; | ||
| 331 | int retries = 0; | ||
| 330 | int error; | 332 | int error; |
| 331 | 333 | ||
| 332 | if (S_ISLNK(inode->i_mode)) | 334 | if (S_ISLNK(inode->i_mode)) |
| @@ -336,31 +338,24 @@ ext3_acl_chmod(struct inode *inode) | |||
| 336 | acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); | 338 | acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); |
| 337 | if (IS_ERR(acl) || !acl) | 339 | if (IS_ERR(acl) || !acl) |
| 338 | return PTR_ERR(acl); | 340 | return PTR_ERR(acl); |
| 339 | clone = posix_acl_clone(acl, GFP_KERNEL); | 341 | error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 340 | posix_acl_release(acl); | 342 | if (error) |
| 341 | if (!clone) | 343 | return error; |
| 342 | return -ENOMEM; | 344 | retry: |
| 343 | error = posix_acl_chmod_masq(clone, inode->i_mode); | 345 | handle = ext3_journal_start(inode, |
| 344 | if (!error) { | 346 | EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); |
| 345 | handle_t *handle; | 347 | if (IS_ERR(handle)) { |
| 346 | int retries = 0; | 348 | error = PTR_ERR(handle); |
| 347 | 349 | ext3_std_error(inode->i_sb, error); | |
| 348 | retry: | 350 | goto out; |
| 349 | handle = ext3_journal_start(inode, | ||
| 350 | EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); | ||
| 351 | if (IS_ERR(handle)) { | ||
| 352 | error = PTR_ERR(handle); | ||
| 353 | ext3_std_error(inode->i_sb, error); | ||
| 354 | goto out; | ||
| 355 | } | ||
| 356 | error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, clone); | ||
| 357 | ext3_journal_stop(handle); | ||
| 358 | if (error == -ENOSPC && | ||
| 359 | ext3_should_retry_alloc(inode->i_sb, &retries)) | ||
| 360 | goto retry; | ||
| 361 | } | 351 | } |
| 352 | error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); | ||
| 353 | ext3_journal_stop(handle); | ||
| 354 | if (error == -ENOSPC && | ||
| 355 | ext3_should_retry_alloc(inode->i_sb, &retries)) | ||
| 356 | goto retry; | ||
| 362 | out: | 357 | out: |
| 363 | posix_acl_release(clone); | 358 | posix_acl_release(acl); |
| 364 | return error; | 359 | return error; |
| 365 | } | 360 | } |
| 366 | 361 | ||
diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c index 4cd9e2e4085e..e38a2047d246 100644 --- a/fs/ext4/acl.c +++ b/fs/ext4/acl.c | |||
| @@ -324,9 +324,12 @@ cleanup: | |||
| 324 | int | 324 | int |
| 325 | ext4_acl_chmod(struct inode *inode) | 325 | ext4_acl_chmod(struct inode *inode) |
| 326 | { | 326 | { |
| 327 | struct posix_acl *acl, *clone; | 327 | struct posix_acl *acl; |
| 328 | handle_t *handle; | ||
| 329 | int retries = 0; | ||
| 328 | int error; | 330 | int error; |
| 329 | 331 | ||
| 332 | |||
| 330 | if (S_ISLNK(inode->i_mode)) | 333 | if (S_ISLNK(inode->i_mode)) |
| 331 | return -EOPNOTSUPP; | 334 | return -EOPNOTSUPP; |
| 332 | if (!test_opt(inode->i_sb, POSIX_ACL)) | 335 | if (!test_opt(inode->i_sb, POSIX_ACL)) |
| @@ -334,31 +337,24 @@ ext4_acl_chmod(struct inode *inode) | |||
| 334 | acl = ext4_get_acl(inode, ACL_TYPE_ACCESS); | 337 | acl = ext4_get_acl(inode, ACL_TYPE_ACCESS); |
| 335 | if (IS_ERR(acl) || !acl) | 338 | if (IS_ERR(acl) || !acl) |
| 336 | return PTR_ERR(acl); | 339 | return PTR_ERR(acl); |
| 337 | clone = posix_acl_clone(acl, GFP_KERNEL); | 340 | error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 338 | posix_acl_release(acl); | 341 | if (error) |
| 339 | if (!clone) | 342 | return error; |
| 340 | return -ENOMEM; | 343 | retry: |
| 341 | error = posix_acl_chmod_masq(clone, inode->i_mode); | 344 | handle = ext4_journal_start(inode, |
| 342 | if (!error) { | 345 | EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); |
| 343 | handle_t *handle; | 346 | if (IS_ERR(handle)) { |
| 344 | int retries = 0; | 347 | error = PTR_ERR(handle); |
| 345 | 348 | ext4_std_error(inode->i_sb, error); | |
| 346 | retry: | 349 | goto out; |
| 347 | handle = ext4_journal_start(inode, | ||
| 348 | EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); | ||
| 349 | if (IS_ERR(handle)) { | ||
| 350 | error = PTR_ERR(handle); | ||
| 351 | ext4_std_error(inode->i_sb, error); | ||
| 352 | goto out; | ||
| 353 | } | ||
| 354 | error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, clone); | ||
| 355 | ext4_journal_stop(handle); | ||
| 356 | if (error == -ENOSPC && | ||
| 357 | ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
| 358 | goto retry; | ||
| 359 | } | 350 | } |
| 351 | error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); | ||
| 352 | ext4_journal_stop(handle); | ||
| 353 | if (error == -ENOSPC && | ||
| 354 | ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
| 355 | goto retry; | ||
| 360 | out: | 356 | out: |
| 361 | posix_acl_release(clone); | 357 | posix_acl_release(acl); |
| 362 | return error; | 358 | return error; |
| 363 | } | 359 | } |
| 364 | 360 | ||
diff --git a/fs/generic_acl.c b/fs/generic_acl.c index 4949473d3542..3a60d9d1653c 100644 --- a/fs/generic_acl.c +++ b/fs/generic_acl.c | |||
| @@ -170,21 +170,18 @@ cleanup: | |||
| 170 | int | 170 | int |
| 171 | generic_acl_chmod(struct inode *inode) | 171 | generic_acl_chmod(struct inode *inode) |
| 172 | { | 172 | { |
| 173 | struct posix_acl *acl, *clone; | 173 | struct posix_acl *acl; |
| 174 | int error = 0; | 174 | int error = 0; |
| 175 | 175 | ||
| 176 | if (S_ISLNK(inode->i_mode)) | 176 | if (S_ISLNK(inode->i_mode)) |
| 177 | return -EOPNOTSUPP; | 177 | return -EOPNOTSUPP; |
| 178 | acl = get_cached_acl(inode, ACL_TYPE_ACCESS); | 178 | acl = get_cached_acl(inode, ACL_TYPE_ACCESS); |
| 179 | if (acl) { | 179 | if (acl) { |
| 180 | clone = posix_acl_clone(acl, GFP_KERNEL); | 180 | error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 181 | if (error) | ||
| 182 | return error; | ||
| 183 | set_cached_acl(inode, ACL_TYPE_ACCESS, acl); | ||
| 181 | posix_acl_release(acl); | 184 | posix_acl_release(acl); |
| 182 | if (!clone) | ||
| 183 | return -ENOMEM; | ||
| 184 | error = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 185 | if (!error) | ||
| 186 | set_cached_acl(inode, ACL_TYPE_ACCESS, clone); | ||
| 187 | posix_acl_release(clone); | ||
| 188 | } | 185 | } |
| 189 | return error; | 186 | return error; |
| 190 | } | 187 | } |
diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c index 48171f4c943d..160d4e1575ce 100644 --- a/fs/gfs2/acl.c +++ b/fs/gfs2/acl.c | |||
| @@ -187,7 +187,7 @@ out: | |||
| 187 | 187 | ||
| 188 | int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr) | 188 | int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr) |
| 189 | { | 189 | { |
| 190 | struct posix_acl *acl, *clone; | 190 | struct posix_acl *acl; |
| 191 | char *data; | 191 | char *data; |
| 192 | unsigned int len; | 192 | unsigned int len; |
| 193 | int error; | 193 | int error; |
| @@ -198,25 +198,19 @@ int gfs2_acl_chmod(struct gfs2_inode *ip, struct iattr *attr) | |||
| 198 | if (!acl) | 198 | if (!acl) |
| 199 | return gfs2_setattr_simple(ip, attr); | 199 | return gfs2_setattr_simple(ip, attr); |
| 200 | 200 | ||
| 201 | clone = posix_acl_clone(acl, GFP_NOFS); | 201 | error = posix_acl_chmod(&acl, GFP_NOFS, attr->ia_mode); |
| 202 | if (error) | ||
| 203 | return error; | ||
| 204 | |||
| 205 | len = posix_acl_to_xattr(acl, NULL, 0); | ||
| 206 | data = kmalloc(len, GFP_NOFS); | ||
| 202 | error = -ENOMEM; | 207 | error = -ENOMEM; |
| 203 | if (!clone) | 208 | if (data == NULL) |
| 204 | goto out; | 209 | goto out; |
| 205 | posix_acl_release(acl); | 210 | posix_acl_to_xattr(acl, data, len); |
| 206 | acl = clone; | 211 | error = gfs2_xattr_acl_chmod(ip, attr, data); |
| 207 | 212 | kfree(data); | |
| 208 | error = posix_acl_chmod_masq(acl, attr->ia_mode); | 213 | set_cached_acl(&ip->i_inode, ACL_TYPE_ACCESS, acl); |
| 209 | if (!error) { | ||
| 210 | len = posix_acl_to_xattr(acl, NULL, 0); | ||
| 211 | data = kmalloc(len, GFP_NOFS); | ||
| 212 | error = -ENOMEM; | ||
| 213 | if (data == NULL) | ||
| 214 | goto out; | ||
| 215 | posix_acl_to_xattr(acl, data, len); | ||
| 216 | error = gfs2_xattr_acl_chmod(ip, attr, data); | ||
| 217 | kfree(data); | ||
| 218 | set_cached_acl(&ip->i_inode, ACL_TYPE_ACCESS, acl); | ||
| 219 | } | ||
| 220 | 214 | ||
| 221 | out: | 215 | out: |
| 222 | posix_acl_release(acl); | 216 | posix_acl_release(acl); |
diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 4933a8f8ecc9..71d022d38508 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c | |||
| @@ -332,7 +332,7 @@ int jffs2_init_acl_post(struct inode *inode) | |||
| 332 | 332 | ||
| 333 | int jffs2_acl_chmod(struct inode *inode) | 333 | int jffs2_acl_chmod(struct inode *inode) |
| 334 | { | 334 | { |
| 335 | struct posix_acl *acl, *clone; | 335 | struct posix_acl *acl; |
| 336 | int rc; | 336 | int rc; |
| 337 | 337 | ||
| 338 | if (S_ISLNK(inode->i_mode)) | 338 | if (S_ISLNK(inode->i_mode)) |
| @@ -340,14 +340,11 @@ int jffs2_acl_chmod(struct inode *inode) | |||
| 340 | acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS); | 340 | acl = jffs2_get_acl(inode, ACL_TYPE_ACCESS); |
| 341 | if (IS_ERR(acl) || !acl) | 341 | if (IS_ERR(acl) || !acl) |
| 342 | return PTR_ERR(acl); | 342 | return PTR_ERR(acl); |
| 343 | clone = posix_acl_clone(acl, GFP_KERNEL); | 343 | rc = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 344 | if (rc) | ||
| 345 | return rc; | ||
| 346 | rc = jffs2_set_acl(inode, ACL_TYPE_ACCESS, acl); | ||
| 344 | posix_acl_release(acl); | 347 | posix_acl_release(acl); |
| 345 | if (!clone) | ||
| 346 | return -ENOMEM; | ||
| 347 | rc = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 348 | if (!rc) | ||
| 349 | rc = jffs2_set_acl(inode, ACL_TYPE_ACCESS, clone); | ||
| 350 | posix_acl_release(clone); | ||
| 351 | return rc; | 348 | return rc; |
| 352 | } | 349 | } |
| 353 | 350 | ||
diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c index ead200eef5e4..89ced71e225a 100644 --- a/fs/jfs/acl.c +++ b/fs/jfs/acl.c | |||
| @@ -177,8 +177,9 @@ cleanup: | |||
| 177 | 177 | ||
| 178 | int jfs_acl_chmod(struct inode *inode) | 178 | int jfs_acl_chmod(struct inode *inode) |
| 179 | { | 179 | { |
| 180 | struct posix_acl *acl, *clone; | 180 | struct posix_acl *acl; |
| 181 | int rc; | 181 | int rc; |
| 182 | tid_t tid; | ||
| 182 | 183 | ||
| 183 | if (S_ISLNK(inode->i_mode)) | 184 | if (S_ISLNK(inode->i_mode)) |
| 184 | return -EOPNOTSUPP; | 185 | return -EOPNOTSUPP; |
| @@ -187,22 +188,18 @@ int jfs_acl_chmod(struct inode *inode) | |||
| 187 | if (IS_ERR(acl) || !acl) | 188 | if (IS_ERR(acl) || !acl) |
| 188 | return PTR_ERR(acl); | 189 | return PTR_ERR(acl); |
| 189 | 190 | ||
| 190 | clone = posix_acl_clone(acl, GFP_KERNEL); | 191 | rc = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 191 | posix_acl_release(acl); | 192 | if (rc) |
| 192 | if (!clone) | 193 | return rc; |
| 193 | return -ENOMEM; | ||
| 194 | |||
| 195 | rc = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 196 | if (!rc) { | ||
| 197 | tid_t tid = txBegin(inode->i_sb, 0); | ||
| 198 | mutex_lock(&JFS_IP(inode)->commit_mutex); | ||
| 199 | rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, clone); | ||
| 200 | if (!rc) | ||
| 201 | rc = txCommit(tid, 1, &inode, 0); | ||
| 202 | txEnd(tid); | ||
| 203 | mutex_unlock(&JFS_IP(inode)->commit_mutex); | ||
| 204 | } | ||
| 205 | 194 | ||
| 206 | posix_acl_release(clone); | 195 | tid = txBegin(inode->i_sb, 0); |
| 196 | mutex_lock(&JFS_IP(inode)->commit_mutex); | ||
| 197 | rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, acl); | ||
| 198 | if (!rc) | ||
| 199 | rc = txCommit(tid, 1, &inode, 0); | ||
| 200 | txEnd(tid); | ||
| 201 | mutex_unlock(&JFS_IP(inode)->commit_mutex); | ||
| 202 | |||
| 203 | posix_acl_release(acl); | ||
| 207 | return rc; | 204 | return rc; |
| 208 | } | 205 | } |
diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index aff23e59b58c..dd0296ade181 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c | |||
| @@ -327,7 +327,7 @@ int ocfs2_check_acl(struct inode *inode, int mask) | |||
| 327 | int ocfs2_acl_chmod(struct inode *inode) | 327 | int ocfs2_acl_chmod(struct inode *inode) |
| 328 | { | 328 | { |
| 329 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 329 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
| 330 | struct posix_acl *acl, *clone; | 330 | struct posix_acl *acl; |
| 331 | int ret; | 331 | int ret; |
| 332 | 332 | ||
| 333 | if (S_ISLNK(inode->i_mode)) | 333 | if (S_ISLNK(inode->i_mode)) |
| @@ -339,15 +339,12 @@ int ocfs2_acl_chmod(struct inode *inode) | |||
| 339 | acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); | 339 | acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); |
| 340 | if (IS_ERR(acl) || !acl) | 340 | if (IS_ERR(acl) || !acl) |
| 341 | return PTR_ERR(acl); | 341 | return PTR_ERR(acl); |
| 342 | clone = posix_acl_clone(acl, GFP_KERNEL); | 342 | ret = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 343 | if (ret) | ||
| 344 | return ret; | ||
| 345 | ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, | ||
| 346 | acl, NULL, NULL); | ||
| 343 | posix_acl_release(acl); | 347 | posix_acl_release(acl); |
| 344 | if (!clone) | ||
| 345 | return -ENOMEM; | ||
| 346 | ret = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 347 | if (!ret) | ||
| 348 | ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, | ||
| 349 | clone, NULL, NULL); | ||
| 350 | posix_acl_release(clone); | ||
| 351 | return ret; | 348 | return ret; |
| 352 | } | 349 | } |
| 353 | 350 | ||
diff --git a/fs/posix_acl.c b/fs/posix_acl.c index b1cf6bf4b41d..0aa9f1676726 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c | |||
| @@ -386,3 +386,21 @@ posix_acl_chmod_masq(struct posix_acl *acl, mode_t mode) | |||
| 386 | 386 | ||
| 387 | return 0; | 387 | return 0; |
| 388 | } | 388 | } |
| 389 | |||
| 390 | int | ||
| 391 | posix_acl_chmod(struct posix_acl **acl, gfp_t gfp, mode_t mode) | ||
| 392 | { | ||
| 393 | struct posix_acl *clone = posix_acl_clone(*acl, gfp); | ||
| 394 | int err = -ENOMEM; | ||
| 395 | if (clone) { | ||
| 396 | err = posix_acl_chmod_masq(clone, mode); | ||
| 397 | if (err) { | ||
| 398 | posix_acl_release(clone); | ||
| 399 | clone = NULL; | ||
| 400 | } | ||
| 401 | } | ||
| 402 | posix_acl_release(*acl); | ||
| 403 | *acl = clone; | ||
| 404 | return err; | ||
| 405 | } | ||
| 406 | EXPORT_SYMBOL(posix_acl_chmod); | ||
diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index 3dc38f1206fc..26b08acf913f 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c | |||
| @@ -445,7 +445,10 @@ int reiserfs_cache_default_acl(struct inode *inode) | |||
| 445 | 445 | ||
| 446 | int reiserfs_acl_chmod(struct inode *inode) | 446 | int reiserfs_acl_chmod(struct inode *inode) |
| 447 | { | 447 | { |
| 448 | struct posix_acl *acl, *clone; | 448 | struct reiserfs_transaction_handle th; |
| 449 | struct posix_acl *acl; | ||
| 450 | size_t size; | ||
| 451 | int depth; | ||
| 449 | int error; | 452 | int error; |
| 450 | 453 | ||
| 451 | if (S_ISLNK(inode->i_mode)) | 454 | if (S_ISLNK(inode->i_mode)) |
| @@ -463,30 +466,22 @@ int reiserfs_acl_chmod(struct inode *inode) | |||
| 463 | return 0; | 466 | return 0; |
| 464 | if (IS_ERR(acl)) | 467 | if (IS_ERR(acl)) |
| 465 | return PTR_ERR(acl); | 468 | return PTR_ERR(acl); |
| 466 | clone = posix_acl_clone(acl, GFP_NOFS); | 469 | error = posix_acl_chmod(&acl, GFP_NOFS, inode->i_mode); |
| 467 | posix_acl_release(acl); | 470 | if (error) |
| 468 | if (!clone) | 471 | return error; |
| 469 | return -ENOMEM; | 472 | |
| 470 | error = posix_acl_chmod_masq(clone, inode->i_mode); | 473 | size = reiserfs_xattr_nblocks(inode, reiserfs_acl_size(acl->a_count)); |
| 474 | depth = reiserfs_write_lock_once(inode->i_sb); | ||
| 475 | error = journal_begin(&th, inode->i_sb, size * 2); | ||
| 471 | if (!error) { | 476 | if (!error) { |
| 472 | struct reiserfs_transaction_handle th; | 477 | int error2; |
| 473 | size_t size = reiserfs_xattr_nblocks(inode, | 478 | error = reiserfs_set_acl(&th, inode, ACL_TYPE_ACCESS, acl); |
| 474 | reiserfs_acl_size(clone->a_count)); | 479 | error2 = journal_end(&th, inode->i_sb, size * 2); |
| 475 | int depth; | 480 | if (error2) |
| 476 | 481 | error = error2; | |
| 477 | depth = reiserfs_write_lock_once(inode->i_sb); | ||
| 478 | error = journal_begin(&th, inode->i_sb, size * 2); | ||
| 479 | if (!error) { | ||
| 480 | int error2; | ||
| 481 | error = reiserfs_set_acl(&th, inode, ACL_TYPE_ACCESS, | ||
| 482 | clone); | ||
| 483 | error2 = journal_end(&th, inode->i_sb, size * 2); | ||
| 484 | if (error2) | ||
| 485 | error = error2; | ||
| 486 | } | ||
| 487 | reiserfs_write_unlock_once(inode->i_sb, depth); | ||
| 488 | } | 482 | } |
| 489 | posix_acl_release(clone); | 483 | reiserfs_write_unlock_once(inode->i_sb, depth); |
| 484 | posix_acl_release(acl); | ||
| 490 | return error; | 485 | return error; |
| 491 | } | 486 | } |
| 492 | 487 | ||
diff --git a/fs/xfs/linux-2.6/xfs_acl.c b/fs/xfs/linux-2.6/xfs_acl.c index 13c4e4fd5c6e..4c554122db02 100644 --- a/fs/xfs/linux-2.6/xfs_acl.c +++ b/fs/xfs/linux-2.6/xfs_acl.c | |||
| @@ -326,7 +326,7 @@ xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl) | |||
| 326 | int | 326 | int |
| 327 | xfs_acl_chmod(struct inode *inode) | 327 | xfs_acl_chmod(struct inode *inode) |
| 328 | { | 328 | { |
| 329 | struct posix_acl *acl, *clone; | 329 | struct posix_acl *acl; |
| 330 | int error; | 330 | int error; |
| 331 | 331 | ||
| 332 | if (S_ISLNK(inode->i_mode)) | 332 | if (S_ISLNK(inode->i_mode)) |
| @@ -336,16 +336,12 @@ xfs_acl_chmod(struct inode *inode) | |||
| 336 | if (IS_ERR(acl) || !acl) | 336 | if (IS_ERR(acl) || !acl) |
| 337 | return PTR_ERR(acl); | 337 | return PTR_ERR(acl); |
| 338 | 338 | ||
| 339 | clone = posix_acl_clone(acl, GFP_KERNEL); | 339 | error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); |
| 340 | posix_acl_release(acl); | 340 | if (error) |
| 341 | if (!clone) | 341 | return error; |
| 342 | return -ENOMEM; | ||
| 343 | |||
| 344 | error = posix_acl_chmod_masq(clone, inode->i_mode); | ||
| 345 | if (!error) | ||
| 346 | error = xfs_set_acl(inode, ACL_TYPE_ACCESS, clone); | ||
| 347 | 342 | ||
| 348 | posix_acl_release(clone); | 343 | error = xfs_set_acl(inode, ACL_TYPE_ACCESS, acl); |
| 344 | posix_acl_release(acl); | ||
| 349 | return error; | 345 | return error; |
| 350 | } | 346 | } |
| 351 | 347 | ||
diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 54211c1cd926..7a74d37482e8 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h | |||
| @@ -80,6 +80,7 @@ extern struct posix_acl *posix_acl_from_mode(mode_t, gfp_t); | |||
| 80 | extern int posix_acl_equiv_mode(const struct posix_acl *, mode_t *); | 80 | extern int posix_acl_equiv_mode(const struct posix_acl *, mode_t *); |
| 81 | extern int posix_acl_create_masq(struct posix_acl *, mode_t *); | 81 | extern int posix_acl_create_masq(struct posix_acl *, mode_t *); |
| 82 | extern int posix_acl_chmod_masq(struct posix_acl *, mode_t); | 82 | extern int posix_acl_chmod_masq(struct posix_acl *, mode_t); |
| 83 | extern int posix_acl_chmod(struct posix_acl **, gfp_t, mode_t); | ||
| 83 | 84 | ||
| 84 | extern struct posix_acl *get_posix_acl(struct inode *, int); | 85 | extern struct posix_acl *get_posix_acl(struct inode *, int); |
| 85 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); | 86 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); |
