From patchwork Fri Feb 21 14:11:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396675 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CD16C1580 for ; Fri, 21 Feb 2020 14:11:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A04C324672 for ; Fri, 21 Feb 2020 14:11:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="D/MOFX3X" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728344AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59268 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728455AbgBUOLz (ORCPT ); Fri, 21 Feb 2020 09:11:55 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=4mPP/ff5n2vZ4KoU4urQYSn7o751n+nX5PbXfXPmoHg=; b=D/MOFX3XdXyHG/j145TBkiaeQK T12BMv9/WF6Hp9iVtMOsuDBeGegCakfb9JpudvmnxJqemkupGt4ZjvZmFRWccLTzk6iI1TWauFV7f Ln+HBo7Km7n9I2g2JSagQ0/rDItgLrR/mppvgZzY+aMZat3c/0ejdaD+r/oX9FCrHBoy0uCqF1DeS P1DVWJMjXzEywg/Vf3jHkD+ot1QjMEsNJU/KUOyme6aE1o3SgJxdaqH40VrC8zW4OmF+8LlC/7KTt 4w1ptfbr3kAOSuBJ+AvvdQlbCw29+qZN1PlYPgDF40/Lz5ptbnuUn2yAqJPJnB040MfkimOVTNflJ N3URErQg==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5923-0000GB-3w; Fri, 21 Feb 2020 14:11:55 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 01/31] xfs: reject invalid flags combinations in XFS_IOC_ATTRLIST_BY_HANDLE Date: Fri, 21 Feb 2020 06:11:24 -0800 Message-Id: <20200221141154.476496-2-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org While the flags field in the ABI and the on-disk format allows for multiple namespace flags, an attribute can only exist in a single namespace at a time. Hence asking to list attributes that exist in multiple namespaces simultaneously is a logically invalid request and will return no results. Reject this case early with -EINVAL. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 2 ++ fs/xfs/xfs_ioctl32.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index d42de92cb283..d974bf099d45 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -317,6 +317,8 @@ xfs_attrlist_by_handle( */ if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) return -EINVAL; + if (al_hreq.flags == (ATTR_ROOT | ATTR_SECURE)) + return -EINVAL; dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 769581a79c58..9705172e5410 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -375,6 +375,8 @@ xfs_compat_attrlist_by_handle( */ if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) return -EINVAL; + if (al_hreq.flags == (ATTR_ROOT | ATTR_SECURE)) + return -EINVAL; dentry = xfs_compat_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) From patchwork Fri Feb 21 14:11:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396673 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 973541395 for ; Fri, 21 Feb 2020 14:11:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 75E3024650 for ; Fri, 21 Feb 2020 14:11:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="jLJb46Ov" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728550AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59264 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728344AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=HAXvMDQU3TN68Ba15rDR3f31NuZKIhqeopocktkehpg=; b=jLJb46OvMrIWMnukvJ2yS8cI94 RNjM6no2UAopZDFjjngJ+946CRc44CL0Qx/xpPs9HXtYaPAFZlx/zX/wzjqlNmqsWew5ExEtiB1Ok M5UrI//YqrdAcm+wHtW8qZao+TOlpkCmp8I8NPG1E3LdSmMXtzXufIw3upfcbhz93Lr3iIzjbqfnN +Q7Hw0EoS668DcoGH0CBDS4Ox9FKTCCsLErTqFwjEKowq9224X8xg41aYHy+B12Y0arjby2PkfgkM 6HgiRZ1gaPKfyYz/RJ5FHZj36Lbn1q0e49ce1C3dcltwlMqy7x7l5Z9GVega3R04nw/o/QtDO6rCQ I1BVvygQ==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5923-0000GE-9z; Fri, 21 Feb 2020 14:11:55 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , "Darrick J . Wong" Subject: [PATCH 02/31] xfs: remove the ATTR_INCOMPLETE flag Date: Fri, 21 Feb 2020 06:11:25 -0800 Message-Id: <20200221141154.476496-3-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Replace the ATTR_INCOMPLETE flag with a new boolean field in struct xfs_attr_list_context. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 5 ++--- fs/xfs/scrub/attr.c | 2 +- fs/xfs/xfs_attr_list.c | 8 ++------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 4243b2272642..71bcf1298e4c 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -36,11 +36,10 @@ struct xfs_attr_list_context; #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */ -#define ATTR_INCOMPLETE 0x4000 /* [kernel] return INCOMPLETE attr keys */ #define ATTR_ALLOC 0x8000 /* [kernel] allocate xattr buffer on demand */ #define ATTR_KERNEL_FLAGS \ - (ATTR_KERNOTIME | ATTR_KERNOVAL | ATTR_INCOMPLETE | ATTR_ALLOC) + (ATTR_KERNOTIME | ATTR_KERNOVAL | ATTR_ALLOC) #define XFS_ATTR_FLAGS \ { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ @@ -51,7 +50,6 @@ struct xfs_attr_list_context; { ATTR_REPLACE, "REPLACE" }, \ { ATTR_KERNOTIME, "KERNOTIME" }, \ { ATTR_KERNOVAL, "KERNOVAL" }, \ - { ATTR_INCOMPLETE, "INCOMPLETE" }, \ { ATTR_ALLOC, "ALLOC" } /* @@ -123,6 +121,7 @@ typedef struct xfs_attr_list_context { * error values to the xfs_attr_list caller. */ int seen_enough; + bool allow_incomplete; ssize_t count; /* num used entries */ int dupcnt; /* count dup hashvals seen */ diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index d9f0dd444b80..d804558cdbca 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -497,7 +497,7 @@ xchk_xattr( sx.context.resynch = 1; sx.context.put_listent = xchk_xattr_listent; sx.context.tp = sc->tp; - sx.context.flags = ATTR_INCOMPLETE; + sx.context.allow_incomplete = true; sx.sc = sc; /* diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index d37743bdf274..f7c4f6b9749a 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -452,8 +452,8 @@ xfs_attr3_leaf_list_int( } if ((entry->flags & XFS_ATTR_INCOMPLETE) && - !(context->flags & ATTR_INCOMPLETE)) - continue; /* skip incomplete entries */ + !context->allow_incomplete) + continue; if (entry->flags & XFS_ATTR_LOCAL) { xfs_attr_leaf_name_local_t *name_loc; @@ -632,10 +632,6 @@ xfs_attr_list( (cursor->hashval || cursor->blkno || cursor->offset)) return -EINVAL; - /* Only internal consumers can retrieve incomplete attrs. */ - if (flags & ATTR_INCOMPLETE) - return -EINVAL; - /* * Check for a properly aligned buffer. */ From patchwork Fri Feb 21 14:11:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396677 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 203E4930 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D64E124672 for ; Fri, 21 Feb 2020 14:11:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ArokZjit" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728583AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59258 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727851AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=sGCmx40qH6mh36PCj7qMMVQ173hYYfpyj5PT25Z7dsg=; b=ArokZjit5wVNRhNZty1JW5HPZR hNalMsuW0WQVA54IpvCaLIs3xImB8ZXP5Y70JAOrhfgh1+cJbgiH6S6b8f3v1pyyZEMGNDmvK7WAY zSatAtFSfQUihxS5+VH7YL5PhPM0+FeAUEAa7wmQOItxsrFApuK0nKzXfWRPYzc/99QA5/BxcZZiB a8m/82kRaGxq4znrM5uhkZfaaV3AKK7iYHOVzoSeUleWagjqMJHTJXhtwR9NB6lt5W7YgEBBJeNRE JyGVhSl7CQNrdj46qDrQ8ZoPIZSBDWrvgMLCkR9TbRAG9Hi7ukFqokAXqjJMvnTX+Q3q5ucSFlPQm L2QT03Ew==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5923-0000GH-GG; Fri, 21 Feb 2020 14:11:55 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra Subject: [PATCH 03/31] xfs: merge xfs_attr_remove into xfs_attr_set Date: Fri, 21 Feb 2020 06:11:26 -0800 Message-Id: <20200221141154.476496-4-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The Linux xattr and acl APIs use a single call for set and remove. Modify the high-level XFS API to match that and let xfs_attr_set handle removing attributes as well. With a little bit of reordering this removes a lot of code. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 178 ++++++++++++++------------------------- fs/xfs/libxfs/xfs_attr.h | 2 - fs/xfs/xfs_acl.c | 33 +++----- fs/xfs/xfs_ioctl.c | 4 +- fs/xfs/xfs_xattr.c | 9 +- 5 files changed, 77 insertions(+), 149 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index e6149720ce02..bb391b96cd78 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -336,6 +336,10 @@ xfs_attr_remove_args( return error; } +/* + * Note: If value is NULL the attribute will be removed, just like the + * Linux ->setattr API. + */ int xfs_attr_set( struct xfs_inode *dp, @@ -350,149 +354,92 @@ xfs_attr_set( struct xfs_trans_res tres; int rsvd = (flags & ATTR_ROOT) != 0; int error, local; - - XFS_STATS_INC(mp, xs_attr_set); + unsigned int total; if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return -EIO; - error = xfs_attr_args_init(&args, dp, name, namelen, flags); - if (error) - return error; - - args.value = value; - args.valuelen = valuelen; - args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; - args.total = xfs_attr_calc_size(&args, &local); - error = xfs_qm_dqattach(dp); if (error) return error; - /* - * If the inode doesn't have an attribute fork, add one. - * (inode must not be locked when we call this routine) - */ - if (XFS_IFORK_Q(dp) == 0) { - int sf_size = sizeof(xfs_attr_sf_hdr_t) + - XFS_ATTR_SF_ENTSIZE_BYNAME(args.namelen, valuelen); - - error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); - if (error) - return error; - } - - tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + - M_RES(mp)->tr_attrsetrt.tr_logres * args.total; - tres.tr_logcount = XFS_ATTRSET_LOG_COUNT; - tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; - - /* - * Root fork attributes can use reserved data blocks for this - * operation if necessary - */ - error = xfs_trans_alloc(mp, &tres, args.total, 0, - rsvd ? XFS_TRANS_RESERVE : 0, &args.trans); + error = xfs_attr_args_init(&args, dp, name, namelen, flags); if (error) return error; - xfs_ilock(dp, XFS_ILOCK_EXCL); - error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0, - rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : - XFS_QMOPT_RES_REGBLKS); - if (error) - goto out_trans_cancel; - - xfs_trans_ijoin(args.trans, dp, 0); - error = xfs_attr_set_args(&args); - if (error) - goto out_trans_cancel; - if (!args.trans) { - /* shortform attribute has already been committed */ - goto out_unlock; - } - - /* - * If this is a synchronous mount, make sure that the - * transaction goes to disk before returning to the user. - */ - if (mp->m_flags & XFS_MOUNT_WSYNC) - xfs_trans_set_sync(args.trans); - - if ((flags & ATTR_KERNOTIME) == 0) - xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + args.value = value; + args.valuelen = valuelen; /* - * Commit the last in the sequence of transactions. + * We have no control over the attribute names that userspace passes us + * to remove, so we have to allow the name lookup prior to attribute + * removal to fail as well. */ - xfs_trans_log_inode(args.trans, dp, XFS_ILOG_CORE); - error = xfs_trans_commit(args.trans); -out_unlock: - xfs_iunlock(dp, XFS_ILOCK_EXCL); - return error; - -out_trans_cancel: - if (args.trans) - xfs_trans_cancel(args.trans); - goto out_unlock; -} + args.op_flags = XFS_DA_OP_OKNOENT; -/* - * Generic handler routine to remove a name from an attribute list. - * Transitions attribute list from Btree to shortform as necessary. - */ -int -xfs_attr_remove( - struct xfs_inode *dp, - const unsigned char *name, - size_t namelen, - int flags) -{ - struct xfs_mount *mp = dp->i_mount; - struct xfs_da_args args; - int error; + if (value) { + XFS_STATS_INC(mp, xs_attr_set); - XFS_STATS_INC(mp, xs_attr_remove); + args.op_flags |= XFS_DA_OP_ADDNAME; + args.total = xfs_attr_calc_size(&args, &local); - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return -EIO; + /* + * If the inode doesn't have an attribute fork, add one. + * (inode must not be locked when we call this routine) + */ + if (XFS_IFORK_Q(dp) == 0) { + int sf_size = sizeof(struct xfs_attr_sf_hdr) + + XFS_ATTR_SF_ENTSIZE_BYNAME(args.namelen, + valuelen); - error = xfs_attr_args_init(&args, dp, name, namelen, flags); - if (error) - return error; + error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); + if (error) + return error; + } - /* - * we have no control over the attribute names that userspace passes us - * to remove, so we have to allow the name lookup prior to attribute - * removal to fail. - */ - args.op_flags = XFS_DA_OP_OKNOENT; + tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + + M_RES(mp)->tr_attrsetrt.tr_logres * args.total; + tres.tr_logcount = XFS_ATTRSET_LOG_COUNT; + tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; + total = args.total; + } else { + XFS_STATS_INC(mp, xs_attr_remove); - error = xfs_qm_dqattach(dp); - if (error) - return error; + tres = M_RES(mp)->tr_attrrm; + total = XFS_ATTRRM_SPACE_RES(mp); + } /* * Root fork attributes can use reserved data blocks for this * operation if necessary */ - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_attrrm, - XFS_ATTRRM_SPACE_RES(mp), 0, - (flags & ATTR_ROOT) ? XFS_TRANS_RESERVE : 0, - &args.trans); + error = xfs_trans_alloc(mp, &tres, total, 0, + rsvd ? XFS_TRANS_RESERVE : 0, &args.trans); if (error) return error; xfs_ilock(dp, XFS_ILOCK_EXCL); - /* - * No need to make quota reservations here. We expect to release some - * blocks not allocate in the common case. - */ xfs_trans_ijoin(args.trans, dp, 0); + if (value) { + unsigned int quota_flags = XFS_QMOPT_RES_REGBLKS; - error = xfs_attr_remove_args(&args); - if (error) - goto out; + if (rsvd) + quota_flags |= XFS_QMOPT_FORCE_RES; + error = xfs_trans_reserve_quota_nblks(args.trans, dp, + args.total, 0, quota_flags); + if (error) + goto out_trans_cancel; + error = xfs_attr_set_args(&args); + if (error) + goto out_trans_cancel; + /* shortform attribute has already been committed */ + if (!args.trans) + goto out_unlock; + } else { + error = xfs_attr_remove_args(&args); + if (error) + goto out_trans_cancel; + } /* * If this is a synchronous mount, make sure that the @@ -509,15 +456,14 @@ xfs_attr_remove( */ xfs_trans_log_inode(args.trans, dp, XFS_ILOG_CORE); error = xfs_trans_commit(args.trans); +out_unlock: xfs_iunlock(dp, XFS_ILOCK_EXCL); - return error; -out: +out_trans_cancel: if (args.trans) xfs_trans_cancel(args.trans); - xfs_iunlock(dp, XFS_ILOCK_EXCL); - return error; + goto out_unlock; } /*======================================================================== diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 71bcf1298e4c..db58a6c7dea5 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -152,8 +152,6 @@ int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name, int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name, size_t namelen, unsigned char *value, int valuelen, int flags); int xfs_attr_set_args(struct xfs_da_args *args); -int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, - size_t namelen, int flags); int xfs_attr_remove_args(struct xfs_da_args *args); int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, int flags, struct attrlist_cursor_kern *cursor); diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index cd743fad8478..4e76063ff956 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -168,6 +168,8 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) { struct xfs_inode *ip = XFS_I(inode); unsigned char *ea_name; + struct xfs_acl *xfs_acl = NULL; + int len = 0; int error; switch (type) { @@ -184,9 +186,7 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) } if (acl) { - struct xfs_acl *xfs_acl; - int len = XFS_ACL_MAX_SIZE(ip->i_mount); - + len = XFS_ACL_MAX_SIZE(ip->i_mount); xfs_acl = kmem_zalloc_large(len, 0); if (!xfs_acl) return -ENOMEM; @@ -196,26 +196,17 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) /* subtract away the unused acl entries */ len -= sizeof(struct xfs_acl_entry) * (XFS_ACL_MAX_ENTRIES(ip->i_mount) - acl->a_count); - - error = xfs_attr_set(ip, ea_name, strlen(ea_name), - (unsigned char *)xfs_acl, len, ATTR_ROOT); - - kmem_free(xfs_acl); - } else { - /* - * A NULL ACL argument means we want to remove the ACL. - */ - error = xfs_attr_remove(ip, ea_name, - strlen(ea_name), - ATTR_ROOT); - - /* - * If the attribute didn't exist to start with that's fine. - */ - if (error == -ENOATTR) - error = 0; } + error = xfs_attr_set(ip, ea_name, strlen(ea_name), + (unsigned char *)xfs_acl, len, ATTR_ROOT); + kmem_free(xfs_acl); + + /* + * If the attribute didn't exist to start with that's fine. + */ + if (!acl && error == -ENOATTR) + error = 0; if (!error) set_cached_acl(inode, type, acl); return error; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index d974bf099d45..79c418888e9a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -417,12 +417,10 @@ xfs_attrmulti_attr_remove( uint32_t flags) { int error; - size_t namelen; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) return -EPERM; - namelen = strlen(name); - error = xfs_attr_remove(XFS_I(inode), name, namelen, flags); + error = xfs_attr_set(XFS_I(inode), name, strlen(name), NULL, 0, flags); if (!error) xfs_forget_acl(inode, name, flags); return error; diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index b0fedb543f97..1670bfbc9ad2 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -69,7 +69,6 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, int xflags = handler->flags; struct xfs_inode *ip = XFS_I(inode); int error; - size_t namelen = strlen(name); /* Convert Linux syscall to XFS internal ATTR flags */ if (flags & XATTR_CREATE) @@ -77,14 +76,10 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, if (flags & XATTR_REPLACE) xflags |= ATTR_REPLACE; - if (value) - error = xfs_attr_set(ip, name, namelen, (void *)value, size, - xflags); - else - error = xfs_attr_remove(ip, name, namelen, xflags); + error = xfs_attr_set(ip, (unsigned char *)name, strlen(name), + (void *)value, size, xflags); if (!error) xfs_forget_acl(inode, name, xflags); - return error; } From patchwork Fri Feb 21 14:11:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396679 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 54B3618EC for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 296F924672 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="TPwX9Uc5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727851AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59270 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728468AbgBUOLz (ORCPT ); Fri, 21 Feb 2020 09:11:55 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=ZLSTyaD86BzxjIuGrq6X2EkTrTChBEZATy+GTQ7mr9E=; b=TPwX9Uc5EYTLEj2NPYf6F0F5xl dP2ShHhVnlZZOmK5QaFaU7CN8IKvgABncp/zZkFay0JrGbzeA35Jf464WHgeESA4wF3QWZIVtWtag hLw35ZGUDbSIFypGXJVPWhhAGkFD3CC32r7mINN/uzYyNK3zfasvaW33BiF3/TQLdPXL9ONLZSSqh b1VLfo+2lUuiIjItG/aOg1wp9rVByPde7stXN/22ALnnyd1ftz1dOch12gIolVGzNwKKmEYhoOmNr 0cyxA2KUBQrAF2rTs80CNtU3ZDcVnYynfVraX2HJc+L31BzVpm3mvfSInYAr7AUXwtArOi/pGW6t0 E1IMoyPw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5923-0000GK-Nn; Fri, 21 Feb 2020 14:11:55 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 04/31] xfs: merge xfs_attrmulti_attr_remove into xfs_attrmulti_attr_set Date: Fri, 21 Feb 2020 06:11:27 -0800 Message-Id: <20200221141154.476496-5-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Merge the ioctl handlers just like the low-level xfs_attr_set function. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 34 ++++++++++------------------------ fs/xfs/xfs_ioctl.h | 6 ------ fs/xfs/xfs_ioctl32.c | 4 ++-- 3 files changed, 12 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 79c418888e9a..b806003caacd 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -389,18 +389,20 @@ xfs_attrmulti_attr_set( uint32_t len, uint32_t flags) { - unsigned char *kbuf; + unsigned char *kbuf = NULL; int error; size_t namelen; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) return -EPERM; - if (len > XFS_XATTR_SIZE_MAX) - return -EINVAL; - kbuf = memdup_user(ubuf, len); - if (IS_ERR(kbuf)) - return PTR_ERR(kbuf); + if (ubuf) { + if (len > XFS_XATTR_SIZE_MAX) + return -EINVAL; + kbuf = memdup_user(ubuf, len); + if (IS_ERR(kbuf)) + return PTR_ERR(kbuf); + } namelen = strlen(name); error = xfs_attr_set(XFS_I(inode), name, namelen, kbuf, len, flags); @@ -410,22 +412,6 @@ xfs_attrmulti_attr_set( return error; } -int -xfs_attrmulti_attr_remove( - struct inode *inode, - unsigned char *name, - uint32_t flags) -{ - int error; - - if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) - return -EPERM; - error = xfs_attr_set(XFS_I(inode), name, strlen(name), NULL, 0, flags); - if (!error) - xfs_forget_acl(inode, name, flags); - return error; -} - STATIC int xfs_attrmulti_by_handle( struct file *parfilp, @@ -504,8 +490,8 @@ xfs_attrmulti_by_handle( ops[i].am_error = mnt_want_write_file(parfilp); if (ops[i].am_error) break; - ops[i].am_error = xfs_attrmulti_attr_remove( - d_inode(dentry), attr_name, + ops[i].am_error = xfs_attrmulti_attr_set( + d_inode(dentry), attr_name, NULL, 0, ops[i].am_flags); mnt_drop_write_file(parfilp); break; diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index 420bd95dc326..819504df00ae 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -46,12 +46,6 @@ xfs_attrmulti_attr_set( uint32_t len, uint32_t flags); -extern int -xfs_attrmulti_attr_remove( - struct inode *inode, - unsigned char *name, - uint32_t flags); - extern struct dentry * xfs_handle_to_dentry( struct file *parfilp, diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 9705172e5410..e085f304e539 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -488,8 +488,8 @@ xfs_compat_attrmulti_by_handle( ops[i].am_error = mnt_want_write_file(parfilp); if (ops[i].am_error) break; - ops[i].am_error = xfs_attrmulti_attr_remove( - d_inode(dentry), attr_name, + ops[i].am_error = xfs_attrmulti_attr_set( + d_inode(dentry), attr_name, NULL, 0, ops[i].am_flags); mnt_drop_write_file(parfilp); break; From patchwork Fri Feb 21 14:11:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396681 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8F0AD1580 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6450124672 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="oISCLMn5" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728468AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59276 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728544AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=EgAi2LtKqXxJAYdGNdwr2FlEG8DmEKp3kYxQUgZNvF4=; b=oISCLMn5FC9y0l1rwGh3hQie2q P/AE9t5ubuGTRtWHI21NSHCB1BDySfxNKCqkXEhQCt+Wmg3h0zBJQjZqLNzuUcMBYtIHJdf78QNAy g3qLkzn0J/ZznCl2+tdypDP0oxUorypYFCAWiaHkhj2LHtLZxjrT6UnK4Fh38kCYfLCG2DCY3bvT3 q7RAF6WOCWBV6f7TNrMmHGd2x30fzdwPR6gMmG0B7PySaAe0emlUOe9dFGOM61kAD1T9bwe4Qgsd5 zTYxjQaYT0ZO3iC1NcfCrvFNvuU/I++1h8Myo5PgX9j6nmIrkXyLqHGC4nyIKFZQ7tWYsmejf8nUS 4nv8xSrA==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5923-0000GV-Uz; Fri, 21 Feb 2020 14:11:55 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 05/31] xfs: use strndup_user in XFS_IOC_ATTRMULTI_BY_HANDLE Date: Fri, 21 Feb 2020 06:11:28 -0800 Message-Id: <20200221141154.476496-6-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Simplify the user copy code by using strndup_user. This means that we now do one memory allocation per operation instead of one per ioctl, but memory allocations are cheap compared to the actual file system operations. Also the error for an invalid path is now EINVAL or EFAULT instead of the previous odd and undocumented ERANGE. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 17 +++++------------ fs/xfs/xfs_ioctl32.c | 17 +++++------------ 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index b806003caacd..bb490a954c0b 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -448,11 +448,6 @@ xfs_attrmulti_by_handle( goto out_dput; } - error = -ENOMEM; - attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); - if (!attr_name) - goto out_kfree_ops; - error = 0; for (i = 0; i < am_hreq.opcount; i++) { if ((ops[i].am_flags & ATTR_ROOT) && @@ -462,12 +457,11 @@ xfs_attrmulti_by_handle( } ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; - ops[i].am_error = strncpy_from_user((char *)attr_name, - ops[i].am_attrname, MAXNAMELEN); - if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) - error = -ERANGE; - if (ops[i].am_error < 0) + attr_name = strndup_user(ops[i].am_attrname, MAXNAMELEN); + if (IS_ERR(attr_name)) { + ops[i].am_error = PTR_ERR(attr_name); break; + } switch (ops[i].am_opcode) { case ATTR_OP_GET: @@ -498,13 +492,12 @@ xfs_attrmulti_by_handle( default: ops[i].am_error = -EINVAL; } + kfree(attr_name); } if (copy_to_user(am_hreq.ops, ops, size)) error = -EFAULT; - kfree(attr_name); - out_kfree_ops: kfree(ops); out_dput: dput(dentry); diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index e085f304e539..936c2f62fb6c 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -445,11 +445,6 @@ xfs_compat_attrmulti_by_handle( goto out_dput; } - error = -ENOMEM; - attr_name = kmalloc(MAXNAMELEN, GFP_KERNEL); - if (!attr_name) - goto out_kfree_ops; - error = 0; for (i = 0; i < am_hreq.opcount; i++) { if ((ops[i].am_flags & ATTR_ROOT) && @@ -459,13 +454,12 @@ xfs_compat_attrmulti_by_handle( } ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; - ops[i].am_error = strncpy_from_user((char *)attr_name, - compat_ptr(ops[i].am_attrname), + attr_name = strndup_user(compat_ptr(ops[i].am_attrname), MAXNAMELEN); - if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN) - error = -ERANGE; - if (ops[i].am_error < 0) + if (IS_ERR(attr_name)) { + ops[i].am_error = PTR_ERR(attr_name); break; + } switch (ops[i].am_opcode) { case ATTR_OP_GET: @@ -496,13 +490,12 @@ xfs_compat_attrmulti_by_handle( default: ops[i].am_error = -EINVAL; } + kfree(attr_name); } if (copy_to_user(compat_ptr(am_hreq.ops), ops, size)) error = -EFAULT; - kfree(attr_name); - out_kfree_ops: kfree(ops); out_dput: dput(dentry); From patchwork Fri Feb 21 14:11:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396683 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BD7E61892 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9C5AD24672 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="HXu/2KPT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728590AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59288 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728455AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=p+Nb+yQ/mqhlKiWlJtadc9dcaEApyHfIixSNZ5jZNvM=; b=HXu/2KPTR1CLbcjAmsmxmWzpqL dxY8F/zR6GhRMFkVi0EOwJEmanjXxGZde/6DG9oQmKbOm8Bq+Z8X+QP78m7VrUAGkOtjVEgASKRh+ 13+2kyjZX+dcD9aPZq9PxTDBcqQ4yBpvqUPHZMKJX4jUJ4eQWBFYxd6geiqsUTOtnfjY0lJtOwXUt iKy+7JHvCwChHlC8fw3DrHM3pLaGR04zNCkPs9YbBorX4AV0zYcjfqOAmldtiCbif0TjUwb9gWKrN LeTeuE00680me3zksA6xiidCdYa6XJuTucIES1QKf+WGjd1PC7JVYam/o+6wcQHlFbDtzVPEQNhKH d0MeQMhQ==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5924-0000Ga-5S; Fri, 21 Feb 2020 14:11:56 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra Subject: [PATCH 06/31] xfs: factor out a helper for a single XFS_IOC_ATTRMULTI_BY_HANDLE op Date: Fri, 21 Feb 2020 06:11:29 -0800 Message-Id: <20200221141154.476496-7-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Add a new helper to handle a single attr multi ioctl operation that can be shared between the native and compat ioctl implementation. There is a slight change in heavior in that we don't break out of the loop when copying in the attribute name fails. The previous behavior was rather inconsistent here as it continued for any other kind of error, and that we don't clear the flags in the structure returned to userspace, a behavior only introduced as a bug fix in the last merge window. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 97 +++++++++++++++++++++++--------------------- fs/xfs/xfs_ioctl.h | 18 ++------ fs/xfs/xfs_ioctl32.c | 50 +++-------------------- 3 files changed, 59 insertions(+), 106 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bb490a954c0b..b17458c8947e 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -349,7 +349,7 @@ xfs_attrlist_by_handle( return error; } -int +static int xfs_attrmulti_attr_get( struct inode *inode, unsigned char *name, @@ -381,7 +381,7 @@ xfs_attrmulti_attr_get( return error; } -int +static int xfs_attrmulti_attr_set( struct inode *inode, unsigned char *name, @@ -412,6 +412,51 @@ xfs_attrmulti_attr_set( return error; } +int +xfs_ioc_attrmulti_one( + struct file *parfilp, + struct inode *inode, + uint32_t opcode, + void __user *uname, + void __user *value, + uint32_t *len, + uint32_t flags) +{ + unsigned char *name; + int error; + + if ((flags & ATTR_ROOT) && (flags & ATTR_SECURE)) + return -EINVAL; + flags &= ~ATTR_KERNEL_FLAGS; + + name = strndup_user(uname, MAXNAMELEN); + if (IS_ERR(name)) + return PTR_ERR(name); + + switch (opcode) { + case ATTR_OP_GET: + error = xfs_attrmulti_attr_get(inode, name, value, len, flags); + break; + case ATTR_OP_REMOVE: + value = NULL; + *len = 0; + /* fall through */ + case ATTR_OP_SET: + error = mnt_want_write_file(parfilp); + if (error) + break; + error = xfs_attrmulti_attr_set(inode, name, value, *len, flags); + mnt_drop_write_file(parfilp); + break; + default: + error = -EINVAL; + break; + } + + kfree(name); + return error; +} + STATIC int xfs_attrmulti_by_handle( struct file *parfilp, @@ -422,7 +467,6 @@ xfs_attrmulti_by_handle( xfs_fsop_attrmulti_handlereq_t am_hreq; struct dentry *dentry; unsigned int i, size; - unsigned char *attr_name; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -450,49 +494,10 @@ xfs_attrmulti_by_handle( error = 0; for (i = 0; i < am_hreq.opcount; i++) { - if ((ops[i].am_flags & ATTR_ROOT) && - (ops[i].am_flags & ATTR_SECURE)) { - ops[i].am_error = -EINVAL; - continue; - } - ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; - - attr_name = strndup_user(ops[i].am_attrname, MAXNAMELEN); - if (IS_ERR(attr_name)) { - ops[i].am_error = PTR_ERR(attr_name); - break; - } - - switch (ops[i].am_opcode) { - case ATTR_OP_GET: - ops[i].am_error = xfs_attrmulti_attr_get( - d_inode(dentry), attr_name, - ops[i].am_attrvalue, &ops[i].am_length, - ops[i].am_flags); - break; - case ATTR_OP_SET: - ops[i].am_error = mnt_want_write_file(parfilp); - if (ops[i].am_error) - break; - ops[i].am_error = xfs_attrmulti_attr_set( - d_inode(dentry), attr_name, - ops[i].am_attrvalue, ops[i].am_length, - ops[i].am_flags); - mnt_drop_write_file(parfilp); - break; - case ATTR_OP_REMOVE: - ops[i].am_error = mnt_want_write_file(parfilp); - if (ops[i].am_error) - break; - ops[i].am_error = xfs_attrmulti_attr_set( - d_inode(dentry), attr_name, NULL, 0, - ops[i].am_flags); - mnt_drop_write_file(parfilp); - break; - default: - ops[i].am_error = -EINVAL; - } - kfree(attr_name); + ops[i].am_error = xfs_ioc_attrmulti_one(parfilp, + d_inode(dentry), ops[i].am_opcode, + ops[i].am_attrname, ops[i].am_attrvalue, + &ops[i].am_length, ops[i].am_flags); } if (copy_to_user(am_hreq.ops, ops, size)) diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index 819504df00ae..bb50cb3dc61f 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -30,21 +30,9 @@ xfs_readlink_by_handle( struct file *parfilp, xfs_fsop_handlereq_t *hreq); -extern int -xfs_attrmulti_attr_get( - struct inode *inode, - unsigned char *name, - unsigned char __user *ubuf, - uint32_t *len, - uint32_t flags); - -extern int -xfs_attrmulti_attr_set( - struct inode *inode, - unsigned char *name, - const unsigned char __user *ubuf, - uint32_t len, - uint32_t flags); +int xfs_ioc_attrmulti_one(struct file *parfilp, struct inode *inode, + uint32_t opcode, void __user *uname, void __user *value, + uint32_t *len, uint32_t flags); extern struct dentry * xfs_handle_to_dentry( diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 936c2f62fb6c..e1daf095c585 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -418,7 +418,6 @@ xfs_compat_attrmulti_by_handle( compat_xfs_fsop_attrmulti_handlereq_t am_hreq; struct dentry *dentry; unsigned int i, size; - unsigned char *attr_name; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -447,50 +446,11 @@ xfs_compat_attrmulti_by_handle( error = 0; for (i = 0; i < am_hreq.opcount; i++) { - if ((ops[i].am_flags & ATTR_ROOT) && - (ops[i].am_flags & ATTR_SECURE)) { - ops[i].am_error = -EINVAL; - continue; - } - ops[i].am_flags &= ~ATTR_KERNEL_FLAGS; - - attr_name = strndup_user(compat_ptr(ops[i].am_attrname), - MAXNAMELEN); - if (IS_ERR(attr_name)) { - ops[i].am_error = PTR_ERR(attr_name); - break; - } - - switch (ops[i].am_opcode) { - case ATTR_OP_GET: - ops[i].am_error = xfs_attrmulti_attr_get( - d_inode(dentry), attr_name, - compat_ptr(ops[i].am_attrvalue), - &ops[i].am_length, ops[i].am_flags); - break; - case ATTR_OP_SET: - ops[i].am_error = mnt_want_write_file(parfilp); - if (ops[i].am_error) - break; - ops[i].am_error = xfs_attrmulti_attr_set( - d_inode(dentry), attr_name, - compat_ptr(ops[i].am_attrvalue), - ops[i].am_length, ops[i].am_flags); - mnt_drop_write_file(parfilp); - break; - case ATTR_OP_REMOVE: - ops[i].am_error = mnt_want_write_file(parfilp); - if (ops[i].am_error) - break; - ops[i].am_error = xfs_attrmulti_attr_set( - d_inode(dentry), attr_name, NULL, 0, - ops[i].am_flags); - mnt_drop_write_file(parfilp); - break; - default: - ops[i].am_error = -EINVAL; - } - kfree(attr_name); + ops[i].am_error = xfs_ioc_attrmulti_one(parfilp, + d_inode(dentry), ops[i].am_opcode, + compat_ptr(ops[i].am_attrname), + compat_ptr(ops[i].am_attrvalue), + &ops[i].am_length, ops[i].am_flags); } if (copy_to_user(compat_ptr(am_hreq.ops), ops, size)) From patchwork Fri Feb 21 14:11:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396685 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F1886930 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C70A224670 for ; Fri, 21 Feb 2020 14:11:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="YzZST2sc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728626AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59294 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728590AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=2sSZWlUYu4PnEXVX9AYk32viqeXEKbTgPi2NFhbaZzE=; b=YzZST2scypCMUKF1PjEa8uyD8r r444uHTsEe3gjMo1K/x+LBNKbaslw3/TuyJJIkRy/VtFUQjOylqMTpkVSRRET8uXjoiF6/fr362Lr yfXRfPNpoKirpeYhC9agP9U6EqGbFrc96SKV9g1Lmo1bl2udNpgHc/P1i498vBS5ryEaSNJXhhtvo dcOBL/boFPGbYMVIOoimiczEPgwWDtEXUO2EcYHXWJ4q5dwcJkb3bIPKfqm5dG6D2ngQJWnJfz6ZD PfnIXL9XoyMPCaMn3eIcGwBB2mfT1yJZ8GtNcuoUAGDGu8YDvenSjQvlYeChLVCBcRzrVsn+euB78 vthOyd6Q==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5924-0000Gk-HA; Fri, 21 Feb 2020 14:11:56 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , "Darrick J . Wong" , Chandan Rajendra Subject: [PATCH 07/31] xfs: remove the name == NULL check from xfs_attr_args_init Date: Fri, 21 Feb 2020 06:11:30 -0800 Message-Id: <20200221141154.476496-8-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org All callers provide a valid name pointer, remove the redundant check. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Darrick J. Wong Reviewed-by: Chandan Rajendra --- fs/xfs/libxfs/xfs_attr.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index bb391b96cd78..a968158b9bb1 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -65,10 +65,6 @@ xfs_attr_args_init( size_t namelen, int flags) { - - if (!name) - return -EINVAL; - memset(args, 0, sizeof(*args)); args->geo = dp->i_mount->m_attr_geo; args->whichfork = XFS_ATTR_FORK; From patchwork Fri Feb 21 14:11:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396687 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 473B91580 for ; Fri, 21 Feb 2020 14:11:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C38C24650 for ; Fri, 21 Feb 2020 14:11:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ey+A4+Kw" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728687AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59298 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728544AbgBUOL4 (ORCPT ); Fri, 21 Feb 2020 09:11:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=VwReIK2Wv5hggJYXLfnABzyYc5b93fHIm+IPidvFfvE=; b=ey+A4+KwEhWaKX6mtsdQW5BXL4 hNdq+ZKB3yjAEBqXSH7Bt5lz7QIylVHj4hTly/XsqmzPuhZ6L0v8sAQYRl4x4Q/K5tJaMwY+yxIhd ip6QOHgK7zhFyxqeqNLXRDmsrtE/TpuqbPcpDFytrKf6eH3Zlf6MB4P2Ey/IzcQPoUdrCf7QUASzL sOP27sC2EL6oQZkRdzjcwzwABCzHTWGaZ02+kjwr03Y6mETdfs9RvBp1IrG6XSNYddnrnHtg+6NJo IckqdHONDs8NG8Di9NxZgIXHCI04K+gSa29zkoKS1CvL7mq38SlmuHwgkXWnWS/SAde4PFZAh8uPh 7XBAe+dg==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5924-0000Gr-NT; Fri, 21 Feb 2020 14:11:56 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 08/31] xfs: remove the MAXNAMELEN check from xfs_attr_args_init Date: Fri, 21 Feb 2020 06:11:31 -0800 Message-Id: <20200221141154.476496-9-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org All the callers already check the length when allocating the in-kernel xattrs buffers. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index a968158b9bb1..f887d62e0956 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -72,9 +72,6 @@ xfs_attr_args_init( args->flags = flags; args->name = name; args->namelen = namelen; - if (args->namelen >= MAXNAMELEN) - return -EFAULT; /* match IRIX behaviour */ - args->hashval = xfs_da_hashname(args->name, args->namelen); return 0; } From patchwork Fri Feb 21 14:11:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396691 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1766E1580 for ; Fri, 21 Feb 2020 14:11:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EB53D24650 for ; Fri, 21 Feb 2020 14:11:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="H9NuUIR7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728743AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59304 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728640AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=1rGIouOWfJ0k2OvrMCdPkMucPRPBUfqTIZwYXAa+xAo=; b=H9NuUIR7c9Wf5jiQKaGG1SbaA6 p1Xkmpargfxo9REAsUYivympKe8c6eI+gzw+RMmFNJra5WuCaXCNVJsH576IVjewb0kkOcG1GmUPK Z8q7JT7hAC/2KqMew59O4XldtKeiK9743AUraDAKZghud5OYKfFD9uchvNi0nA2j7ZwfwLaIi8Pso IgsfaXLKg1+YAMTFFJ0ZE5xSVKGCqSUBOD1e9jQt1hKfs/Z+WjawLUXH1tSX3L0CEjJRIWn5hVJWJ 6FPbxQhQln3z2fXseQ6hYI4JJq5MLkWGUFchbDvZprXbCMt7bihILSZv9OrVbJIy0xy8Hu3BnGY+C BhWv3B3A==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5924-0000Gx-U1; Fri, 21 Feb 2020 14:11:56 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , "Darrick J . Wong" Subject: [PATCH 09/31] xfs: move struct xfs_da_args to xfs_types.h Date: Fri, 21 Feb 2020 06:11:32 -0800 Message-Id: <20200221141154.476496-10-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org To allow passing a struct xfs_da_args to the high-level attr helpers it needs to be easily includable by files like xfs_xattr.c. Move the struct definition to xfs_types.h to allow for that. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_da_btree.h | 64 ------------------------------------ fs/xfs/libxfs/xfs_types.h | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 64 deletions(-) diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h index 0f4fbb0889ff..dd2f48b8ee07 100644 --- a/fs/xfs/libxfs/xfs_da_btree.h +++ b/fs/xfs/libxfs/xfs_da_btree.h @@ -36,70 +36,6 @@ struct xfs_da_geometry { size_t data_entry_offset; }; -/*======================================================================== - * Btree searching and modification structure definitions. - *========================================================================*/ - -/* - * Search comparison results - */ -enum xfs_dacmp { - XFS_CMP_DIFFERENT, /* names are completely different */ - XFS_CMP_EXACT, /* names are exactly the same */ - XFS_CMP_CASE /* names are same but differ in case */ -}; - -/* - * Structure to ease passing around component names. - */ -typedef struct xfs_da_args { - struct xfs_da_geometry *geo; /* da block geometry */ - const uint8_t *name; /* string (maybe not NULL terminated) */ - int namelen; /* length of string (maybe no NULL) */ - uint8_t filetype; /* filetype of inode for directories */ - uint8_t *value; /* set of bytes (maybe contain NULLs) */ - int valuelen; /* length of value */ - int flags; /* argument flags (eg: ATTR_NOCREATE) */ - xfs_dahash_t hashval; /* hash value of name */ - xfs_ino_t inumber; /* input/output inode number */ - struct xfs_inode *dp; /* directory inode to manipulate */ - struct xfs_trans *trans; /* current trans (changes over time) */ - xfs_extlen_t total; /* total blocks needed, for 1st bmap */ - int whichfork; /* data or attribute fork */ - xfs_dablk_t blkno; /* blkno of attr leaf of interest */ - int index; /* index of attr of interest in blk */ - xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ - int rmtblkcnt; /* remote attr value block count */ - int rmtvaluelen; /* remote attr value length in bytes */ - xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ - int index2; /* index of 2nd attr in blk */ - xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ - int rmtblkcnt2; /* remote attr value block count */ - int rmtvaluelen2; /* remote attr value length in bytes */ - int op_flags; /* operation flags */ - enum xfs_dacmp cmpresult; /* name compare result for lookups */ -} xfs_da_args_t; - -/* - * Operation flags: - */ -#define XFS_DA_OP_JUSTCHECK 0x0001 /* check for ok with no space */ -#define XFS_DA_OP_RENAME 0x0002 /* this is an atomic rename op */ -#define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ -#define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ -#define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ -#define XFS_DA_OP_ALLOCVAL 0x0020 /* lookup to alloc buffer if found */ -#define XFS_DA_OP_INCOMPLETE 0x0040 /* lookup INCOMPLETE attr keys */ - -#define XFS_DA_OP_FLAGS \ - { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \ - { XFS_DA_OP_RENAME, "RENAME" }, \ - { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ - { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ - { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \ - { XFS_DA_OP_ALLOCVAL, "ALLOCVAL" }, \ - { XFS_DA_OP_INCOMPLETE, "INCOMPLETE" } - /* * Storage for holding state during Btree searches and split/join ops. * diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 397d94775440..e2711d119665 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -175,6 +175,66 @@ enum xfs_ag_resv_type { XFS_AG_RESV_RMAPBT, }; +/* + * Dir/attr btree search comparison results. + */ +enum xfs_dacmp { + XFS_CMP_DIFFERENT, /* names are completely different */ + XFS_CMP_EXACT, /* names are exactly the same */ + XFS_CMP_CASE /* names are same but differ in case */ +}; + +/* + * Structure to ease passing around dir/attr component names. + */ +typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ + const uint8_t *name; /* string (maybe not NULL terminated) */ + int namelen; /* length of string (maybe no NULL) */ + uint8_t filetype; /* filetype of inode for directories */ + uint8_t *value; /* set of bytes (maybe contain NULLs) */ + int valuelen; /* length of value */ + int flags; /* argument flags (eg: ATTR_NOCREATE) */ + xfs_dahash_t hashval; /* hash value of name */ + xfs_ino_t inumber; /* input/output inode number */ + struct xfs_inode *dp; /* directory inode to manipulate */ + struct xfs_trans *trans; /* current trans (changes over time) */ + xfs_extlen_t total; /* total blocks needed, for 1st bmap */ + int whichfork; /* data or attribute fork */ + xfs_dablk_t blkno; /* blkno of attr leaf of interest */ + int index; /* index of attr of interest in blk */ + xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ + int rmtblkcnt; /* remote attr value block count */ + int rmtvaluelen; /* remote attr value length in bytes */ + xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ + int index2; /* index of 2nd attr in blk */ + xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ + int rmtblkcnt2; /* remote attr value block count */ + int rmtvaluelen2; /* remote attr value length in bytes */ + int op_flags; /* operation flags */ + enum xfs_dacmp cmpresult; /* name compare result for lookups */ +} xfs_da_args_t; + +/* + * Operation flags: + */ +#define XFS_DA_OP_JUSTCHECK 0x0001 /* check for ok with no space */ +#define XFS_DA_OP_RENAME 0x0002 /* this is an atomic rename op */ +#define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ +#define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ +#define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ +#define XFS_DA_OP_ALLOCVAL 0x0020 /* lookup to alloc buffer if found */ +#define XFS_DA_OP_INCOMPLETE 0x0040 /* lookup INCOMPLETE attr keys */ + +#define XFS_DA_OP_FLAGS \ + { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \ + { XFS_DA_OP_RENAME, "RENAME" }, \ + { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ + { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ + { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \ + { XFS_DA_OP_ALLOCVAL, "ALLOCVAL" }, \ + { XFS_DA_OP_INCOMPLETE, "INCOMPLETE" } + /* * Type verifier functions */ From patchwork Fri Feb 21 14:11:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396733 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6952E930 for ; Fri, 21 Feb 2020 14:12:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 440D824673 for ; Fri, 21 Feb 2020 14:12:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="NMFg0MaL" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728732AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59312 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728655AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=m8HeFaAXizYl31b/ksq1WmZhZLaXYGVVk74nK6Ib3UY=; b=NMFg0MaLFDwaisJUlJb3ppreoh BpDrbaYA0ng9v3l8/uVv6VMNKvzxFJM33TJJ9/UaWGu+fFUVJuYz8YQvdpHAbc8znDuxnD7cukWf6 7rI2DBqDJwJdP4bur4gFvT5KtZmFdsU7cLm7h1v8Hm7DgYADYCB6bJ0XAHbCw1G5hkIUtrQCviz4v Rzf9OIaop2eoLD4+tU5DHSPII5fvSGzt1mhZy0sbHCTTSIPrdk2YYZ4ayscCJKxREB6s5qDiuFALg MrQpz+c/myqK0bli6OTcj1+KOn/Ery0BVAQd/RWWjkKWjJSlaYFqT9VX1eoufJBlXxreWCWaDpLir lTXl8HsQ==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5925-0000H4-4j; Fri, 21 Feb 2020 14:11:57 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , "Darrick J . Wong" Subject: [PATCH 10/31] xfs: turn xfs_da_args.value into a void pointer Date: Fri, 21 Feb 2020 06:11:33 -0800 Message-Id: <20200221141154.476496-11-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The xattr values are blobs and should not be typed. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index e2711d119665..634814dd1d10 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -192,7 +192,7 @@ typedef struct xfs_da_args { const uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ uint8_t filetype; /* filetype of inode for directories */ - uint8_t *value; /* set of bytes (maybe contain NULLs) */ + void *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ xfs_dahash_t hashval; /* hash value of name */ From patchwork Fri Feb 21 14:11:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396689 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E1CFC930 for ; Fri, 21 Feb 2020 14:11:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B770424650 for ; Fri, 21 Feb 2020 14:11:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="Vtp/SAZ1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728740AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59322 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728715AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=zE8huY3sNwmuYSLiC53idbzRMcgu4B2vheBB+1jW7J4=; b=Vtp/SAZ1eFnV2BHWxipAblB8S+ NVNgckxui5nP3SwOIBEkVa/w7O7YIhYK7AZqgTCHlFdVYIobDDoNhtP3oznOdqElYtk+92JTIttEl +QYTOSAHVcc5q0EYbifrLyqQHKt4+HVqQ+407u93sPS3Bq1qD46iyq40SqcN5fFCzMCcTWLwrnk7P L5KuVRAmHxz/CLxY++zmEJ59xfewePhx44h8Bq42QhggDvSJnYey/PZP3GIOdrUFjwL89rEEtknf5 fMQIczZQzD6o7Jm5zLgjDY8Jl1VAsR+ULBBmWEMCzuob5NUSwL6CPqpTkhl2/B2ZIEI/yBKjVMdz2 HwIj+R0Q==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5925-0000HF-BG; Fri, 21 Feb 2020 14:11:57 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 11/31] xfs: pass an initialized xfs_da_args structure to xfs_attr_set Date: Fri, 21 Feb 2020 06:11:34 -0800 Message-Id: <20200221141154.476496-12-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Instead of converting from one style of arguments to another in xfs_attr_set, pass the structure from higher up in the call chain. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 69 ++++++++++++++++++---------------------- fs/xfs/libxfs/xfs_attr.h | 3 +- fs/xfs/xfs_acl.c | 31 +++++++++--------- fs/xfs/xfs_ioctl.c | 20 +++++++----- fs/xfs/xfs_iops.c | 13 +++++--- fs/xfs/xfs_xattr.c | 19 +++++++---- 6 files changed, 81 insertions(+), 74 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index f887d62e0956..eea6d90af276 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -330,22 +330,17 @@ xfs_attr_remove_args( } /* - * Note: If value is NULL the attribute will be removed, just like the + * Note: If args->value is NULL the attribute will be removed, just like the * Linux ->setattr API. */ int xfs_attr_set( - struct xfs_inode *dp, - const unsigned char *name, - size_t namelen, - unsigned char *value, - int valuelen, - int flags) + struct xfs_da_args *args) { + struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; - struct xfs_da_args args; struct xfs_trans_res tres; - int rsvd = (flags & ATTR_ROOT) != 0; + int rsvd = (args->flags & ATTR_ROOT) != 0; int error, local; unsigned int total; @@ -356,25 +351,22 @@ xfs_attr_set( if (error) return error; - error = xfs_attr_args_init(&args, dp, name, namelen, flags); - if (error) - return error; - - args.value = value; - args.valuelen = valuelen; + args->geo = mp->m_attr_geo; + args->whichfork = XFS_ATTR_FORK; + args->hashval = xfs_da_hashname(args->name, args->namelen); /* * We have no control over the attribute names that userspace passes us * to remove, so we have to allow the name lookup prior to attribute * removal to fail as well. */ - args.op_flags = XFS_DA_OP_OKNOENT; + args->op_flags = XFS_DA_OP_OKNOENT; - if (value) { + if (args->value) { XFS_STATS_INC(mp, xs_attr_set); - args.op_flags |= XFS_DA_OP_ADDNAME; - args.total = xfs_attr_calc_size(&args, &local); + args->op_flags |= XFS_DA_OP_ADDNAME; + args->total = xfs_attr_calc_size(args, &local); /* * If the inode doesn't have an attribute fork, add one. @@ -382,8 +374,8 @@ xfs_attr_set( */ if (XFS_IFORK_Q(dp) == 0) { int sf_size = sizeof(struct xfs_attr_sf_hdr) + - XFS_ATTR_SF_ENTSIZE_BYNAME(args.namelen, - valuelen); + XFS_ATTR_SF_ENTSIZE_BYNAME(args->namelen, + args->valuelen); error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); if (error) @@ -391,10 +383,11 @@ xfs_attr_set( } tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + - M_RES(mp)->tr_attrsetrt.tr_logres * args.total; + M_RES(mp)->tr_attrsetrt.tr_logres * + args->total; tres.tr_logcount = XFS_ATTRSET_LOG_COUNT; tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; - total = args.total; + total = args->total; } else { XFS_STATS_INC(mp, xs_attr_remove); @@ -407,29 +400,29 @@ xfs_attr_set( * operation if necessary */ error = xfs_trans_alloc(mp, &tres, total, 0, - rsvd ? XFS_TRANS_RESERVE : 0, &args.trans); + rsvd ? XFS_TRANS_RESERVE : 0, &args->trans); if (error) return error; xfs_ilock(dp, XFS_ILOCK_EXCL); - xfs_trans_ijoin(args.trans, dp, 0); - if (value) { + xfs_trans_ijoin(args->trans, dp, 0); + if (args->value) { unsigned int quota_flags = XFS_QMOPT_RES_REGBLKS; if (rsvd) quota_flags |= XFS_QMOPT_FORCE_RES; - error = xfs_trans_reserve_quota_nblks(args.trans, dp, - args.total, 0, quota_flags); + error = xfs_trans_reserve_quota_nblks(args->trans, dp, + args->total, 0, quota_flags); if (error) goto out_trans_cancel; - error = xfs_attr_set_args(&args); + error = xfs_attr_set_args(args); if (error) goto out_trans_cancel; /* shortform attribute has already been committed */ - if (!args.trans) + if (!args->trans) goto out_unlock; } else { - error = xfs_attr_remove_args(&args); + error = xfs_attr_remove_args(args); if (error) goto out_trans_cancel; } @@ -439,23 +432,23 @@ xfs_attr_set( * transaction goes to disk before returning to the user. */ if (mp->m_flags & XFS_MOUNT_WSYNC) - xfs_trans_set_sync(args.trans); + xfs_trans_set_sync(args->trans); - if ((flags & ATTR_KERNOTIME) == 0) - xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); + if ((args->flags & ATTR_KERNOTIME) == 0) + xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); /* * Commit the last in the sequence of transactions. */ - xfs_trans_log_inode(args.trans, dp, XFS_ILOG_CORE); - error = xfs_trans_commit(args.trans); + xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); + error = xfs_trans_commit(args->trans); out_unlock: xfs_iunlock(dp, XFS_ILOCK_EXCL); return error; out_trans_cancel: - if (args.trans) - xfs_trans_cancel(args.trans); + if (args->trans) + xfs_trans_cancel(args->trans); goto out_unlock; } diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index db58a6c7dea5..07ca543db831 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -149,8 +149,7 @@ int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args); int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name, size_t namelen, unsigned char **value, int *valuelenp, int flags); -int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name, - size_t namelen, unsigned char *value, int valuelen, int flags); +int xfs_attr_set(struct xfs_da_args *args); int xfs_attr_set_args(struct xfs_da_args *args); int xfs_attr_remove_args(struct xfs_da_args *args); int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 4e76063ff956..e9ae7cbe1973 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -166,41 +166,42 @@ xfs_get_acl(struct inode *inode, int type) int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) { - struct xfs_inode *ip = XFS_I(inode); - unsigned char *ea_name; - struct xfs_acl *xfs_acl = NULL; - int len = 0; - int error; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_da_args args = { + .dp = ip, + .flags = ATTR_ROOT, + }; + int error; switch (type) { case ACL_TYPE_ACCESS: - ea_name = SGI_ACL_FILE; + args.name = SGI_ACL_FILE; break; case ACL_TYPE_DEFAULT: if (!S_ISDIR(inode->i_mode)) return acl ? -EACCES : 0; - ea_name = SGI_ACL_DEFAULT; + args.name = SGI_ACL_DEFAULT; break; default: return -EINVAL; } + args.namelen = strlen(args.name); if (acl) { - len = XFS_ACL_MAX_SIZE(ip->i_mount); - xfs_acl = kmem_zalloc_large(len, 0); - if (!xfs_acl) + args.valuelen = XFS_ACL_MAX_SIZE(ip->i_mount); + args.value = kmem_zalloc_large(args.valuelen, 0); + if (!args.value) return -ENOMEM; - xfs_acl_to_disk(xfs_acl, acl); + xfs_acl_to_disk(args.value, acl); /* subtract away the unused acl entries */ - len -= sizeof(struct xfs_acl_entry) * + args.valuelen -= sizeof(struct xfs_acl_entry) * (XFS_ACL_MAX_ENTRIES(ip->i_mount) - acl->a_count); } - error = xfs_attr_set(ip, ea_name, strlen(ea_name), - (unsigned char *)xfs_acl, len, ATTR_ROOT); - kmem_free(xfs_acl); + error = xfs_attr_set(&args); + kmem_free(args.value); /* * If the attribute didn't exist to start with that's fine. diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index b17458c8947e..eb59be2ebfb0 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -389,9 +389,13 @@ xfs_attrmulti_attr_set( uint32_t len, uint32_t flags) { - unsigned char *kbuf = NULL; + struct xfs_da_args args = { + .dp = XFS_I(inode), + .flags = flags, + .name = name, + .namelen = strlen(name), + }; int error; - size_t namelen; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) return -EPERM; @@ -399,16 +403,16 @@ xfs_attrmulti_attr_set( if (ubuf) { if (len > XFS_XATTR_SIZE_MAX) return -EINVAL; - kbuf = memdup_user(ubuf, len); - if (IS_ERR(kbuf)) - return PTR_ERR(kbuf); + args.value = memdup_user(ubuf, len); + if (IS_ERR(args.value)) + return PTR_ERR(args.value); + args.valuelen = len; } - namelen = strlen(name); - error = xfs_attr_set(XFS_I(inode), name, namelen, kbuf, len, flags); + error = xfs_attr_set(&args); if (!error) xfs_forget_acl(inode, name, flags); - kfree(kbuf); + kfree(args.value); return error; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 81f2f93caec0..94cd4254656c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -50,10 +50,15 @@ xfs_initxattrs( int error = 0; for (xattr = xattr_array; xattr->name != NULL; xattr++) { - error = xfs_attr_set(ip, xattr->name, - strlen(xattr->name), - xattr->value, xattr->value_len, - ATTR_SECURE); + struct xfs_da_args args = { + .dp = ip, + .flags = ATTR_SECURE, + .name = xattr->name, + .namelen = strlen(xattr->name), + .value = xattr->value, + .valuelen = xattr->value_len, + }; + error = xfs_attr_set(&args); if (error < 0) break; } diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 1670bfbc9ad2..7c140fb93bf8 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -66,20 +66,25 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, struct inode *inode, const char *name, const void *value, size_t size, int flags) { - int xflags = handler->flags; - struct xfs_inode *ip = XFS_I(inode); + struct xfs_da_args args = { + .dp = XFS_I(inode), + .flags = handler->flags, + .name = name, + .namelen = strlen(name), + .value = (void *)value, + .valuelen = size, + }; int error; /* Convert Linux syscall to XFS internal ATTR flags */ if (flags & XATTR_CREATE) - xflags |= ATTR_CREATE; + args.flags |= ATTR_CREATE; if (flags & XATTR_REPLACE) - xflags |= ATTR_REPLACE; + args.flags |= ATTR_REPLACE; - error = xfs_attr_set(ip, (unsigned char *)name, strlen(name), - (void *)value, size, xflags); + error = xfs_attr_set(&args); if (!error) - xfs_forget_acl(inode, name, xflags); + xfs_forget_acl(inode, name, args.flags); return error; } From patchwork Fri Feb 21 14:11:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396693 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 41EB01892 for ; Fri, 21 Feb 2020 14:11:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 21E4E24653 for ; Fri, 21 Feb 2020 14:11:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="BhGidvBg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728640AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59326 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728177AbgBUOL5 (ORCPT ); Fri, 21 Feb 2020 09:11:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=YP2Zrb4X0y6hRsFdmuFqjarJBx/RRb2+4f8ZuVcOySM=; b=BhGidvBgyWYxaTj4I6U2wumq7l 0kYSpMhtqQiFQxOewIcnoF7Lk1HmALU+W2HJq22AmAdG69cpk2e1yzR2PJhw35SjSAF3BoQRrTe38 EzI0wwC9NXkA8QQHo9r5XmcpLnNcHrFRxEJEvtP6XsaCCvhS0CoPZPaik80+7Z6jOWiVPODWobdnf mY2dECzhXDhmdonCmUHgRAsXnPzhOUiMv5jvDnGKA+WVOQt6yUJBgSFdNyEQaOKUo745nGufvtTMl gMBTm92iYMlNFpznNXZVn69Km/IC7m2suJShM1QjSvogb00+qJrZ/ErJcQdR/w4LymTj6c2QMcfEO rDwPDBrA==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5925-0000HP-IS; Fri, 21 Feb 2020 14:11:57 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 12/31] xfs: pass an initialized xfs_da_args to xfs_attr_get Date: Fri, 21 Feb 2020 06:11:35 -0800 Message-Id: <20200221141154.476496-13-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Instead of converting from one style of arguments to another in xfs_attr_set, pass the structure from higher up in the call chain. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 80 ++++++++++++---------------------------- fs/xfs/libxfs/xfs_attr.h | 4 +- fs/xfs/xfs_acl.c | 35 ++++++++---------- fs/xfs/xfs_ioctl.c | 25 ++++++++----- fs/xfs/xfs_xattr.c | 24 ++++++------ 5 files changed, 68 insertions(+), 100 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index eea6d90af276..288b39e81efd 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -56,26 +56,6 @@ STATIC int xfs_attr_node_removename(xfs_da_args_t *args); STATIC int xfs_attr_fillstate(xfs_da_state_t *state); STATIC int xfs_attr_refillstate(xfs_da_state_t *state); - -STATIC int -xfs_attr_args_init( - struct xfs_da_args *args, - struct xfs_inode *dp, - const unsigned char *name, - size_t namelen, - int flags) -{ - memset(args, 0, sizeof(*args)); - args->geo = dp->i_mount->m_attr_geo; - args->whichfork = XFS_ATTR_FORK; - args->dp = dp; - args->flags = flags; - args->name = name; - args->namelen = namelen; - args->hashval = xfs_da_hashname(args->name, args->namelen); - return 0; -} - int xfs_inode_hasattr( struct xfs_inode *ip) @@ -115,15 +95,15 @@ xfs_attr_get_ilocked( /* * Retrieve an extended attribute by name, and its value if requested. * - * If ATTR_KERNOVAL is set in @flags, then the caller does not want the value, - * just an indication whether the attribute exists and the size of the value if - * it exists. The size is returned in @valuelenp, + * If ATTR_KERNOVAL is set in args->flags, then the caller does not want the + * value, just an indication whether the attribute exists and the size of the + * value if it exists. The size is returned in args.valuelen. * * If the attribute is found, but exceeds the size limit set by the caller in - * @valuelenp, return -ERANGE with the size of the attribute that was found in - * @valuelenp. + * args->valuelen, return -ERANGE with the size of the attribute that was found + * in args->valuelen. * - * If ATTR_ALLOC is set in @flags, allocate the buffer for the value after + * If ATTR_ALLOC is set in args->flags, allocate the buffer for the value after * existence of the attribute has been determined. On success, return that * buffer to the caller and leave them to free it. On failure, free any * allocated buffer and ensure the buffer pointer returned to the caller is @@ -131,51 +111,37 @@ xfs_attr_get_ilocked( */ int xfs_attr_get( - struct xfs_inode *ip, - const unsigned char *name, - size_t namelen, - unsigned char **value, - int *valuelenp, - int flags) + struct xfs_da_args *args) { - struct xfs_da_args args; uint lock_mode; int error; - ASSERT((flags & (ATTR_ALLOC | ATTR_KERNOVAL)) || *value); + ASSERT((args->flags & (ATTR_ALLOC | ATTR_KERNOVAL)) || args->value); - XFS_STATS_INC(ip->i_mount, xs_attr_get); + XFS_STATS_INC(args->dp->i_mount, xs_attr_get); - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + if (XFS_FORCED_SHUTDOWN(args->dp->i_mount)) return -EIO; - error = xfs_attr_args_init(&args, ip, name, namelen, flags); - if (error) - return error; + args->geo = args->dp->i_mount->m_attr_geo; + args->whichfork = XFS_ATTR_FORK; + args->hashval = xfs_da_hashname(args->name, args->namelen); /* Entirely possible to look up a name which doesn't exist */ - args.op_flags = XFS_DA_OP_OKNOENT; - if (flags & ATTR_ALLOC) - args.op_flags |= XFS_DA_OP_ALLOCVAL; - else - args.value = *value; - args.valuelen = *valuelenp; + args->op_flags = XFS_DA_OP_OKNOENT; + if (args->flags & ATTR_ALLOC) + args->op_flags |= XFS_DA_OP_ALLOCVAL; - lock_mode = xfs_ilock_attr_map_shared(ip); - error = xfs_attr_get_ilocked(ip, &args); - xfs_iunlock(ip, lock_mode); - *valuelenp = args.valuelen; + lock_mode = xfs_ilock_attr_map_shared(args->dp); + error = xfs_attr_get_ilocked(args->dp, args); + xfs_iunlock(args->dp, lock_mode); /* on error, we have to clean up allocated value buffers */ - if (error) { - if (flags & ATTR_ALLOC) { - kmem_free(args.value); - *value = NULL; - } - return error; + if (error && (args->flags & ATTR_ALLOC)) { + kmem_free(args->value); + args->value = NULL; } - *value = args.value; - return 0; + return error; } /* diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 07ca543db831..be77d13a2902 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -146,9 +146,7 @@ int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *); int xfs_attr_list_int(struct xfs_attr_list_context *); int xfs_inode_hasattr(struct xfs_inode *ip); int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args); -int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name, - size_t namelen, unsigned char **value, int *valuelenp, - int flags); +int xfs_attr_get(struct xfs_da_args *args); int xfs_attr_set(struct xfs_da_args *args); int xfs_attr_set_args(struct xfs_da_args *args); int xfs_attr_remove_args(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index e9ae7cbe1973..780924984492 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -120,34 +120,31 @@ xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl) struct posix_acl * xfs_get_acl(struct inode *inode, int type) { - struct xfs_inode *ip = XFS_I(inode); - struct posix_acl *acl = NULL; - struct xfs_acl *xfs_acl = NULL; - unsigned char *ea_name; - int error; - int len; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + struct posix_acl *acl = NULL; + struct xfs_da_args args = { + .dp = ip, + .flags = ATTR_ALLOC | ATTR_ROOT, + .valuelen = XFS_ACL_MAX_SIZE(mp), + }; + int error; trace_xfs_get_acl(ip); switch (type) { case ACL_TYPE_ACCESS: - ea_name = SGI_ACL_FILE; + args.name = SGI_ACL_FILE; break; case ACL_TYPE_DEFAULT: - ea_name = SGI_ACL_DEFAULT; + args.name = SGI_ACL_DEFAULT; break; default: BUG(); } + args.namelen = strlen(args.name); - /* - * If we have a cached ACLs value just return it, not need to - * go out to the disk. - */ - len = XFS_ACL_MAX_SIZE(ip->i_mount); - error = xfs_attr_get(ip, ea_name, strlen(ea_name), - (unsigned char **)&xfs_acl, &len, - ATTR_ALLOC | ATTR_ROOT); + error = xfs_attr_get(&args); if (error) { /* * If the attribute doesn't exist make sure we have a negative @@ -156,9 +153,9 @@ xfs_get_acl(struct inode *inode, int type) if (error != -ENOATTR) acl = ERR_PTR(error); } else { - acl = xfs_acl_from_disk(ip->i_mount, xfs_acl, len, - XFS_ACL_MAX_ENTRIES(ip->i_mount)); - kmem_free(xfs_acl); + acl = xfs_acl_from_disk(mp, args.value, args.valuelen, + XFS_ACL_MAX_ENTRIES(mp)); + kmem_free(args.value); } return acl; } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index eb59be2ebfb0..ce393a97c85c 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -357,27 +357,32 @@ xfs_attrmulti_attr_get( uint32_t *len, uint32_t flags) { - unsigned char *kbuf; - int error = -EFAULT; - size_t namelen; + struct xfs_da_args args = { + .dp = XFS_I(inode), + .flags = flags, + .name = name, + .namelen = strlen(name), + .valuelen = *len, + }; + int error; if (*len > XFS_XATTR_SIZE_MAX) return -EINVAL; - kbuf = kmem_zalloc_large(*len, 0); - if (!kbuf) + + args.value = kmem_zalloc_large(*len, 0); + if (!args.value) return -ENOMEM; - namelen = strlen(name); - error = xfs_attr_get(XFS_I(inode), name, namelen, &kbuf, (int *)len, - flags); + error = xfs_attr_get(&args); if (error) goto out_kfree; - if (copy_to_user(ubuf, kbuf, *len)) + *len = args.valuelen; + if (copy_to_user(ubuf, args.value, args.valuelen)) error = -EFAULT; out_kfree: - kmem_free(kbuf); + kmem_free(args.value); return error; } diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 7c140fb93bf8..d3b3264dae78 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -21,22 +21,24 @@ static int xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused, struct inode *inode, const char *name, void *value, size_t size) { - int xflags = handler->flags; - struct xfs_inode *ip = XFS_I(inode); - int error, asize = size; - size_t namelen = strlen(name); + struct xfs_da_args args = { + .dp = XFS_I(inode), + .flags = handler->flags, + .name = name, + .namelen = strlen(name), + .value = value, + .valuelen = size, + }; + int error; /* Convert Linux syscall to XFS internal ATTR flags */ - if (!size) { - xflags |= ATTR_KERNOVAL; - value = NULL; - } + if (!size) + args.flags |= ATTR_KERNOVAL; - error = xfs_attr_get(ip, name, namelen, (unsigned char **)&value, - &asize, xflags); + error = xfs_attr_get(&args); if (error) return error; - return asize; + return args.valuelen; } void From patchwork Fri Feb 21 14:11:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396723 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 241921580 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0282B24676 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="iDcS/4sV" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728745AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59338 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728544AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=gtSp/E2NE8jyvN5jwpr/CGwYQvguyJPLdg6z3T+3pYA=; b=iDcS/4sV8SDbODy5d2nE/kk2VU UKAlQf4dX5ZiZZfCahR39bwGGO22IqusXU4LSr8muYHKMth1+DTPDPA/2JYatUEsXMPoOfvIDiXJd H+JdZnEStZyLbKnA+ofTJ/g2g24VvL0d+4Cm6ey0fhXyonjYK/tsXtqodADVAUyr4OsRBuyj6aQKT riNiqtUz+WLMSnpQuLBaMmDAPDDWtlJotV4oJtfHVnImxJQcxaoFMWEfDQpgnFZv2hxXlX5QfEjR5 VFo+szge4mPg5xAnRQKJFKCeUPboo+U3cStnumYRHVdVSfA9GHgsXWSVJDrnT6ofwLTknwgU6QwhG 7FNmCnOw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5925-0000HY-PX; Fri, 21 Feb 2020 14:11:57 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 13/31] xfs: remove the xfs_inode argument to xfs_attr_get_ilocked Date: Fri, 21 Feb 2020 06:11:36 -0800 Message-Id: <20200221141154.476496-14-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The inode can easily be derived from the args structure. Also don't bother with else statements after early returns. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 15 +++++++-------- fs/xfs/libxfs/xfs_attr.h | 2 +- fs/xfs/scrub/attr.c | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 288b39e81efd..fd095e3d4a9a 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -77,19 +77,18 @@ xfs_inode_hasattr( */ int xfs_attr_get_ilocked( - struct xfs_inode *ip, struct xfs_da_args *args) { - ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); + ASSERT(xfs_isilocked(args->dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - if (!xfs_inode_hasattr(ip)) + if (!xfs_inode_hasattr(args->dp)) return -ENOATTR; - else if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) + + if (args->dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) return xfs_attr_shortform_getvalue(args); - else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) + if (xfs_bmap_one_block(args->dp, XFS_ATTR_FORK)) return xfs_attr_leaf_get(args); - else - return xfs_attr_node_get(args); + return xfs_attr_node_get(args); } /* @@ -133,7 +132,7 @@ xfs_attr_get( args->op_flags |= XFS_DA_OP_ALLOCVAL; lock_mode = xfs_ilock_attr_map_shared(args->dp); - error = xfs_attr_get_ilocked(args->dp, args); + error = xfs_attr_get_ilocked(args); xfs_iunlock(args->dp, lock_mode); /* on error, we have to clean up allocated value buffers */ diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index be77d13a2902..b8c4ed27f626 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -145,7 +145,7 @@ int xfs_attr_inactive(struct xfs_inode *dp); int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *); int xfs_attr_list_int(struct xfs_attr_list_context *); int xfs_inode_hasattr(struct xfs_inode *ip); -int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args); +int xfs_attr_get_ilocked(struct xfs_da_args *args); int xfs_attr_get(struct xfs_da_args *args); int xfs_attr_set(struct xfs_da_args *args); int xfs_attr_set_args(struct xfs_da_args *args); diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index d804558cdbca..f983c2b969e0 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -162,7 +162,7 @@ xchk_xattr_listent( args.value = xchk_xattr_valuebuf(sx->sc); args.valuelen = valuelen; - error = xfs_attr_get_ilocked(context->dp, &args); + error = xfs_attr_get_ilocked(&args); if (!xchk_fblock_process_error(sx->sc, XFS_ATTR_FORK, args.blkno, &error)) goto fail_xref; From patchwork Fri Feb 21 14:11:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396725 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 62A7C1892 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 406BB2073A for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="EOHWjVBE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728177AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59344 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728655AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=irr77a/9WXk939mncRxo/wvNxlu7JoWV9Kl6dZE/RcA=; b=EOHWjVBEQJX/C2sKtG7SuMTdk7 X83od8crAa6sl5txFr+VVsiIm1yXWmR/iZGK2JV/gwqhxec4BqJ0aECipYVu+SC08CFle4pMCMGsB mveGQUM+VIVxieL8nhuFFBFUcS8JJNjC4Ol5o8ZhmAzNCSWrp+X+Eipg1yvAxoYN+c1+LxW8pb0VS UCy1Yy72bpPox4ud4eRol1wctBtIbIJoW/guzAEaUDja4puUcJH3vAK5pYcoEIKbn16uwuMz6K153 /57mmwCufhkVoqqW2kQguxwsK08fyrPFJ13prchIQvO3X/wHk2+ZGwSkCiqhMmZSvzE+9QHhDkZOO QPYRWnEQ==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5925-0000Ho-VM; Fri, 21 Feb 2020 14:11:57 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 14/31] xfs: remove ATTR_KERNOVAL Date: Fri, 21 Feb 2020 06:11:37 -0800 Message-Id: <20200221141154.476496-15-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org We can just pass down the Linux convention of a zero valuelen to just query for the existance of an attribute to the low-level code instead. The use in the legacy xfs_attr_list code only used by the ioctl interface was already dead code, as the callers check that the flag is not present. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 8 ++++---- fs/xfs/libxfs/xfs_attr.h | 4 +--- fs/xfs/libxfs/xfs_attr_leaf.c | 14 +++++++------- fs/xfs/libxfs/xfs_attr_remote.c | 2 +- fs/xfs/xfs_attr_list.c | 3 --- fs/xfs/xfs_xattr.c | 4 ---- 6 files changed, 13 insertions(+), 22 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index fd095e3d4a9a..469417786bfc 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -94,9 +94,9 @@ xfs_attr_get_ilocked( /* * Retrieve an extended attribute by name, and its value if requested. * - * If ATTR_KERNOVAL is set in args->flags, then the caller does not want the - * value, just an indication whether the attribute exists and the size of the - * value if it exists. The size is returned in args.valuelen. + * If args->valuelen is zero, then the caller does not want the value, just an + * indication whether the attribute exists and the size of the value if it + * exists. The size is returned in args.valuelen. * * If the attribute is found, but exceeds the size limit set by the caller in * args->valuelen, return -ERANGE with the size of the attribute that was found @@ -115,7 +115,7 @@ xfs_attr_get( uint lock_mode; int error; - ASSERT((args->flags & (ATTR_ALLOC | ATTR_KERNOVAL)) || args->value); + ASSERT((args->flags & ATTR_ALLOC) || !args->valuelen || args->value); XFS_STATS_INC(args->dp->i_mount, xs_attr_get); diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index b8c4ed27f626..fe064cd81747 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -34,12 +34,11 @@ struct xfs_attr_list_context; #define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */ #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ -#define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */ #define ATTR_ALLOC 0x8000 /* [kernel] allocate xattr buffer on demand */ #define ATTR_KERNEL_FLAGS \ - (ATTR_KERNOTIME | ATTR_KERNOVAL | ATTR_ALLOC) + (ATTR_KERNOTIME | ATTR_ALLOC) #define XFS_ATTR_FLAGS \ { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ @@ -49,7 +48,6 @@ struct xfs_attr_list_context; { ATTR_CREATE, "CREATE" }, \ { ATTR_REPLACE, "REPLACE" }, \ { ATTR_KERNOTIME, "KERNOTIME" }, \ - { ATTR_KERNOVAL, "KERNOVAL" }, \ { ATTR_ALLOC, "ALLOC" } /* diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index fed537a4353d..5e700dfc48a9 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -464,7 +464,7 @@ xfs_attr_copy_value( /* * No copy if all we have to do is get the length */ - if (args->flags & ATTR_KERNOVAL) { + if (!args->valuelen) { args->valuelen = valuelen; return 0; } @@ -830,9 +830,9 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) /* * Retrieve the attribute value and length. * - * If ATTR_KERNOVAL is specified, only the length needs to be returned. - * Unlike a lookup, we only return an error if the attribute does not - * exist or we can't retrieve the value. + * If args->valuelen is zero, only the length needs to be returned. Unlike a + * lookup, we only return an error if the attribute does not exist or we can't + * retrieve the value. */ int xfs_attr_shortform_getvalue( @@ -2444,9 +2444,9 @@ xfs_attr3_leaf_lookup_int( * Get the value associated with an attribute name from a leaf attribute * list structure. * - * If ATTR_KERNOVAL is specified, only the length needs to be returned. - * Unlike a lookup, we only return an error if the attribute does not - * exist or we can't retrieve the value. + * If args->valuelen is zero, only the length needs to be returned. Unlike a + * lookup, we only return an error if the attribute does not exist or we can't + * retrieve the value. */ int xfs_attr3_leaf_getvalue( diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index 8b7f74b3bea2..01ad7f353e08 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -397,7 +397,7 @@ xfs_attr_rmtval_get( trace_xfs_attr_rmtval_get(args); - ASSERT(!(args->flags & ATTR_KERNOVAL)); + ASSERT(args->valuelen != 0); ASSERT(args->rmtvaluelen == args->valuelen); valuelen = args->rmtvaluelen; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index f7c4f6b9749a..b4305217bcc0 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -568,7 +568,6 @@ xfs_attr_put_listent( int arraytop; ASSERT(!context->seen_enough); - ASSERT(!(context->flags & ATTR_KERNOVAL)); ASSERT(context->count >= 0); ASSERT(context->count < (ATTR_MAX_VALUELEN/8)); ASSERT(context->firstu >= sizeof(*alist)); @@ -637,8 +636,6 @@ xfs_attr_list( */ if (((long)buffer) & (sizeof(int)-1)) return -EFAULT; - if (flags & ATTR_KERNOVAL) - bufsize = 0; /* * Initialize the output buffer. diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index d3b3264dae78..84e8b806977f 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -31,10 +31,6 @@ xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused, }; int error; - /* Convert Linux syscall to XFS internal ATTR flags */ - if (!size) - args.flags |= ATTR_KERNOVAL; - error = xfs_attr_get(&args); if (error) return error; From patchwork Fri Feb 21 14:11:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396695 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D8B93930 for ; Fri, 21 Feb 2020 14:11:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B77B724650 for ; Fri, 21 Feb 2020 14:11:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="TTta92eC" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728749AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59358 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728715AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=wpU+2YNqoFgk/sp02qqBSIIAG7SM7XEEImCP8x9zSLA=; b=TTta92eCUHMaRM1X+rAS9k+Jp1 x6K0kqubbZke2XnBS5q+E1L3LFXHovHX+ivjnHTael9YkX7o6fZu00s6KfrB/GiirW27Eh/7iFFwL DCjewNl27EPqSvAswss8CmGh0cHIY4Z6ex6vZvqy1MZ8rQPJQowpV1VU2a5r8poPO5XiY6x3iAX60 3tA51fTMX6use12Z7AF1dB2jqmmYUQIfsbtBSgdDPQwpTwScojfWY6sVUbKSvAg6KOjtaICvPQNmO ijul3zxscykYqPO6GNlOcZlEa6n97ubH22IC3x02lDH+v/+Vaxi95yyCNFP0UgcTU8szrppSk1q+n 95VUYBXw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5926-0000Hw-6A; Fri, 21 Feb 2020 14:11:58 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra Subject: [PATCH 15/31] xfs: remove ATTR_ALLOC and XFS_DA_OP_ALLOCVAL Date: Fri, 21 Feb 2020 06:11:38 -0800 Message-Id: <20200221141154.476496-16-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Use a NULL args->value as the indicator to lazily allocate a buffer instead, and let the caller always free args->value instead of duplicating the cleanup. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 20 +++++--------------- fs/xfs/libxfs/xfs_attr.h | 7 ++----- fs/xfs/libxfs/xfs_attr_leaf.c | 2 +- fs/xfs/libxfs/xfs_types.h | 2 -- fs/xfs/xfs_acl.c | 20 ++++++++++---------- 5 files changed, 18 insertions(+), 33 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 469417786bfc..1382e51ef85e 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -98,15 +98,14 @@ xfs_attr_get_ilocked( * indication whether the attribute exists and the size of the value if it * exists. The size is returned in args.valuelen. * + * If args->value is NULL but args->valuelen is non-zero, allocate the buffer + * for the value after existence of the attribute has been determined. The + * caller always has to free args->value if it is set, no matter if this + * function was successful or not. + * * If the attribute is found, but exceeds the size limit set by the caller in * args->valuelen, return -ERANGE with the size of the attribute that was found * in args->valuelen. - * - * If ATTR_ALLOC is set in args->flags, allocate the buffer for the value after - * existence of the attribute has been determined. On success, return that - * buffer to the caller and leave them to free it. On failure, free any - * allocated buffer and ensure the buffer pointer returned to the caller is - * null. */ int xfs_attr_get( @@ -115,8 +114,6 @@ xfs_attr_get( uint lock_mode; int error; - ASSERT((args->flags & ATTR_ALLOC) || !args->valuelen || args->value); - XFS_STATS_INC(args->dp->i_mount, xs_attr_get); if (XFS_FORCED_SHUTDOWN(args->dp->i_mount)) @@ -128,18 +125,11 @@ xfs_attr_get( /* Entirely possible to look up a name which doesn't exist */ args->op_flags = XFS_DA_OP_OKNOENT; - if (args->flags & ATTR_ALLOC) - args->op_flags |= XFS_DA_OP_ALLOCVAL; lock_mode = xfs_ilock_attr_map_shared(args->dp); error = xfs_attr_get_ilocked(args); xfs_iunlock(args->dp, lock_mode); - /* on error, we have to clean up allocated value buffers */ - if (error && (args->flags & ATTR_ALLOC)) { - kmem_free(args->value); - args->value = NULL; - } return error; } diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index fe064cd81747..a6de050675c9 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -35,10 +35,8 @@ struct xfs_attr_list_context; #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ -#define ATTR_ALLOC 0x8000 /* [kernel] allocate xattr buffer on demand */ - #define ATTR_KERNEL_FLAGS \ - (ATTR_KERNOTIME | ATTR_ALLOC) + (ATTR_KERNOTIME) #define XFS_ATTR_FLAGS \ { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ @@ -47,8 +45,7 @@ struct xfs_attr_list_context; { ATTR_SECURE, "SECURE" }, \ { ATTR_CREATE, "CREATE" }, \ { ATTR_REPLACE, "REPLACE" }, \ - { ATTR_KERNOTIME, "KERNOTIME" }, \ - { ATTR_ALLOC, "ALLOC" } + { ATTR_KERNOTIME, "KERNOTIME" } /* * The maximum size (into the kernel or returned from the kernel) of an diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 5e700dfc48a9..b0658eb8fbcc 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -477,7 +477,7 @@ xfs_attr_copy_value( return -ERANGE; } - if (args->op_flags & XFS_DA_OP_ALLOCVAL) { + if (!args->value) { args->value = kmem_alloc_large(valuelen, 0); if (!args->value) return -ENOMEM; diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 634814dd1d10..3379ebc0c7c5 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -223,7 +223,6 @@ typedef struct xfs_da_args { #define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ -#define XFS_DA_OP_ALLOCVAL 0x0020 /* lookup to alloc buffer if found */ #define XFS_DA_OP_INCOMPLETE 0x0040 /* lookup INCOMPLETE attr keys */ #define XFS_DA_OP_FLAGS \ @@ -232,7 +231,6 @@ typedef struct xfs_da_args { { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \ - { XFS_DA_OP_ALLOCVAL, "ALLOCVAL" }, \ { XFS_DA_OP_INCOMPLETE, "INCOMPLETE" } /* diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 780924984492..bc78b7c33401 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -125,7 +125,7 @@ xfs_get_acl(struct inode *inode, int type) struct posix_acl *acl = NULL; struct xfs_da_args args = { .dp = ip, - .flags = ATTR_ALLOC | ATTR_ROOT, + .flags = ATTR_ROOT, .valuelen = XFS_ACL_MAX_SIZE(mp), }; int error; @@ -144,19 +144,19 @@ xfs_get_acl(struct inode *inode, int type) } args.namelen = strlen(args.name); + /* + * If the attribute doesn't exist make sure we have a negative cache + * entry, for any other error assume it is transient. + */ error = xfs_attr_get(&args); - if (error) { - /* - * If the attribute doesn't exist make sure we have a negative - * cache entry, for any other error assume it is transient. - */ - if (error != -ENOATTR) - acl = ERR_PTR(error); - } else { + if (!error) { acl = xfs_acl_from_disk(mp, args.value, args.valuelen, XFS_ACL_MAX_ENTRIES(mp)); - kmem_free(args.value); + } else if (error != -ENOATTR) { + acl = ERR_PTR(error); } + + kmem_free(args.value); return acl; } From patchwork Fri Feb 21 14:11:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396727 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8F4EE1395 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6E55024676 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="F99g53Q3" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728715AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59370 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728745AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=6JM2Bym7Wi7EAVW7TK5XNsQeRam8mmoRpf9F/5cK3kM=; b=F99g53Q3rkEJiUeuG/Fn0S11+B eHYPsrdPdCViC1gBBWZkNILA9ah9MPAr/ddpIe3TqpVnZLcvq+PPLHaXFNhtXXlQNJFzoUlMSP9Ph c00yUbWkMLiTelV2Iua79AmWeQoRWqIaJhnqjG+OQ8lv+YHi8Jb1hV1jRWDIuOek8qhRpYTo6b14r 5qutf0f6MKDIWT62zqjNUPtb4PIReAm70dRyn+jutvy8xghJ0Xo7bDPZbIPswxbJWov1TQYnlymQ4 tNKRAb3YASR2nU7a2KoOWZfy1tF1qRAHWbJGB+K3U803WCIPj3YSMM/Pu91Xn1bPcxkDj+Oukr6i0 0eOv6qFw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5926-0000IS-DJ; Fri, 21 Feb 2020 14:11:58 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 16/31] xfs: replace ATTR_KERNOTIME with XFS_DA_OP_NOTIME Date: Fri, 21 Feb 2020 06:11:39 -0800 Message-Id: <20200221141154.476496-17-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org op_flags with the XFS_DA_OP_* flags is the usual place for in-kernel only flags, so move the notime flag there. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 4 ++-- fs/xfs/libxfs/xfs_attr.h | 8 +------- fs/xfs/libxfs/xfs_types.h | 2 ++ fs/xfs/scrub/attr.c | 2 +- fs/xfs/xfs_ioctl.c | 1 - 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 1382e51ef85e..3b1db2afb104 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -186,7 +186,7 @@ xfs_attr_try_sf_addname( * Commit the shortform mods, and we're done. * NOTE: this is also the error path (EEXIST, etc). */ - if (!error && (args->flags & ATTR_KERNOTIME) == 0) + if (!error && !(args->op_flags & XFS_DA_OP_NOTIME)) xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); if (mp->m_flags & XFS_MOUNT_WSYNC) @@ -389,7 +389,7 @@ xfs_attr_set( if (mp->m_flags & XFS_MOUNT_WSYNC) xfs_trans_set_sync(args->trans); - if ((args->flags & ATTR_KERNOTIME) == 0) + if (!(args->op_flags & XFS_DA_OP_NOTIME)) xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); /* diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index a6de050675c9..0f369399effd 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -33,19 +33,13 @@ struct xfs_attr_list_context; #define ATTR_CREATE 0x0010 /* pure create: fail if attr already exists */ #define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */ -#define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ - -#define ATTR_KERNEL_FLAGS \ - (ATTR_KERNOTIME) - #define XFS_ATTR_FLAGS \ { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ { ATTR_ROOT, "ROOT" }, \ { ATTR_TRUST, "TRUST" }, \ { ATTR_SECURE, "SECURE" }, \ { ATTR_CREATE, "CREATE" }, \ - { ATTR_REPLACE, "REPLACE" }, \ - { ATTR_KERNOTIME, "KERNOTIME" } + { ATTR_REPLACE, "REPLACE" } /* * The maximum size (into the kernel or returned from the kernel) of an diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 3379ebc0c7c5..1594325d7742 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -223,6 +223,7 @@ typedef struct xfs_da_args { #define XFS_DA_OP_ADDNAME 0x0004 /* this is an add operation */ #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ +#define XFS_DA_OP_NOTIME 0x0020 /* don't update inode timestamps */ #define XFS_DA_OP_INCOMPLETE 0x0040 /* lookup INCOMPLETE attr keys */ #define XFS_DA_OP_FLAGS \ @@ -231,6 +232,7 @@ typedef struct xfs_da_args { { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \ + { XFS_DA_OP_NOTIME, "NOTIME" }, \ { XFS_DA_OP_INCOMPLETE, "INCOMPLETE" } /* diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index f983c2b969e0..05537627211d 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -147,7 +147,7 @@ xchk_xattr_listent( return; } - args.flags = ATTR_KERNOTIME; + args.op_flags = XFS_DA_OP_NOTIME; if (flags & XFS_ATTR_ROOT) args.flags |= ATTR_ROOT; else if (flags & XFS_ATTR_SECURE) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index ce393a97c85c..41f05a94fe51 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -436,7 +436,6 @@ xfs_ioc_attrmulti_one( if ((flags & ATTR_ROOT) && (flags & ATTR_SECURE)) return -EINVAL; - flags &= ~ATTR_KERNEL_FLAGS; name = strndup_user(uname, MAXNAMELEN); if (IS_ERR(name)) From patchwork Fri Feb 21 14:11:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396719 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8FFB51892 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6F4B924673 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="OR/mOvwh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728544AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59386 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728748AbgBUOL6 (ORCPT ); Fri, 21 Feb 2020 09:11:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=TWsUOmTZqICvrihUP1F0vQL/xkZYIDbZkXGE/7U5I08=; b=OR/mOvwhbyZphV2Y/hQkliXmy/ tzQchOHQPuxKsZ5655qv4e+G7lbdEQg+GTLjuPZVN4ChjPrl6EKN0sA0AljNsNHSEmKZzP6dwaA8a KUOEhpp5Nr7X7iiLf8zXadJiYGBurqy9zikjqoTItPcvFdbPfAS60mFMvsj06GStoZjW2yHlLRNBX QSQEPjOhaAFUMipSZQaO99kQFMXAR9p2T6U44g59y3mYj8kp6sZGmOKSn57yQfEgajyLCH2oBPZPo dhMcT8JrQhrRNgNhhCC/KbwBG1PvTPXOR5AAeOx7JkbppD3oei+xLewOb4vIPKHdtqu2nQDDbkYTV C7bUYtjg==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5926-0000Ib-KW; Fri, 21 Feb 2020 14:11:58 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 17/31] xfs: factor out a xfs_attr_match helper Date: Fri, 21 Feb 2020 06:11:40 -0800 Message-Id: <20200221141154.476496-18-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Factor out a helper that compares an on-disk attr vs the name, length and flags specified in struct xfs_da_args. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr_leaf.c | 80 +++++++++++++---------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index b0658eb8fbcc..8852754153ba 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -445,14 +445,21 @@ xfs_attr3_leaf_read( * Namespace helper routines *========================================================================*/ -/* - * If namespace bits don't match return 0. - * If all match then return 1. - */ -STATIC int -xfs_attr_namesp_match(int arg_flags, int ondisk_flags) +static bool +xfs_attr_match( + struct xfs_da_args *args, + uint8_t namelen, + unsigned char *name, + int flags) { - return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); + if (args->namelen != namelen) + return false; + if (memcmp(args->name, name, namelen) != 0) + return false; + if (XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags) != + XFS_ATTR_NSP_ONDISK(flags)) + return false; + return true; } static int @@ -678,15 +685,8 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { -#ifdef DEBUG - if (sfe->namelen != args->namelen) - continue; - if (memcmp(args->name, sfe->nameval, args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, sfe->flags)) - continue; - ASSERT(0); -#endif + ASSERT(!xfs_attr_match(args, sfe->namelen, sfe->nameval, + sfe->flags)); } offset = (char *)sfe - (char *)sf; @@ -749,13 +749,9 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), base += size, i++) { size = XFS_ATTR_SF_ENTSIZE(sfe); - if (sfe->namelen != args->namelen) - continue; - if (memcmp(sfe->nameval, args->name, args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, sfe->flags)) - continue; - break; + if (xfs_attr_match(args, sfe->namelen, sfe->nameval, + sfe->flags)) + break; } if (i == end) return -ENOATTR; @@ -816,13 +812,9 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { - if (sfe->namelen != args->namelen) - continue; - if (memcmp(args->name, sfe->nameval, args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, sfe->flags)) - continue; - return -EEXIST; + if (xfs_attr_match(args, sfe->namelen, sfe->nameval, + sfe->flags)) + return -EEXIST; } return -ENOATTR; } @@ -847,14 +839,10 @@ xfs_attr_shortform_getvalue( sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { - if (sfe->namelen != args->namelen) - continue; - if (memcmp(args->name, sfe->nameval, args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, sfe->flags)) - continue; - return xfs_attr_copy_value(args, &sfe->nameval[args->namelen], - sfe->valuelen); + if (xfs_attr_match(args, sfe->namelen, sfe->nameval, + sfe->flags)) + return xfs_attr_copy_value(args, + &sfe->nameval[args->namelen], sfe->valuelen); } return -ENOATTR; } @@ -2409,23 +2397,15 @@ xfs_attr3_leaf_lookup_int( } if (entry->flags & XFS_ATTR_LOCAL) { name_loc = xfs_attr3_leaf_name_local(leaf, probe); - if (name_loc->namelen != args->namelen) - continue; - if (memcmp(args->name, name_loc->nameval, - args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, entry->flags)) + if (!xfs_attr_match(args, name_loc->namelen, + name_loc->nameval, entry->flags)) continue; args->index = probe; return -EEXIST; } else { name_rmt = xfs_attr3_leaf_name_remote(leaf, probe); - if (name_rmt->namelen != args->namelen) - continue; - if (memcmp(args->name, name_rmt->name, - args->namelen) != 0) - continue; - if (!xfs_attr_namesp_match(args->flags, entry->flags)) + if (!xfs_attr_match(args, name_rmt->namelen, + name_rmt->name, entry->flags)) continue; args->index = probe; args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); From patchwork Fri Feb 21 14:11:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396697 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 97B7C930 for ; Fri, 21 Feb 2020 14:12:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6CFEB222C4 for ; Fri, 21 Feb 2020 14:12:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="u3tdLxZT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728815AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59396 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728655AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=kidMiLnG0c5WklDjj5OfzTqnAEGzEgH41HtFwoUollU=; b=u3tdLxZTbQJ0meqP55PNzbwlNy 3AfTBDzXt4Yv2MbZ3eHkS0Gd9EOD5bKQ83KApsAUnKkh5SjmTBes8cDED7VItahiQXnUHBTDWxcWn KBPmF/sYlomcSNo586ecMHeDPCljSOo6TR2qK6ZCLef2sNRoPVY2CCbf2CC5mW5iFyiFuCZYWzL+1 A8acpsL6IqNzKEkGCf9qCRgFx6jYB73ZV/aJyx3bphDMHQpkCmzaXTCuWOfk1uZzM+d5ilhLpZkBW n5IkGLN6KMrrhgX7c95atfgS2/Egh+kU+FRDhoSSvkr2PrqYq6fkL2ecQJzs17jb6+COT0opZ6ut8 PZd/alEw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5926-0000Is-Rp; Fri, 21 Feb 2020 14:11:58 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 18/31] xfs: cleanup struct xfs_attr_list_context Date: Fri, 21 Feb 2020 06:11:41 -0800 Message-Id: <20200221141154.476496-19-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Replace the alist char pointer with a void buffer given that different callers use it in different ways. Use the chance to remove the typedef and reduce the indentation of the struct definition so that it doesn't overflow 80 char lines all over. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 34 +++++++++++++------------- fs/xfs/xfs_attr_list.c | 53 ++++++++++++++++++++-------------------- fs/xfs/xfs_trace.h | 16 ++++++------ fs/xfs/xfs_xattr.c | 6 ++--- 4 files changed, 55 insertions(+), 54 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 0f369399effd..0c8f7c7a6b65 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -99,28 +99,28 @@ typedef struct attrlist_cursor_kern { typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int, unsigned char *, int, int); -typedef struct xfs_attr_list_context { - struct xfs_trans *tp; - struct xfs_inode *dp; /* inode */ - struct attrlist_cursor_kern *cursor; /* position in list */ - char *alist; /* output buffer */ +struct xfs_attr_list_context { + struct xfs_trans *tp; + struct xfs_inode *dp; /* inode */ + struct attrlist_cursor_kern *cursor; /* position in list */ + void *buffer; /* output buffer */ /* * Abort attribute list iteration if non-zero. Can be used to pass * error values to the xfs_attr_list caller. */ - int seen_enough; - bool allow_incomplete; - - ssize_t count; /* num used entries */ - int dupcnt; /* count dup hashvals seen */ - int bufsize; /* total buffer size */ - int firstu; /* first used byte in buffer */ - int flags; /* from VOP call */ - int resynch; /* T/F: resynch with cursor */ - put_listent_func_t put_listent; /* list output fmt function */ - int index; /* index into output buffer */ -} xfs_attr_list_context_t; + int seen_enough; + bool allow_incomplete; + + ssize_t count; /* num used entries */ + int dupcnt; /* count dup hashvals seen */ + int bufsize; /* total buffer size */ + int firstu; /* first used byte in buffer */ + int flags; /* from VOP call */ + int resynch; /* T/F: resynch with cursor */ + put_listent_func_t put_listent; /* list output fmt function */ + int index; /* index into output buffer */ +}; /*======================================================================== diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index b4305217bcc0..0fe12474a952 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -488,10 +488,11 @@ xfs_attr3_leaf_list_int( * Copy out attribute entries for attr_list(), for leaf attribute lists. */ STATIC int -xfs_attr_leaf_list(xfs_attr_list_context_t *context) +xfs_attr_leaf_list( + struct xfs_attr_list_context *context) { - int error; - struct xfs_buf *bp; + struct xfs_buf *bp; + int error; trace_xfs_attr_leaf_list(context); @@ -527,11 +528,11 @@ xfs_attr_list_int_ilocked( int xfs_attr_list_int( - xfs_attr_list_context_t *context) + struct xfs_attr_list_context *context) { - int error; - xfs_inode_t *dp = context->dp; - uint lock_mode; + struct xfs_inode *dp = context->dp; + uint lock_mode; + int error; XFS_STATS_INC(dp->i_mount, xs_attr_list); @@ -557,15 +558,15 @@ xfs_attr_list_int( */ STATIC void xfs_attr_put_listent( - xfs_attr_list_context_t *context, - int flags, - unsigned char *name, - int namelen, - int valuelen) + struct xfs_attr_list_context *context, + int flags, + unsigned char *name, + int namelen, + int valuelen) { - struct attrlist *alist = (struct attrlist *)context->alist; - attrlist_ent_t *aep; - int arraytop; + struct attrlist *alist = context->buffer; + struct attrlist_ent *aep; + int arraytop; ASSERT(!context->seen_enough); ASSERT(context->count >= 0); @@ -593,7 +594,7 @@ xfs_attr_put_listent( return; } - aep = (attrlist_ent_t *)&context->alist[context->firstu]; + aep = context->buffer + context->firstu; aep->a_valuelen = valuelen; memcpy(aep->a_name, name, namelen); aep->a_name[namelen] = 0; @@ -612,15 +613,15 @@ xfs_attr_put_listent( */ int xfs_attr_list( - xfs_inode_t *dp, - char *buffer, - int bufsize, - int flags, - attrlist_cursor_kern_t *cursor) + struct xfs_inode *dp, + char *buffer, + int bufsize, + int flags, + struct attrlist_cursor_kern *cursor) { - xfs_attr_list_context_t context; - struct attrlist *alist; - int error; + struct xfs_attr_list_context context; + struct attrlist *alist; + int error; /* * Validate the cursor. @@ -645,12 +646,12 @@ xfs_attr_list( context.cursor = cursor; context.resynch = 1; context.flags = flags; - context.alist = buffer; + context.buffer = buffer; context.bufsize = (bufsize & ~(sizeof(int)-1)); /* align */ context.firstu = context.bufsize; context.put_listent = xfs_attr_put_listent; - alist = (struct attrlist *)context.alist; + alist = context.buffer; alist->al_count = 0; alist->al_more = 0; alist->al_offset[0] = context.bufsize; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index e242988f57fb..43b1b03ae00f 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -45,7 +45,7 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, __field(u32, hashval) __field(u32, blkno) __field(u32, offset) - __field(void *, alist) + __field(void *, buffer) __field(int, bufsize) __field(int, count) __field(int, firstu) @@ -58,21 +58,21 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, __entry->hashval = ctx->cursor->hashval; __entry->blkno = ctx->cursor->blkno; __entry->offset = ctx->cursor->offset; - __entry->alist = ctx->alist; + __entry->buffer = ctx->buffer; __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; __entry->firstu = ctx->firstu; __entry->flags = ctx->flags; ), TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u " - "alist %p size %u count %u firstu %u flags %d %s", + "buffer %p size %u count %u firstu %u flags %d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __entry->hashval, __entry->blkno, __entry->offset, __entry->dupcnt, - __entry->alist, + __entry->buffer, __entry->bufsize, __entry->count, __entry->firstu, @@ -169,7 +169,7 @@ TRACE_EVENT(xfs_attr_list_node_descend, __field(u32, hashval) __field(u32, blkno) __field(u32, offset) - __field(void *, alist) + __field(void *, buffer) __field(int, bufsize) __field(int, count) __field(int, firstu) @@ -184,7 +184,7 @@ TRACE_EVENT(xfs_attr_list_node_descend, __entry->hashval = ctx->cursor->hashval; __entry->blkno = ctx->cursor->blkno; __entry->offset = ctx->cursor->offset; - __entry->alist = ctx->alist; + __entry->buffer = ctx->buffer; __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; __entry->firstu = ctx->firstu; @@ -193,7 +193,7 @@ TRACE_EVENT(xfs_attr_list_node_descend, __entry->bt_before = be32_to_cpu(btree->before); ), TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u " - "alist %p size %u count %u firstu %u flags %d %s " + "buffer %p size %u count %u firstu %u flags %d %s " "node hashval %u, node before %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, @@ -201,7 +201,7 @@ TRACE_EVENT(xfs_attr_list_node_descend, __entry->blkno, __entry->offset, __entry->dupcnt, - __entry->alist, + __entry->buffer, __entry->bufsize, __entry->count, __entry->firstu, diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 84e8b806977f..5276874a7aec 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -132,7 +132,7 @@ __xfs_xattr_put_listent( if (context->count < 0 || context->seen_enough) return; - if (!context->alist) + if (!context->buffer) goto compute_size; arraytop = context->count + prefix_len + namelen + 1; @@ -141,7 +141,7 @@ __xfs_xattr_put_listent( context->seen_enough = 1; return; } - offset = (char *)context->alist + context->count; + offset = context->buffer + context->count; strncpy(offset, prefix, prefix_len); offset += prefix_len; strncpy(offset, (char *)name, namelen); /* real name */ @@ -227,7 +227,7 @@ xfs_vn_listxattr( context.dp = XFS_I(inode); context.cursor = &cursor; context.resynch = 1; - context.alist = size ? data : NULL; + context.buffer = size ? data : NULL; context.bufsize = size; context.firstu = context.bufsize; context.put_listent = xfs_xattr_put_listent; From patchwork Fri Feb 21 14:11:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396707 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 233111892 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EAEF824653 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="K/RXvHHF" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728817AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59404 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728754AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=EPUYC+s6pguYeMcjLej9GTQUeR8yhOlfX2zNBapNT5U=; b=K/RXvHHF+59SamM3UVrKPZoq50 MIQwCarCM9FICui3mbLRJA1XmRwL5la/Tjmy4vIMA3d6hnNPHZQCClZGcON0iJbVH31USAF6atLDR tjdcO1AoBCMMWd4l8P7GvAtdA02svqYd9sRgDeYJ7e0jpN/Sjd3UyJSF9VZOBVPCSE7wWNFwUIImb UyRqHmSmDVpFXNGoHuHxOhZr3ozY1M5am+v8Ov8HzgCl09acnf7VKEbiENAZTfGtlgrScX+JY+5+R 9lDX5dH64mW72oT+5zm4rO3nbRt68J9CGso+/i24wfLI6xzgBzWtoOBm3TJKzkUxmq1yUk5m321rD 2lUjXW7g==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5927-0000JN-2B; Fri, 21 Feb 2020 14:11:59 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , "Darrick J . Wong" Subject: [PATCH 19/31] xfs: remove the unused ATTR_ENTRY macro Date: Fri, 21 Feb 2020 06:11:42 -0800 Message-Id: <20200221141154.476496-20-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 0c8f7c7a6b65..31c0ffde4f59 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -69,14 +69,6 @@ typedef struct attrlist_ent { /* data from attr_list() */ char a_name[1]; /* attr name (NULL terminated) */ } attrlist_ent_t; -/* - * Given a pointer to the (char*) buffer containing the attr_list() result, - * and an index, return a pointer to the indicated attribute in the buffer. - */ -#define ATTR_ENTRY(buffer, index) \ - ((attrlist_ent_t *) \ - &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ]) - /* * Kernel-internal version of the attrlist cursor. */ From patchwork Fri Feb 21 14:11:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396699 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E01FA1580 for ; Fri, 21 Feb 2020 14:12:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B2C1B24653 for ; Fri, 21 Feb 2020 14:12:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="dFmYi+0e" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728765AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59414 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728761AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=hgOI00QSO2OOUoBUAPD28REHlRO+qHzfg0pWMkdZOKk=; b=dFmYi+0eDnuCr0DaWyy4uVcDau D8849c1o9FYw6vz5tnk9igfqODmKEg4ewr4KoIhakMiyx1MnRdUQlqUZR2ClgZ6vM4ZYTARsUZahu 7qwDdym17g0m3YvyYnWnYIvj6k9Dfinrxj5ZYBf5pTIkVM4R172o8hz8IMdTMRC6O3cYdQccWVHmi OB12MrlWnM/qVSuF9G51GTYEHYlDa1LGiavPguRki6kPun3laGAZampBgal71j8PjJZI1mlmKIW9P UJu4CW0VSExrw0o6lumOAx+wHss6MlS2mTPBBZexOVjMvyXwn3KVX2+2NCdACvQWLnUeCFjlO/rXa nzqDDqUw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5927-0000JT-94; Fri, 21 Feb 2020 14:11:59 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra Subject: [PATCH 20/31] xfs: open code ATTR_ENTSIZE Date: Fri, 21 Feb 2020 06:11:43 -0800 Message-Id: <20200221141154.476496-21-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Replace a single use macro containing open-coded variants of standard helpers with direct calls to the standard helpers. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_attr_list.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 0fe12474a952..c97e6806cf1f 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -545,12 +545,6 @@ xfs_attr_list_int( return error; } -#define ATTR_ENTBASESIZE /* minimum bytes used by an attr */ \ - (((struct attrlist_ent *) 0)->a_name - (char *) 0) -#define ATTR_ENTSIZE(namelen) /* actual bytes used by an attr */ \ - ((ATTR_ENTBASESIZE + (namelen) + 1 + sizeof(uint32_t)-1) \ - & ~(sizeof(uint32_t)-1)) - /* * Format an attribute and copy it out to the user's buffer. * Take care to check values and protect against them changing later, @@ -586,7 +580,10 @@ xfs_attr_put_listent( arraytop = sizeof(*alist) + context->count * sizeof(alist->al_offset[0]); - context->firstu -= ATTR_ENTSIZE(namelen); + + /* decrement by the actual bytes used by the attr */ + context->firstu -= round_up(offsetof(struct attrlist_ent, a_name) + + namelen + 1, sizeof(uint32_t)); if (context->firstu < arraytop) { trace_xfs_attr_list_full(context); alist->al_more = 1; From patchwork Fri Feb 21 14:11:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396731 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3A2C91892 for ; Fri, 21 Feb 2020 14:12:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0F2A224670 for ; Fri, 21 Feb 2020 14:12:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="qWtTZ7yg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728791AbgBUOME (ORCPT ); Fri, 21 Feb 2020 09:12:04 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59436 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728780AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=/mNmwoBkfgeqI7l1KFMV7njZFFJHxrHq+ZIgHzjiUVI=; b=qWtTZ7yg6x8lPGtDEBgArYhHAm mLCUK2PS34XOa+X4gn5wL8nna4qJAuxxIqldQAY23AYaq4nPUL42VngR8WRVnLKPtjyKq9IVQAgiZ XSYwfRVmQCCmpsQ88iiZtMpZ38c/9iUEsI2rRfhIS7ghYilUax6pk7bKRhpQGyD07fMH1h9F0DjiG rV421R8wgZkf8YFI6/MnEL3ODUesAgN7J92IVdLGBTpju3F3nW/CkEvbRD0B42hqzRiUWA6ppFEKg QMw/cPqM6b5xEOwGiNXU4bgmsAruF7B1Kx0DnVQh5WEX/5VjTl8u0M/BWYDo878/nns3+H3vRw4jO +KVgZX4g==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5927-0000Jh-G6; Fri, 21 Feb 2020 14:11:59 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra Subject: [PATCH 21/31] xfs: move the legacy xfs_attr_list to xfs_ioctl.c Date: Fri, 21 Feb 2020 06:11:44 -0800 Message-Id: <20200221141154.476496-22-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org 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 Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 23 -------- fs/xfs/libxfs/xfs_fs.h | 20 +++++++ fs/xfs/xfs_attr_list.c | 113 --------------------------------------- fs/xfs/xfs_ioctl.c | 110 ++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_ioctl.h | 12 +++-- fs/xfs/xfs_ioctl32.c | 4 +- 6 files changed, 138 insertions(+), 144 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 31c0ffde4f59..0e3c213f78ce 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -48,27 +48,6 @@ struct xfs_attr_list_context; */ #define ATTR_MAX_VALUELEN (64*1024) /* max length of a value */ -/* - * Define how lists of attribute names are returned to the user from - * the attr_list() call. A large, 32bit aligned, buffer is passed in - * along with its size. We put an array of offsets at the top that each - * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom. - */ -typedef struct attrlist { - __s32 al_count; /* number of entries in attrlist */ - __s32 al_more; /* T/F: more attrs (do call again) */ - __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */ -} attrlist_t; - -/* - * Show the interesting info about one attribute. This is what the - * al_offset[i] entry points to. - */ -typedef struct attrlist_ent { /* data from attr_list() */ - __u32 a_valuelen; /* number bytes in value of attr */ - char a_name[1]; /* attr name (NULL terminated) */ -} attrlist_ent_t; - /* * Kernel-internal version of the attrlist cursor. */ @@ -131,8 +110,6 @@ int xfs_attr_get(struct xfs_da_args *args); int xfs_attr_set(struct xfs_da_args *args); int xfs_attr_set_args(struct xfs_da_args *args); int xfs_attr_remove_args(struct xfs_da_args *args); -int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, - int flags, struct attrlist_cursor_kern *cursor); bool xfs_attr_namecheck(const void *name, size_t length); #endif /* __XFS_ATTR_H__ */ diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index ef95ca07d084..ae77bcd8c05b 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -572,6 +572,26 @@ typedef struct xfs_attrlist_cursor { __u32 opaque[4]; } xfs_attrlist_cursor_t; +/* + * Define how lists of attribute names are returned to userspace from the + * XFS_IOC_ATTRLIST_BY_HANDLE ioctl. struct xfs_attrlist is the header at the + * beginning of the returned buffer, and a each entry in al_offset contains the + * relative offset of an xfs_attrlist_ent containing the actual entry. + * + * NOTE: struct xfs_attrlist must match struct attrlist defined in libattr, and + * struct xfs_attrlist_ent must match struct attrlist_ent defined in libattr. + */ +struct xfs_attrlist { + __s32 al_count; /* number of entries in attrlist */ + __s32 al_more; /* T/F: more attrs (do call again) */ + __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */ +}; + +struct xfs_attrlist_ent { /* data from attr_list() */ + __u32 a_valuelen; /* number bytes in value of attr */ + char a_name[1]; /* attr name (NULL terminated) */ +}; + typedef struct xfs_fsop_attrlist_handlereq { struct xfs_fsop_handlereq hreq; /* handle interface structure */ struct xfs_attrlist_cursor pos; /* opaque cookie, list offset */ diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index c97e6806cf1f..09901aa4ad99 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -544,116 +544,3 @@ xfs_attr_list_int( xfs_iunlock(dp, lock_mode); 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_attr_put_listent( - struct xfs_attr_list_context *context, - int flags, - unsigned char *name, - int namelen, - int valuelen) -{ - struct attrlist *alist = context->buffer; - struct 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 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); - return; -} - -/* - * Generate a list of extended attribute names and optionally - * also value lengths. Positive return value follows the XFS - * convention of being an error, zero or negative return code - * is the length of the buffer returned (negated), indicating - * success. - */ -int -xfs_attr_list( - struct xfs_inode *dp, - char *buffer, - int bufsize, - int flags, - struct attrlist_cursor_kern *cursor) -{ - struct xfs_attr_list_context context; - struct 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_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; -} diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 41f05a94fe51..1cc819d77fd3 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -35,6 +35,7 @@ #include "xfs_health.h" #include "xfs_reflink.h" #include "xfs_ioctl.h" +#include "xfs_da_format.h" #include #include @@ -292,6 +293,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, @@ -308,7 +414,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; @@ -329,7 +435,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; diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index bb50cb3dc61f..cb7b94c576a7 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -6,6 +6,12 @@ #ifndef __XFS_IOCTL_H__ #define __XFS_IOCTL_H__ +struct attrlist_cursor_kern; +struct xfs_bstat; +struct xfs_ibulk; +struct xfs_inogrp; + + extern int xfs_ioc_space( struct file *filp, @@ -33,6 +39,8 @@ xfs_readlink_by_handle( int xfs_ioc_attrmulti_one(struct file *parfilp, struct inode *inode, uint32_t opcode, void __user *uname, void __user *value, uint32_t *len, uint32_t flags); +int xfs_ioc_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, + int flags, struct attrlist_cursor_kern *cursor); extern struct dentry * xfs_handle_to_dentry( @@ -52,10 +60,6 @@ xfs_file_compat_ioctl( unsigned int cmd, unsigned long arg); -struct xfs_ibulk; -struct xfs_bstat; -struct xfs_inogrp; - int xfs_fsbulkstat_one_fmt(struct xfs_ibulk *breq, const struct xfs_bulkstat *bstat); int xfs_fsinumbers_fmt(struct xfs_ibulk *breq, const struct xfs_inumbers *igrp); diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index e1daf095c585..10ea0222954c 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -366,7 +366,7 @@ xfs_compat_attrlist_by_handle( if (copy_from_user(&al_hreq, arg, sizeof(compat_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; @@ -388,7 +388,7 @@ xfs_compat_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; From patchwork Fri Feb 21 14:11:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396729 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 04BCD1580 for ; Fri, 21 Feb 2020 14:12:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D6C4724653 for ; Fri, 21 Feb 2020 14:12:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="ieqDL9LO" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728780AbgBUOME (ORCPT ); Fri, 21 Feb 2020 09:12:04 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59454 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728781AbgBUOL7 (ORCPT ); Fri, 21 Feb 2020 09:11:59 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=B49G+A9JwZh0yTpfapF4ncPg3q+Oj1NCTHZ41mt1fCA=; b=ieqDL9LOcgvijcjnGYQPjGWiBF 7bWgN5VroCLewXbatxhiz7Z1MEEKzZ8fcv0MX738gkHA97V0UR8/5amRJLOg1GnOt/5G65ZTGhOcy VtGydPTbBIa672168FkNZJ3pXTnXdqNxxB8+AsyI3Szd6H5uxWm/0ncAv1pfiYiT+77vAdHrNiGtS Ev4INvhoeRBIUu0NrMFi2TFUsKJbMXb4TUHgY2fYNglGjsRPECK4jnWn10m7M36J6Jp+VqWUEYqNM QR7qVUY0YdT9xrxN4ESpbzgGSgdkNur5MUOJV/xoro7kAztJflCjGDiL5AVT3GxEI+6OpBoLvwkZE RMM+6Sfw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5927-0000K3-NN; Fri, 21 Feb 2020 14:11:59 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 22/31] xfs: rename xfs_attr_list_int to xfs_attr_list Date: Fri, 21 Feb 2020 06:11:45 -0800 Message-Id: <20200221141154.476496-23-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The version taking the context structure is the main interface to list attributes, so drop the _int postfix. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 4 ++-- fs/xfs/scrub/attr.c | 4 ++-- fs/xfs/xfs_attr_list.c | 6 +++--- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_xattr.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 0e3c213f78ce..8d42f5782ff7 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -102,8 +102,8 @@ struct xfs_attr_list_context { * Overall external interface routines. */ int xfs_attr_inactive(struct xfs_inode *dp); -int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *); -int xfs_attr_list_int(struct xfs_attr_list_context *); +int xfs_attr_list_ilocked(struct xfs_attr_list_context *); +int xfs_attr_list(struct xfs_attr_list_context *); int xfs_inode_hasattr(struct xfs_inode *ip); int xfs_attr_get_ilocked(struct xfs_da_args *args); int xfs_attr_get(struct xfs_da_args *args); diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index 05537627211d..9e336d797616 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -98,7 +98,7 @@ struct xchk_xattr { /* * Check that an extended attribute key can be looked up by hash. * - * We use the XFS attribute list iterator (i.e. xfs_attr_list_int_ilocked) + * We use the XFS attribute list iterator (i.e. xfs_attr_list_ilocked) * to call this function for every attribute key in an inode. Once * we're here, we load the attribute value to see if any errors happen, * or if we get more or less data than we expected. @@ -516,7 +516,7 @@ xchk_xattr( * iteration, which doesn't really follow the usual buffer * locking order. */ - error = xfs_attr_list_int_ilocked(&sx.context); + error = xfs_attr_list_ilocked(&sx.context); if (!xchk_fblock_process_error(sc, XFS_ATTR_FORK, 0, &error)) goto out; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 09901aa4ad99..ba71bf4303f8 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -507,7 +507,7 @@ xfs_attr_leaf_list( } int -xfs_attr_list_int_ilocked( +xfs_attr_list_ilocked( struct xfs_attr_list_context *context) { struct xfs_inode *dp = context->dp; @@ -527,7 +527,7 @@ xfs_attr_list_int_ilocked( } int -xfs_attr_list_int( +xfs_attr_list( struct xfs_attr_list_context *context) { struct xfs_inode *dp = context->dp; @@ -540,7 +540,7 @@ xfs_attr_list_int( return -EIO; lock_mode = xfs_ilock_attr_map_shared(dp); - error = xfs_attr_list_int_ilocked(context); + error = xfs_attr_list_ilocked(context); xfs_iunlock(dp, lock_mode); return error; } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 1cc819d77fd3..4304028d8837 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -393,7 +393,7 @@ xfs_ioc_attr_list( alist->al_more = 0; alist->al_offset[0] = context.bufsize; - error = xfs_attr_list_int(&context); + error = xfs_attr_list(&context); ASSERT(error <= 0); return error; } diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 5276874a7aec..3b18e782bdd6 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -232,7 +232,7 @@ xfs_vn_listxattr( context.firstu = context.bufsize; context.put_listent = xfs_xattr_put_listent; - error = xfs_attr_list_int(&context); + error = xfs_attr_list(&context); if (error) return error; if (context.count < 0) From patchwork Fri Feb 21 14:11:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396721 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ED703930 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CC20A24653 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="QfPzslMr" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728690AbgBUOME (ORCPT ); Fri, 21 Feb 2020 09:12:04 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59460 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728791AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=QIfNXDiIpKBz9p84PcCL4bTEk3WJmbW4latxvpeHHC0=; b=QfPzslMrQoDwSnC1vox4tDGtFK hNMCUnyHEXslA6oFyCwwC0qOKRttmRwddQoihOg69raEi7VAL3PbKIY9r9uBriYE3okCU+2mib7dG 9QoBGnztTXsJ02IMogHja0X6NUxYpfvwRPQZy3etBMEE1ESUr9fuh9Upr74vliErfcXqls8E3AbUu XaldEO/Z6eAkgzQwsVYU4xXFlosu/PNhu8Bs2pN/jt8vJZymfMxcu154ij6bKMvqJkayR7Hw54Cvx i7+37JdPTd7dpQW/szdj3oKVCPvfAfvzaVG6W4Fmy03cbukwy583e5mJ20ShOL6pv9Ryv+5RHOkrZ RgJhwZOg==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5927-0000KN-Tq; Fri, 21 Feb 2020 14:11:59 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 23/31] xfs: lift common checks into xfs_ioc_attr_list Date: Fri, 21 Feb 2020 06:11:46 -0800 Message-Id: <20200221141154.476496-24-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Lift the flags and bufsize checks from both callers into the common code in xfs_ioc_attr_list. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 23 ++++++++++++----------- fs/xfs/xfs_ioctl32.c | 11 ----------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 4304028d8837..e1cb86d9eb5f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -360,6 +360,18 @@ xfs_ioc_attr_list( struct xfs_attrlist *alist; int error; + if (bufsize < sizeof(struct xfs_attrlist) || + bufsize > XFS_XATTR_LIST_MAX) + return -EINVAL; + + /* + * Reject flags, only allow namespaces. + */ + if (flags & ~(ATTR_ROOT | ATTR_SECURE)) + return -EINVAL; + if (flags == (ATTR_ROOT | ATTR_SECURE)) + return -EINVAL; + /* * Validate the cursor. */ @@ -414,17 +426,6 @@ 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 xfs_attrlist) || - al_hreq.buflen > XFS_XATTR_LIST_MAX) - return -EINVAL; - - /* - * Reject flags, only allow namespaces. - */ - if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) - return -EINVAL; - if (al_hreq.flags == (ATTR_ROOT | ATTR_SECURE)) - return -EINVAL; dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 10ea0222954c..840d17951407 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -366,17 +366,6 @@ xfs_compat_attrlist_by_handle( if (copy_from_user(&al_hreq, arg, sizeof(compat_xfs_fsop_attrlist_handlereq_t))) return -EFAULT; - if (al_hreq.buflen < sizeof(struct xfs_attrlist) || - al_hreq.buflen > XFS_XATTR_LIST_MAX) - return -EINVAL; - - /* - * Reject flags, only allow namespaces. - */ - if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE)) - return -EINVAL; - if (al_hreq.flags == (ATTR_ROOT | ATTR_SECURE)) - return -EINVAL; dentry = xfs_compat_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) From patchwork Fri Feb 21 14:11:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396701 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 34E3A1395 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 12DED2073A for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="NiZb6OBc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728761AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59466 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728798AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=mg4ea7vSwehVZkfjAUG1RyLL7NcvqJjF3lbnlFH1Rj8=; b=NiZb6OBca5VQSdNSg+S+nU+BIE YAgrFk4wRnGsk1r+lLtOvD8lbMHMI0r6n2lfAsNQHNjlbXTXPLMdO0zTGDagcWGTmjlMPSsGKptsH SXpV4dbm2JNKM/5ieUEd/ZkKKuD4fma2f4/H3OE5JFcK1DdCm95rbEg9W/Tc1tAFqeKlTLi0avPEO 9198k7hf3mzOAWKTh2bl6g2usj63ibY4xCxAAWhj1Bh1Sf4uCqcCTJ36rDJcR8r/+cEyobgHKZE2o c4U+19kg6Bm5J+tlojhJ4IhspLpID+70SH6QwxcCjKNQgIAg5aTdrzATdaMZIg3WZ0H+hjVniUPkB cm7iGwTw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5928-0000KR-3n; Fri, 21 Feb 2020 14:12:00 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 24/31] xfs: lift buffer allocation into xfs_ioc_attr_list Date: Fri, 21 Feb 2020 06:11:47 -0800 Message-Id: <20200221141154.476496-25-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Lift the buffer allocation from the two callers into xfs_ioc_attr_list. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 39 ++++++++++++++++----------------------- fs/xfs/xfs_ioctl.h | 2 +- fs/xfs/xfs_ioctl32.c | 22 +++++----------------- 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index e1cb86d9eb5f..cee760a5ec3a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -351,13 +351,14 @@ xfs_ioc_attr_put_listent( int xfs_ioc_attr_list( struct xfs_inode *dp, - char *buffer, + void __user *ubuf, int bufsize, int flags, struct attrlist_cursor_kern *cursor) { struct xfs_attr_list_context context; struct xfs_attrlist *alist; + void *buffer; int error; if (bufsize < sizeof(struct xfs_attrlist) || @@ -381,11 +382,9 @@ xfs_ioc_attr_list( (cursor->hashval || cursor->blkno || cursor->offset)) return -EINVAL; - /* - * Check for a properly aligned buffer. - */ - if (((long)buffer) & (sizeof(int)-1)) - return -EFAULT; + buffer = kmem_zalloc_large(bufsize, 0); + if (!buffer) + return -ENOMEM; /* * Initialize the output buffer. @@ -406,7 +405,13 @@ xfs_ioc_attr_list( alist->al_offset[0] = context.bufsize; error = xfs_attr_list(&context); - ASSERT(error <= 0); + if (error) + goto out_free; + + if (copy_to_user(ubuf, buffer, bufsize)) + error = -EFAULT; +out_free: + kmem_free(buffer); return error; } @@ -420,7 +425,6 @@ xfs_attrlist_by_handle( struct xfs_fsop_attrlist_handlereq __user *p = arg; xfs_fsop_attrlist_handlereq_t al_hreq; struct dentry *dentry; - char *kbuf; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -431,26 +435,15 @@ xfs_attrlist_by_handle( if (IS_ERR(dentry)) return PTR_ERR(dentry); - kbuf = kmem_zalloc_large(al_hreq.buflen, 0); - if (!kbuf) - goto out_dput; - cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; - error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen, - al_hreq.flags, cursor); + error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), al_hreq.buffer, + al_hreq.buflen, al_hreq.flags, cursor); if (error) - goto out_kfree; - - if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) { - error = -EFAULT; - goto out_kfree; - } + goto out_dput; - if (copy_to_user(al_hreq.buffer, kbuf, al_hreq.buflen)) + if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) error = -EFAULT; -out_kfree: - kmem_free(kbuf); out_dput: dput(dentry); return error; diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index cb7b94c576a7..ec6448b259fb 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -39,7 +39,7 @@ xfs_readlink_by_handle( int xfs_ioc_attrmulti_one(struct file *parfilp, struct inode *inode, uint32_t opcode, void __user *uname, void __user *value, uint32_t *len, uint32_t flags); -int xfs_ioc_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, +int xfs_ioc_attr_list(struct xfs_inode *dp, void __user *ubuf, int bufsize, int flags, struct attrlist_cursor_kern *cursor); extern struct dentry * diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 840d17951407..17e14916757b 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -359,7 +359,6 @@ xfs_compat_attrlist_by_handle( compat_xfs_fsop_attrlist_handlereq_t __user *p = arg; compat_xfs_fsop_attrlist_handlereq_t al_hreq; struct dentry *dentry; - char *kbuf; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -371,27 +370,16 @@ xfs_compat_attrlist_by_handle( if (IS_ERR(dentry)) return PTR_ERR(dentry); - error = -ENOMEM; - kbuf = kmem_zalloc_large(al_hreq.buflen, 0); - if (!kbuf) - goto out_dput; - cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; - error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), kbuf, al_hreq.buflen, - al_hreq.flags, cursor); + error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), + compat_ptr(al_hreq.buffer), al_hreq.buflen, + al_hreq.flags, cursor); if (error) - goto out_kfree; - - if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) { - error = -EFAULT; - goto out_kfree; - } + goto out_dput; - if (copy_to_user(compat_ptr(al_hreq.buffer), kbuf, al_hreq.buflen)) + if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) error = -EFAULT; -out_kfree: - kmem_free(kbuf); out_dput: dput(dentry); return error; From patchwork Fri Feb 21 14:11:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396703 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AA3AE1580 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8963824650 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="Cyk8rUX0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728798AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59486 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728814AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=vGimBaXSnXuDTvJzRaWPmSgOsUY4qBCKh1egfh5NqkI=; b=Cyk8rUX0McP/ScCKk3U2QpDzYy JZ8mvjI1IDLrBvW7cqa3Kj0KWFsuNfhOuF225vsQwhwJNIefkiDFGV/ZH7i1O8a08xkqPN6zrMvgo RhJsPJ3TDEI6vZHOx46wcVZ/Am1nwyTQWDDyGuCiUkGxczmqLQ1tflHj+w0SkQvkF7rfp9TsmO86z FL3ffIP0rJ2DqmnlHzhyywbGBZSMQT1TP2mj+qBPdheBEgvbLr3+oV9Fv9V3pxbYYmMY8J4YWFzaY yIFJxFVsiMw3SkQL9gYaGz2BI3OU0ZxLwE+UdKgcdrpQ0od82UyrforwRd/+1DSU3j0837xC+Xao5 dPi2zNAA==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5928-0000KY-Ag; Fri, 21 Feb 2020 14:12:00 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 25/31] xfs: lift cursor copy in/out into xfs_ioc_attr_list Date: Fri, 21 Feb 2020 06:11:48 -0800 Message-Id: <20200221141154.476496-26-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Lift the common code to copy the cursor from and to user space into xfs_ioc_attr_list. Note that this means we copy in twice now as the cursor is in the middle of the conaining structure, but we never touch the memory for the original copy. Doing so keeps the cursor handling isolated in the common helper. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 36 +++++++++++++++--------------------- fs/xfs/xfs_ioctl.h | 2 +- fs/xfs/xfs_ioctl32.c | 19 ++++--------------- 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index cee760a5ec3a..fdb6a881e785 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -354,9 +354,10 @@ xfs_ioc_attr_list( void __user *ubuf, int bufsize, int flags, - struct attrlist_cursor_kern *cursor) + struct xfs_attrlist_cursor __user *ucursor) { struct xfs_attr_list_context context; + struct attrlist_cursor_kern cursor; struct xfs_attrlist *alist; void *buffer; int error; @@ -376,10 +377,12 @@ xfs_ioc_attr_list( /* * Validate the cursor. */ - if (cursor->pad1 || cursor->pad2) + if (copy_from_user(&cursor, ucursor, sizeof(cursor))) + return -EFAULT; + if (cursor.pad1 || cursor.pad2) return -EINVAL; - if ((cursor->initted == 0) && - (cursor->hashval || cursor->blkno || cursor->offset)) + if ((cursor.initted == 0) && + (cursor.hashval || cursor.blkno || cursor.offset)) return -EINVAL; buffer = kmem_zalloc_large(bufsize, 0); @@ -391,7 +394,7 @@ xfs_ioc_attr_list( */ memset(&context, 0, sizeof(context)); context.dp = dp; - context.cursor = cursor; + context.cursor = &cursor; context.resynch = 1; context.flags = flags; context.buffer = buffer; @@ -408,7 +411,8 @@ xfs_ioc_attr_list( if (error) goto out_free; - if (copy_to_user(ubuf, buffer, bufsize)) + if (copy_to_user(ubuf, buffer, bufsize) || + copy_to_user(ucursor, &cursor, sizeof(cursor))) error = -EFAULT; out_free: kmem_free(buffer); @@ -418,33 +422,23 @@ xfs_ioc_attr_list( STATIC int xfs_attrlist_by_handle( struct file *parfilp, - void __user *arg) + struct xfs_fsop_attrlist_handlereq __user *p) { - int error = -ENOMEM; - attrlist_cursor_kern_t *cursor; - struct xfs_fsop_attrlist_handlereq __user *p = arg; - xfs_fsop_attrlist_handlereq_t al_hreq; + struct xfs_fsop_attrlist_handlereq al_hreq; struct dentry *dentry; + int error = -ENOMEM; if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t))) + if (copy_from_user(&al_hreq, p, sizeof(al_hreq))) return -EFAULT; dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) return PTR_ERR(dentry); - cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), al_hreq.buffer, - al_hreq.buflen, al_hreq.flags, cursor); - if (error) - goto out_dput; - - if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) - error = -EFAULT; - -out_dput: + al_hreq.buflen, al_hreq.flags, &p->pos); dput(dentry); return error; } diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index ec6448b259fb..d6e8000ad825 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -40,7 +40,7 @@ int xfs_ioc_attrmulti_one(struct file *parfilp, struct inode *inode, uint32_t opcode, void __user *uname, void __user *value, uint32_t *len, uint32_t flags); int xfs_ioc_attr_list(struct xfs_inode *dp, void __user *ubuf, int bufsize, - int flags, struct attrlist_cursor_kern *cursor); + int flags, struct xfs_attrlist_cursor __user *ucursor); extern struct dentry * xfs_handle_to_dentry( diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 17e14916757b..c1771e728117 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -352,35 +352,24 @@ xfs_compat_handlereq_to_dentry( STATIC int xfs_compat_attrlist_by_handle( struct file *parfilp, - void __user *arg) + compat_xfs_fsop_attrlist_handlereq_t __user *p) { - int error; - attrlist_cursor_kern_t *cursor; - compat_xfs_fsop_attrlist_handlereq_t __user *p = arg; compat_xfs_fsop_attrlist_handlereq_t al_hreq; struct dentry *dentry; + int error; if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (copy_from_user(&al_hreq, arg, - sizeof(compat_xfs_fsop_attrlist_handlereq_t))) + if (copy_from_user(&al_hreq, p, sizeof(al_hreq))) return -EFAULT; dentry = xfs_compat_handlereq_to_dentry(parfilp, &al_hreq.hreq); if (IS_ERR(dentry)) return PTR_ERR(dentry); - cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = xfs_ioc_attr_list(XFS_I(d_inode(dentry)), compat_ptr(al_hreq.buffer), al_hreq.buflen, - al_hreq.flags, cursor); - if (error) - goto out_dput; - - if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) - error = -EFAULT; - -out_dput: + al_hreq.flags, &p->pos); dput(dentry); return error; } From patchwork Fri Feb 21 14:11:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396705 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D67AC930 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B52C024650 for ; Fri, 21 Feb 2020 14:12:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="pIlQ52p6" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728803AbgBUOMC (ORCPT ); Fri, 21 Feb 2020 09:12:02 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59498 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728748AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=Iit7KDs5UdTPBI7cdufly66w4wB838dYYeaDbwlisWw=; b=pIlQ52p6WfNr1GYiaCQ/eLD+Hb qakMucm6MCzF405/qRDsH+MZk499xW89zoIJ8nrNLDcvvYVRDkO9IlHOLgvuwAIoWt2iAvTXs7z4l 2IzdaJgCItiDR1EnhUlhzZMuuQyEBlcvNcAeBfBl7xo+HUqMMA0EnLt50YEdFrh29RZRgEXK81UQT meI5mu8rryaOTKVsjH5gTHXDVa4lB/HkkSB9PfpTOlkURreCUYaiyr8QQ3cfTk5KGwGEOxbPDuNmn U1XO1DtiVZLo6w/etZAzoESLisGYc8Is3qckcAbf0kf6vWLX8pqEJsglk51nGAMndBSa7n0RF0BZs XkJQ2d/w==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5928-0000Kf-H8; Fri, 21 Feb 2020 14:12:00 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 26/31] xfs: improve xfs_forget_acl Date: Fri, 21 Feb 2020 06:11:49 -0800 Message-Id: <20200221141154.476496-27-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Move the function to xfs_acl.c and provide a proper stub for the !CONFIG_XFS_POSIX_ACL case. Lift the flags check to the caller as it nicely fits in there. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_acl.c | 16 ++++++++++++++++ fs/xfs/xfs_acl.h | 6 ++++-- fs/xfs/xfs_ioctl.c | 4 ++-- fs/xfs/xfs_xattr.c | 26 ++------------------------ 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index bc78b7c33401..e9a48d718c3a 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -264,3 +264,19 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) return error; } + +/* + * Invalidate any cached ACLs if the user has bypassed the ACL interface. + * We don't validate the content whatsoever so it is caller responsibility to + * provide data in valid format and ensure i_mode is consistent. + */ +void +xfs_forget_acl( + struct inode *inode, + const char *name) +{ + if (!strcmp(name, SGI_ACL_FILE)) + forget_cached_acl(inode, ACL_TYPE_ACCESS); + else if (!strcmp(name, SGI_ACL_DEFAULT)) + forget_cached_acl(inode, ACL_TYPE_DEFAULT); +} diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 94615e34bc86..c042c0868016 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h @@ -13,14 +13,16 @@ struct posix_acl; extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type); extern int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type); +void xfs_forget_acl(struct inode *inode, const char *name); #else static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type) { return NULL; } # define xfs_set_acl NULL +static inline void xfs_forget_acl(struct inode *inode, const char *name) +{ +} #endif /* CONFIG_XFS_POSIX_ACL */ -extern void xfs_forget_acl(struct inode *inode, const char *name, int xflags); - #endif /* __XFS_ACL_H__ */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index fdb6a881e785..2c532dec09dc 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -509,8 +509,8 @@ xfs_attrmulti_attr_set( } error = xfs_attr_set(&args); - if (!error) - xfs_forget_acl(inode, name, flags); + if (!error && (flags & ATTR_ROOT)) + xfs_forget_acl(inode, name); kfree(args.value); return error; } diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 3b18e782bdd6..10ff60e96051 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -37,28 +37,6 @@ xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused, return args.valuelen; } -void -xfs_forget_acl( - struct inode *inode, - const char *name, - int xflags) -{ - /* - * Invalidate any cached ACLs if the user has bypassed the ACL - * interface. We don't validate the content whatsoever so it is caller - * responsibility to provide data in valid format and ensure i_mode is - * consistent. - */ - if (xflags & ATTR_ROOT) { -#ifdef CONFIG_XFS_POSIX_ACL - if (!strcmp(name, SGI_ACL_FILE)) - forget_cached_acl(inode, ACL_TYPE_ACCESS); - else if (!strcmp(name, SGI_ACL_DEFAULT)) - forget_cached_acl(inode, ACL_TYPE_DEFAULT); -#endif - } -} - static int xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, struct inode *inode, const char *name, const void *value, @@ -81,8 +59,8 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, args.flags |= ATTR_REPLACE; error = xfs_attr_set(&args); - if (!error) - xfs_forget_acl(inode, name, args.flags); + if (!error && (handler->flags & ATTR_ROOT)) + xfs_forget_acl(inode, name); return error; } From patchwork Fri Feb 21 14:11:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396709 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4D79C1395 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2BC6124650 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="rQdLZDgE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728748AbgBUOMC (ORCPT ); Fri, 21 Feb 2020 09:12:02 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59522 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728655AbgBUOMA (ORCPT ); Fri, 21 Feb 2020 09:12:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=t+ktxGnchaPmE9TYnxtVVkQZv6qU565o2QX20azveFc=; b=rQdLZDgEkVCzeZwjouB3tkbbMg vBKFjJnW5UMAdKcoaE91LL/3NKT3mWCVaz6X3CFvCydHUTcijgQbA5WlrAOOm0jmpqSynG7dNO8oE tcNh4VAVZ8l9g5rLh1IaPkBnjgauSsmUQvrR3faMDsaCQc2RnSffjEMkFulF7A6PJE56DjFvR/qwg dZ1dP2/AHHVnrwnAvay4atFIQxl4M0U0l5H0feEG7ER+ZktmnIwQVDQ91sleAc8yXe+9oMZyoZUVi 5gh4fE45LI6wGQ/vrXSLhAFCpo6dY0B844X+St2nL/rpq84Ej2eOxwF1YjFyFR7jROl3CqF+SEL0D BEI29sfw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5928-0000Kn-Oh; Fri, 21 Feb 2020 14:12:00 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 27/31] xfs: clean up the ATTR_REPLACE checks Date: Fri, 21 Feb 2020 06:11:50 -0800 Message-Id: <20200221141154.476496-28-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Remove superflous braces, elses after return statements and use a goto label to merge common error handling. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 3b1db2afb104..495364927ea0 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -423,9 +423,9 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) trace_xfs_attr_sf_addname(args); retval = xfs_attr_shortform_lookup(args); - if ((args->flags & ATTR_REPLACE) && (retval == -ENOATTR)) { + if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) return retval; - } else if (retval == -EEXIST) { + if (retval == -EEXIST) { if (args->flags & ATTR_CREATE) return retval; retval = xfs_attr_shortform_remove(args); @@ -489,14 +489,11 @@ xfs_attr_leaf_addname( * the given flags produce an error or call for an atomic rename. */ retval = xfs_attr3_leaf_lookup_int(bp, args); - if ((args->flags & ATTR_REPLACE) && (retval == -ENOATTR)) { - xfs_trans_brelse(args->trans, bp); - return retval; - } else if (retval == -EEXIST) { - if (args->flags & ATTR_CREATE) { /* pure create op */ - xfs_trans_brelse(args->trans, bp); - return retval; - } + if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) + goto out_brelse; + if (retval == -EEXIST) { + if (args->flags & ATTR_CREATE) /* pure create op */ + goto out_brelse; trace_xfs_attr_leaf_replace(args); @@ -637,6 +634,9 @@ xfs_attr_leaf_addname( error = xfs_attr3_leaf_clearflag(args); } return error; +out_brelse: + xfs_trans_brelse(args->trans, bp); + return retval; } /* @@ -763,9 +763,9 @@ xfs_attr_node_addname( goto out; blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - if ((args->flags & ATTR_REPLACE) && (retval == -ENOATTR)) { + if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) goto out; - } else if (retval == -EEXIST) { + if (retval == -EEXIST) { if (args->flags & ATTR_CREATE) goto out; From patchwork Fri Feb 21 14:11:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396713 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BC9F318EC for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 90AE824672 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="txsj8Z2S" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728655AbgBUOMC (ORCPT ); Fri, 21 Feb 2020 09:12:02 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59536 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728754AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=rEIpfgjuEcBK8ElkR2JcaOzZTP8DseGwunkUheeRYUw=; b=txsj8Z2SXQY19mf7G/c/qiXNML wx+WThv2SsN4ZdUigoD86AnztVyDhS9SeWS0zWNNYJmVR1DFB3a+sO925sfxtBqLfXYXViyt2xOzt t0H0yACk/JGlLZryVh420dnpn1PB/MCRmdLvQ2Ea8Vx4Sg5NqQ7PhxD0DJtdORYAmjD1l62Z1WShT w0++1mYzYPSbux2S9Rj2wvGw4tRA9KdF6HnkwI5Vct/ET1MIHjFm4hFn8twHPMtAf3v9kdUpobHEZ P6z2pTdgHyJqtLke9IAMbfWxVYLHAwuDiItNkD3J1CVnC4Wy/hXuzRHN2neu4Wca/mZYlzqJaKRsy 8bw+Y8Wg==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5928-0000L7-Uw; Fri, 21 Feb 2020 14:12:00 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra Subject: [PATCH 28/31] xfs: clean up the attr flag confusion Date: Fri, 21 Feb 2020 06:11:51 -0800 Message-Id: <20200221141154.476496-29-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The ATTR_* flags have a long IRIX history, where they a userspace interface, the on-disk format and an internal interface. We've split out the on-disk interface to the XFS_ATTR_* values, but despite (or because?) of that the flag have still been a mess. Switch the internal interface to pass the on-disk XFS_ATTR_* flags for the namespace and the Linux XATTR_* flags for the actual flags instead. The ATTR_* values that are actually used are move to xfs_fs.h with a new XFS_IOC_* prefix to not conflict with the userspace version that has the same name and must have the same value. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 16 ++++++------- fs/xfs/libxfs/xfs_attr.h | 22 +----------------- fs/xfs/libxfs/xfs_attr_leaf.c | 14 +++++------ fs/xfs/libxfs/xfs_da_format.h | 12 ---------- fs/xfs/libxfs/xfs_fs.h | 12 +++++++++- fs/xfs/libxfs/xfs_types.h | 3 ++- fs/xfs/scrub/attr.c | 5 +--- fs/xfs/xfs_acl.c | 5 ++-- fs/xfs/xfs_ioctl.c | 44 +++++++++++++++++++++++++---------- fs/xfs/xfs_iops.c | 3 +-- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_trace.h | 35 +++++++++++++++++----------- fs/xfs/xfs_xattr.c | 18 +++++--------- 13 files changed, 94 insertions(+), 96 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 495364927ea0..ff4f34f8f74c 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -295,7 +295,7 @@ xfs_attr_set( struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; struct xfs_trans_res tres; - int rsvd = (args->flags & ATTR_ROOT) != 0; + bool rsvd = (args->attr_filter & XFS_ATTR_ROOT); int error, local; unsigned int total; @@ -423,10 +423,10 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) trace_xfs_attr_sf_addname(args); retval = xfs_attr_shortform_lookup(args); - if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) + if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) return retval; if (retval == -EEXIST) { - if (args->flags & ATTR_CREATE) + if (args->attr_flags & XATTR_CREATE) return retval; retval = xfs_attr_shortform_remove(args); if (retval) @@ -436,7 +436,7 @@ xfs_attr_shortform_addname(xfs_da_args_t *args) * that the leaf format add routine won't trip over the attr * not being around. */ - args->flags &= ~ATTR_REPLACE; + args->attr_flags &= ~XATTR_REPLACE; } if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || @@ -489,10 +489,10 @@ xfs_attr_leaf_addname( * the given flags produce an error or call for an atomic rename. */ retval = xfs_attr3_leaf_lookup_int(bp, args); - if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) + if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) goto out_brelse; if (retval == -EEXIST) { - if (args->flags & ATTR_CREATE) /* pure create op */ + if (args->attr_flags & XATTR_CREATE) /* pure create op */ goto out_brelse; trace_xfs_attr_leaf_replace(args); @@ -763,10 +763,10 @@ xfs_attr_node_addname( goto out; blk = &state->path.blk[ state->path.active-1 ]; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); - if (retval == -ENOATTR && (args->flags & ATTR_REPLACE)) + if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) goto out; if (retval == -EEXIST) { - if (args->flags & ATTR_CREATE) + if (args->attr_flags & XATTR_CREATE) goto out; trace_xfs_attr_node_replace(args); diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 8d42f5782ff7..a6bedb0eda26 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -21,26 +21,6 @@ struct xfs_attr_list_context; * as possible so as to fit into the literal area of the inode. */ -/*======================================================================== - * External interfaces - *========================================================================*/ - - -#define ATTR_DONTFOLLOW 0x0001 /* -- ignored, from IRIX -- */ -#define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */ -#define ATTR_TRUST 0x0004 /* -- unused, from IRIX -- */ -#define ATTR_SECURE 0x0008 /* use attrs in security namespace */ -#define ATTR_CREATE 0x0010 /* pure create: fail if attr already exists */ -#define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */ - -#define XFS_ATTR_FLAGS \ - { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ - { ATTR_ROOT, "ROOT" }, \ - { ATTR_TRUST, "TRUST" }, \ - { ATTR_SECURE, "SECURE" }, \ - { ATTR_CREATE, "CREATE" }, \ - { ATTR_REPLACE, "REPLACE" } - /* * The maximum size (into the kernel or returned from the kernel) of an * attribute value or the buffer used for an attr_list() call. Larger @@ -87,7 +67,7 @@ struct xfs_attr_list_context { int dupcnt; /* count dup hashvals seen */ int bufsize; /* total buffer size */ int firstu; /* first used byte in buffer */ - int flags; /* from VOP call */ + unsigned int attr_filter; /* XFS_ATTR_{ROOT,SECURE} */ int resynch; /* T/F: resynch with cursor */ put_listent_func_t put_listent; /* list output fmt function */ int index; /* index into output buffer */ diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 8852754153ba..5f3702172e96 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -456,8 +456,7 @@ xfs_attr_match( return false; if (memcmp(args->name, name, namelen) != 0) return false; - if (XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags) != - XFS_ATTR_NSP_ONDISK(flags)) + if (args->attr_filter != (flags & XFS_ATTR_NSP_ONDISK_MASK)) return false; return true; } @@ -697,7 +696,7 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) sfe->namelen = args->namelen; sfe->valuelen = args->valuelen; - sfe->flags = XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); + sfe->flags = args->attr_filter; memcpy(sfe->nameval, args->name, args->namelen); memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen); sf->hdr.count++; @@ -906,7 +905,7 @@ xfs_attr_shortform_to_leaf( nargs.valuelen = sfe->valuelen; nargs.hashval = xfs_da_hashname(sfe->nameval, sfe->namelen); - nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); + nargs.attr_filter = sfe->flags & XFS_ATTR_NSP_ONDISK_MASK; error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */ ASSERT(error == -ENOATTR); error = xfs_attr3_leaf_add(bp, &nargs); @@ -1112,7 +1111,7 @@ xfs_attr3_leaf_to_shortform( nargs.value = &name_loc->nameval[nargs.namelen]; nargs.valuelen = be16_to_cpu(name_loc->valuelen); nargs.hashval = be32_to_cpu(entry->hashval); - nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(entry->flags); + nargs.attr_filter = entry->flags & XFS_ATTR_NSP_ONDISK_MASK; xfs_attr_shortform_add(&nargs, forkoff); } error = 0; @@ -1437,8 +1436,9 @@ xfs_attr3_leaf_add_work( entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); entry->hashval = cpu_to_be32(args->hashval); - entry->flags = tmp ? XFS_ATTR_LOCAL : 0; - entry->flags |= XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); + entry->flags = args->attr_filter; + if (tmp) + entry->flags |= XFS_ATTR_LOCAL; if (args->op_flags & XFS_DA_OP_RENAME) { entry->flags |= XFS_ATTR_INCOMPLETE; if ((args->blkno2 == args->blkno) && diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 734837a9b51a..08c0a4d98b89 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -692,19 +692,7 @@ struct xfs_attr3_leafblock { #define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) #define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) #define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) - -/* - * Conversion macros for converting namespace bits from argument flags - * to ondisk flags. - */ -#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) #define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) -#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) -#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ - ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) -#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ - ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) /* * Alignment for namelist and valuelist entries (since they are mixed diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index ae77bcd8c05b..245188e4f6d3 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -568,6 +568,16 @@ typedef struct xfs_fsop_setdm_handlereq { struct fsdmidata __user *data; /* DMAPI data */ } xfs_fsop_setdm_handlereq_t; +/* + * Flags passed in xfs_attr_multiop.am_flags for the attr ioctl interface. + * + * NOTE: Must match the values declared in libattr without the XFS_IOC_ prefix. + */ +#define XFS_IOC_ATTR_ROOT 0x0002 /* use attrs in root namespace */ +#define XFS_IOC_ATTR_SECURE 0x0008 /* use attrs in security namespace */ +#define XFS_IOC_ATTR_CREATE 0x0010 /* fail if attr already exists */ +#define XFS_IOC_ATTR_REPLACE 0x0020 /* fail if attr does not exist */ + typedef struct xfs_attrlist_cursor { __u32 opaque[4]; } xfs_attrlist_cursor_t; @@ -609,7 +619,7 @@ typedef struct xfs_attr_multiop { void __user *am_attrname; void __user *am_attrvalue; __u32 am_length; - __u32 am_flags; + __u32 am_flags; /* XFS_IOC_ATTR_* */ } xfs_attr_multiop_t; typedef struct xfs_fsop_attrmulti_handlereq { diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 1594325d7742..04d0d11ec7a9 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -194,7 +194,8 @@ typedef struct xfs_da_args { uint8_t filetype; /* filetype of inode for directories */ void *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ - int flags; /* argument flags (eg: ATTR_NOCREATE) */ + unsigned int attr_filter; /* XFS_ATTR_{ROOT,SECURE} */ + unsigned int attr_flags; /* XATTR_{CREATE,REPLACE} */ xfs_dahash_t hashval; /* hash value of name */ xfs_ino_t inumber; /* input/output inode number */ struct xfs_inode *dp; /* directory inode to manipulate */ diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index 9e336d797616..4ba4eae0dbc3 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -148,10 +148,7 @@ xchk_xattr_listent( } args.op_flags = XFS_DA_OP_NOTIME; - if (flags & XFS_ATTR_ROOT) - args.flags |= ATTR_ROOT; - else if (flags & XFS_ATTR_SECURE) - args.flags |= ATTR_SECURE; + args.attr_filter = flags & XFS_ATTR_NSP_ONDISK_MASK; args.geo = context->dp->i_mount->m_attr_geo; args.whichfork = XFS_ATTR_FORK; args.dp = context->dp; diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index e9a48d718c3a..12f9f83fa353 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -14,6 +14,7 @@ #include "xfs_trace.h" #include "xfs_error.h" #include "xfs_acl.h" +#include "xfs_da_format.h" #include @@ -125,7 +126,7 @@ xfs_get_acl(struct inode *inode, int type) struct posix_acl *acl = NULL; struct xfs_da_args args = { .dp = ip, - .flags = ATTR_ROOT, + .attr_filter = XFS_ATTR_ROOT, .valuelen = XFS_ACL_MAX_SIZE(mp), }; int error; @@ -166,7 +167,7 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) struct xfs_inode *ip = XFS_I(inode); struct xfs_da_args args = { .dp = ip, - .flags = ATTR_ROOT, + .attr_filter = XFS_ATTR_ROOT, }; int error; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 2c532dec09dc..74394355aa91 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -319,11 +319,7 @@ xfs_ioc_attr_put_listent( /* * 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)) + if (context->attr_filter != (flags & XFS_ATTR_NSP_ONDISK_MASK)) return; arraytop = sizeof(*alist) + @@ -348,6 +344,28 @@ xfs_ioc_attr_put_listent( trace_xfs_attr_list_add(context); } +static unsigned int +xfs_attr_filter( + u32 ioc_flags) +{ + if (ioc_flags & XFS_IOC_ATTR_ROOT) + return XFS_ATTR_ROOT; + if (ioc_flags & XFS_IOC_ATTR_SECURE) + return XFS_ATTR_SECURE; + return 0; +} + +static unsigned int +xfs_attr_flags( + u32 ioc_flags) +{ + if (ioc_flags & XFS_IOC_ATTR_CREATE) + return XATTR_CREATE; + if (ioc_flags & XFS_IOC_ATTR_REPLACE) + return XATTR_REPLACE; + return 0; +} + int xfs_ioc_attr_list( struct xfs_inode *dp, @@ -369,9 +387,9 @@ xfs_ioc_attr_list( /* * Reject flags, only allow namespaces. */ - if (flags & ~(ATTR_ROOT | ATTR_SECURE)) + if (flags & ~(XFS_IOC_ATTR_ROOT | XFS_IOC_ATTR_SECURE)) return -EINVAL; - if (flags == (ATTR_ROOT | ATTR_SECURE)) + if (flags == (XFS_IOC_ATTR_ROOT | XFS_IOC_ATTR_SECURE)) return -EINVAL; /* @@ -396,7 +414,7 @@ xfs_ioc_attr_list( context.dp = dp; context.cursor = &cursor; context.resynch = 1; - context.flags = flags; + context.attr_filter = xfs_attr_filter(flags); context.buffer = buffer; context.bufsize = (bufsize & ~(sizeof(int)-1)); /* align */ context.firstu = context.bufsize; @@ -453,7 +471,8 @@ xfs_attrmulti_attr_get( { struct xfs_da_args args = { .dp = XFS_I(inode), - .flags = flags, + .attr_filter = xfs_attr_filter(flags), + .attr_flags = xfs_attr_flags(flags), .name = name, .namelen = strlen(name), .valuelen = *len, @@ -490,7 +509,8 @@ xfs_attrmulti_attr_set( { struct xfs_da_args args = { .dp = XFS_I(inode), - .flags = flags, + .attr_filter = xfs_attr_filter(flags), + .attr_flags = xfs_attr_flags(flags), .name = name, .namelen = strlen(name), }; @@ -509,7 +529,7 @@ xfs_attrmulti_attr_set( } error = xfs_attr_set(&args); - if (!error && (flags & ATTR_ROOT)) + if (!error && (flags & XFS_IOC_ATTR_ROOT)) xfs_forget_acl(inode, name); kfree(args.value); return error; @@ -528,7 +548,7 @@ xfs_ioc_attrmulti_one( unsigned char *name; int error; - if ((flags & ATTR_ROOT) && (flags & ATTR_SECURE)) + if ((flags & XFS_IOC_ATTR_ROOT) && (flags & XFS_IOC_ATTR_SECURE)) return -EINVAL; name = strndup_user(uname, MAXNAMELEN); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 94cd4254656c..93e553d32fe3 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -22,7 +22,6 @@ #include "xfs_iomap.h" #include "xfs_error.h" -#include #include #include #include @@ -52,7 +51,7 @@ xfs_initxattrs( for (xattr = xattr_array; xattr->name != NULL; xattr++) { struct xfs_da_args args = { .dp = ip, - .flags = ATTR_SECURE, + .attr_filter = XFS_ATTR_SECURE, .name = xattr->name, .namelen = strlen(xattr->name), .value = xattr->value, diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 8738bb03f253..8c0070a797de 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -60,6 +60,7 @@ typedef __u32 xfs_nlink_t; #include #include #include +#include #include #include diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 43b1b03ae00f..4d18c6b6edbe 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -36,6 +36,10 @@ struct xfs_owner_info; struct xfs_trans_res; struct xfs_inobt_rec_incore; +#define XFS_ATTR_NSP_FLAGS \ + { XFS_ATTR_ROOT, "ROOT" }, \ + { XFS_ATTR_SECURE, "SECURE" } + DECLARE_EVENT_CLASS(xfs_attr_list_class, TP_PROTO(struct xfs_attr_list_context *ctx), TP_ARGS(ctx), @@ -50,7 +54,7 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, __field(int, count) __field(int, firstu) __field(int, dupcnt) - __field(int, flags) + __field(int, attr_filter) ), TP_fast_assign( __entry->dev = VFS_I(ctx->dp)->i_sb->s_dev; @@ -62,10 +66,10 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; __entry->firstu = ctx->firstu; - __entry->flags = ctx->flags; + __entry->attr_filter = ctx->attr_filter; ), TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u " - "buffer %p size %u count %u firstu %u flags %d %s", + "buffer %p size %u count %u firstu %u namespace %d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __entry->hashval, @@ -76,8 +80,9 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, __entry->bufsize, __entry->count, __entry->firstu, - __entry->flags, - __print_flags(__entry->flags, "|", XFS_ATTR_FLAGS) + __entry->attr_filter, + __print_flags(__entry->attr_filter, "|", + XFS_ATTR_NSP_FLAGS) ) ) @@ -174,7 +179,7 @@ TRACE_EVENT(xfs_attr_list_node_descend, __field(int, count) __field(int, firstu) __field(int, dupcnt) - __field(int, flags) + __field(int, attr_filter) __field(u32, bt_hashval) __field(u32, bt_before) ), @@ -188,12 +193,12 @@ TRACE_EVENT(xfs_attr_list_node_descend, __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; __entry->firstu = ctx->firstu; - __entry->flags = ctx->flags; + __entry->attr_filter = ctx->attr_filter; __entry->bt_hashval = be32_to_cpu(btree->hashval); __entry->bt_before = be32_to_cpu(btree->before); ), TP_printk("dev %d:%d ino 0x%llx cursor h/b/o 0x%x/0x%x/%u dupcnt %u " - "buffer %p size %u count %u firstu %u flags %d %s " + "buffer %p size %u count %u firstu %u namespae %d %s " "node hashval %u, node before %u", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, @@ -205,8 +210,9 @@ TRACE_EVENT(xfs_attr_list_node_descend, __entry->bufsize, __entry->count, __entry->firstu, - __entry->flags, - __print_flags(__entry->flags, "|", XFS_ATTR_FLAGS), + __entry->attr_filter, + __print_flags(__entry->attr_filter, "|", + XFS_ATTR_NSP_FLAGS), __entry->bt_hashval, __entry->bt_before) ); @@ -1701,7 +1707,7 @@ DECLARE_EVENT_CLASS(xfs_attr_class, __field(int, namelen) __field(int, valuelen) __field(xfs_dahash_t, hashval) - __field(int, flags) + __field(int, attr_filter) __field(int, op_flags) ), TP_fast_assign( @@ -1712,11 +1718,11 @@ DECLARE_EVENT_CLASS(xfs_attr_class, __entry->namelen = args->namelen; __entry->valuelen = args->valuelen; __entry->hashval = args->hashval; - __entry->flags = args->flags; + __entry->attr_filter = args->attr_filter; __entry->op_flags = args->op_flags; ), TP_printk("dev %d:%d ino 0x%llx name %.*s namelen %d valuelen %d " - "hashval 0x%x flags %s op_flags %s", + "hashval 0x%x namespace %s op_flags %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino, __entry->namelen, @@ -1724,7 +1730,8 @@ DECLARE_EVENT_CLASS(xfs_attr_class, __entry->namelen, __entry->valuelen, __entry->hashval, - __print_flags(__entry->flags, "|", XFS_ATTR_FLAGS), + __print_flags(__entry->attr_filter, "|", + XFS_ATTR_NSP_FLAGS), __print_flags(__entry->op_flags, "|", XFS_DA_OP_FLAGS)) ) diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 10ff60e96051..ae07d1424192 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -14,7 +14,6 @@ #include "xfs_acl.h" #include -#include static int @@ -23,7 +22,7 @@ xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused, { struct xfs_da_args args = { .dp = XFS_I(inode), - .flags = handler->flags, + .attr_filter = handler->flags, .name = name, .namelen = strlen(name), .value = value, @@ -44,7 +43,8 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, { struct xfs_da_args args = { .dp = XFS_I(inode), - .flags = handler->flags, + .attr_filter = handler->flags, + .attr_flags = flags, .name = name, .namelen = strlen(name), .value = (void *)value, @@ -52,14 +52,8 @@ xfs_xattr_set(const struct xattr_handler *handler, struct dentry *unused, }; int error; - /* Convert Linux syscall to XFS internal ATTR flags */ - if (flags & XATTR_CREATE) - args.flags |= ATTR_CREATE; - if (flags & XATTR_REPLACE) - args.flags |= ATTR_REPLACE; - error = xfs_attr_set(&args); - if (!error && (handler->flags & ATTR_ROOT)) + if (!error && (handler->flags & XFS_ATTR_ROOT)) xfs_forget_acl(inode, name); return error; } @@ -73,14 +67,14 @@ static const struct xattr_handler xfs_xattr_user_handler = { static const struct xattr_handler xfs_xattr_trusted_handler = { .prefix = XATTR_TRUSTED_PREFIX, - .flags = ATTR_ROOT, + .flags = XFS_ATTR_ROOT, .get = xfs_xattr_get, .set = xfs_xattr_set, }; static const struct xattr_handler xfs_xattr_security_handler = { .prefix = XATTR_SECURITY_PREFIX, - .flags = ATTR_SECURE, + .flags = XFS_ATTR_SECURE, .get = xfs_xattr_get, .set = xfs_xattr_set, }; From patchwork Fri Feb 21 14:11:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396711 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 87D47930 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 657DA24650 for ; Fri, 21 Feb 2020 14:12:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="kwnHikyB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728754AbgBUOMC (ORCPT ); Fri, 21 Feb 2020 09:12:02 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59554 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728822AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=ISp2A8xjnwuQougtdqu1Bql3aseQlqHyGJ0b5TKPRps=; b=kwnHikyBeMga+C3vWWHmqeV+uu rJ4lV37xX3yaUUuDgDVtUB/vCfV+3l/LEL+HIjPOtBUDFHPPlU0ygblQIswcnkFQHJ8MjgpJzVVIv Wk0ADWm7cpxQ0spVVfpx2sImzxluvUJUqdvde85O9lV3x/4rZRcJx8mc1Em+mFcnZQfSIJ43iS4B4 2HaJAFaCD26bYi2Qz9CmEvik1HfMV78T1nz1AzqjIrecEAG/tdokMWeI8/ezXSMu6LzRdCzg6oisK PncC9GURXxK+q/aSXMwQ8k3wn6OuofcPRvRHBz9GxTeFqdNbGNysx+diQpq9qmmjeFo9gy/9Kes2q XIeWiNag==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5929-0000LQ-6T; Fri, 21 Feb 2020 14:12:01 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Chandan Rajendra Subject: [PATCH 29/31] xfs: remove XFS_DA_OP_INCOMPLETE Date: Fri, 21 Feb 2020 06:11:52 -0800 Message-Id: <20200221141154.476496-30-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Now that we use the on-disk flags field also for the interface to the lower level attr routines we can use the XFS_ATTR_INCOMPLETE definition from the on-disk format directly instead. Signed-off-by: Christoph Hellwig Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.c | 2 +- fs/xfs/libxfs/xfs_attr_leaf.c | 15 ++++++--------- fs/xfs/libxfs/xfs_types.h | 6 ++---- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index ff4f34f8f74c..067716be6d73 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -898,7 +898,7 @@ xfs_attr_node_addname( * The INCOMPLETE flag means that we will find the "old" * attr, not the "new" one. */ - args->op_flags |= XFS_DA_OP_INCOMPLETE; + args->attr_filter |= XFS_ATTR_INCOMPLETE; state = xfs_da_state_alloc(); state->args = args; state->mp = mp; diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 5f3702172e96..4be04aeee278 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -456,7 +456,12 @@ xfs_attr_match( return false; if (memcmp(args->name, name, namelen) != 0) return false; - if (args->attr_filter != (flags & XFS_ATTR_NSP_ONDISK_MASK)) + /* + * If we are looking for incomplete entries, show only those, else only + * show complete entries. + */ + if (args->attr_filter != + (flags & (XFS_ATTR_NSP_ONDISK_MASK | XFS_ATTR_INCOMPLETE))) return false; return true; } @@ -2387,14 +2392,6 @@ xfs_attr3_leaf_lookup_int( /* * GROT: Add code to remove incomplete entries. */ - /* - * If we are looking for INCOMPLETE entries, show only those. - * If we are looking for complete entries, show only those. - */ - if (!!(args->op_flags & XFS_DA_OP_INCOMPLETE) != - !!(entry->flags & XFS_ATTR_INCOMPLETE)) { - continue; - } if (entry->flags & XFS_ATTR_LOCAL) { name_loc = xfs_attr3_leaf_name_local(leaf, probe); if (!xfs_attr_match(args, name_loc->namelen, diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 04d0d11ec7a9..2f4b4e25aec4 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -194,7 +194,7 @@ typedef struct xfs_da_args { uint8_t filetype; /* filetype of inode for directories */ void *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ - unsigned int attr_filter; /* XFS_ATTR_{ROOT,SECURE} */ + unsigned int attr_filter; /* XFS_ATTR_{ROOT,SECURE,INCOMPLETE} */ unsigned int attr_flags; /* XATTR_{CREATE,REPLACE} */ xfs_dahash_t hashval; /* hash value of name */ xfs_ino_t inumber; /* input/output inode number */ @@ -225,7 +225,6 @@ typedef struct xfs_da_args { #define XFS_DA_OP_OKNOENT 0x0008 /* lookup/add op, ENOENT ok, else die */ #define XFS_DA_OP_CILOOKUP 0x0010 /* lookup to return CI name if found */ #define XFS_DA_OP_NOTIME 0x0020 /* don't update inode timestamps */ -#define XFS_DA_OP_INCOMPLETE 0x0040 /* lookup INCOMPLETE attr keys */ #define XFS_DA_OP_FLAGS \ { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \ @@ -233,8 +232,7 @@ typedef struct xfs_da_args { { XFS_DA_OP_ADDNAME, "ADDNAME" }, \ { XFS_DA_OP_OKNOENT, "OKNOENT" }, \ { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \ - { XFS_DA_OP_NOTIME, "NOTIME" }, \ - { XFS_DA_OP_INCOMPLETE, "INCOMPLETE" } + { XFS_DA_OP_NOTIME, "NOTIME" } /* * Type verifier functions From patchwork Fri Feb 21 14:11:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396715 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2F7181395 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 089AF24670 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="I8kPEJLH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728822AbgBUOMD (ORCPT ); Fri, 21 Feb 2020 09:12:03 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59570 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728824AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=ZY7YJVBanbiYX7crQJUVGMtA1cNHOIZTgP9PTXGSqHM=; b=I8kPEJLH9TK8Rwx3xe1fQ2/Hkb Jg+fVFnM/ifn22E8UZnnRUK2B8AlawRcJ+7V8vqhwNRR6LVdWwccOvLtAenUjvQGwRbkr+0ORQL+N uLq+u3ATSlPRv2+vXFRPix1ft6s/5c+a9bpPkXzPKXuFmTQQj/UY9IkYd++/LX21zOmkKRpfuL4ls 5JWeQHbrpwchD14Iu+/F23ASNpL7b6ne7aS6NEtJYhg3w3UApRR80mfSzoDdhA4vcQdP0V3XBMQoX nJbV1yg+pz1g3g99uBmHmJZ4/gCVTGXnNNEJMcLP+inv+S9ChJwqs59+kYvDzMDoKxxhE2hmUtF75 YssgkaJQ==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5929-0000Li-DQ; Fri, 21 Feb 2020 14:12:01 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner , Chandan Rajendra , "Darrick J . Wong" Subject: [PATCH 30/31] xfs: embedded the attrlist cursor into struct xfs_attr_list_context Date: Fri, 21 Feb 2020 06:11:53 -0800 Message-Id: <20200221141154.476496-31-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The attrlist cursor only exists as part of an attr list context, so embedd the structure instead of pointing to it. Also give it a proper xfs_ prefix and remove the obsolete typedef. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Reviewed-by: Chandan Rajendra Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_attr.h | 6 +++--- fs/xfs/libxfs/xfs_attr_leaf.h | 1 - fs/xfs/scrub/attr.c | 2 -- fs/xfs/xfs_attr_list.c | 19 ++++++------------- fs/xfs/xfs_ioctl.c | 16 +++++++--------- fs/xfs/xfs_ioctl.h | 1 - fs/xfs/xfs_trace.h | 12 ++++++------ fs/xfs/xfs_xattr.c | 2 -- 8 files changed, 22 insertions(+), 37 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index a6bedb0eda26..0d2d05908537 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -31,14 +31,14 @@ struct xfs_attr_list_context; /* * Kernel-internal version of the attrlist cursor. */ -typedef struct attrlist_cursor_kern { +struct xfs_attrlist_cursor_kern { __u32 hashval; /* hash value of next entry to add */ __u32 blkno; /* block containing entry (suggestion) */ __u32 offset; /* offset in list of equal-hashvals */ __u16 pad1; /* padding to match user-level */ __u8 pad2; /* padding to match user-level */ __u8 initted; /* T/F: cursor has been initialized */ -} attrlist_cursor_kern_t; +}; /*======================================================================== @@ -53,7 +53,7 @@ typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int, struct xfs_attr_list_context { struct xfs_trans *tp; struct xfs_inode *dp; /* inode */ - struct attrlist_cursor_kern *cursor; /* position in list */ + struct xfs_attrlist_cursor_kern cursor; /* position in list */ void *buffer; /* output buffer */ /* diff --git a/fs/xfs/libxfs/xfs_attr_leaf.h b/fs/xfs/libxfs/xfs_attr_leaf.h index 73615b1dd1a8..6dd2d937a42a 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.h +++ b/fs/xfs/libxfs/xfs_attr_leaf.h @@ -8,7 +8,6 @@ #define __XFS_ATTR_LEAF_H__ struct attrlist; -struct attrlist_cursor_kern; struct xfs_attr_list_context; struct xfs_da_args; struct xfs_da_state; diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index 4ba4eae0dbc3..0d3b5c03eca0 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -471,7 +471,6 @@ xchk_xattr( struct xfs_scrub *sc) { struct xchk_xattr sx; - struct attrlist_cursor_kern cursor = { 0 }; xfs_dablk_t last_checked = -1U; int error = 0; @@ -490,7 +489,6 @@ xchk_xattr( /* Check that every attr key can also be looked up by hash. */ sx.context.dp = sc->ip; - sx.context.cursor = &cursor; sx.context.resynch = 1; sx.context.put_listent = xchk_xattr_listent; sx.context.tp = sc->tp; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index ba71bf4303f8..017f5691abfa 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -52,24 +52,19 @@ static int xfs_attr_shortform_list( struct xfs_attr_list_context *context) { - struct attrlist_cursor_kern *cursor; + struct xfs_attrlist_cursor_kern *cursor = &context->cursor; + struct xfs_inode *dp = context->dp; struct xfs_attr_sf_sort *sbuf, *sbp; struct xfs_attr_shortform *sf; struct xfs_attr_sf_entry *sfe; - struct xfs_inode *dp; int sbsize, nsbuf, count, i; int error = 0; - ASSERT(context != NULL); - dp = context->dp; - ASSERT(dp != NULL); ASSERT(dp->i_afp != NULL); sf = (xfs_attr_shortform_t *)dp->i_afp->if_u1.if_data; ASSERT(sf != NULL); if (!sf->hdr.count) return 0; - cursor = context->cursor; - ASSERT(cursor != NULL); trace_xfs_attr_list_sf(context); @@ -205,7 +200,7 @@ xfs_attr_shortform_list( STATIC int xfs_attr_node_list_lookup( struct xfs_attr_list_context *context, - struct attrlist_cursor_kern *cursor, + struct xfs_attrlist_cursor_kern *cursor, struct xfs_buf **pbp) { struct xfs_da3_icnode_hdr nodehdr; @@ -288,8 +283,8 @@ STATIC int xfs_attr_node_list( struct xfs_attr_list_context *context) { + struct xfs_attrlist_cursor_kern *cursor = &context->cursor; struct xfs_attr3_icleaf_hdr leafhdr; - struct attrlist_cursor_kern *cursor; struct xfs_attr_leafblock *leaf; struct xfs_da_intnode *node; struct xfs_buf *bp; @@ -299,7 +294,6 @@ xfs_attr_node_list( trace_xfs_attr_node_list(context); - cursor = context->cursor; cursor->initted = 1; /* @@ -394,7 +388,7 @@ xfs_attr3_leaf_list_int( struct xfs_buf *bp, struct xfs_attr_list_context *context) { - struct attrlist_cursor_kern *cursor; + struct xfs_attrlist_cursor_kern *cursor = &context->cursor; struct xfs_attr_leafblock *leaf; struct xfs_attr3_icleaf_hdr ichdr; struct xfs_attr_leaf_entry *entries; @@ -408,7 +402,6 @@ xfs_attr3_leaf_list_int( xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); - cursor = context->cursor; cursor->initted = 1; /* @@ -496,7 +489,7 @@ xfs_attr_leaf_list( trace_xfs_attr_leaf_list(context); - context->cursor->blkno = 0; + context->cursor.blkno = 0; error = xfs_attr3_leaf_read(context->tp, context->dp, 0, &bp); if (error) return error; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 74394355aa91..4b126f5e9bed 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -374,8 +374,7 @@ xfs_ioc_attr_list( int flags, struct xfs_attrlist_cursor __user *ucursor) { - struct xfs_attr_list_context context; - struct attrlist_cursor_kern cursor; + struct xfs_attr_list_context context = { }; struct xfs_attrlist *alist; void *buffer; int error; @@ -395,12 +394,13 @@ xfs_ioc_attr_list( /* * Validate the cursor. */ - if (copy_from_user(&cursor, ucursor, sizeof(cursor))) + if (copy_from_user(&context.cursor, ucursor, sizeof(context.cursor))) return -EFAULT; - if (cursor.pad1 || cursor.pad2) + if (context.cursor.pad1 || context.cursor.pad2) return -EINVAL; - if ((cursor.initted == 0) && - (cursor.hashval || cursor.blkno || cursor.offset)) + if (!context.cursor.initted && + (context.cursor.hashval || context.cursor.blkno || + context.cursor.offset)) return -EINVAL; buffer = kmem_zalloc_large(bufsize, 0); @@ -410,9 +410,7 @@ xfs_ioc_attr_list( /* * Initialize the output buffer. */ - memset(&context, 0, sizeof(context)); context.dp = dp; - context.cursor = &cursor; context.resynch = 1; context.attr_filter = xfs_attr_filter(flags); context.buffer = buffer; @@ -430,7 +428,7 @@ xfs_ioc_attr_list( goto out_free; if (copy_to_user(ubuf, buffer, bufsize) || - copy_to_user(ucursor, &cursor, sizeof(cursor))) + copy_to_user(ucursor, &context.cursor, sizeof(context.cursor))) error = -EFAULT; out_free: kmem_free(buffer); diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index d6e8000ad825..bab6a5a92407 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -6,7 +6,6 @@ #ifndef __XFS_IOCTL_H__ #define __XFS_IOCTL_H__ -struct attrlist_cursor_kern; struct xfs_bstat; struct xfs_ibulk; struct xfs_inogrp; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 4d18c6b6edbe..0597f48990d5 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -59,9 +59,9 @@ DECLARE_EVENT_CLASS(xfs_attr_list_class, TP_fast_assign( __entry->dev = VFS_I(ctx->dp)->i_sb->s_dev; __entry->ino = ctx->dp->i_ino; - __entry->hashval = ctx->cursor->hashval; - __entry->blkno = ctx->cursor->blkno; - __entry->offset = ctx->cursor->offset; + __entry->hashval = ctx->cursor.hashval; + __entry->blkno = ctx->cursor.blkno; + __entry->offset = ctx->cursor.offset; __entry->buffer = ctx->buffer; __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; @@ -186,9 +186,9 @@ TRACE_EVENT(xfs_attr_list_node_descend, TP_fast_assign( __entry->dev = VFS_I(ctx->dp)->i_sb->s_dev; __entry->ino = ctx->dp->i_ino; - __entry->hashval = ctx->cursor->hashval; - __entry->blkno = ctx->cursor->blkno; - __entry->offset = ctx->cursor->offset; + __entry->hashval = ctx->cursor.hashval; + __entry->blkno = ctx->cursor.blkno; + __entry->offset = ctx->cursor.offset; __entry->buffer = ctx->buffer; __entry->bufsize = ctx->bufsize; __entry->count = ctx->count; diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index ae07d1424192..e738d51ec34a 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -188,7 +188,6 @@ xfs_vn_listxattr( size_t size) { struct xfs_attr_list_context context; - struct attrlist_cursor_kern cursor = { 0 }; struct inode *inode = d_inode(dentry); int error; @@ -197,7 +196,6 @@ xfs_vn_listxattr( */ memset(&context, 0, sizeof(context)); context.dp = XFS_I(inode); - context.cursor = &cursor; context.resynch = 1; context.buffer = size ? data : NULL; context.bufsize = size; From patchwork Fri Feb 21 14:11:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 11396717 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5431B1580 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 338C124673 for ; Fri, 21 Feb 2020 14:12:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="W4m35vHt" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728814AbgBUOMD (ORCPT ); Fri, 21 Feb 2020 09:12:03 -0500 Received: from bombadil.infradead.org ([198.137.202.133]:59594 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728825AbgBUOMB (ORCPT ); Fri, 21 Feb 2020 09:12:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=0HA864KCGBerK1+P6JX+PPAw3EHz5y/ZPy3g0lUZCIA=; b=W4m35vHtJ3rvryuujb3+L8ye2w kbFNwAcUeW69hdncN86tfQCJH8hegQB4mrIAU2GnGGTvpQvxGx0K1So0J3DDMgvr1Ij8BWeixYxJ6 2MfBJEiqXNVj8Uibcg9G1UKyaSFp4LGS1V4uPhWB5vGVfHbEodgYFjJxK8rBZiVeAFPr7aEbmG2Gv 6U8CriUOML26bzNEQxVqUXCF7t6gktWoEq+uUEqqmby2GLqwkYx48Pw2KEOTtYenQigWCJZDglyEB vCfcK6tC2bEgyKP8qtlrjrY+uzWIbed5oIcokYCrHSGJSNlC6J6o847SEXN62sMdiL37fsSBXSE2b 9cYA/tEw==; Received: from [38.126.112.138] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1j5929-0000Lo-Ks; Fri, 21 Feb 2020 14:12:01 +0000 From: Christoph Hellwig To: linux-xfs@vger.kernel.org Cc: Allison Collins , Dave Chinner Subject: [PATCH 31/31] xfs: clean up bufsize alignment in xfs_ioc_attr_list Date: Fri, 21 Feb 2020 06:11:54 -0800 Message-Id: <20200221141154.476496-32-hch@lst.de> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200221141154.476496-1-hch@lst.de> References: <20200221141154.476496-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Use the round_down macro, and use the size of the uint32 type we use in the callback that fills the buffer to make the code a little more clear - the size of it is always the same as int for platforms that Linux runs on. Suggested-by: Dave Chinner Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 4b126f5e9bed..0690e1a8ef1a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -414,7 +414,7 @@ xfs_ioc_attr_list( context.resynch = 1; context.attr_filter = xfs_attr_filter(flags); context.buffer = buffer; - context.bufsize = (bufsize & ~(sizeof(int)-1)); /* align */ + context.bufsize = round_down(bufsize, sizeof(uint32_t)); context.firstu = context.bufsize; context.put_listent = xfs_ioc_attr_put_listent;