patch-2.4.27 linux-2.4.27/fs/xfs/xfs_attr.c
Next file: linux-2.4.27/fs/xfs/xfs_attr.h
Previous file: linux-2.4.27/fs/xfs/xfs_arch.h
Back to the patch index
Back to the overall index
- Lines: 166
- Date:
2004-08-07 16:26:06.109406564 -0700
- Orig file:
linux-2.4.26/fs/xfs/xfs_attr.c
- Orig date:
2004-02-18 05:36:32.000000000 -0800
diff -urN linux-2.4.26/fs/xfs/xfs_attr.c linux-2.4.27/fs/xfs/xfs_attr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
+ * Copyright (c) 2000-2004 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
@@ -115,20 +115,12 @@
* Overall external interface routines.
*========================================================================*/
-/*ARGSUSED*/
-STATIC int
-xfs_attr_get_int(xfs_inode_t *ip, char *name, char *value, int *valuelenp,
- int flags, int lock, struct cred *cred)
+int
+xfs_attr_fetch(xfs_inode_t *ip, char *name, int namelen,
+ char *value, int *valuelenp, int flags, struct cred *cred)
{
xfs_da_args_t args;
int error;
- int namelen;
-
- ASSERT(MAXNAMELEN-1 <= 0xff); /* length is stored in uint8 */
- namelen = strlen(name);
- if (namelen >= MAXNAMELEN)
- return(EFAULT); /* match IRIX behaviour */
- XFS_STATS_INC(xs_attr_get);
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
return(EIO);
@@ -138,12 +130,11 @@
ip->i_d.di_anextents == 0))
return(ENOATTR);
- if (lock) {
+ if (!(flags & ATTR_KERNACCESS)) {
xfs_ilock(ip, XFS_ILOCK_SHARED);
- /*
- * Do we answer them, or ignore them?
- */
- if ((error = xfs_iaccess(ip, S_IRUSR, cred))) {
+
+ if (!(flags & ATTR_SECURE) &&
+ ((error = xfs_iaccess(ip, S_IRUSR, cred)))) {
xfs_iunlock(ip, XFS_ILOCK_SHARED);
return(XFS_ERROR(error));
}
@@ -161,7 +152,6 @@
args.hashval = xfs_da_hashname(args.name, args.namelen);
args.dp = ip;
args.whichfork = XFS_ATTR_FORK;
- args.trans = NULL;
/*
* Decide on what work routines to call based on the inode size.
@@ -178,7 +168,7 @@
error = xfs_attr_node_get(&args);
}
- if (lock)
+ if (!(flags & ATTR_KERNACCESS))
xfs_iunlock(ip, XFS_ILOCK_SHARED);
/*
@@ -192,20 +182,21 @@
}
int
-xfs_attr_fetch(xfs_inode_t *ip, char *name, char *value, int valuelen)
-{
- return xfs_attr_get_int(ip, name, value, &valuelen, ATTR_ROOT, 0, NULL);
-}
-
-int
xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp,
int flags, struct cred *cred)
{
xfs_inode_t *ip = XFS_BHVTOI(bdp);
+ int namelen;
+
+ XFS_STATS_INC(xs_attr_get);
if (!name)
return(EINVAL);
- return xfs_attr_get_int(ip, name, value, valuelenp, flags, 1, cred);
+ namelen = strlen(name);
+ if (namelen >= MAXNAMELEN)
+ return(EFAULT); /* match IRIX behaviour */
+
+ return xfs_attr_fetch(ip, name, namelen, value, valuelenp, flags, cred);
}
/*ARGSUSED*/
@@ -224,22 +215,20 @@
int rsvd = (flags & ATTR_ROOT) != 0;
int namelen;
- ASSERT(MAXNAMELEN-1 <= 0xff); /* length is stored in uint8 */
namelen = strlen(name);
if (namelen >= MAXNAMELEN)
- return EFAULT; /* match irix behaviour */
+ return EFAULT; /* match IRIX behaviour */
XFS_STATS_INC(xs_attr_set);
- /*
- * Do we answer them, or ignore them?
- */
+
dp = XFS_BHVTOI(bdp);
mp = dp->i_mount;
if (XFS_FORCED_SHUTDOWN(mp))
return (EIO);
xfs_ilock(dp, XFS_ILOCK_SHARED);
- if ((error = xfs_iaccess(dp, S_IWUSR, cred))) {
+ if (!(flags & ATTR_SECURE) &&
+ (error = xfs_iaccess(dp, S_IWUSR, cred))) {
xfs_iunlock(dp, XFS_ILOCK_SHARED);
return(XFS_ERROR(error));
}
@@ -489,16 +478,14 @@
XFS_STATS_INC(xs_attr_remove);
- /*
- * Do we answer them, or ignore them?
- */
dp = XFS_BHVTOI(bdp);
mp = dp->i_mount;
if (XFS_FORCED_SHUTDOWN(mp))
return (EIO);
xfs_ilock(dp, XFS_ILOCK_SHARED);
- if ((error = xfs_iaccess(dp, S_IWUSR, cred))) {
+ 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 ||
@@ -683,11 +670,10 @@
if (XFS_FORCED_SHUTDOWN(dp->i_mount))
return (EIO);
- /*
- * Do they have permission?
- */
+
xfs_ilock(dp, XFS_ILOCK_SHARED);
- if ((error = xfs_iaccess(dp, S_IRUSR, cred))) {
+ if (!(flags & ATTR_SECURE) &&
+ (error = xfs_iaccess(dp, S_IRUSR, cred))) {
xfs_iunlock(dp, XFS_ILOCK_SHARED);
return(XFS_ERROR(error));
}
@@ -2163,8 +2149,8 @@
/*
* If the "remote" value is in the cache, remove it.
*/
- /* bp = incore(mp->m_dev, dblkno, blkcnt, 1); */
- bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, 1);
+ bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt,
+ XFS_INCORE_TRYLOCK);
if (bp) {
XFS_BUF_STALE(bp);
XFS_BUF_UNDELAYWRITE(bp);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)