On Tue, Sep 17, 2019 at 02:49:51PM +0800, Sun Ke wrote: > Add the test case to check nbd devices.This test case catches regressions > fixed by commit 92b5c8f0063e4 "nbd: replace kill_bdev() with > __invalidate_device() again". > > Establish the nbd connection.Run two processes.One do mount and umount, > anther one do clear_sock ioctl. > > Signed-off-by: Sun Ke <sunke32@xxxxxxxxxx> > --- > src/Makefile | 3 ++- > src/mount_clear_sock.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/nbd/003 | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ > tests/nbd/003.out | 1 + > 4 files changed, 137 insertions(+), 1 deletion(-) > 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..acd7327 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -10,7 +10,8 @@ C_TARGETS := \ > sg/syzkaller1 \ > nbdsetsize \ > loop_change_fd \ > - zbdioctl > + zbdioctl \ > + mount_clear_sock > > CXX_TARGETS := \ > discontiguous-io > diff --git a/src/mount_clear_sock.c b/src/mount_clear_sock.c > new file mode 100644 > index 0000000..f6eef5a > --- /dev/null > +++ b/src/mount_clear_sock.c > @@ -0,0 +1,68 @@ > +// SPDX-License-Identifier: GPL-3.0+ > +// Copyright (C) 2019 Sun Ke > + > +#include <stdio.h> > +#include <stdlib.h> > + > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <fcntl.h> > + > +#include <linux/nbd.h> > +#include <assert.h> > +#include <sys/wait.h> > +#include <unistd.h> > +#include <string.h> > +#include <sys/ioctl.h> > +#include <sys/mount.h> > +#include <linux/fs.h> > + > +void clear_sock(int fd) > +{ > + int err; > + > + err = ioctl(fd, NBD_CLEAR_SOCK, 0); > + if (err) { > + perror("ioctl"); > + } > +} > + > +void mount_nbd(char *dev, char *mp, char *fs) > +{ > + mount(dev, mp, fs, MS_NOSUID | MS_SYNCHRONOUS, 0); > + umount(mp); > +} > + > +int main(int argc, char **argv) > +{ > + if (argc != 4) { > + fprintf(stderr, "usage: $0 MOUNTPOINT DEV FS"); > + return EXIT_FAILURE; > + } > + > + char *mp = argv[1]; > + char *dev = argv[2]; > + char *fs = argv[3]; > + > + static int fd = -1; > + > + fd = open(dev, O_RDWR); > + if (fd < 0 ) { > + perror("open"); > + } > + > + if (fork() == 0) { > + mount_nbd(dev, mp, fs); > + exit(0); > + } > + if (fork() == 0) { > + clear_sock(fd); > + exit(0); > + } > + while(wait(NULL) > 0) > + continue; > + > + close(fd); > + > + return 0; > +} > diff --git a/tests/nbd/003 b/tests/nbd/003 > new file mode 100644 > index 0000000..45093aa > --- /dev/null > +++ b/tests/nbd/003 > @@ -0,0 +1,66 @@ > +#!/bin/bash > + > +# SPDX-License-Identifier: GPL-3.0+ > +# Copyright (C) 2019 Sun Ke > +# > +# Test nbd device resizing. Regression test for patch > +# > +# 2b5c8f0063e4 ("nbd: replace kill_bdev() with __invalidate_device() again") > + > + > +DESCRIPTION="resize a connected nbd device" > +QUICK=1 > + > +fs_type=ext4 > +disk_capacity=256M > +run_cnt=1 > + > +requires() { > + _have_nbd && _have_src_program mount_clear_sock > +} > + > +_start_nbd_mount_server() { > + > + fallocate -l $1 "${TMPDIR}/mnt_$i" > + > + if [[ "$2"x = "ext4"x ]]; then > + mkfs.ext4 "${TMPDIR}/mnt_$i" >> "$FULL" 2>&1 > + else > + mkdosfs "${TMPDIR}/mnt_$i" >> "$FULL" 2>&1 > + fi > + nbd-server 800$i "${TMPDIR}/mnt_$i" >> "$FULL" 2>&1 > + > + mkdir -p "${TMPDIR}/$i" > +} > + > +_stop_nbd_mount_server() { > + pkill -9 -f 800$i > + rm -f "${TMPDIR}/mnt_$i" > + rm -rf "${TMPDIR}/$i" > +} > + > +test() { > + echo "Running ${TEST_NAME}" > + for ((i = 0; i < 15; i++)) > + do > + _start_nbd_mount_server $disk_capacity $fs_type > + nbd-client localhost 800$i /dev/nbd$i >> "$FULL" 2>&1 > + if [[ "$?" -ne "0" ]]; then > + echo "nbd$i connnect failed" > + fi > + done > + > + for ((j = 0; j < $run_cnt; j++)) > + do > + for ((i = 0; i < 15; i++)) > + do > + src/mount_clear_sock "${TMPDIR}/$i" /dev/nbd$i $fs_type > + done > + done > + > + for ((i = 0; i < 15; i++)) > + do > + nbd-client -d /dev/nbd$i > + _stop_nbd_mount_server > + done > +} Sorry for the delay, it's been a busy few weeks. I'm still not seeing why it's necessary to create 15 connections. You create 15 devices one by one, run the test on each one, one by one, and tear them down, one by one. This is not parallelized, so why is it faster to have 15 devices than just one?