summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2009-12-10 15:06:07 -0800
committerBrian Behlendorf <[email protected]>2009-12-10 15:06:07 -0800
commitf60a5f5221c594372d96767d9859a334ed0a80a6 (patch)
tree36a5828d7f6264c1c967c7dcd0edda1b38b7157f
parentd04c8a563c09d6449d5663aa2b57840653defae5 (diff)
Splat vnode tests must return negative error codes.
I must have been in a hurry when I wrote the vnode regression tests because the error code handling is not correct. The Solaris vnode API returns positive errno's, these need to be converted to negative errno's for Linux before being passed back to user space. Otherwise the test hardness with report the failure but errno will not be set with the correct error code. Additionally tests 3, 4, 6, and 7 may fail in the test file already exists. To avoid false positives a user mode helper has added to remove the test files in /tmp/ before running the actual test.
-rw-r--r--module/splat/splat-vnode.c107
1 files changed, 82 insertions, 25 deletions
diff --git a/module/splat/splat-vnode.c b/module/splat/splat-vnode.c
index e545ce9f1..91a719b5f 100644
--- a/module/splat/splat-vnode.c
+++ b/module/splat/splat-vnode.c
@@ -65,6 +65,51 @@
#define SPLAT_VNODE_TEST_FILE_RW2 "/tmp/spl.vnode.tmp.2"
static int
+splat_vnode_user_cmd(struct file *file, void *arg,
+ char *name, char *cmd)
+{
+ char sh_path[] = "/bin/sh";
+ char *argv[] = { sh_path,
+ "-c",
+ cmd,
+ NULL };
+ char *envp[] = { "HOME=/",
+ "TERM=linux",
+ "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
+ NULL };
+ int rc;
+
+ rc = call_usermodehelper(sh_path, argv, envp, 1);
+ if (rc) {
+ splat_vprint(file, name,
+ "Failed command: %s %s %s (%d)\n",
+ argv[0], argv[1], cmd, rc);
+ return -EPERM;
+ }
+
+ return 0;
+}
+
+static int
+splat_vnode_unlink_all(struct file *file, void *arg, char *name)
+{
+ char *cmds[] = { "rm -f " SPLAT_VNODE_TEST_FILE_RW,
+ "rm -f " SPLAT_VNODE_TEST_FILE_RW1,
+ "rm -f " SPLAT_VNODE_TEST_FILE_RW2,
+ NULL };
+ int i = 0, rc = 0;
+
+ while (cmds[i] != NULL) {
+ if ((rc = splat_vnode_user_cmd(file, arg, name, cmds[i])))
+ return rc;
+
+ i++;
+ }
+
+ return rc;
+}
+
+static int
splat_vnode_test1(struct file *file, void *arg)
{
vnode_t *vp;
@@ -75,7 +120,7 @@ splat_vnode_test1(struct file *file, void *arg)
splat_vprint(file, SPLAT_VNODE_TEST1_NAME,
"Failed to vn_open test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE, rc);
- return rc;
+ return -rc;
}
rc = VOP_CLOSE(vp, 0, 0, 0, 0, 0);
@@ -85,13 +130,13 @@ splat_vnode_test1(struct file *file, void *arg)
splat_vprint(file, SPLAT_VNODE_TEST1_NAME,
"Failed to vn_close test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE, rc);
- return rc;
+ return -rc;
}
splat_vprint(file, SPLAT_VNODE_TEST1_NAME, "Successfully vn_open'ed "
"and vn_closed test file: %s\n", SPLAT_VNODE_TEST_FILE);
- return rc;
+ return -rc;
} /* splat_vnode_test1() */
static int
@@ -105,7 +150,7 @@ splat_vnode_test2(struct file *file, void *arg)
splat_vprint(file, SPLAT_VNODE_TEST2_NAME,
"Failed to vn_openat test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE, rc);
- return rc;
+ return -rc;
}
rc = VOP_CLOSE(vp, 0, 0, 0, 0, 0);
@@ -115,13 +160,13 @@ splat_vnode_test2(struct file *file, void *arg)
splat_vprint(file, SPLAT_VNODE_TEST2_NAME,
"Failed to vn_close test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE, rc);
- return rc;
+ return -rc;
}
splat_vprint(file, SPLAT_VNODE_TEST2_NAME, "Successfully vn_openat'ed "
"and vn_closed test file: %s\n", SPLAT_VNODE_TEST_FILE);
- return rc;
+ return -rc;
} /* splat_vnode_test2() */
static int
@@ -132,18 +177,21 @@ splat_vnode_test3(struct file *file, void *arg)
char buf2[32] = "";
int rc;
+ if ((rc = splat_vnode_unlink_all(file, arg, SPLAT_VNODE_TEST3_NAME)))
+ return rc;
+
if ((rc = vn_open(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE,
FWRITE | FREAD | FCREAT | FEXCL,
0644, &vp, 0, 0))) {
splat_vprint(file, SPLAT_VNODE_TEST3_NAME,
"Failed to vn_open test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
- return rc;
+ return -rc;
}
rc = vn_rdwr(UIO_WRITE, vp, buf1, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST3_NAME,
"Failed vn_rdwr write of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
@@ -152,7 +200,7 @@ splat_vnode_test3(struct file *file, void *arg)
rc = vn_rdwr(UIO_READ, vp, buf2, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST3_NAME,
"Failed vn_rdwr read of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
@@ -160,7 +208,7 @@ splat_vnode_test3(struct file *file, void *arg)
}
if (strncmp(buf1, buf2, strlen(buf1))) {
- rc = -EINVAL;
+ rc = EINVAL;
splat_vprint(file, SPLAT_VNODE_TEST3_NAME,
"Failed strncmp data written does not match "
"data read\nWrote: %sRead: %s\n", buf1, buf2);
@@ -179,7 +227,7 @@ out:
VN_RELE(vp);
vn_remove(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE, RMFILE);
- return rc;
+ return -rc;
} /* splat_vnode_test3() */
static int
@@ -190,6 +238,9 @@ splat_vnode_test4(struct file *file, void *arg)
char buf2[32] = "";
int rc;
+ if ((rc = splat_vnode_unlink_all(file, arg, SPLAT_VNODE_TEST4_NAME)))
+ return rc;
+
if ((rc = vn_open(SPLAT_VNODE_TEST_FILE_RW1, UIO_SYSSPACE,
FWRITE | FREAD | FCREAT | FEXCL, 0644, &vp, 0, 0))) {
splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
@@ -200,7 +251,7 @@ splat_vnode_test4(struct file *file, void *arg)
rc = vn_rdwr(UIO_WRITE, vp, buf1, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
"Failed vn_rdwr write of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW1, rc);
@@ -229,7 +280,7 @@ splat_vnode_test4(struct file *file, void *arg)
rc = vn_rdwr(UIO_READ, vp, buf2, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST4_NAME,
"Failed vn_rdwr read of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW2, rc);
@@ -259,7 +310,7 @@ out:
vn_remove(SPLAT_VNODE_TEST_FILE_RW1, UIO_SYSSPACE, RMFILE);
vn_remove(SPLAT_VNODE_TEST_FILE_RW2, UIO_SYSSPACE, RMFILE);
- return rc;
+ return -rc;
} /* splat_vnode_test4() */
static int
@@ -274,7 +325,7 @@ splat_vnode_test5(struct file *file, void *arg)
splat_vprint(file, SPLAT_VNODE_TEST5_NAME,
"Failed to vn_open test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE, rc);
- return rc;
+ return -rc;
}
rc = VOP_GETATTR(vp, &vap, 0, 0, NULL);
@@ -286,7 +337,7 @@ splat_vnode_test5(struct file *file, void *arg)
}
if (vap.va_type != VREG) {
- rc = -EINVAL;
+ rc = EINVAL;
splat_vprint(file, SPLAT_VNODE_TEST5_NAME,
"Failed expected regular file type "
"(%d != VREG): %s (%d)\n", vap.va_type,
@@ -301,7 +352,7 @@ out:
VOP_CLOSE(vp, 0, 0, 0, 0, 0);
VN_RELE(vp);
- return rc;
+ return -rc;
} /* splat_vnode_test5() */
static int
@@ -311,17 +362,20 @@ splat_vnode_test6(struct file *file, void *arg)
char buf[32] = "SPL VNode Interface Test File\n";
int rc;
+ if ((rc = splat_vnode_unlink_all(file, arg, SPLAT_VNODE_TEST6_NAME)))
+ return rc;
+
if ((rc = vn_open(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE,
FWRITE | FCREAT | FEXCL, 0644, &vp, 0, 0))) {
splat_vprint(file, SPLAT_VNODE_TEST6_NAME,
"Failed to vn_open test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
- return rc;
+ return -rc;
}
rc = vn_rdwr(UIO_WRITE, vp, buf, strlen(buf), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST6_NAME,
"Failed vn_rdwr write of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
@@ -344,7 +398,7 @@ out:
VN_RELE(vp);
vn_remove(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE, RMFILE);
- return rc;
+ return -rc;
} /* splat_vnode_test6() */
/* Basically a slightly modified version of sys_close() */
@@ -401,6 +455,9 @@ splat_vnode_test7(struct file *file, void *arg)
file_t *fp;
int rc, fd;
+ if ((rc = splat_vnode_unlink_all(file, arg, SPLAT_VNODE_TEST7_NAME)))
+ return rc;
+
/* Prep work needed to test getf/releasef */
fd = get_unused_fd();
if (fd < 0) {
@@ -426,7 +483,7 @@ splat_vnode_test7(struct file *file, void *arg)
/* Actual getf()/releasef() test */
fp = vn_getf(fd);
if (fp == NULL) {
- rc = -EINVAL;
+ rc = EINVAL;
splat_vprint(file, SPLAT_VNODE_TEST7_NAME,
"Failed to getf fd %d: (%d)\n", fd, rc);
goto out;
@@ -434,7 +491,7 @@ splat_vnode_test7(struct file *file, void *arg)
rc = vn_rdwr(UIO_WRITE, fp->f_vnode, buf1, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST7_NAME,
"Failed vn_rdwr write of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
@@ -443,7 +500,7 @@ splat_vnode_test7(struct file *file, void *arg)
rc = vn_rdwr(UIO_READ, fp->f_vnode, buf2, strlen(buf1), 0,
UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL);
- if (rc < 0) {
+ if (rc) {
splat_vprint(file, SPLAT_VNODE_TEST7_NAME,
"Failed vn_rdwr read of test file: %s (%d)\n",
SPLAT_VNODE_TEST_FILE_RW, rc);
@@ -451,7 +508,7 @@ splat_vnode_test7(struct file *file, void *arg)
}
if (strncmp(buf1, buf2, strlen(buf1))) {
- rc = -EINVAL;
+ rc = EINVAL;
splat_vprint(file, SPLAT_VNODE_TEST7_NAME,
"Failed strncmp data written does not match "
"data read\nWrote: %sRead: %s\n", buf1, buf2);
@@ -470,7 +527,7 @@ out:
filp_close(lfp, 0);
vn_remove(SPLAT_VNODE_TEST_FILE_RW, UIO_SYSSPACE, RMFILE);
- return rc;
+ return -rc;
} /* splat_vnode_test7() */
splat_subsystem_t *