Skip to content

Commit b4e94fe

Browse files
author
Octavian Purdila
authored
Merge pull request torvalds#212 from opurdila/lklfuse-tests
Disable multithreaded support in lklfuse
2 parents f127d50 + 5c74652 commit b4e94fe

File tree

7 files changed

+169
-37
lines changed

7 files changed

+169
-37
lines changed

tools/lkl/include/lkl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,17 @@ long lkl_mount_dev(unsigned int disk_id, const char *fs_type, int flags,
136136
*/
137137
long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms);
138138

139+
/**
140+
* lkl_umount_timeout - umount filesystem with timeout
141+
*
142+
* @path - the path to unmount
143+
* @flags - umount flags
144+
* @timeout_ms - timeout to wait for the kernel to flush closed files so that
145+
* umount can succeed
146+
* @returns - 0 on success, a negative value on error
147+
*/
148+
long lkl_umount_timeout(char *path, int flags, long timeout_ms);
149+
139150
/**
140151
* lkl_opendir - open a directory
141152
*

tools/lkl/lib/fs.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,31 +130,39 @@ long lkl_mount_dev(unsigned int disk_id, const char *fs_type, int flags,
130130
return 0;
131131
}
132132

133-
long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms)
133+
long lkl_umount_timeout(char *path, int flags, long timeout_ms)
134134
{
135-
char dev_str[] = { "/dev/xxxxxxxx" };
136-
char mnt_str[] = { "/mnt/xxxxxxxx" };
137135
long incr = 10000000; /* 10 ms */
138136
struct lkl_timespec ts = {
139137
.tv_sec = 0,
140138
.tv_nsec = incr,
141139
};
142-
unsigned int dev;
143-
int err;
144-
145-
dev = get_virtio_blkdev(disk_id);
146-
147-
snprintf(dev_str, sizeof(dev_str), "/dev/%08x", dev);
148-
snprintf(mnt_str, sizeof(mnt_str), "/mnt/%08x", dev);
140+
long err;
149141

150142
do {
151-
err = lkl_sys_umount(mnt_str, flags);
143+
err = lkl_sys_umount(path, flags);
152144
if (err == -LKL_EBUSY) {
153145
lkl_sys_nanosleep(&ts, NULL);
154146
timeout_ms -= incr / 1000000;
155147
}
156148
} while (err == -LKL_EBUSY && timeout_ms > 0);
157149

150+
return err;
151+
}
152+
153+
long lkl_umount_dev(unsigned int disk_id, int flags, long timeout_ms)
154+
{
155+
char dev_str[] = { "/dev/xxxxxxxx" };
156+
char mnt_str[] = { "/mnt/xxxxxxxx" };
157+
unsigned int dev;
158+
int err;
159+
160+
dev = get_virtio_blkdev(disk_id);
161+
162+
snprintf(dev_str, sizeof(dev_str), "/dev/%08x", dev);
163+
snprintf(mnt_str, sizeof(mnt_str), "/mnt/%08x", dev);
164+
165+
err = lkl_umount_timeout(mnt_str, flags, timeout_ms);
158166
if (err)
159167
return err;
160168

tools/lkl/lklfuse.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -623,9 +623,9 @@ int main(int argc, char **argv)
623623
}
624624

625625
if (mt)
626-
ret = fuse_loop_mt(fuse);
627-
else
628-
ret = fuse_loop(fuse);
626+
fprintf(stderr, "warning: multithreaded mode not supported\n");
627+
628+
ret = fuse_loop(fuse);
629629

630630
stop_lkl();
631631

tools/lkl/tests/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ define gdb_test
1313
TEST_CMD="gdb --args" ./boot.sh -t $1
1414
endef
1515

16+
define lklfuse
17+
for fs in $(FS_TYPES); do ./lklfuse.sh -t $$fs || exit 1; done
18+
endef
19+
1620
define for_fs
1721
for fs in $(FS_TYPES); do $(call $1,$$fs); done
1822
endef
@@ -41,6 +45,7 @@ endif
4145

4246
test:
4347
$(call run,)
48+
$(call lklfuse)
4449
$(HIJACK_TEST)
4550
./net.sh
4651

tools/lkl/tests/boot.c

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ static int test_epoll(char *str, int len)
485485

486486
static char mnt_point[32];
487487

488-
static int test_mount(char *str, int len)
488+
static int test_mount_dev(char *str, int len)
489489
{
490490
long ret;
491491

@@ -500,11 +500,11 @@ static int test_mount(char *str, int len)
500500
return TEST_FAILURE;
501501
}
502502

503-
static int test_chdir(char *str, int len)
503+
static int test_chdir(char *str, int len, const char *path)
504504
{
505505
long ret;
506506

507-
ret = lkl_sys_chdir(mnt_point);
507+
ret = lkl_sys_chdir(path);
508508

509509
snprintf(str, len, "%ld", ret);
510510

@@ -556,7 +556,7 @@ static int test_getdents64(char *str, int len)
556556
return TEST_SUCCESS;
557557
}
558558

559-
static int test_umount(char *str, int len)
559+
static int test_umount_dev(char *str, int len)
560560
{
561561
long ret, ret2, ret3;
562562

@@ -574,6 +574,36 @@ static int test_umount(char *str, int len)
574574
return TEST_FAILURE;
575575
}
576576

