linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5
@ 2019-08-01  1:42 Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 1/5] xfs/122: ignore inode geometry structure Darrick J. Wong
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:42 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

Hi all,

Fix some problems introduced by the creation of the V5 bulkstat ioctl,
and then add some new tests to make sure the new libxfrog bulkstat
wrappers work fine with both the new v5 ioctl and emulating it with the
old v1 ioctl.

If you're going to start using this mess, you probably ought to just
pull from my git trees, which are linked below.

This is an extraordinary way to destroy everything.  Enjoy!
Comments and questions are, as always, welcome.

--D

kernel git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfs-linux.git/log/?h=bulkstat-v5

xfsprogs git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfsprogs-dev.git/log/?h=bulkstat-v5

fstests git tree:
https://git.kernel.org/cgit/linux/kernel/git/djwong/xfstests-dev.git/log/?h=bulkstat-v5

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/5] xfs/122: ignore inode geometry structure
  2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
@ 2019-08-01  1:42 ` Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 2/5] xfs/122: mask wonky ioctls Darrick J. Wong
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:42 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

From: Darrick J. Wong <darrick.wong@oracle.com>

Ignore new in-core structure.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 tests/xfs/122 |    1 +
 1 file changed, 1 insertion(+)


diff --git a/tests/xfs/122 b/tests/xfs/122
index b66b78a6..89a39a23 100755
--- a/tests/xfs/122
+++ b/tests/xfs/122
@@ -177,6 +177,7 @@ xfs_dirent_t
 xfs_fsop_getparents_handlereq_t
 xfs_dinode_core_t
 struct xfs_iext_cursor
+struct xfs_ino_geometry
 EOF
 
 echo 'int main(int argc, char *argv[]) {' >>$cprog

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/5] xfs/122: mask wonky ioctls
  2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 1/5] xfs/122: ignore inode geometry structure Darrick J. Wong
@ 2019-08-01  1:42 ` Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures Darrick J. Wong
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:42 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

From: Darrick J. Wong <darrick.wong@oracle.com>

Don't check the structure size of the inogrp/bstat/fsop_bulkreq
structures because they're incorrectly padded.  When we remove the
old typdefs the old filter stops working.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 tests/xfs/122 |    3 +++
 1 file changed, 3 insertions(+)


diff --git a/tests/xfs/122 b/tests/xfs/122
index 89a39a23..64b63cb1 100755
--- a/tests/xfs/122
+++ b/tests/xfs/122
@@ -148,12 +148,15 @@ xfs_growfs_data_t
 xfs_growfs_rt_t
 xfs_bstime_t
 xfs_bstat_t
+struct xfs_bstat
 xfs_fsop_bulkreq_t
+struct xfs_fsop_bulkreq
 xfs_icsb_cnts_t
 xfs_icdinode_t
 xfs_ictimestamp_t
 xfs_inobt_rec_incore_t
 xfs_inogrp_t
+struct xfs_inogrp
 xfs_fid2_t
 xfs_fsop_handlereq_t
 xfs_fsop_setdm_handlereq_t

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures
  2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 1/5] xfs/122: ignore inode geometry structure Darrick J. Wong
  2019-08-01  1:42 ` [PATCH 2/5] xfs/122: mask wonky ioctls Darrick J. Wong
@ 2019-08-01  1:42 ` Darrick J. Wong
  2019-08-01 10:47   ` Brian Foster
  2019-08-01  1:43 ` [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems Darrick J. Wong
  2019-08-01  1:43 ` [PATCH 5/5] xfs: test new v5 bulkstat commands Darrick J. Wong
  4 siblings, 1 reply; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:42 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

From: Darrick J. Wong <darrick.wong@oracle.com>

The new v5 bulkstat and inumbers structures are correctly padded so that
no format changes are necessary across platforms, so add them to the
output.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 tests/xfs/122.out |    5 +++++
 1 file changed, 5 insertions(+)


diff --git a/tests/xfs/122.out b/tests/xfs/122.out
index cf9ac9e2..d2d5a184 100644
--- a/tests/xfs/122.out
+++ b/tests/xfs/122.out
@@ -66,6 +66,9 @@ sizeof(struct xfs_btree_block_lhdr) = 64
 sizeof(struct xfs_btree_block_shdr) = 48
 sizeof(struct xfs_bud_log_format) = 16
 sizeof(struct xfs_bui_log_format) = 16
+sizeof(struct xfs_bulk_ireq) = 64
+sizeof(struct xfs_bulkstat) = 192
+sizeof(struct xfs_bulkstat_req) = 64
 sizeof(struct xfs_clone_args) = 32
 sizeof(struct xfs_cud_log_format) = 16
 sizeof(struct xfs_cui_log_format) = 16
@@ -89,6 +92,8 @@ sizeof(struct xfs_fsop_geom_v4) = 112
 sizeof(struct xfs_icreate_log) = 28
 sizeof(struct xfs_inode_log_format) = 56
 sizeof(struct xfs_inode_log_format_32) = 52
+sizeof(struct xfs_inumbers) = 24
+sizeof(struct xfs_inumbers_req) = 64
 sizeof(struct xfs_log_dinode) = 176
 sizeof(struct xfs_map_extent) = 32
 sizeof(struct xfs_phys_extent) = 16

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems
  2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
                   ` (2 preceding siblings ...)
  2019-08-01  1:42 ` [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures Darrick J. Wong
@ 2019-08-01  1:43 ` Darrick J. Wong
  2019-08-01 10:48   ` Brian Foster
  2019-08-01  1:43 ` [PATCH 5/5] xfs: test new v5 bulkstat commands Darrick J. Wong
  4 siblings, 1 reply; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:43 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

From: Darrick J. Wong <darrick.wong@oracle.com>

Create a helper function to return the number of AGs of a mounted
filesystem so that we can get rid of the open-coded versions in various
tests.  The new helper will be used in a subsequent patch.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 common/xfs    |    6 ++++++
 tests/xfs/085 |    2 +-
 tests/xfs/086 |    2 +-
 tests/xfs/087 |    2 +-
 tests/xfs/088 |    2 +-
 tests/xfs/089 |    2 +-
 tests/xfs/091 |    2 +-
 tests/xfs/093 |    2 +-
 tests/xfs/097 |    2 +-
 tests/xfs/130 |    2 +-
 tests/xfs/235 |    2 +-
 tests/xfs/271 |    2 +-
 12 files changed, 17 insertions(+), 11 deletions(-)


diff --git a/common/xfs b/common/xfs
index 2b38e94b..1bce3c18 100644
--- a/common/xfs
+++ b/common/xfs
@@ -878,3 +878,9 @@ _force_xfsv4_mount_options()
 	fi
 	echo "MOUNT_OPTIONS = $MOUNT_OPTIONS" >>$seqres.full
 }
