diff options
Diffstat (limited to 'fs/xfs/xfs_acl.c')
-rw-r--r-- | fs/xfs/xfs_acl.c | 53 |
1 files changed, 14 insertions, 39 deletions
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 8e130b9720ae..ebee3a4f703a 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c | |||
@@ -72,7 +72,7 @@ xfs_acl_vhasacl_default( | |||
72 | { | 72 | { |
73 | int error; | 73 | int error; |
74 | 74 | ||
75 | if (!VN_ISDIR(vp)) | 75 | if (!S_ISDIR(vp->i_mode)) |
76 | return 0; | 76 | return 0; |
77 | xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error); | 77 | xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error); |
78 | return (error == 0); | 78 | return (error == 0); |
@@ -238,15 +238,8 @@ xfs_acl_vget( | |||
238 | error = EINVAL; | 238 | error = EINVAL; |
239 | goto out; | 239 | goto out; |
240 | } | 240 | } |
241 | if (kind == _ACL_TYPE_ACCESS) { | 241 | if (kind == _ACL_TYPE_ACCESS) |
242 | bhv_vattr_t va; | 242 | xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, xfs_acl); |
243 | |||
244 | va.va_mask = XFS_AT_MODE; | ||
245 | error = xfs_getattr(xfs_vtoi(vp), &va, 0); | ||
246 | if (error) | ||
247 | goto out; | ||
248 | xfs_acl_sync_mode(va.va_mode, xfs_acl); | ||
249 | } | ||
250 | error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size); | 243 | error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size); |
251 | } | 244 | } |
252 | out: | 245 | out: |
@@ -341,14 +334,15 @@ xfs_acl_iaccess( | |||
341 | { | 334 | { |
342 | xfs_acl_t *acl; | 335 | xfs_acl_t *acl; |
343 | int rval; | 336 | int rval; |
337 | struct xfs_name acl_name = {SGI_ACL_FILE, SGI_ACL_FILE_SIZE}; | ||
344 | 338 | ||
345 | if (!(_ACL_ALLOC(acl))) | 339 | if (!(_ACL_ALLOC(acl))) |
346 | return -1; | 340 | return -1; |
347 | 341 | ||
348 | /* If the file has no ACL return -1. */ | 342 | /* If the file has no ACL return -1. */ |
349 | rval = sizeof(xfs_acl_t); | 343 | rval = sizeof(xfs_acl_t); |
350 | if (xfs_attr_fetch(ip, SGI_ACL_FILE, SGI_ACL_FILE_SIZE, | 344 | if (xfs_attr_fetch(ip, &acl_name, (char *)acl, &rval, |
351 | (char *)acl, &rval, ATTR_ROOT | ATTR_KERNACCESS, cr)) { | 345 | ATTR_ROOT | ATTR_KERNACCESS)) { |
352 | _ACL_FREE(acl); | 346 | _ACL_FREE(acl); |
353 | return -1; | 347 | return -1; |
354 | } | 348 | } |
@@ -373,23 +367,15 @@ xfs_acl_allow_set( | |||
373 | bhv_vnode_t *vp, | 367 | bhv_vnode_t *vp, |
374 | int kind) | 368 | int kind) |
375 | { | 369 | { |
376 | xfs_inode_t *ip = xfs_vtoi(vp); | ||
377 | bhv_vattr_t va; | ||
378 | int error; | ||
379 | |||
380 | if (vp->i_flags & (S_IMMUTABLE|S_APPEND)) | 370 | if (vp->i_flags & (S_IMMUTABLE|S_APPEND)) |
381 | return EPERM; | 371 | return EPERM; |
382 | if (kind == _ACL_TYPE_DEFAULT && !VN_ISDIR(vp)) | 372 | if (kind == _ACL_TYPE_DEFAULT && !S_ISDIR(vp->i_mode)) |
383 | return ENOTDIR; | 373 | return ENOTDIR; |
384 | if (vp->i_sb->s_flags & MS_RDONLY) | 374 | if (vp->i_sb->s_flags & MS_RDONLY) |
385 | return EROFS; | 375 | return EROFS; |
386 | va.va_mask = XFS_AT_UID; | 376 | if (xfs_vtoi(vp)->i_d.di_uid != current->fsuid && !capable(CAP_FOWNER)) |
387 | error = xfs_getattr(ip, &va, 0); | ||
388 | if (error) | ||
389 | return error; | ||
390 | if (va.va_uid != current->fsuid && !capable(CAP_FOWNER)) | ||
391 | return EPERM; | 377 | return EPERM; |
392 | return error; | 378 | return 0; |
393 | } | 379 | } |
394 | 380 | ||
395 | /* | 381 | /* |
@@ -594,7 +580,7 @@ xfs_acl_get_attr( | |||
594 | *error = xfs_attr_get(xfs_vtoi(vp), | 580 | *error = xfs_attr_get(xfs_vtoi(vp), |
595 | kind == _ACL_TYPE_ACCESS ? | 581 | kind == _ACL_TYPE_ACCESS ? |
596 | SGI_ACL_FILE : SGI_ACL_DEFAULT, | 582 | SGI_ACL_FILE : SGI_ACL_DEFAULT, |
597 | (char *)aclp, &len, flags, sys_cred); | 583 | (char *)aclp, &len, flags); |
598 | if (*error || (flags & ATTR_KERNOVAL)) | 584 | if (*error || (flags & ATTR_KERNOVAL)) |
599 | return; | 585 | return; |
600 | xfs_acl_get_endian(aclp); | 586 | xfs_acl_get_endian(aclp); |
@@ -643,7 +629,6 @@ xfs_acl_vtoacl( | |||
643 | xfs_acl_t *access_acl, | 629 | xfs_acl_t *access_acl, |
644 | xfs_acl_t *default_acl) | 630 | xfs_acl_t *default_acl) |
645 | { | 631 | { |
646 | bhv_vattr_t va; | ||
647 | int error = 0; | 632 | int error = 0; |
648 | 633 | ||
649 | if (access_acl) { | 634 | if (access_acl) { |
@@ -652,16 +637,10 @@ xfs_acl_vtoacl( | |||
652 | * be obtained for some reason, invalidate the access ACL. | 637 | * be obtained for some reason, invalidate the access ACL. |
653 | */ | 638 | */ |
654 | xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error); | 639 | xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error); |
655 | if (!error) { | ||
656 | /* Got the ACL, need the mode... */ | ||
657 | va.va_mask = XFS_AT_MODE; | ||
658 | error = xfs_getattr(xfs_vtoi(vp), &va, 0); | ||
659 | } | ||
660 | |||
661 | if (error) | 640 | if (error) |
662 | access_acl->acl_cnt = XFS_ACL_NOT_PRESENT; | 641 | access_acl->acl_cnt = XFS_ACL_NOT_PRESENT; |
663 | else /* We have a good ACL and the file mode, synchronize. */ | 642 | else /* We have a good ACL and the file mode, synchronize. */ |
664 | xfs_acl_sync_mode(va.va_mode, access_acl); | 643 | xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, access_acl); |
665 | } | 644 | } |
666 | 645 | ||
667 | if (default_acl) { | 646 | if (default_acl) { |
@@ -719,7 +698,7 @@ xfs_acl_inherit( | |||
719 | * If the new file is a directory, its default ACL is a copy of | 698 | * If the new file is a directory, its default ACL is a copy of |
720 | * the containing directory's default ACL. | 699 | * the containing directory's default ACL. |
721 | */ | 700 | */ |
722 | if (VN_ISDIR(vp)) | 701 | if (S_ISDIR(vp->i_mode)) |
723 | xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error); | 702 | xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error); |
724 | if (!error && !basicperms) | 703 | if (!error && !basicperms) |
725 | xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error); | 704 | xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error); |
@@ -744,7 +723,7 @@ xfs_acl_setmode( | |||
744 | bhv_vattr_t va; | 723 | bhv_vattr_t va; |
745 | xfs_acl_entry_t *ap; | 724 | xfs_acl_entry_t *ap; |
746 | xfs_acl_entry_t *gap = NULL; | 725 | xfs_acl_entry_t *gap = NULL; |
747 | int i, error, nomask = 1; | 726 | int i, nomask = 1; |
748 | 727 | ||
749 | *basicperms = 1; | 728 | *basicperms = 1; |
750 | 729 | ||
@@ -756,11 +735,7 @@ xfs_acl_setmode( | |||
756 | * mode. The m:: bits take precedence over the g:: bits. | 735 | * mode. The m:: bits take precedence over the g:: bits. |
757 | */ | 736 | */ |
758 | va.va_mask = XFS_AT_MODE; | 737 | va.va_mask = XFS_AT_MODE; |
759 | error = xfs_getattr(xfs_vtoi(vp), &va, 0); | 738 | va.va_mode = xfs_vtoi(vp)->i_d.di_mode; |
760 | if (error) | ||
761 | return error; | ||
762 | |||
763 | va.va_mask = XFS_AT_MODE; | ||
764 | va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); | 739 | va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); |
765 | ap = acl->acl_entry; | 740 | ap = acl->acl_entry; |
766 | for (i = 0; i < acl->acl_cnt; ++i) { | 741 | for (i = 0; i < acl->acl_cnt; ++i) { |