xfs: move the legacy xfs_attr_list to xfs_ioctl.c
The old xfs_attr_list code is only used by the attrlist by handle ioctl. Move it to xfs_ioctl.c with its user. Also move the attrlist and attrlist_ent structure to xfs_fs.h, as they are exposed user ABIs. They are used through libattr headers with the same name by at least xfsdump. Also document this relation so that it doesn't require a research project to figure out. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:

committed by
Darrick J. Wong

parent
2f014aad03
commit
3e7a779937
@@ -294,6 +294,111 @@ xfs_readlink_by_handle(
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Format an attribute and copy it out to the user's buffer.
|
||||
* Take care to check values and protect against them changing later,
|
||||
* we may be reading them directly out of a user buffer.
|
||||
*/
|
||||
static void
|
||||
xfs_ioc_attr_put_listent(
|
||||
struct xfs_attr_list_context *context,
|
||||
int flags,
|
||||
unsigned char *name,
|
||||
int namelen,
|
||||
int valuelen)
|
||||
{
|
||||
struct xfs_attrlist *alist = context->buffer;
|
||||
struct xfs_attrlist_ent *aep;
|
||||
int arraytop;
|
||||
|
||||
ASSERT(!context->seen_enough);
|
||||
ASSERT(context->count >= 0);
|
||||
ASSERT(context->count < (ATTR_MAX_VALUELEN/8));
|
||||
ASSERT(context->firstu >= sizeof(*alist));
|
||||
ASSERT(context->firstu <= context->bufsize);
|
||||
|
||||
/*
|
||||
* Only list entries in the right namespace.
|
||||
*/
|
||||
if (((context->flags & ATTR_SECURE) == 0) !=
|
||||
((flags & XFS_ATTR_SECURE) == 0))
|
||||
return;
|
||||
if (((context->flags & ATTR_ROOT) == 0) !=
|
||||
((flags & XFS_ATTR_ROOT) == 0))
|
||||
return;
|
||||
|
||||
arraytop = sizeof(*alist) +
|
||||
context->count * sizeof(alist->al_offset[0]);
|
||||
|
||||
/* decrement by the actual bytes used by the attr */
|
||||
context->firstu -= round_up(offsetof(struct xfs_attrlist_ent, a_name) +
|
||||
namelen + 1, sizeof(uint32_t));
|
||||
if (context->firstu < arraytop) {
|
||||
trace_xfs_attr_list_full(context);
|
||||
alist->al_more = 1;
|
||||
context->seen_enough = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
aep = context->buffer + context->firstu;
|
||||
aep->a_valuelen = valuelen;
|
||||
memcpy(aep->a_name, name, namelen);
|
||||
aep->a_name[namelen] = 0;
|
||||
alist->al_offset[context->count++] = context->firstu;
|
||||
alist->al_count = context->count;
|
||||
trace_xfs_attr_list_add(context);
|
||||
}
|
||||
|
||||
int
|
||||
xfs_ioc_attr_list(
|
||||
struct xfs_inode *dp,
|
||||
char *buffer,
|
||||
int bufsize,
|
||||
int flags,
|
||||
struct attrlist_cursor_kern *cursor)
|
||||
{
|
||||
struct xfs_attr_list_context context;
|
||||
struct xfs_attrlist *alist;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Validate the cursor.
|
||||
*/
|
||||
if (cursor->pad1 || cursor->pad2)
|
||||
return -EINVAL;
|
||||
if ((cursor->initted == 0) &&
|
||||
(cursor->hashval || cursor->blkno || cursor->offset))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Check for a properly aligned buffer.
|
||||
*/
|
||||
if (((long)buffer) & (sizeof(int)-1))
|
||||
return -EFAULT;
|
||||
|
||||
/*
|
||||
* Initialize the output buffer.
|
||||
*/
|
||||
memset(&context, 0, sizeof(context));
|
||||
context.dp = dp;
|
||||
context.cursor = cursor;
|
||||
context.resynch = 1;
|
||||
context.flags = flags;
|
||||
context.buffer = buffer;
|
||||
context.bufsize = (bufsize & ~(sizeof(int)-1)); /* align */
|
||||
context.firstu = context.bufsize;
|
||||
context.put_listent = xfs_ioc_attr_put_listent;
|
||||
|
||||
alist = context.buffer;
|
||||
alist->al_count = 0;
|
||||
alist->al_more = 0;
|
||||
alist->al_offset[0] = context.bufsize;
|
||||
|
||||
error = xfs_attr_list_int(&context);
|
||||
ASSERT(error <= 0);
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_attrlist_by_handle(
|
||||
struct file *parfilp,
|
||||
@@ -310,7 +415,7 @@ xfs_attrlist_by_handle(
|
||||
return -EPERM;
|
||||
if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t)))
|
||||
return -EFAULT;
|
||||
if (al_hreq.buflen < sizeof(struct attrlist) ||
|
||||
if (al_hreq.buflen < sizeof(struct xfs_attrlist) ||
|
||||
al_hreq.buflen > XFS_XATTR_LIST_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -331,7 +436,7 @@ xfs_attrlist_by_handle(
|
||||
goto out_dput;
|
||||
|
||||
cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
|
||||
error = xfs_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen,
|
||||
error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen,
|
||||
al_hreq.flags, cursor);
|
||||
if (error)
|
||||
goto out_kfree;
|
||||
|
Reference in New Issue
Block a user