+
+# Find AG count of mounted filesystem
+_xfs_mount_agcount()
+{
+	$XFS_INFO_PROG "$1" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g'
+}
diff --git a/tests/xfs/085 b/tests/xfs/085
index 23095413..18ddeff8 100755
--- a/tests/xfs/085
+++ b/tests/xfs/085
@@ -63,7 +63,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/086 b/tests/xfs/086
index 8602a565..7429d39d 100755
--- a/tests/xfs/086
+++ b/tests/xfs/086
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 test "${agcount}" -gt 1 || _notrun "Single-AG XFS not supported"
 umount "${SCRATCH_MNT}"
 
diff --git a/tests/xfs/087 b/tests/xfs/087
index ede8e447..b3d3bca9 100755
--- a/tests/xfs/087
+++ b/tests/xfs/087
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/088 b/tests/xfs/088
index 6f36efab..74b45163 100755
--- a/tests/xfs/088
+++ b/tests/xfs/088
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/089 b/tests/xfs/089
index 5c398299..bcbc6363 100755
--- a/tests/xfs/089
+++ b/tests/xfs/089
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/091 b/tests/xfs/091
index 5d6cd363..be56d8ae 100755
--- a/tests/xfs/091
+++ b/tests/xfs/091
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/093 b/tests/xfs/093
index e09e8499..4c4fbdc4 100755
--- a/tests/xfs/093
+++ b/tests/xfs/093
@@ -64,7 +64,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/097 b/tests/xfs/097
index db355de6..68eae1d4 100755
--- a/tests/xfs/097
+++ b/tests/xfs/097
@@ -67,7 +67,7 @@ for x in `seq 2 64`; do
 	touch "${TESTFILE}.${x}"
 done
 inode="$(stat -c '%i' "${TESTFILE}.1")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 umount "${SCRATCH_MNT}"
 
 echo "+ check fs"
diff --git a/tests/xfs/130 b/tests/xfs/130
index 71c1181f..f15366a6 100755
--- a/tests/xfs/130
+++ b/tests/xfs/130
@@ -43,7 +43,7 @@ _scratch_mkfs_xfs > /dev/null
 echo "+ mount fs image"
 _scratch_mount
 blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")"
-agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
+agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
 
 echo "+ make some files"
 _pwrite_byte 0x62 0 $((blksz * 64)) "${SCRATCH_MNT}/file0" >> "$seqres.full"
diff --git a/tests/xfs/235 b/tests/xfs/235
index 669f58b0..64b0a0b5 100755
--- a/tests/xfs/235
+++ b/tests/xfs/235
@@ -41,7 +41,7 @@ _scratch_mkfs_xfs > /dev/null
 echo "+ mount fs image"
 _scratch_mount
 blksz=$(stat -f -c '%s' ${SCRATCH_MNT})
