From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aserp2120.oracle.com ([141.146.126.78]:47560 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726490AbfGCPf0 (ORCPT ); Wed, 3 Jul 2019 11:35:26 -0400 Date: Wed, 3 Jul 2019 08:34:54 -0700 From: "Darrick J. Wong" Subject: [PATCH v2 9/9] xfs: allow bulkstat_single of special inodes Message-ID: <20190703153454.GX1404256@magnolia> References: <156158193320.495715.6675123051075804739.stgit@magnolia> <156158199168.495715.1433536766420003523.stgit@magnolia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <156158199168.495715.1433536766420003523.stgit@magnolia> Sender: linux-xfs-owner@vger.kernel.org List-ID: List-Id: xfs To: linux-xfs@vger.kernel.org, allison.henderson@oracle.com, Brian Foster From: Darrick J. Wong Create a new ireq flag (for single bulkstats) that enables userspace to ask us for a special inode number instead of interpreting @ino as a literal inode number. This enables us to query the root inode easily. The reason for adding the ability to query specifically the root directory inode is that certain programs (xfsdump and xfsrestore) want to confirm when they've been pointed to the root directory. The userspace code assumes the root directory is always the first result from calling bulkstat with lastino == 0, but this isn't true if the (initial btree roots + initial AGFL + inode alignment padding) is itself long enough to be allocated to new inodes if all of those blocks should happen to be free at the same time. Rather than make userspace guess at internal filesystem state, we provide a direct query. Signed-off-by: Darrick J. Wong Reviewed-by: Allison Collins --- v2: elaborate on why we are adding this new ireq flag --- fs/xfs/libxfs/xfs_fs.h | 11 ++++++++++- fs/xfs/xfs_ioctl.c | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 77c06850ac52..1489bce07d66 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -482,7 +482,16 @@ struct xfs_ireq { uint64_t reserved[2]; /* must be zero */ }; -#define XFS_IREQ_FLAGS_ALL (0) +/* + * The @ino value is a special value, not a literal inode number. See the + * XFS_IREQ_SPECIAL_* values below. + */ +#define XFS_IREQ_SPECIAL (1 << 0) + +#define XFS_IREQ_FLAGS_ALL (XFS_IREQ_SPECIAL) + +/* Operate on the root directory inode. */ +#define XFS_IREQ_SPECIAL_ROOT (1) /* * ioctl structures for v5 bulkstat and inumbers requests diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index ba9a99b7860f..11ccfc5611bf 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -952,6 +952,16 @@ xfs_ireq_setup( memchr_inv(hdr->reserved, 0, sizeof(hdr->reserved))) return -EINVAL; + if (hdr->flags & XFS_IREQ_SPECIAL) { + switch (hdr->ino) { + case XFS_IREQ_SPECIAL_ROOT: + hdr->ino = mp->m_sb.sb_rootino; + break; + default: + return -EINVAL; + } + } + if (XFS_INO_TO_AGNO(mp, hdr->ino) >= mp->m_sb.sb_agcount) return -EINVAL;