[XFS] Move some code around to prepare for the upcoming extended
attributes format change (attr2). SGI-PV: 941645 SGI-Modid: xfs-linux:xfs-kern:23833a Signed-off-by: Nathan Scott <nathans@sgi.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
@@ -200,40 +200,18 @@ xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp,
|
||||
return(error);
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
int /* error */
|
||||
xfs_attr_set(bhv_desc_t *bdp, char *name, char *value, int valuelen, int flags,
|
||||
struct cred *cred)
|
||||
int
|
||||
xfs_attr_set_int(xfs_inode_t *dp, char *name, int namelen,
|
||||
char *value, int valuelen, int flags)
|
||||
{
|
||||
xfs_da_args_t args;
|
||||
xfs_inode_t *dp;
|
||||
xfs_fsblock_t firstblock;
|
||||
xfs_bmap_free_t flist;
|
||||
int error, err2, committed;
|
||||
int local, size;
|
||||
uint nblks;
|
||||
xfs_mount_t *mp;
|
||||
xfs_mount_t *mp = dp->i_mount;
|
||||
int rsvd = (flags & ATTR_ROOT) != 0;
|
||||
int namelen;
|
||||
|
||||
namelen = strlen(name);
|
||||
if (namelen >= MAXNAMELEN)
|
||||
return EFAULT; /* match IRIX behaviour */
|
||||
|
||||
XFS_STATS_INC(xs_attr_set);
|
||||
|
||||
dp = XFS_BHVTOI(bdp);
|
||||
mp = dp->i_mount;
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
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);
|
||||
|
||||
/*
|
||||
* Attach the dquots to the inode.
|
||||
@@ -270,7 +248,8 @@ xfs_attr_set(bhv_desc_t *bdp, char *name, char *value, int valuelen, int flags,
|
||||
/* Determine space new attribute will use, and if it will be inline
|
||||
* or out of line.
|
||||
*/
|
||||
size = xfs_attr_leaf_newentsize(&args, mp->m_sb.sb_blocksize, &local);
|
||||
size = xfs_attr_leaf_newentsize(namelen, valuelen,
|
||||
mp->m_sb.sb_blocksize, &local);
|
||||
|
||||
nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK);
|
||||
if (local) {
|
||||
@@ -456,32 +435,21 @@ out:
|
||||
return(error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic handler routine to remove a name from an attribute list.
|
||||
* Transitions attribute list from Btree to shortform as necessary.
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
int /* error */
|
||||
xfs_attr_remove(bhv_desc_t *bdp, char *name, int flags, struct cred *cred)
|
||||
int
|
||||
xfs_attr_set(bhv_desc_t *bdp, char *name, char *value, int valuelen, int flags,
|
||||
struct cred *cred)
|
||||
{
|
||||
xfs_da_args_t args;
|
||||
xfs_inode_t *dp;
|
||||
xfs_fsblock_t firstblock;
|
||||
xfs_bmap_free_t flist;
|
||||
int error;
|
||||
xfs_mount_t *mp;
|
||||
int namelen;
|
||||
xfs_inode_t *dp;
|
||||
int namelen, error;
|
||||
|
||||
ASSERT(MAXNAMELEN-1<=0xff); /* length is stored in uint8 */
|
||||
namelen = strlen(name);
|
||||
if (namelen>=MAXNAMELEN)
|
||||
return EFAULT; /* match irix behaviour */
|
||||
if (namelen >= MAXNAMELEN)
|
||||
return EFAULT; /* match IRIX behaviour */
|
||||
|
||||
XFS_STATS_INC(xs_attr_remove);
|
||||
XFS_STATS_INC(xs_attr_set);
|
||||
|
||||
dp = XFS_BHVTOI(bdp);
|
||||
mp = dp->i_mount;
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
if (XFS_FORCED_SHUTDOWN(dp->i_mount))
|
||||
return (EIO);
|
||||
|
||||
xfs_ilock(dp, XFS_ILOCK_SHARED);
|
||||
@@ -489,14 +457,25 @@ xfs_attr_remove(bhv_desc_t *bdp, char *name, int flags, struct cred *cred)
|
||||
(error = xfs_iaccess(dp, S_IWUSR, cred))) {
|
||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
||||
return(XFS_ERROR(error));
|
||||
} else 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);
|
||||
return(XFS_ERROR(ENOATTR));
|
||||
}
|
||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
||||
|
||||
return xfs_attr_set_int(dp, name, namelen, value, valuelen, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic handler routine to remove a name from an attribute list.
|
||||
* Transitions attribute list from Btree to shortform as necessary.
|
||||
*/
|
||||
int
|
||||
xfs_attr_remove_int(xfs_inode_t *dp, char *name, int namelen, int flags)
|
||||
{
|
||||
xfs_da_args_t args;
|
||||
xfs_fsblock_t firstblock;
|
||||
xfs_bmap_free_t flist;
|
||||
int error;
|
||||
xfs_mount_t *mp = dp->i_mount;
|
||||
|
||||
/*
|
||||
* Fill in the arg structure for this request.
|
||||
*/
|
||||
@@ -612,6 +591,38 @@ out:
|
||||
return(error);
|
||||
}
|
||||
|
||||
int
|
||||
xfs_attr_remove(bhv_desc_t *bdp, char *name, int flags, struct cred *cred)
|
||||
{
|
||||
xfs_inode_t *dp;
|
||||
int namelen, error;
|
||||
|
||||
namelen = strlen(name);
|
||||
if (namelen >= MAXNAMELEN)
|
||||
return EFAULT; /* match IRIX behaviour */
|
||||
|
||||
XFS_STATS_INC(xs_attr_remove);
|
||||
|
||||
dp = XFS_BHVTOI(bdp);
|
||||
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));
|
||||
} else 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);
|
||||
return(XFS_ERROR(ENOATTR));
|
||||
}
|
||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
||||
|
||||
return xfs_attr_remove_int(dp, name, namelen, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a list of extended attribute names and optionally
|
||||
* also value lengths. Positive return value follows the XFS
|
||||
|
Reference in New Issue
Block a user