|
@@ -238,15 +238,8 @@ xfs_acl_vget(
|
|
error = EINVAL;
|
|
error = EINVAL;
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
- if (kind == _ACL_TYPE_ACCESS) {
|
|
|
|
- bhv_vattr_t va;
|
|
|
|
-
|
|
|
|
- va.va_mask = XFS_AT_MODE;
|
|
|
|
- error = xfs_getattr(xfs_vtoi(vp), &va, 0);
|
|
|
|
- if (error)
|
|
|
|
- goto out;
|
|
|
|
- xfs_acl_sync_mode(va.va_mode, xfs_acl);
|
|
|
|
- }
|
|
|
|
|
|
+ if (kind == _ACL_TYPE_ACCESS)
|
|
|
|
+ xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, xfs_acl);
|
|
error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size);
|
|
error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size);
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
@@ -373,23 +366,15 @@ xfs_acl_allow_set(
|
|
bhv_vnode_t *vp,
|
|
bhv_vnode_t *vp,
|
|
int kind)
|
|
int kind)
|
|
{
|
|
{
|
|
- xfs_inode_t *ip = xfs_vtoi(vp);
|
|
|
|
- bhv_vattr_t va;
|
|
|
|
- int error;
|
|
|
|
-
|
|
|
|
if (vp->i_flags & (S_IMMUTABLE|S_APPEND))
|
|
if (vp->i_flags & (S_IMMUTABLE|S_APPEND))
|
|
return EPERM;
|
|
return EPERM;
|
|
if (kind == _ACL_TYPE_DEFAULT && !S_ISDIR(vp->i_mode))
|
|
if (kind == _ACL_TYPE_DEFAULT && !S_ISDIR(vp->i_mode))
|
|
return ENOTDIR;
|
|
return ENOTDIR;
|
|
if (vp->i_sb->s_flags & MS_RDONLY)
|
|
if (vp->i_sb->s_flags & MS_RDONLY)
|
|
return EROFS;
|
|
return EROFS;
|
|
- va.va_mask = XFS_AT_UID;
|
|
|
|
- error = xfs_getattr(ip, &va, 0);
|
|
|
|
- if (error)
|
|
|
|
- return error;
|
|
|
|
- if (va.va_uid != current->fsuid && !capable(CAP_FOWNER))
|
|
|
|
|
|
+ if (xfs_vtoi(vp)->i_d.di_uid != current->fsuid && !capable(CAP_FOWNER))
|
|
return EPERM;
|
|
return EPERM;
|
|
- return error;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -643,7 +628,6 @@ xfs_acl_vtoacl(
|
|
xfs_acl_t *access_acl,
|
|
xfs_acl_t *access_acl,
|
|
xfs_acl_t *default_acl)
|
|
xfs_acl_t *default_acl)
|
|
{
|
|
{
|
|
- bhv_vattr_t va;
|
|
|
|
int error = 0;
|
|
int error = 0;
|
|
|
|
|
|
if (access_acl) {
|
|
if (access_acl) {
|
|
@@ -652,16 +636,10 @@ xfs_acl_vtoacl(
|
|
* be obtained for some reason, invalidate the access ACL.
|
|
* be obtained for some reason, invalidate the access ACL.
|
|
*/
|
|
*/
|
|
xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error);
|
|
xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error);
|
|
- if (!error) {
|
|
|
|
- /* Got the ACL, need the mode... */
|
|
|
|
- va.va_mask = XFS_AT_MODE;
|
|
|
|
- error = xfs_getattr(xfs_vtoi(vp), &va, 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (error)
|
|
if (error)
|
|
access_acl->acl_cnt = XFS_ACL_NOT_PRESENT;
|
|
access_acl->acl_cnt = XFS_ACL_NOT_PRESENT;
|
|
else /* We have a good ACL and the file mode, synchronize. */
|
|
else /* We have a good ACL and the file mode, synchronize. */
|
|
- xfs_acl_sync_mode(va.va_mode, access_acl);
|
|
|
|
|
|
+ xfs_acl_sync_mode(xfs_vtoi(vp)->i_d.di_mode, access_acl);
|
|
}
|
|
}
|
|
|
|
|
|
if (default_acl) {
|
|
if (default_acl) {
|
|
@@ -744,7 +722,7 @@ xfs_acl_setmode(
|
|
bhv_vattr_t va;
|
|
bhv_vattr_t va;
|
|
xfs_acl_entry_t *ap;
|
|
xfs_acl_entry_t *ap;
|
|
xfs_acl_entry_t *gap = NULL;
|
|
xfs_acl_entry_t *gap = NULL;
|
|
- int i, error, nomask = 1;
|
|
|
|
|
|
+ int i, nomask = 1;
|
|
|
|
|
|
*basicperms = 1;
|
|
*basicperms = 1;
|
|
|
|
|
|
@@ -756,11 +734,7 @@ xfs_acl_setmode(
|
|
* mode. The m:: bits take precedence over the g:: bits.
|
|
* mode. The m:: bits take precedence over the g:: bits.
|
|
*/
|
|
*/
|
|
va.va_mask = XFS_AT_MODE;
|
|
va.va_mask = XFS_AT_MODE;
|
|
- error = xfs_getattr(xfs_vtoi(vp), &va, 0);
|
|
|
|
- if (error)
|
|
|
|
- return error;
|
|
|
|
-
|
|
|
|
- va.va_mask = XFS_AT_MODE;
|
|
|
|
|
|
+ va.va_mode = xfs_vtoi(vp)->i_d.di_mode;
|
|
va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO);
|
|
va.va_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO);
|
|
ap = acl->acl_entry;
|
|
ap = acl->acl_entry;
|
|
for (i = 0; i < acl->acl_cnt; ++i) {
|
|
for (i = 0; i < acl->acl_cnt; ++i) {
|