577+
static int test_mount_fs(char *str, int len, char *fs)
578+
{
579+
long ret;
580+
581+
ret = lkl_mount_fs(fs);
582+
583+
snprintf(str, len, "%s: %ld", fs, ret);
584+
585+
if (ret == 0)
586+
return TEST_SUCCESS;
587+
588+
return TEST_FAILURE;
589+
}
590+
591+
static int test_umount_fs(char *str, int len, char *fs)
592+
{
593+
long ret, ret2, ret3;
594+
595+
ret = lkl_sys_close(dir_fd);
596+
ret2 = lkl_sys_chdir("/");
597+
ret3 = lkl_umount_timeout(fs, 0, 1000);
598+
599+
snprintf(str, len, "%s: %ld %ld %ld", fs, ret, ret2, ret3);
600+
601+
if (!ret && !ret2 && !ret3)
602+
return TEST_SUCCESS;
603+
604+
return TEST_FAILURE;
605+
}
606+
577607
static int test_lo_ifup(char *str, int len)
578608
{
579609
long ret;
@@ -781,7 +811,8 @@ int main(int argc, char **argv)
781811

782812
lkl_host_ops.print = printk;
783813

784-
TEST(disk_add);
814+
if (cla.disk_filename)
815+
TEST(disk_add);
785816
#ifndef __MINGW32__
786817
if (cla.tap_ifname)
787818
TEST(netdev_add);
@@ -807,11 +838,18 @@ int main(int argc, char **argv)
807838
#endif /* __MINGW32__ */
808839
TEST(pipe2);
809840
TEST(epoll);
810-
TEST(mount);
811-
TEST(chdir);
841+
TEST(mount_fs, "proc");
842+
TEST(chdir, "proc");
812843
TEST(opendir);
813844
TEST(getdents64);
814-
TEST(umount);
845+
TEST(umount_fs, "proc");
846+
if (cla.disk_filename) {
847+
TEST(mount_dev);
848+
TEST(chdir, mnt_point);
849+
TEST(opendir);
850+
TEST(getdents64);
851+
TEST(umount_dev);
852+
}
815853
TEST(lo_ifup);
816854
TEST(mutex);
817855
TEST(semaphore);

tools/lkl/tests/lklfuse.sh

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/bin/sh -e
2+
3+
if ! [ -x ../lklfuse ]; then
4+
echo "lklfuse not available, skipping tests"
5+
exit 0
6+
fi
7+
8+
if ! [ -e /dev/fuse ]; then
9+
echo "fuse not available, skipping tests"
10+
exit 0
11+
fi
12+
13+
if [ "$1" = "-t" ]; then
14+
shift
15+
fstype=$1
16+
shift
17+
fi
18+
19+
if [ -z "$fstype" ]; then
20+
fstype="ext4"
21+
fi
22+
23+
file=`mktemp`
24+
dir=`mktemp -d`
25+
26+
cleanup()
27+
{
28+
cd $olddir
29+
sleep 1
30+
fusermount -u $dir
31+
rm $file
32+
rmdir $dir
33+
}
34+
35+
basic()
36+
{
37+
touch a
38+
if ! [ -e ]; then exit 1; fi
39+
rm a
40+
mkdir a
41+
if ! [ -d ]; then exit 1; fi
42+
rmdir a
43+
}
44+
45+
trap cleanup EXIT
46+
47+
olddir=`pwd`
48+
49+
# create empty filesystem
50+
dd if=/dev/zero of=$file bs=1024 seek=500000 count=1
51+
yes | mkfs.$fstype $file
52+
53+
# mount with fuse
54+
../lklfuse $file $dir -o type=$fstype
55+
56+
cd $dir
57+
58+
# run basic tests
59+
basic
60+
61+
# run stress-ng
62+
if which stress-ng; then
63+
if [ "$fstype" = "vfat" ]; then
64+
exclude="chmod,filename,link,mknod,symlink,xattr"
65+
fi
66+
stress-ng --class filesystem --all 0 --timeout 10 \
67+
--exclude fiemap,$exclude --fallocate-bytes 50m \
68+
--sync-file-bytes 50m
69+
else
70+
echo "could not find stress-ng, skipping"
71+
fi

tools/lkl/tests/test.h

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22
#define TEST_FAILURE 0
33
#define MAX_MSG_LEN 60
44

5-
65
static int g_test_pass = 0;
7-
#define TEST(name) { \
8-
int ret = do_test(#name, test_##name); \
9-
if (!ret) g_test_pass = -1; \
10-
}
11-
12-
static int do_test(char *name, int (*fn)(char *, int))
13-
{
14-
char str[MAX_MSG_LEN];
15-
int result;
16-
17-
result = fn(str, sizeof(str));
18-
printf("%-20s %s [%s]\n", name,
19-
result == TEST_SUCCESS ? "passed" : "failed", str);
20-
return result;
6+
#define TEST(name, ...) \
7+
{ \
8+
char str[MAX_MSG_LEN]; \
9+
int (*fn)(char *str, int len, ...); \
10+
int ret; \
11+
\
12+
fn = (int (*)(char *str, int len, ...))test_##name; \
13+
ret = fn(str, sizeof(str), ##__VA_ARGS__); \
14+
if (!ret) \
15+
g_test_pass = -1; \
16+
\
17+
printf("%-20s %s [%s]\n", #name, \
18+
ret == TEST_SUCCESS ? "passed" : "failed", str); \
2119
}
20+

0 commit comments

Comments
 (0)