public inbox for linux-block@vger.kernel.org
 help / color / mirror / Atom feed
From: Sun Ke <sunke32@huawei.com>
To: <linux-block@vger.kernel.org>, <osandov@fb.com>
Cc: <sunke32@huawei.com>
Subject: [PATCH blktests v4] nbd/003:add mount and clear_sock test for nbd
Date: Mon, 23 Dec 2019 11:18:29 +0800	[thread overview]
Message-ID: <1577071109-68332-1-git-send-email-sunke32@huawei.com> (raw)

Add the test case to check nbd device. This test case catches regressions
fixed by commit 92b5c8f0063e4 "nbd: replace kill_bdev() with
__invalidate_device() again".

Establish the nbd connection. Run two processes. The first one do mount
and umount, and the other one do clear_sock ioctl.

Signed-off-by: Sun Ke <sunke32@huawei.com>
[Omar: simplify]
Signed-off-by: Omar Sandoval <osandov@fb.com>
---
simplified nbd/003 -> v4
1. mkfs.ext4 /dev/nbd0 >> "$FULL" 2>&1.
2. Allow mount and umount to fail. if clear sock do the first, mount and
   umount can not be successful.
3. Add the loops to 5000. So it is very likely to trigger the BUGON.
---
 src/Makefile           |  5 +--
 src/mount_clear_sock.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/nbd/003          | 30 +++++++++++++++++
 tests/nbd/003.out      |  1 +
 4 files changed, 125 insertions(+), 2 deletions(-)
 create mode 100644 src/mount_clear_sock.c
 create mode 100644 tests/nbd/003
 create mode 100644 tests/nbd/003.out

diff --git a/src/Makefile b/src/Makefile
index 917d6f4..3b587f6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,12 +4,13 @@ HAVE_C_HEADER = $(shell if echo "\#include <$(1)>" |		\
 
 C_TARGETS := \
 	loblksize \
+	loop_change_fd \
 	loop_get_status_null \
+	mount_clear_sock \
+	nbdsetsize \
 	openclose \
 	sg/dxfer-from-dev \
 	sg/syzkaller1 \
-	nbdsetsize \
-	loop_change_fd \
 	zbdioctl
 
 CXX_TARGETS := \
diff --git a/src/mount_clear_sock.c b/src/mount_clear_sock.c
new file mode 100644
index 0000000..ba9ed71
--- /dev/null
+++ b/src/mount_clear_sock.c
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-3.0+
+// Copyright (C) 2019 Sun Ke
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <linux/fs.h>
+#include <linux/nbd.h>
+
+int main(int argc, char **argv)
+{
+	const char *mountpoint, *dev, *fstype;
+	int loops, fd;
+
+	if (argc != 5) {
+		fprintf(stderr, "usage: %s DEV MOUNTPOINT FSTYPE LOOPS", argv[0]);
+		return EXIT_FAILURE;
+	}
+
+	dev = argv[1];
+	mountpoint = argv[2];
+	fstype = argv[3];
+	loops = atoi(argv[4]);
+
+	fd = open(dev, O_RDWR);
+	if (fd == -1) {
+		perror("open");
+		return EXIT_FAILURE;
+	}
+
+	for (int i = 0; i < loops; i++) {
+		pid_t mount_pid, clear_sock_pid;
+		int wstatus;
+
+		mount_pid = fork();
+		if (mount_pid == -1) {
+			perror("fork");
+			return EXIT_FAILURE;
+		}
+		if (mount_pid == 0) {
+			mount(dev, mountpoint, fstype,
+				  MS_NOSUID | MS_SYNCHRONOUS, 0);
+			umount(mountpoint);
+			exit(EXIT_SUCCESS);
+		}
+
+		clear_sock_pid = fork();
+		if (clear_sock_pid == -1) {
+			perror("fork");
+			return EXIT_FAILURE;
+		}
+		if (clear_sock_pid == 0) {
+			if (ioctl(fd, NBD_CLEAR_SOCK, 0) == -1) {
+				perror("ioctl");
+				exit(EXIT_FAILURE);
+			}
+			exit(EXIT_SUCCESS);
+		}
+
+		if (waitpid(mount_pid, &wstatus, 0) == -1) {
+			perror("waitpid");
+			return EXIT_FAILURE;
+		}
+		if (!WIFEXITED(wstatus) ||
+		    WEXITSTATUS(wstatus) != EXIT_SUCCESS) {
+			fprintf(stderr, "mount process failed");
+			return EXIT_FAILURE;
+		}
+
+		if (waitpid(clear_sock_pid, &wstatus, 0) == -1) {
+			perror("waitpid");
+			return EXIT_FAILURE;
+		}
+		if (!WIFEXITED(wstatus) ||
+		    WEXITSTATUS(wstatus) != EXIT_SUCCESS) {
+			fprintf(stderr, "NBD_CLEAR_SOCK process failed");
+			return EXIT_FAILURE;
+		}
+	}
+
+	close(fd);
+	return EXIT_SUCCESS;
+}
diff --git a/tests/nbd/003 b/tests/nbd/003
new file mode 100644
index 0000000..57fb63a
--- /dev/null
+++ b/tests/nbd/003
@@ -0,0 +1,30 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0+
+# Copyright (C) 2019 Sun Ke
+#
+# Regression test for commit 2b5c8f0063e4 ("nbd: replace kill_bdev() with
+# __invalidate_device() again").
+
+. tests/nbd/rc
+
+DESCRIPTION="mount/unmount concurrently with NBD_CLEAR_SOCK"
+QUICK=1
+
+requires() {
+	_have_nbd && _have_src_program mount_clear_sock
+}
+
+test() {
+	echo "Running ${TEST_NAME}"
+
+	_start_nbd_server
+	nbd-client -L -N export localhost /dev/nbd0 >> "$FULL" 2>&1
+	mkfs.ext4 /dev/nbd0 >> "$FULL" 2>&1
+
+	mkdir -p "${TMPDIR}/mnt"
+	src/mount_clear_sock /dev/nbd0 "${TMPDIR}/mnt" ext4 5000
+	umount "${TMPDIR}/mnt" > /dev/null 2>&1
+
+	nbd-client -d /dev/nbd0 >> "$FULL" 2>&1
+	_stop_nbd_server
+}
diff --git a/tests/nbd/003.out b/tests/nbd/003.out
new file mode 100644
index 0000000..aa340db
--- /dev/null
+++ b/tests/nbd/003.out
@@ -0,0 +1 @@
+Running nbd/003
-- 
2.13.6


             reply	other threads:[~2019-12-23  3:11 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-23  3:18 Sun Ke [this message]
2019-12-23  3:15 ` [PATCH blktests v4] nbd/003:add mount and clear_sock test for nbd sunke (E)
2020-02-11 22:23   ` Omar Sandoval
2020-02-12  8:13     ` sunke (E)
2020-02-19 16:43       ` Omar Sandoval
2020-02-05  2:02 ` sunke (E)
2020-02-11 22:21 ` Omar Sandoval

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1577071109-68332-1-git-send-email-sunke32@huawei.com \
    --to=sunke32@huawei.com \
    --cc=linux-block@vger.kernel.org \
    --cc=osandov@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox