From: Christoph Hellwig remove checks now in the VFS XFS has an additional xattr interface through obscure ioctl. it requires raised capabilities but we need to add some read-only/immutable checks anyway Signed-off-by: Christoph Hellwig Signed-off-by: Andrew Morton --- fs/xfs/linux-2.6/xfs_ioctl.c | 5 +++++ fs/xfs/xfs_attr.c | 25 +------------------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff -puN fs/xfs/linux-2.6/xfs_ioctl.c~remove-xfs-xattr-permission-checks fs/xfs/linux-2.6/xfs_ioctl.c --- devel/fs/xfs/linux-2.6/xfs_ioctl.c~remove-xfs-xattr-permission-checks 2005-11-04 01:10:00.000000000 -0800 +++ devel-akpm/fs/xfs/linux-2.6/xfs_ioctl.c 2005-11-04 01:10:00.000000000 -0800 @@ -530,6 +530,8 @@ xfs_attrmulti_attr_set( char *kbuf; int error = EFAULT; + if (IS_RDONLY(&vp->v_inode)) + return -EROFS; if (IS_IMMUTABLE(&vp->v_inode) || IS_APPEND(&vp->v_inode)) return EPERM; if (len > XATTR_SIZE_MAX) @@ -557,6 +559,9 @@ xfs_attrmulti_attr_remove( { int error; + + if (IS_RDONLY(&vp->v_inode)) + return -EROFS; if (IS_IMMUTABLE(&vp->v_inode) || IS_APPEND(&vp->v_inode)) return EPERM; diff -puN fs/xfs/xfs_attr.c~remove-xfs-xattr-permission-checks fs/xfs/xfs_attr.c --- devel/fs/xfs/xfs_attr.c~remove-xfs-xattr-permission-checks 2005-11-04 01:10:00.000000000 -0800 +++ devel-akpm/fs/xfs/xfs_attr.c 2005-11-04 01:10:37.000000000 -0800 @@ -117,11 +117,6 @@ xfs_attr_fetch(xfs_inode_t *ip, const ch ip->i_d.di_anextents == 0)) return(ENOATTR); - if (!(flags & (ATTR_KERNACCESS|ATTR_SECURE))) { - if ((error = xfs_iaccess(ip, S_IRUSR, cred))) - return(XFS_ERROR(error)); - } - /* * Fill in the arg structure for this request. */ @@ -437,14 +432,6 @@ xfs_attr_set(bhv_desc_t *bdp, const char if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return (EIO); - xfs_ilock(dp, XFS_ILOCK_SHARED); - if (!(flags & ATTR_SECURE) && - (error = xfs_iaccess(dp, S_IWUSR, cred))) { - xfs_iunlock(dp, XFS_ILOCK_SHARED); - return(XFS_ERROR(error)); - } - xfs_iunlock(dp, XFS_ILOCK_SHARED); - return xfs_attr_set_int(dp, name, namelen, value, valuelen, flags); } @@ -592,11 +579,7 @@ xfs_attr_remove(bhv_desc_t *bdp, const c return (EIO); xfs_ilock(dp, XFS_ILOCK_SHARED); - if (!(flags & ATTR_SECURE) && - (error = xfs_iaccess(dp, S_IWUSR, cred))) { - xfs_iunlock(dp, XFS_ILOCK_SHARED); - return(XFS_ERROR(error)); - } else if (XFS_IFORK_Q(dp) == 0 || + if (XFS_IFORK_Q(dp) == 0 || (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && dp->i_d.di_anextents == 0)) { xfs_iunlock(dp, XFS_ILOCK_SHARED); @@ -668,12 +651,6 @@ xfs_attr_list(bhv_desc_t *bdp, char *buf return (EIO); xfs_ilock(dp, XFS_ILOCK_SHARED); - if (!(flags & ATTR_SECURE) && - (error = xfs_iaccess(dp, S_IRUSR, cred))) { - xfs_iunlock(dp, XFS_ILOCK_SHARED); - return(XFS_ERROR(error)); - } - /* * Decide on what work routines to call based on the inode size. */ _