-agcount=$($XFS_INFO_PROG ${SCRATCH_MNT} | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')
+agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
 
 echo "+ make some files"
 _pwrite_byte 0x62 0 $((blksz * 64)) ${SCRATCH_MNT}/file0 >> $seqres.full
diff --git a/tests/xfs/271 b/tests/xfs/271
index db14bfec..38844246 100755
--- a/tests/xfs/271
+++ b/tests/xfs/271
@@ -37,7 +37,7 @@ echo "Format and mount"
 _scratch_mkfs > "$seqres.full" 2>&1
 _scratch_mount
 
-agcount=$($XFS_INFO_PROG $SCRATCH_MNT | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')
+agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
 
 echo "Get fsmap" | tee -a $seqres.full
 $XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT > $TEST_DIR/fsmap

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/5] xfs: test new v5 bulkstat commands
  2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
                   ` (3 preceding siblings ...)
  2019-08-01  1:43 ` [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems Darrick J. Wong
@ 2019-08-01  1:43 ` Darrick J. Wong
  2019-08-01 10:48   ` Brian Foster
  4 siblings, 1 reply; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01  1:43 UTC (permalink / raw)
  To: guaneryu, darrick.wong; +Cc: linux-xfs, bfoster, fstests

From: Darrick J. Wong <darrick.wong@oracle.com>

Check that the new v5 bulkstat commands do everything the old one do,
and then make sure the new functionality actually works.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 .gitignore                 |    1 
 src/Makefile               |    2 
 src/bulkstat_null_ocount.c |   61 +++++++++
 tests/xfs/744              |  215 ++++++++++++++++++++++++++++++++
 tests/xfs/744.out          |  297 ++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/745              |   47 +++++++
 tests/xfs/745.out          |    2 
 tests/xfs/group            |    2 
 8 files changed, 626 insertions(+), 1 deletion(-)
 create mode 100644 src/bulkstat_null_ocount.c
 create mode 100755 tests/xfs/744
 create mode 100644 tests/xfs/744.out
 create mode 100755 tests/xfs/745
 create mode 100644 tests/xfs/745.out


diff --git a/.gitignore b/.gitignore
index 11232be7..c8c815f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,7 @@
 /src/attr_replace_test
 /src/attr-list-by-handle-cursor-test
 /src/bstat
+/src/bulkstat_null_ocount
 /src/bulkstat_unlink_test
 /src/bulkstat_unlink_test_modified
 /src/cloner
diff --git a/src/Makefile b/src/Makefile
index 9d3d2529..c4fcf370 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -28,7 +28,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \
 	attr-list-by-handle-cursor-test listxattr dio-interleaved t_dir_type \
 	dio-invalidate-cache stat_test t_encrypted_d_revalidate \
 	attr_replace_test swapon mkswap t_attr_corruption t_open_tmpfiles \
-	fscrypt-crypt-util
+	fscrypt-crypt-util bulkstat_null_ocount
 
 SUBDIRS = log-writes perf
 
diff --git a/src/bulkstat_null_ocount.c b/src/bulkstat_null_ocount.c
new file mode 100644
index 00000000..b8f8fd39
--- /dev/null
+++ b/src/bulkstat_null_ocount.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ *
+ * Ensure the kernel returns the new lastip even when ocount is null.
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <xfs/xfs.h>
+
+static void die(const char *tag)
+{
+	perror(tag);
+	exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+	struct xfs_bstat	bstat;
+	__u64			last;
+	struct xfs_fsop_bulkreq bulkreq = {
+		.lastip		= &last,
+		.icount		= 1,
+		.ubuffer	= &bstat,
+		.ocount		= NULL,
+	};
+	int ret;
+	int fd;
+
+	fd = open(argv[1], O_RDONLY);
+	if (fd < 0)
+		die(argv[1]);
+
+	last = 0;
+	ret = ioctl(fd, XFS_IOC_FSINUMBERS, &bulkreq);
+	if (ret)
+		die("inumbers");
+
+	if (last == 0)
+		printf("inumbers last = %llu\n", (unsigned long long)last);
+
+	last = 0;
+	ret = ioctl(fd, XFS_IOC_FSBULKSTAT, &bulkreq);
+	if (ret)
+		die("bulkstat");
+
+	if (last == 0)
+		printf("bulkstat last = %llu\n", (unsigned long long)last);
+
+	ret = close(fd);
+	if (ret)
+		die("close");
+
+	return 0;
+}
diff --git a/tests/xfs/744 b/tests/xfs/744
new file mode 100755
index 00000000..182c6ee5
--- /dev/null
+++ b/tests/xfs/744
@@ -0,0 +1,215 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2014 Red Hat, Inc.  All Rights Reserved.
+# Copyright (c) 2019 Oracle, Inc.  All Rights Reserved.
+#
+# FS QA Test No. 744
+#
+# Use the xfs_io bulkstat utility to verify bulkstat finds all inodes in a
+# filesystem.  Test under various inode counts, inobt record layouts and
+# bulkstat batch sizes.  Test v1 and v5 ioctls explicitly, as well as the
+# ioctl version autodetection code in libfrog.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+}
+
+bstat_versions()
+{
+	echo "default"
+	echo "v1 -v1"
+	if [ -n "$has_v5" ]; then
+		echo "v5 -v5"
+	else
+		echo "v5"
+	fi
+}
+
+# Print the number of inodes counted by bulkstat
+bstat_count()
+{
+	local batchsize="$1"
+	local tag="$2"
+
+	bstat_versions | while read v_tag v_flag; do
+		echo "$tag($v_tag): passing \"$v_flag\" to bulkstat" >> $seqres.full
+		echo -n "bulkstat $tag($v_tag): "
+		$XFS_IO_PROG -c "bulkstat -n $batchsize $v_flag" $SCRATCH_MNT | grep ino | wc -l
+	done
+}
+
+# Print the number of inodes counted by per-ag bulkstat
+bstat_perag_count()
+{
+	local batchsize="$1"
+	local tag="$2"
+
+	local agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
+
+	bstat_versions | while read v_tag v_flag; do
+		echo -n "bulkstat $tag($v_tag): "
+		seq 0 $((agcount - 1)) | while read ag; do
+			$XFS_IO_PROG -c "bulkstat -a $ag -n $batchsize $v_flag" $SCRATCH_MNT
+		done | grep ino | wc -l
+	done
+}
+
+# Sum the number of allocated inodes in each AG in a fs.
+inumbers_ag()
+{
+	local agcount="$1"
+	local batchsize="$2"
+	local mount="$3"
+	local v_flag="$4"
+
+	seq 0 $((agcount - 1)) | while read ag; do
+		$XFS_IO_PROG -c "inumbers -a $ag -n $batchsize $v_flag" $mount
+	done | grep alloccount | awk '{x += $3} END { print(x) }'
+}
+
+# Sum the number of allocated inodes in the whole fs all at once.
+inumbers_fs()
+{
+	local dir="$1"
+	local v_flag="$2"
+
+	$XFS_IO_PROG -c "inumbers $v_flag" "$dir" | grep alloccount | \
+		awk '{x += $3} END { print(x) }'
+}
+
+# Print the number of inodes counted by inumbers
+inumbers_count()
+{
+	local expect="$1"
+
+	# There probably aren't more than 10 hidden inodes, right?
+	local tolerance=10
+
+	# Force all background unlinked inode cleanup to run so that we don't
+	# race changes to the inode btree with our inumbers query.
+	_scratch_cycle_mount
+
+	bstat_versions | while read v_tag v_flag; do
+		echo -n "inumbers all($v_tag): "
+		nr=$(inumbers_fs $SCRATCH_MNT $v_flag)
+		_within_tolerance "inumbers" $nr $expect $tolerance -v
+
+		local agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
+		for batchsize in 71 2 1; do
+			echo -n "inumbers $batchsize($v_tag): "
+			nr=$(inumbers_ag $agcount $batchsize $SCRATCH_MNT $v_flag)
+			_within_tolerance "inumbers" $nr $expect $tolerance -v
+		done
+	done
+}
+
+# Compare the src/bstat output against the xfs_io bstat output.
+# This compares the actual inode numbers output by one tool against another,
+# so we can't easily put the output in the golden output.
+bstat_compare()
+{
+	bstat_versions | while read v_tag v_flag; do
+		diff -u <(./src/bstat $SCRATCH_MNT | grep ino | awk '{print $2}') \
+			<($XFS_IO_PROG -c "bulkstat $v_flag" $SCRATCH_MNT | grep ino | awk '{print $3}')
+	done
+}
+
+# Print bulkstat counts using varied batch sizes
+bstat_test()
+{
+	expect=`find $SCRATCH_MNT -print | wc -l`
+	echo
+	echo "expect $expect"
+
+	for sz in 4096 71 32 1; do
+		bstat_count $sz "$sz all"
+		bstat_perag_count $sz "$sz perag"
+		bstat_compare
+		inumbers_count $expect
+	done
+}
+
+# Get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+_require_scratch
+_require_xfs_io_command bulkstat
+_require_xfs_io_command bulkstat_single
+_require_xfs_io_command inumbers
+
+# Real QA test starts here
+
+_supported_fs xfs
+_supported_os Linux
+
+rm -f $seqres.full
+
+DIRCOUNT=8
+INOCOUNT=$((2048 / DIRCOUNT))
+
+_scratch_mkfs "-d agcount=$DIRCOUNT" >> $seqres.full 2>&1 || _fail "mkfs failed"
+_scratch_mount
+
+# Figure out if we have v5 bulkstat/inumbers ioctls.
+has_v5=
+bs_root_out="$($XFS_IO_PROG -c 'bulkstat_single root' $SCRATCH_MNT 2>>$seqres.full)"
+test -n "$bs_root_out" && has_v5=1
+
+echo "this will be 1 if we have v5 bulkstat: $has_v5" >> $seqres.full
+
+# If v5 bulkstat is present, query the root inode and compare it to the stat
+# output of $SCRATCH_MNT to make sure it gave us the correct number
+if [ -n "$has_v5" ]; then
+	bs_root=$(echo "$bs_root_out" | grep ino | awk '{print $3}')
+	stat_root=$(stat -c '%i' $SCRATCH_MNT)
+	if [ "$stat_root" -ne "$bs_root" ]; then
+		echo "stat says root is $stat_root but bulkstat says $bs_root"
+	fi
+fi
+
+# Create a set of directories and fill each with a fixed number of files
+for dir in $(seq 1 $DIRCOUNT); do
+	mkdir -p $SCRATCH_MNT/$dir
+	for i in $(seq 1 $INOCOUNT); do
+		touch $SCRATCH_MNT/$dir/$i
+	done
+done
+bstat_test
+
+# Remove every other file from each dir
+for dir in $(seq 1 $DIRCOUNT); do
+	for i in $(seq 2 2 $INOCOUNT); do
+		rm -f $SCRATCH_MNT/$dir/$i
+	done
+done
+bstat_test
+
+# Remove the entire second half of files
+for dir in $(seq 1 $DIRCOUNT); do
+	for i in $(seq $((INOCOUNT / 2)) $INOCOUNT); do
+		rm -f $SCRATCH_MNT/$dir/$i
+	done
+done
+bstat_test
+
+# Remove all regular files
+for dir in $(seq 1 $DIRCOUNT); do
+	rm -f $SCRATCH_MNT/$dir/*
+done
+bstat_test
+
+# Success, all done
+status=0
+exit
diff --git a/tests/xfs/744.out b/tests/xfs/744.out
new file mode 100644
index 00000000..ed6b03cf
--- /dev/null
+++ b/tests/xfs/744.out
@@ -0,0 +1,297 @@
+QA output created by 744
+
+expect 2057
+bulkstat 4096 all(default): 2057
+bulkstat 4096 all(v1): 2057
+bulkstat 4096 all(v5): 2057
+bulkstat 4096 perag(default): 2057
+bulkstat 4096 perag(v1): 2057
+bulkstat 4096 perag(v5): 2057
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 71 all(default): 2057
+bulkstat 71 all(v1): 2057
+bulkstat 71 all(v5): 2057
+bulkstat 71 perag(default): 2057
+bulkstat 71 perag(v1): 2057
+bulkstat 71 perag(v5): 2057
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 32 all(default): 2057
+bulkstat 32 all(v1): 2057
+bulkstat 32 all(v5): 2057
+bulkstat 32 perag(default): 2057
+bulkstat 32 perag(v1): 2057
+bulkstat 32 perag(v5): 2057
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 1 all(default): 2057
+bulkstat 1 all(v1): 2057
+bulkstat 1 all(v5): 2057
+bulkstat 1 perag(default): 2057
+bulkstat 1 perag(v1): 2057
+bulkstat 1 perag(v5): 2057
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+
+expect 1033
+bulkstat 4096 all(default): 1033
+bulkstat 4096 all(v1): 1033
+bulkstat 4096 all(v5): 1033
+bulkstat 4096 perag(default): 1033
+bulkstat 4096 perag(v1): 1033
+bulkstat 4096 perag(v5): 1033
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 71 all(default): 1033
+bulkstat 71 all(v1): 1033
+bulkstat 71 all(v5): 1033
+bulkstat 71 perag(default): 1033
+bulkstat 71 perag(v1): 1033
+bulkstat 71 perag(v5): 1033
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 32 all(default): 1033
+bulkstat 32 all(v1): 1033
+bulkstat 32 all(v5): 1033
+bulkstat 32 perag(default): 1033
+bulkstat 32 perag(v1): 1033
+bulkstat 32 perag(v5): 1033
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 1 all(default): 1033
+bulkstat 1 all(v1): 1033
+bulkstat 1 all(v5): 1033
+bulkstat 1 perag(default): 1033
+bulkstat 1 perag(v1): 1033
+bulkstat 1 perag(v5): 1033
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+
+expect 521
+bulkstat 4096 all(default): 521
+bulkstat 4096 all(v1): 521
+bulkstat 4096 all(v5): 521
+bulkstat 4096 perag(default): 521
+bulkstat 4096 perag(v1): 521
+bulkstat 4096 perag(v5): 521
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 71 all(default): 521
+bulkstat 71 all(v1): 521
+bulkstat 71 all(v5): 521
+bulkstat 71 perag(default): 521
+bulkstat 71 perag(v1): 521
+bulkstat 71 perag(v5): 521
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 32 all(default): 521
+bulkstat 32 all(v1): 521
+bulkstat 32 all(v5): 521
+bulkstat 32 perag(default): 521
+bulkstat 32 perag(v1): 521
+bulkstat 32 perag(v5): 521
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 1 all(default): 521
+bulkstat 1 all(v1): 521
+bulkstat 1 all(v5): 521
+bulkstat 1 perag(default): 521
+bulkstat 1 perag(v1): 521
+bulkstat 1 perag(v5): 521
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+
+expect 9
+bulkstat 4096 all(default): 9
+bulkstat 4096 all(v1): 9
+bulkstat 4096 all(v5): 9
+bulkstat 4096 perag(default): 9
+bulkstat 4096 perag(v1): 9
+bulkstat 4096 perag(v5): 9
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 71 all(default): 9
+bulkstat 71 all(v1): 9
+bulkstat 71 all(v5): 9
+bulkstat 71 perag(default): 9
+bulkstat 71 perag(v1): 9
+bulkstat 71 perag(v5): 9
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 32 all(default): 9
+bulkstat 32 all(v1): 9
+bulkstat 32 all(v5): 9
+bulkstat 32 perag(default): 9
+bulkstat 32 perag(v1): 9
+bulkstat 32 perag(v5): 9
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
+bulkstat 1 all(default): 9
+bulkstat 1 all(v1): 9
+bulkstat 1 all(v5): 9
+bulkstat 1 perag(default): 9
+bulkstat 1 perag(v1): 9
+bulkstat 1 perag(v5): 9
+inumbers all(default): inumbers is in range
+inumbers 71(default): inumbers is in range
+inumbers 2(default): inumbers is in range
+inumbers 1(default): inumbers is in range
+inumbers all(v1): inumbers is in range
+inumbers 71(v1): inumbers is in range
+inumbers 2(v1): inumbers is in range
+inumbers 1(v1): inumbers is in range
+inumbers all(v5): inumbers is in range
+inumbers 71(v5): inumbers is in range
+inumbers 2(v5): inumbers is in range
+inumbers 1(v5): inumbers is in range
diff --git a/tests/xfs/745 b/tests/xfs/745
new file mode 100755
index 00000000..dcb14c41
--- /dev/null
+++ b/tests/xfs/745
@@ -0,0 +1,47 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2019 Oracle, Inc.  All Rights Reserved.
+#
+# FS QA Test No. 745
+#
+# Regression test for a long-standing bug in BULKSTAT and INUMBERS where
+# the kernel fails to write thew new @lastip value back to userspace if
+# @ocount is NULL.
+#
+# This is a regression test for commit f16fe3ecde62 ("xfs: bulkstat should copy
+# lastip whenever userspace supplies one")
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+_require_test_program "bulkstat_null_ocount"
+
+# real QA test starts here
+
+_supported_fs xfs
+_supported_os Linux
+
+rm -f $seqres.full
+
+echo "Silence is golden."
+src/bulkstat_null_ocount $TEST_DIR
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/745.out b/tests/xfs/745.out
new file mode 100644
index 00000000..ce947de2
--- /dev/null
+++ b/tests/xfs/745.out
@@ -0,0 +1,2 @@
+QA output created by 745
+Silence is golden.
diff --git a/tests/xfs/group b/tests/xfs/group
index 270d82ff..ef0cf92c 100644
--- a/tests/xfs/group
+++ b/tests/xfs/group
@@ -506,3 +506,5 @@
 506 auto quick health
 507 clone
 508 auto quick quota
+744 auto ioctl quick
+745 auto ioctl quick

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures
  2019-08-01  1:42 ` [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures Darrick J. Wong
@ 2019-08-01 10:47   ` Brian Foster
  0 siblings, 0 replies; 11+ messages in thread
From: Brian Foster @ 2019-08-01 10:47 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: guaneryu, linux-xfs, fstests

On Wed, Jul 31, 2019 at 06:42:57PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> The new v5 bulkstat and inumbers structures are correctly padded so that
> no format changes are necessary across platforms, so add them to the
> output.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  tests/xfs/122.out |    5 +++++
>  1 file changed, 5 insertions(+)
> 
> 
> diff --git a/tests/xfs/122.out b/tests/xfs/122.out
> index cf9ac9e2..d2d5a184 100644
> --- a/tests/xfs/122.out
> +++ b/tests/xfs/122.out
> @@ -66,6 +66,9 @@ sizeof(struct xfs_btree_block_lhdr) = 64
>  sizeof(struct xfs_btree_block_shdr) = 48
>  sizeof(struct xfs_bud_log_format) = 16
>  sizeof(struct xfs_bui_log_format) = 16
> +sizeof(struct xfs_bulk_ireq) = 64
> +sizeof(struct xfs_bulkstat) = 192
> +sizeof(struct xfs_bulkstat_req) = 64
>  sizeof(struct xfs_clone_args) = 32
>  sizeof(struct xfs_cud_log_format) = 16
>  sizeof(struct xfs_cui_log_format) = 16
> @@ -89,6 +92,8 @@ sizeof(struct xfs_fsop_geom_v4) = 112
>  sizeof(struct xfs_icreate_log) = 28
>  sizeof(struct xfs_inode_log_format) = 56
>  sizeof(struct xfs_inode_log_format_32) = 52
> +sizeof(struct xfs_inumbers) = 24
> +sizeof(struct xfs_inumbers_req) = 64
>  sizeof(struct xfs_log_dinode) = 176
>  sizeof(struct xfs_map_extent) = 32
>  sizeof(struct xfs_phys_extent) = 16
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems
  2019-08-01  1:43 ` [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems Darrick J. Wong
@ 2019-08-01 10:48   ` Brian Foster
  0 siblings, 0 replies; 11+ messages in thread
From: Brian Foster @ 2019-08-01 10:48 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: guaneryu, linux-xfs, fstests

On Wed, Jul 31, 2019 at 06:43:04PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Create a helper function to return the number of AGs of a mounted
> filesystem so that we can get rid of the open-coded versions in various
> tests.  The new helper will be used in a subsequent patch.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---

Thanks for splitting this out:

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  common/xfs    |    6 ++++++
>  tests/xfs/085 |    2 +-
>  tests/xfs/086 |    2 +-
>  tests/xfs/087 |    2 +-
>  tests/xfs/088 |    2 +-
>  tests/xfs/089 |    2 +-
>  tests/xfs/091 |    2 +-
>  tests/xfs/093 |    2 +-
>  tests/xfs/097 |    2 +-
>  tests/xfs/130 |    2 +-
>  tests/xfs/235 |    2 +-
>  tests/xfs/271 |    2 +-
>  12 files changed, 17 insertions(+), 11 deletions(-)
> 
> 
> diff --git a/common/xfs b/common/xfs
> index 2b38e94b..1bce3c18 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -878,3 +878,9 @@ _force_xfsv4_mount_options()
>  	fi
>  	echo "MOUNT_OPTIONS = $MOUNT_OPTIONS" >>$seqres.full
>  }
> +
> +# Find AG count of mounted filesystem
> +_xfs_mount_agcount()
> +{
> +	$XFS_INFO_PROG "$1" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g'
> +}
> diff --git a/tests/xfs/085 b/tests/xfs/085
> index 23095413..18ddeff8 100755
> --- a/tests/xfs/085
> +++ b/tests/xfs/085
> @@ -63,7 +63,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/086 b/tests/xfs/086
> index 8602a565..7429d39d 100755
> --- a/tests/xfs/086
> +++ b/tests/xfs/086
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  test "${agcount}" -gt 1 || _notrun "Single-AG XFS not supported"
>  umount "${SCRATCH_MNT}"
>  
> diff --git a/tests/xfs/087 b/tests/xfs/087
> index ede8e447..b3d3bca9 100755
> --- a/tests/xfs/087
> +++ b/tests/xfs/087
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/088 b/tests/xfs/088
> index 6f36efab..74b45163 100755
> --- a/tests/xfs/088
> +++ b/tests/xfs/088
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/089 b/tests/xfs/089
> index 5c398299..bcbc6363 100755
> --- a/tests/xfs/089
> +++ b/tests/xfs/089
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/091 b/tests/xfs/091
> index 5d6cd363..be56d8ae 100755
> --- a/tests/xfs/091
> +++ b/tests/xfs/091
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/093 b/tests/xfs/093
> index e09e8499..4c4fbdc4 100755
> --- a/tests/xfs/093
> +++ b/tests/xfs/093
> @@ -64,7 +64,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/097 b/tests/xfs/097
> index db355de6..68eae1d4 100755
> --- a/tests/xfs/097
> +++ b/tests/xfs/097
> @@ -67,7 +67,7 @@ for x in `seq 2 64`; do
>  	touch "${TESTFILE}.${x}"
>  done
>  inode="$(stat -c '%i' "${TESTFILE}.1")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  umount "${SCRATCH_MNT}"
>  
>  echo "+ check fs"
> diff --git a/tests/xfs/130 b/tests/xfs/130
> index 71c1181f..f15366a6 100755
> --- a/tests/xfs/130
> +++ b/tests/xfs/130
> @@ -43,7 +43,7 @@ _scratch_mkfs_xfs > /dev/null
>  echo "+ mount fs image"
>  _scratch_mount
>  blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")"
> -agcount="$($XFS_INFO_PROG "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')"
> +agcount="$(_xfs_mount_agcount $SCRATCH_MNT)"
>  
>  echo "+ make some files"
>  _pwrite_byte 0x62 0 $((blksz * 64)) "${SCRATCH_MNT}/file0" >> "$seqres.full"
> diff --git a/tests/xfs/235 b/tests/xfs/235
> index 669f58b0..64b0a0b5 100755
> --- a/tests/xfs/235
> +++ b/tests/xfs/235
> @@ -41,7 +41,7 @@ _scratch_mkfs_xfs > /dev/null
>  echo "+ mount fs image"
>  _scratch_mount
>  blksz=$(stat -f -c '%s' ${SCRATCH_MNT})
> -agcount=$($XFS_INFO_PROG ${SCRATCH_MNT} | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')
> +agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
>  
>  echo "+ make some files"
>  _pwrite_byte 0x62 0 $((blksz * 64)) ${SCRATCH_MNT}/file0 >> $seqres.full
> diff --git a/tests/xfs/271 b/tests/xfs/271
> index db14bfec..38844246 100755
> --- a/tests/xfs/271
> +++ b/tests/xfs/271
> @@ -37,7 +37,7 @@ echo "Format and mount"
>  _scratch_mkfs > "$seqres.full" 2>&1
>  _scratch_mount
>  
> -agcount=$($XFS_INFO_PROG $SCRATCH_MNT | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')
> +agcount=$(_xfs_mount_agcount $SCRATCH_MNT)
>  
>  echo "Get fsmap" | tee -a $seqres.full
>  $XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT > $TEST_DIR/fsmap
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] xfs: test new v5 bulkstat commands
  2019-08-01  1:43 ` [PATCH 5/5] xfs: test new v5 bulkstat commands Darrick J. Wong
@ 2019-08-01 10:48   ` Brian Foster
  2019-08-01 14:01     ` Darrick J. Wong
  2019-08-02  1:55     ` Eryu Guan
  0 siblings, 2 replies; 11+ messages in thread
From: Brian Foster @ 2019-08-01 10:48 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: guaneryu, linux-xfs, fstests

On Wed, Jul 31, 2019 at 06:43:10PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Check that the new v5 bulkstat commands do everything the old one do,
> and then make sure the new functionality actually works.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  .gitignore                 |    1 
>  src/Makefile               |    2 
>  src/bulkstat_null_ocount.c |   61 +++++++++
>  tests/xfs/744              |  215 ++++++++++++++++++++++++++++++++
>  tests/xfs/744.out          |  297 ++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/745              |   47 +++++++
>  tests/xfs/745.out          |    2 
>  tests/xfs/group            |    2 
>  8 files changed, 626 insertions(+), 1 deletion(-)
>  create mode 100644 src/bulkstat_null_ocount.c
>  create mode 100755 tests/xfs/744
>  create mode 100644 tests/xfs/744.out
>  create mode 100755 tests/xfs/745
>  create mode 100644 tests/xfs/745.out
> 
> 
...
> diff --git a/tests/xfs/group b/tests/xfs/group
> index 270d82ff..ef0cf92c 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -506,3 +506,5 @@
>  506 auto quick health
>  507 clone
>  508 auto quick quota
> +744 auto ioctl quick
> +745 auto ioctl quick
> 

One quick note that xfs/744 runs in ~68 seconds in my (low resource)
test VM. Not a problem in and of itself, but it seems slightly long for
the quick group. Can somebody remind me of the quick group criteria?

FWIW if I kick off a quick group run, the first 10-15 tests complete in
10s or so or less with the exception of generic/013, which takes over a
minute. So perhaps anything under a minute or so is fine..? Either way,
that can be easily changed on merge if appropriate:

Reviewed-by: Brian Foster <bfoster@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] xfs: test new v5 bulkstat commands
  2019-08-01 10:48   ` Brian Foster
@ 2019-08-01 14:01     ` Darrick J. Wong
  2019-08-02  1:55     ` Eryu Guan
  1 sibling, 0 replies; 11+ messages in thread
From: Darrick J. Wong @ 2019-08-01 14:01 UTC (permalink / raw)
  To: Brian Foster; +Cc: guaneryu, linux-xfs, fstests

On Thu, Aug 01, 2019 at 06:48:15AM -0400, Brian Foster wrote:
> On Wed, Jul 31, 2019 at 06:43:10PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Check that the new v5 bulkstat commands do everything the old one do,
> > and then make sure the new functionality actually works.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  .gitignore                 |    1 
> >  src/Makefile               |    2 
> >  src/bulkstat_null_ocount.c |   61 +++++++++
> >  tests/xfs/744              |  215 ++++++++++++++++++++++++++++++++
> >  tests/xfs/744.out          |  297 ++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/745              |   47 +++++++
> >  tests/xfs/745.out          |    2 
> >  tests/xfs/group            |    2 
> >  8 files changed, 626 insertions(+), 1 deletion(-)
> >  create mode 100644 src/bulkstat_null_ocount.c
> >  create mode 100755 tests/xfs/744
> >  create mode 100644 tests/xfs/744.out
> >  create mode 100755 tests/xfs/745
> >  create mode 100644 tests/xfs/745.out
> > 
> > 
> ...
> > diff --git a/tests/xfs/group b/tests/xfs/group
> > index 270d82ff..ef0cf92c 100644
> > --- a/tests/xfs/group
> > +++ b/tests/xfs/group
> > @@ -506,3 +506,5 @@
> >  506 auto quick health
> >  507 clone
> >  508 auto quick quota
> > +744 auto ioctl quick
> > +745 auto ioctl quick
> > 
> 
> One quick note that xfs/744 runs in ~68 seconds in my (low resource)
> test VM. Not a problem in and of itself, but it seems slightly long for
> the quick group. Can somebody remind me of the quick group criteria?
> 
> FWIW if I kick off a quick group run, the first 10-15 tests complete in
> 10s or so or less with the exception of generic/013, which takes over a
> minute. So perhaps anything under a minute or so is fine..? Either way,
> that can be easily changed on merge if appropriate:

Hmm, yeah, that's probably too slow for quick...

> Reviewed-by: Brian Foster <bfoster@redhat.com>

Thanks for the review!

--D

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 5/5] xfs: test new v5 bulkstat commands
  2019-08-01 10:48   ` Brian Foster
  2019-08-01 14:01     ` Darrick J. Wong
@ 2019-08-02  1:55     ` Eryu Guan
  1 sibling, 0 replies; 11+ messages in thread
From: Eryu Guan @ 2019-08-02  1:55 UTC (permalink / raw)
  To: Brian Foster; +Cc: Darrick J. Wong, guaneryu, linux-xfs, fstests

On Thu, Aug 01, 2019 at 06:48:15AM -0400, Brian Foster wrote:
> On Wed, Jul 31, 2019 at 06:43:10PM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Check that the new v5 bulkstat commands do everything the old one do,
> > and then make sure the new functionality actually works.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> >  .gitignore                 |    1 
> >  src/Makefile               |    2 
> >  src/bulkstat_null_ocount.c |   61 +++++++++
> >  tests/xfs/744              |  215 ++++++++++++++++++++++++++++++++
> >  tests/xfs/744.out          |  297 ++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/745              |   47 +++++++
> >  tests/xfs/745.out          |    2 
> >  tests/xfs/group            |    2 
> >  8 files changed, 626 insertions(+), 1 deletion(-)
> >  create mode 100644 src/bulkstat_null_ocount.c
> >  create mode 100755 tests/xfs/744
> >  create mode 100644 tests/xfs/744.out
> >  create mode 100755 tests/xfs/745
> >  create mode 100644 tests/xfs/745.out
> > 
> > 
> ...
> > diff --git a/tests/xfs/group b/tests/xfs/group
> > index 270d82ff..ef0cf92c 100644
> > --- a/tests/xfs/group
> > +++ b/tests/xfs/group
> > @@ -506,3 +506,5 @@
> >  506 auto quick health
> >  507 clone
> >  508 auto quick quota
> > +744 auto ioctl quick
> > +745 auto ioctl quick
> > 
> 
> One quick note that xfs/744 runs in ~68 seconds in my (low resource)
> test VM. Not a problem in and of itself, but it seems slightly long for
> the quick group. Can somebody remind me of the quick group criteria?

A quick test is usually under 30s run-time.

> 
> FWIW if I kick off a quick group run, the first 10-15 tests complete in
> 10s or so or less with the exception of generic/013, which takes over a
> minute. So perhaps anything under a minute or so is fine..? Either way,
> that can be easily changed on merge if appropriate:

Yeah, I'll drop quick group if it's not really quick :)

> 
> Reviewed-by: Brian Foster <bfoster@redhat.com>

Thanks for the review!

Eryu

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2019-08-02  2:05 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-01  1:42 [PATCH v2 0/5] xfs: fixes and new tests for bulkstat v5 Darrick J. Wong
2019-08-01  1:42 ` [PATCH 1/5] xfs/122: ignore inode geometry structure Darrick J. Wong
2019-08-01  1:42 ` [PATCH 2/5] xfs/122: mask wonky ioctls Darrick J. Wong
2019-08-01  1:42 ` [PATCH 3/5] xfs/122: add the new v5 bulkstat/inumbers ioctl structures Darrick J. Wong
2019-08-01 10:47   ` Brian Foster
2019-08-01  1:43 ` [PATCH 4/5] common/xfs: refactor agcount calculation for mounted filesystems Darrick J. Wong
2019-08-01 10:48   ` Brian Foster
2019-08-01  1:43 ` [PATCH 5/5] xfs: test new v5 bulkstat commands Darrick J. Wong
2019-08-01 10:48   ` Brian Foster
2019-08-01 14:01     ` Darrick J. Wong
2019-08-02  1:55     ` Eryu Guan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).