Commit 4a93d6e8 authored by Nathan Scott's avatar Nathan Scott Committed by Stephen Lord

[XFS] Alternate, cleaner fix for the ENOSPC/ACL lookup problem

SGI Modid: 2.5.x-xfs:slinx:157531a
parent 487d7c62
...@@ -65,7 +65,6 @@ xfs-$(CONFIG_SYSCTL) += linux/xfs_sysctl.o ...@@ -65,7 +65,6 @@ xfs-$(CONFIG_SYSCTL) += linux/xfs_sysctl.o
xfs-y += xfs_alloc.o \ xfs-y += xfs_alloc.o \
xfs_alloc_btree.o \ xfs_alloc_btree.o \
xfs_attr.o \ xfs_attr.o \
xfs_attr_fetch.o \
xfs_attr_leaf.o \ xfs_attr_leaf.o \
xfs_bit.o \ xfs_bit.o \
xfs_bmap.o \ xfs_bmap.o \
......
...@@ -116,37 +116,37 @@ ktrace_t *xfs_attr_trace_buf; ...@@ -116,37 +116,37 @@ ktrace_t *xfs_attr_trace_buf;
*========================================================================*/ *========================================================================*/
/*ARGSUSED*/ /*ARGSUSED*/
int /* error */ STATIC int
xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp, xfs_attr_get_int(xfs_inode_t *ip, char *name, char *value, int *valuelenp,
int flags, struct cred *cred) int flags, int lock, struct cred *cred)
{ {
xfs_da_args_t args; xfs_da_args_t args;
int error; int error;
int namelen; int namelen;
xfs_inode_t *ip = XFS_BHVTOI(bdp);
if (!name)
return EINVAL;
ASSERT(MAXNAMELEN-1 <= 0xff); /* length is stored in uint8 */ ASSERT(MAXNAMELEN-1 <= 0xff); /* length is stored in uint8 */
namelen = strlen(name); namelen = strlen(name);
if (namelen >= MAXNAMELEN) if (namelen >= MAXNAMELEN)
return EFAULT; /* match IRIX behaviour */ return(EFAULT); /* match IRIX behaviour */
XFS_STATS_INC(xs_attr_get); XFS_STATS_INC(xs_attr_get);
if (XFS_IFORK_Q(ip) == 0)
return ENOATTR;
if (XFS_FORCED_SHUTDOWN(ip->i_mount)) if (XFS_FORCED_SHUTDOWN(ip->i_mount))
return (EIO); return(EIO);
/* if ((XFS_IFORK_Q(ip) == 0) ||
* Do we answer them, or ignore them? (ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS &&
*/ ip->i_d.di_anextents == 0))
xfs_ilock(ip, XFS_ILOCK_SHARED); return(ENOATTR);
if ((error = xfs_iaccess(XFS_BHVTOI(bdp), IREAD, cred))) {
xfs_iunlock(ip, XFS_ILOCK_SHARED); if (lock) {
return(XFS_ERROR(error)); xfs_ilock(ip, XFS_ILOCK_SHARED);
/*
* Do we answer them, or ignore them?
*/
if ((error = xfs_iaccess(ip, IREAD, cred))) {
xfs_iunlock(ip, XFS_ILOCK_SHARED);
return(XFS_ERROR(error));
}
} }
/* /*
...@@ -177,7 +177,9 @@ xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp, ...@@ -177,7 +177,9 @@ xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp,
} else { } else {
error = xfs_attr_node_get(&args); error = xfs_attr_node_get(&args);
} }
xfs_iunlock(ip, XFS_ILOCK_SHARED);
if (lock)
xfs_iunlock(ip, XFS_ILOCK_SHARED);
/* /*
* Return the number of bytes in the value to the caller. * Return the number of bytes in the value to the caller.
...@@ -189,6 +191,23 @@ xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp, ...@@ -189,6 +191,23 @@ xfs_attr_get(bhv_desc_t *bdp, char *name, char *value, int *valuelenp,
return(error); return(error);
} }
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);
if (!name)
return(EINVAL);
return xfs_attr_get_int(ip, name, value, valuelenp, flags, 1, cred);
}
/*ARGSUSED*/ /*ARGSUSED*/
int /* error */ int /* error */
xfs_attr_set(bhv_desc_t *bdp, char *name, char *value, int valuelen, int flags, xfs_attr_set(bhv_desc_t *bdp, char *name, char *value, int valuelen, int flags,
...@@ -1718,7 +1737,6 @@ xfs_attr_node_get(xfs_da_args_t *args) ...@@ -1718,7 +1737,6 @@ xfs_attr_node_get(xfs_da_args_t *args)
int i; int i;
state = xfs_da_state_alloc(); state = xfs_da_state_alloc();
state->holeok = 1;
state->args = args; state->args = args;
state->mp = args->dp->i_mount; state->mp = args->dp->i_mount;
state->blocksize = state->mp->m_sb.sb_blocksize; state->blocksize = state->mp->m_sb.sb_blocksize;
......
...@@ -1141,12 +1141,10 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) ...@@ -1141,12 +1141,10 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
xfs_da_node_entry_t *btree; xfs_da_node_entry_t *btree;
xfs_dablk_t blkno; xfs_dablk_t blkno;
int probe, span, max, error, retval; int probe, span, max, error, retval;
xfs_daddr_t mappedbno;
xfs_dahash_t hashval; xfs_dahash_t hashval;
xfs_da_args_t *args; xfs_da_args_t *args;
args = state->args; args = state->args;
mappedbno = state->holeok ? -2 : -1;
/* /*
* Descend thru the B-tree searching each level for the right * Descend thru the B-tree searching each level for the right
...@@ -1164,9 +1162,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) ...@@ -1164,9 +1162,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
*/ */
blk->blkno = blkno; blk->blkno = blkno;
error = xfs_da_read_buf(args->trans, args->dp, blkno, error = xfs_da_read_buf(args->trans, args->dp, blkno,
mappedbno, &blk->bp, args->whichfork); -1, &blk->bp, args->whichfork);
if (!error && unlikely(state->holeok && !blk->bp))
error = XFS_ERROR(ENOATTR); /* always attr here */
if (error) { if (error) {
blk->blkno = 0; blk->blkno = 0;
state->path.active--; state->path.active--;
......
...@@ -253,7 +253,6 @@ typedef struct xfs_da_state { ...@@ -253,7 +253,6 @@ typedef struct xfs_da_state {
xfs_da_state_path_t path; /* search/split paths */ xfs_da_state_path_t path; /* search/split paths */
xfs_da_state_path_t altpath; /* alternate path for join */ xfs_da_state_path_t altpath; /* alternate path for join */
unsigned char inleaf; /* insert into 1->lf, 0->splf */ unsigned char inleaf; /* insert into 1->lf, 0->splf */
unsigned char holeok; /* T/F: can deal with a hole */
unsigned char extravalid; /* T/F: extrablk is in use */ unsigned char extravalid; /* T/F: extrablk is in use */
unsigned char extraafter; /* T/F: extrablk is after new */ unsigned char extraafter; /* T/F: extrablk is after new */
xfs_da_state_blk_t extrablk; /* for double-splits on leafs */ xfs_da_state_blk_t extrablk; /* for double-splits on leafs */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment