2020-07-20 09:16:26

by Petr Vorel

[permalink] [raw]
Subject: [RFC PATCH 1/1] Remove nfsv4

Reasons to drop:
* outdated tests (from 2005)
* not used (NFS kernel maintainers use pynfs [1])
* written in Python (we support C and shell, see [2])

[1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
[2] https://github.com/linux-test-project/ltp/issues/547

Signed-off-by: Petr Vorel <[email protected]>
---
@Chuck, Bruce: FYI RFC to drop NFS related legacy test suite from LTP.

Kind regards,
Petr

testcases/network/.gitignore | 2 -
testcases/network/nfsv4/Makefile | 26 -
testcases/network/nfsv4/acl/Makefile | 29 -
testcases/network/nfsv4/acl/README | 21 -
testcases/network/nfsv4/acl/acl1.c | 373 ------
testcases/network/nfsv4/acl/cleangroups.py | 10 -
testcases/network/nfsv4/acl/cleanusers.py | 12 -
testcases/network/nfsv4/acl/create_users.py | 21 -
testcases/network/nfsv4/acl/random_gen.py | 251 ----
testcases/network/nfsv4/acl/runtest | 70 --
testcases/network/nfsv4/acl/setacl_stress.py | 32 -
testcases/network/nfsv4/acl/test_acl.py | 122 --
testcases/network/nfsv4/acl/test_long_acl.py | 44 -
testcases/network/nfsv4/locks/Makefile | 33 -
testcases/network/nfsv4/locks/README | 169 ---
testcases/network/nfsv4/locks/VERSION | 3 -
.../nfsv4/locks/deploy/locktests.tar.gz | Bin 12354 -> 0 bytes
testcases/network/nfsv4/locks/deploy_info | 37 -
testcases/network/nfsv4/locks/locktests.c | 1034 -----------------
testcases/network/nfsv4/locks/locktests.h | 165 ---
testcases/network/nfsv4/locks/locktests.py | 236 ----
testcases/network/nfsv4/locks/netsync.c | 201 ----
22 files changed, 2891 deletions(-)
delete mode 100644 testcases/network/nfsv4/Makefile
delete mode 100644 testcases/network/nfsv4/acl/Makefile
delete mode 100644 testcases/network/nfsv4/acl/README
delete mode 100644 testcases/network/nfsv4/acl/acl1.c
delete mode 100755 testcases/network/nfsv4/acl/cleangroups.py
delete mode 100755 testcases/network/nfsv4/acl/cleanusers.py
delete mode 100755 testcases/network/nfsv4/acl/create_users.py
delete mode 100755 testcases/network/nfsv4/acl/random_gen.py
delete mode 100755 testcases/network/nfsv4/acl/runtest
delete mode 100755 testcases/network/nfsv4/acl/setacl_stress.py
delete mode 100755 testcases/network/nfsv4/acl/test_acl.py
delete mode 100755 testcases/network/nfsv4/acl/test_long_acl.py
delete mode 100644 testcases/network/nfsv4/locks/Makefile
delete mode 100644 testcases/network/nfsv4/locks/README
delete mode 100644 testcases/network/nfsv4/locks/VERSION
delete mode 100644 testcases/network/nfsv4/locks/deploy/locktests.tar.gz
delete mode 100644 testcases/network/nfsv4/locks/deploy_info
delete mode 100644 testcases/network/nfsv4/locks/locktests.c
delete mode 100644 testcases/network/nfsv4/locks/locktests.h
delete mode 100755 testcases/network/nfsv4/locks/locktests.py
delete mode 100644 testcases/network/nfsv4/locks/netsync.c

diff --git a/testcases/network/.gitignore b/testcases/network/.gitignore
index dab2bc34e..b5cdb351a 100644
--- a/testcases/network/.gitignore
+++ b/testcases/network/.gitignore
@@ -17,8 +17,6 @@
/nfs/nfs_stress/nfs05_make_tree
/nfs/nfslock01/nfs_flock
/nfs/nfslock01/nfs_flock_dgen
-/nfsv4/acl/acl1
-/nfsv4/locks/locktests
/rpc/basic_tests/rpc01/rpc1
/rpc/basic_tests/rpc01/rpc_server
/sctp/sctp_big_chunk
diff --git a/testcases/network/nfsv4/Makefile b/testcases/network/nfsv4/Makefile
deleted file mode 100644
index a311eaa42..000000000
--- a/testcases/network/nfsv4/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# network/nfsv4 test suite Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, July 2009
-#
-
-top_srcdir ?= ../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-include $(top_srcdir)/include/mk/generic_trunk_target.mk
diff --git a/testcases/network/nfsv4/acl/Makefile b/testcases/network/nfsv4/acl/Makefile
deleted file mode 100644
index 8c55a6bbd..000000000
--- a/testcases/network/nfsv4/acl/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# network/nfsv4/acl testcases Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, September 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-
-LDLIBS += $(ACL_LIBS)
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/network/nfsv4/acl/README b/testcases/network/nfsv4/acl/README
deleted file mode 100644
index 15a0e0a48..000000000
--- a/testcases/network/nfsv4/acl/README
+++ /dev/null
@@ -1,21 +0,0 @@
-ACL testing
-Aurélien Charbon - Bull SA
-
-# GOAL :
-Testing ACL conformance, ACL limits, and ACL robustness
-
-# REQUIREMENTS :
-ACL support must be present on the remote host
-attr and acl packages must be install for the stestsuite to build/run.
-This testsuite is not built by the default make in the LTP root directory
-
-acl1: verify the conformance ok access regarding the ACL of files and directory.
-stress: multiprocess application to stress the ACL
-
-setacl_stress.py: python script that does lots of setfacl function
-
-test_long_acl.py: try to "build" ACLs of different length. Stop when the specified maximum length is reached.
-
-To run the test:
-make (builds the binaries)
-./runtest (executes the sequence of tests)
diff --git a/testcases/network/nfsv4/acl/acl1.c b/testcases/network/nfsv4/acl/acl1.c
deleted file mode 100644
index ad778cd33..000000000
--- a/testcases/network/nfsv4/acl/acl1.c
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Aurélien Charbon - Bull SA
- * ACL testing basic program
- * Purpose: setting an acl on a file a verifies that the accesses are right
- */
-
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "config.h"
-#include "tst_res_flags.h"
-
-#ifdef HAVE_LIBACL
-
-#include <sys/acl.h>
-
-#define OP_READ 0x1
-#define OP_WRITE 0x2
-#define OP_EXEC 0x4
-
-acl_t testacl;
-/* the "typical" acl used for the test */
-
-static char *permtab[] =
- { "---", "r--", "-w-", "rw-", "--x", "r-x", "-wx", "rwx" };
-
-struct statstore {
- /* number of passed tests */
- int ok;
- /* number of failed tests */
- int failed;
-} aclstat;
-
-int do_file_op(char *filename)
-{
- int exe;
- int result;
- uid_t uid;
- result = 0;
- FILE *fptr;
- char str[256] = "./";
-
- uid = geteuid();
- strcat(str, filename);
-
- exe = execl(str, NULL, NULL);
- if (exe == -1 && errno != EACCES)
- result = result + OP_EXEC;
-
- fptr = fopen(filename, "r");
- if (fptr != NULL) {
- result = result + OP_READ;
- fclose(fptr);
- }
-
- fptr = fopen(filename, "r+");
- if (fptr != NULL) {
- result = result + OP_WRITE;
- fclose(fptr);
- }
-
- return result;
-}
-
-/* acl with user entries used for the test */
-acl_t test_acl_user_create(void)
-{
- char acl_text[] =
- "u::rwx,u:user1:rwx,u:user2:rw-,u:user3:r--,u:user4:r-x,u:user5:---,g::r-x,o::r-x,m::rwx";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-/* acl with group entries used for the test */
-
-acl_t test_acl_grp_create(void)
-{
- char acl_text[] =
- "u::rwx,g:grp1:rwx,g:grp2:rw-,g:grp3:r--,g:grp4:r-x,g:grp5:---,g::---,o::r-x,m::rwx";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-acl_t test_acl_default_create(void)
-{
- char acl_text[] =
- "u::rwx,u:user1:rwx,u:user2:rw-,u:user3:r--,u:user4:r-x,u:user5:---,g::r-x,m::rwx,o::r-x";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-static void report(testnum, expected, result, fail)
-int testnum; /* test number */
-int expected; /* expected result */
-int result; /* actual result */
-int fail; /* fail or warning */
-{
- char *res;
- if (expected == result) {
- res = "[OK]";
- aclstat.ok++;
- } else {
- res = "[FAILED]";
- aclstat.failed++;
- }
- printf("\ttest #%d - Expected: %s - Obtained: %s - %s\n", testnum,
- permtab[expected], permtab[result], res);
-
- fflush(stdout);
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-static void test1(char *file)
-{
- int result;
- if (seteuid((uid_t) 601) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE || OP_EXEC */
- report(1, OP_READ + OP_WRITE + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testgroup
- * - try to read with test user
- * - try to write with test user
- *
- */
-
-static void test2(char *file)
-{
- int result;
- if (seteuid((uid_t) 602) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE */
- report(2, OP_READ + OP_WRITE, result);
- seteuid((uid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-
-static void test3(char *file)
-{
- int result;
- if (seteuid((uid_t) 603) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ */
- report(3, OP_READ, result);
- seteuid((uid_t) 0);
- }
-}
-
-/*
- * set read-write acl on the file for the testuser
- * - try to read
- * - try to write
- */
-
-static void test4(char *file)
-{
- int result;
- if (seteuid((uid_t) 604) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_EXEC */
- report(4, OP_READ + OP_EXEC, result);
- seteuid((uid_t) 0);
- }
-}
-
-static void test5(char *file)
-{
- int result;
- if (seteuid((uid_t) 605) == 0) {
- result = do_file_op(file);
- /* expected result = 0x0 */
- report(5, 0x00, result);
- seteuid((uid_t) 0);
- }
-}
-
-static void testgrp1(char *file)
-{
- int result;
- if (setegid((gid_t) 601) == 0) {
- if (seteuid((uid_t) 601) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE || OP_EXEC */
- report(1, OP_READ + OP_WRITE + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
- }
-}
-
-/*
- * set acl in order the file is only readable for the testgroup
- * - try to read with test user
- * - try to write with test user
- *
- */
-
-static void testgrp2(char *file)
-{
- int result;
- if ((setegid((gid_t) 602) == 0) && (seteuid((uid_t) 602) == 0)) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE */
- report(2, OP_READ + OP_WRITE, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-
-static void testgrp3(char *file)
-{
- int result;
- if ((setegid((gid_t) 603) == 0) && (seteuid((uid_t) 603) == 0)) {
- result = do_file_op(file);
- /* expected result = OP_READ */
- report(3, OP_READ, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set read-write acl on the file for the testuser
- * - try to read
- * - try to write
- */
-
-static void testgrp4(char *file)
-{
- int result;
- if (setegid((gid_t) 604) == 0) {
- if (seteuid((uid_t) 604) == 0)
- result = do_file_op(file);
- /* expected result = OP_READ || OP_EXEC */
- report(4, OP_READ + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-static void testgrp5(char *file)
-{
- int result;
- if (setegid((gid_t) 605) == 0) {
- if (seteuid((uid_t) 605) == 0)
- result = do_file_op(file);
- /* expected result = 0x0 */
- report(5, 0x00, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/* testing default acl */
-void test_acl_default(char *dir, acl_t acl)
-{
- /* set default acl on directory */
- /* create a file in this directory */
- /* compare the file's acl and the parent directory's one */
- int res;
- acl_t acl1, acl2;
-
- res = acl_set_file(dir, ACL_TYPE_DEFAULT, acl);
- acl1 = acl_get_file(dir, ACL_TYPE_DEFAULT);
- if (res == -1)
- printf("path = %s **** errno = %d", dir, errno);
- char *path = strcat(dir, "/testfile");
- fopen(path, "w+");
- char *cmd = malloc(256);
-
- strcpy(cmd, "chmod 7777 ");
- printf(cmd, NULL);
- strcat(cmd, dir);
- system(cmd);
- acl2 = acl_get_file(path, ACL_TYPE_ACCESS);
-
- test1(path);
- test2(path);
- test3(path);
- test4(path);
- test5(path);
-}
-
-static void showstats(void)
-{
- printf("\nACL TESTS RESULTS: %d passed, %d failed\n\n", aclstat.ok,
- aclstat.failed);
-}
-
-int main(int argc, char *argv[])
-{
- int result;
- aclstat.ok = 0;
- aclstat.failed = 0;
- acl_t testacl;
- printf("Test acl with entries on users\n");
- testacl = test_acl_user_create();
-
- /* set the right acl for the test */
- result = acl_set_file(argv[1], ACL_TYPE_ACCESS, testacl);
- if (result == -1) {
- printf("setting acl on file %s failed\nBad NFS configuration",
- argv[1]);
- exit(1);
- }
- test1(argv[1]);
- test2(argv[1]);
- test3(argv[1]);
- test4(argv[1]);
- test5(argv[1]);
- acl_free(testacl);
- printf("\nTest of default acl:\n");
-
- testacl = test_acl_default_create();
- test_acl_default(argv[2], testacl);
-
- printf("\nTest acl with entries concerning groups\n");
- testacl = test_acl_grp_create();
- result = acl_set_file(argv[1], ACL_TYPE_ACCESS, testacl);
- if (result == -1)
- printf("setting acl on file %s failed\n", argv[1]);
-
- testgrp1(argv[1]);
- testgrp2(argv[1]);
- testgrp3(argv[1]);
- testgrp4(argv[1]);
- testgrp5(argv[1]);
-
- acl_free(testacl);
-
- showstats();
- return 1;
-}
-#else
-int main(void)
-{
- printf("The acl library was missing upon compilation.\n");
- return TCONF;
-}
-#endif /* HAVE_LIBACL */
diff --git a/testcases/network/nfsv4/acl/cleangroups.py b/testcases/network/nfsv4/acl/cleangroups.py
deleted file mode 100755
index 3c064783c..000000000
--- a/testcases/network/nfsv4/acl/cleangroups.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python3
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-test = RandomGen()
-test.getGroupList()
-test.cleanGroups()
diff --git a/testcases/network/nfsv4/acl/cleanusers.py b/testcases/network/nfsv4/acl/cleanusers.py
deleted file mode 100755
index 3e652c5b7..000000000
--- a/testcases/network/nfsv4/acl/cleanusers.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python3
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-test = RandomGen()
-test.getUserList()
-test.getGroupList()
-test.cleanUsers()
-test.cleanGroups()
diff --git a/testcases/network/nfsv4/acl/create_users.py b/testcases/network/nfsv4/acl/create_users.py
deleted file mode 100755
index 3203aff8b..000000000
--- a/testcases/network/nfsv4/acl/create_users.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-
-from random_gen import *
-from optparse import OptionParser
-
-parser = OptionParser()
-parser.add_option("-u", "--users", dest="nu",type="int",help="number of users to create")
-parser.add_option("-g", "--group",dest="ng",type="int",help="number of groups to create")
-
-(options, args) = parser.parse_args()
-
-''' Measuring time to add an ACE to a list regarding the number of ACE already in the list'''
-''' Doing the measurement on 100 files '''
-test=RandomGen()
-test.createNGroup(options.ng)
-test.getGroupList()
-test.createNUser(options.nu)
diff --git a/testcases/network/nfsv4/acl/random_gen.py b/testcases/network/nfsv4/acl/random_gen.py
deleted file mode 100755
index 4b6ba9625..000000000
--- a/testcases/network/nfsv4/acl/random_gen.py
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/usr/bin/env python3
-import subprocess
-import random
-import re
-
-alphabet = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789-_'
-a_length = len(alphabet)
-
-""" ACL support attribute """
-ACL4_SUPPORT_ALLOW_ACL = 0x00000001
-ACL4_SUPPORT_DENY_ACL = 0x00000002
-ACL4_SUPPORT_AUDIT_ACL = 0x00000004
-ACL4_SUPPORT_ALARM_ACL = 0x00000008
-
-class RandomGen(object):
-
-
- """ List of ACE possible who fields """
- ace_who=["OWNER@","GROUP@","EVERYONE@","ANONYMOUS@","AUTHENTICATED@"]
-
- """ List of GID than can be used to do the tests """
- gList=[]
- gListSize = len(gList)
- uList = []
- uListSize = len(uList)
-
- fList=[]
- fListSize = len(fList)
-
- """ Create a user in available groups to do the tests """
- def createUser(self,username):
- group = self.gList[random.randint(0,len(self.gList)-1)][0]
- opts = "-g" + group + " -p" + "1pilot" + " -m " + username
- u = subprocess.getoutput('/usr/sbin/useradd '+ opts)
- if u != "":
- print("create user " + username + "failed" + u)
-
- def createFile(self,path,n):
- for i in range(n):
- fName = 'file' + str(i)
- u = subprocess.getoutput('touch ' + path + '/'+ fName)
- self.fList.append(fName)
-
- def createGroup(self, grpname, gid):
- u = subprocess.getoutput('/usr/sbin/groupadd -g' + gid + " " + grpname)
- if u != "":
- print(u)
-
- def createNGroup(self, n):
- for i in range(n):
- gName = 'grp' + str(i)
- gid = str(500+i)
- self.createGroup(gName, gid)
-
-
- """ Random creation of n user """
- def createNUser(self,n):
- for i in range(n):
- userName= "user" + str(i)
- self.createUser(userName)
-
- """ clean all users created to do the tests """
- def cleanUsers(self):
- for name in self.uList:
- u = subprocess.getoutput('/usr/sbin/userdel -r '+ name)
- self.uList = []
-
- """ clean all users created to do the tests """
- def cleanGroups(self):
- for name in self.gList:
- u = subprocess.getoutput('/usr/sbin/groupdel '+ name[0])
- self.gList = []
-
- """ Retrieve the list of user from /etc/passwd file """
- def getUserList(self):
- f = open('/etc/passwd','r')
- lines = f.readlines()
- for line in lines:
- splitedline = line.split(':')
- userName = splitedline[0]
- gid = splitedline[3]
- # TO FIX: verify that the group is OK (in the right range)
- NameOK = re.match("user",userName)
- # We keep only usernames starting with "user"
- if NameOK != None:
- self.uList.append(userName)
- f.close()
-
- def getFileList(self,path):
- u = subprocess.getoutput('ls ' + path)
- tmp = u.split('\n')
- for i in range (len(tmp)-1):
- NameOK = re.match("file",tmp[i])
- if NameOK != None:
- self.fList.append(tmp[i])
-
- def getNUserList(self,nb):
- f = open('/etc/passwd','r')
- lines = f.readlines()
- n = 0
- for line in lines:
- splitedline = line.split(':');
- userName = splitedline[0]
- gid = splitedline[3]
- # TO FIX: verify that the group is OK (in the right range)
- NameOK = re.match("user",userName)
- # We keep only usernames starting with "user"
- if NameOK != None:
- self.uList.append(userName)
- n = n+1
- if n==nb:
- break;
- f.close()
-
- """ Get group list """
- def getGroupList(self):
- f = open('/etc/group','r')
- lines = f.readlines()
- for line in lines:
- splitedline = line.split(':');
- groupName = splitedline[0]
- gid = splitedline[2]
- NameOK = re.match("grp",groupName)
- if NameOK != None:
- self.gList.append([groupName,gid])
- f.close()
-
- """ Get a list of n group """
- def getNGroupList(self,nb):
- f = open('/etc/group','r')
- lines = f.readlines()
- n = 0
- for line in lines:
- splitedline = line.split(':');
- groupName = splitedline[0]
- gid = splitedline[2]
- NameOK = re.match("grp",groupName)
- if NameOK != None:
- self.gList.append([groupName,gid])
- n = n+1
- if n==nb:
- break;
- f.close()
-
- def printUserList(self):
- print(self.uList)
-
- def printGroupList(self):
- print(self.gList)
-
- """ Create a random name of random length """
- def createOneNameRandomLength(self,maxlength):
- outputString =""
- l=random.randint(0,maxlength)
- for i in range(l):
- a = random.randint(0,a_length-1)
- outputString =outputString + alphabet[a]
- return outputString
-
- """ Create a random name of fixed length """
- def createOneName(self,lenght):
- outputString =""
- for i in range(length):
- a = random.randint(0,a_length-1)
- outputString = outputString + alphabet[a]
- return outputString
-
- """ Create Random User List with fixed length user names """
- def createRandomUserList(self,listlength,usernamelength):
- userlist = []
- for i in range(listlength):
- user = createOneName(lenght)
- userlist.append(user)
- return userlist
-
- """ Create Random ACE for a file and a given usr """
- def createRandomACE(self,user):
- type = ace_type[random.randint(0,len(ace_type))]
- flag = ace_flags[random.randint(0,len(ace_flags))]
- mask = ace_mask[random.randint(0,len(ace_mask))]
- who = ace_who[random.randint(0,len(ace_who))]
- return nfsace4(type, flag, mask, who)
-
- """ Create Random ACL for a file with a fixed number a entries """
- def createRandomACL(self,acl_size):
- acl = []
- userList = uList
- userListSize = uListSize
- for i in range(acl_size):
- n = random.randint(0,userListSize-1)
- usr = userList.pop(n)
- newace = createRandomACE(usr)
- acl.append(newace)
- return acl
-
- """ Return a mode string like 'xwr' or 'x' """
- def createRandomMode(self):
- out_str = ""
- while (out_str == ""):
- if random.randint(0,1) == 1:
- out_str += 'x'
- if random.randint(0,1) == 1:
- out_str += 'w'
- if random.randint(0,1) == 1:
- out_str += 'r'
- return out_str
-
- """ Create a random ACL operation (delete / remove / modify on user / group ) """
- def randomOp(self,path):
- a = random.randint(1,4)
- mode = self.createRandomMode()
- file = self.fList[random.randint(0,len(self.fList)-1)]
- if a == 1: # creation/modification
- user = self.uList[random.randint(0,len(self.uList)-1)]
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
-
- if a == 2: # with group
- group = self.gList[random.randint(0,len(self.gList)-1)][0]
- u = subprocess.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
-
- if a == 3: # deletation
- user = self.uList[random.randint(0,len(self.uList)-1)]
- u = subprocess.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
-
- if a == 4: # with group
- group = self.gList[random.randint(0,len(self.gList)-1)][0]
- u = subprocess.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
-
- # request on a unexisting group
- '''if a == 5:
- group = self.createOneNameRandomLength(16)
- print 'setfacl -x g:' + group + " " + path + "/" + file
- u = commands.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
- if a == 6:
- user = self.createOneNameRandomLength(16)
- u = commands.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
-
- if a == 7: # creation/modification
- user = self.createOneNameRandomLength(16)
- u = commands.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
-
- if a == 8: # with group
- group = self.createOneNameRandomLength(16)
- u = commands.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
-
- if a == 9: #Copying the ACL of one file to another
- file2 = self.fList[random.randint(0,len(self.fList)-1)]
- u = commands.getoutput('getfacl ' + path + "/" + file + "| setfacl --set-file=- " + path + "/" + file2)
- if u!="":
- print u'''
-
diff --git a/testcases/network/nfsv4/acl/runtest b/testcases/network/nfsv4/acl/runtest
deleted file mode 100755
index a859e85bc..000000000
--- a/testcases/network/nfsv4/acl/runtest
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/sh
-#
-# @(#)runtests
-#
-# runtests script for ACL testing
-REMOTEHOST=nfsserver
-MAXLENGTH=30 # maximum ACL length - NB: the current NFSv4 acl implementation does not allow ACL greater than one page (about 35 entries with 6 character user name length and 10 character domain name)
-NFSMNTDIR=/mnt/nfs-acl
-echo "Test on NFS server $REMOTEHOST"
-ACLTESTDIR=testdir
-ACLTESTFILE=testfile
-
-USER_NB=20 # total number of users to create
-GRP_NB=20 # total number of groups to create
-FILE_NB=10 # total number of files for the test
-
-# creation of users on the local machine
-for i in 1 2 3 4 5
-do
- groupadd -g 60$i grp$i
- useradd -u 60$i user$i
-done
-
-# creation of users on the remote machine (removed only at the end of the tests)
-rsh -n $REMOTEHOST python3 $PWD/create_users.py -u 50 -g 50
-
-echo "Starting ACL testing"
-
-echo "Starting BASIC tests"
-
-echo "Creating testing file and directory"
-touch $NFSMNTDIR/$ACLTESTFILE
-mkdir $NFSMNTDIR/$ACLTESTDIR
-if test ! -d $NFSMNTDIR/$ACLTESTDIR
-then
- echo "Can't make directory $ACLTESTDIR"
- exit 1
-fi
-
-# File and Directory tree creation test
-echo "Execute acl1 $NFSMNTDIR/$ACLTESTFILE $NFSMNTDIR/$ACLTESTDIR"
-./acl1 $NFSMNTDIR/$ACLTESTFILE $NFSMNTDIR/$ACLTESTDIR
-#./stress $ACLTESTFILE
-for i in 1 2 3 4 5
- do
- userdel user$i
- groupdel grp$i
- done
-
-echo "Basic tests finished"
-
-echo "LONG ACL TEST"
-echo "creating necessary users and groups"
-python3 create_users.py -u 50 -g 50
-echo "creating necessary users and groups on the remote host"
-mkdir $NFSMNTDIR/lacl-testdir
-python3 test_long_acl.py -l $MAXLENGTH -p $NFSMNTDIR/lacl-testdir
-rm -rf $NFSMNTDIR/lacl-testdir
-echo "Long ACL test OK with $MAXLENGTH entries"
-echo "ACL STRESSING TEST"
-python3 setacl_stress.py -n 100 -u $USER_NB -g $GRP_NB -f $FILE_NB -p $NFSMNTDIR
-
-# remove local an remote users
-python3 cleanusers.py
-python3 cleangroups.py
-rsh -n $REMOTEHOST python3 $PWD/cleanusers.py
-
-echo "Test OK"
-
-exit 0
diff --git a/testcases/network/nfsv4/acl/setacl_stress.py b/testcases/network/nfsv4/acl/setacl_stress.py
deleted file mode 100755
index c93ac8bc0..000000000
--- a/testcases/network/nfsv4/acl/setacl_stress.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists stressing script
- To lauch on the first client
- Aurelien Charbon - Bull SA
-'''
-
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-()'
-t_alphabet=len(alphabet)
-
-test = RandomGen()
-
-parser = OptionParser()
-parser.set_defaults(nbfiles=5,nbusers=5,nbgroups=5,nloop=100 )
-parser.add_option("-n","--nloop", dest="nloop",type="int", help="number of loop to do in the test")
-parser.add_option("-p", "--path", dest="path",help="path on which the test is executed")
-parser.add_option("-f", "--nbfiles", dest="nbfiles",type="int",help="nb of files to do the test (default=5)")
-parser.add_option("-u", "--nbusers", dest="nbusers",type="int",help="nb of users (default=5)")
-parser.add_option("-g", "--nbgrp", dest="nbgroups",type="int",help="nb of groups (default=5)")
-(options, args) = parser.parse_args()
-
-test.createFile(options.path,options.nbfiles)
-test.getNUserList(options.nbusers)
-test.getNGroupList(options.nbgroups)
-for i in range (options.nloop):
- test.randomOp(options.path)
diff --git a/testcases/network/nfsv4/acl/test_acl.py b/testcases/network/nfsv4/acl/test_acl.py
deleted file mode 100755
index 8699b0206..000000000
--- a/testcases/network/nfsv4/acl/test_acl.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-from random_gen import *
-import subprocess
-import os
-import threading
-import time
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-() ~'
-t_alphabet=len(alphabet)
-
-def test_acl_default(path):
-
-# set default acl on the test directory
- u = subprocess.getoutput('mkdir ' + path + "/" + testdir)
- u = subprocess.getoutput('getfacl ' + path + "/" + testdir)
- acl=[]
- for i in range (len(splitedresult)-1):
- splitedline = splitedresult[i].split('::')
- name = splitedline[0]
- entry = splitedline[1]
- acl.append(name,entry)
-# create a file in this directory
- u = subprocess.getoutput('touch ' + path + "/" + testdir + testfile)
-# get the file's ACL and verify
- u = subprocess.getoutput('getfacl ' + path + "/" + testdir + testfile)
- splitedresult = u.split('\n')
- acl2=[]
- for i in range (len(splitedresult)-1):
- splitedline = splitedresult[i].split('::')
- name = splitedline[0]
- entry = splitedline[1]
- acl2.append(name,entry)
-
- result_final = True
- while i < len(acl2):
- result = False
- while j < len(acl2) and result == False:
- if acl2[i] == acl[j]:
- result = True
- if result == False:
- result_final = False
-
-''' Measuring time to add an ACE to a list regarding the number of ACE already in the list'''
-''' Doing the measurement on 100 files '''
-def test_acl_long():
- path = '/mnt/nfs/test-acl'
- test = RandomGen()
- test.createFile(path,100)
- test.getUserList()
- t0=time.time()
- for test_file in test.fList:
- for user in test.uList:
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + test_file)
- t1=time.time()
- print(t1-t0)
-
-def test_nfs_acl():
- print("test acl 10000\n")
- test = RandomGen()
- f = open('/tmp/acl-result-10000','w')
- path = '/mnt/nfs/test-acl'
- for i in range(10000):
- print("test avec " + str(i) + " ACE")
- test.getUserList()
- testfile = 'testfile' + str(i)
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- t0=time.time()
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
- t1=time.time()
- f.write(str(i) + "\t" + str(t1-t0)+"\n")
- f.close()
-
-
-def test_nfs_getfacl():
- # mesures sur le getfacl
- test = RandomGen()
-
- path = '/mnt/nfs/test-acl' # NFS mounted directory
- u = subprocess.getoutput('rm ' + path + "/*") # clean directory
- print("test acl getfacl\n")
- f = open('/tmp/acl-result-getfacl','w')
- for i in range(37):
-
- test.getUserList()
- testfile = 'testfile' + str(i)
-
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- print("setfacl " + str(i) + " " + u)
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
-
- t1=time.time()
- u = subprocess.getoutput('getfacl ' + path + "/" + testfile)
- print("getfacl - " + str(i) + u + "\n")
- t2=time.time()
- f.write(str(i) + "\t" + str(t2-t1)+"\n")
- f.close()
-
-
-def main():
- # test getFileList
- path = '/mnt/nfs/test-acl'
- test = RandomGen()
- test.getFileList(path)
- print(test.fList)
-main()
-
-
-
-
-
diff --git a/testcases/network/nfsv4/acl/test_long_acl.py b/testcases/network/nfsv4/acl/test_long_acl.py
deleted file mode 100755
index 893855b42..000000000
--- a/testcases/network/nfsv4/acl/test_long_acl.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import threading
-import time
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-() ~'
-t_alphabet=len(alphabet)
-
-
-
-def test_longacl(l,path):
- # mesures sur le getfacl
- test = RandomGen()
-
- u = subprocess.getoutput('rm ' + path + "/*") # clean directory
- print("test acl getfacl\n")
- for i in range(l):
- test.getUserList()
- testfile = 'testfile' + str(i)
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- print("setfacl with " + str(i) + " entries\n " + u)
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
- if u != "":
- print("setfacl -m u:" + user + ':' + mode + " " + path + "/" + testfile)
- print(u)
-def main():
- parser = OptionParser()
- parser.add_option("-l", "--length", dest="length",type="int",help="max lentgh of ACL")
- parser.add_option("-p", "--path", dest="path",help="path of test file")
- (options, args) = parser.parse_args()
- test_longacl(options.length,options.path)
-main()
-
diff --git a/testcases/network/nfsv4/locks/Makefile b/testcases/network/nfsv4/locks/Makefile
deleted file mode 100644
index 5812dea3a..000000000
--- a/testcases/network/nfsv4/locks/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# network/nfsv4/locks testcases Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, July 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/testcases.mk
-
-MAKE_TARGETS := locktests
-
-LDLIBS += -lpthread
-
-$(MAKE_TARGETS): $(patsubst $(abs_srcdir)/%.c,%.o,$(wildcard $(abs_srcdir)/*.c))
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/network/nfsv4/locks/README b/testcases/network/nfsv4/locks/README
deleted file mode 100644
index cf044a45c..000000000
--- a/testcases/network/nfsv4/locks/README
+++ /dev/null
@@ -1,169 +0,0 @@
-COMPILE : make
-RUN LOCAL: ./locktests -n <number of concurent process> -f <test file> [-T]
-
-
-GOAL : This test is aimed at stressing the fcntl locking functions.
-A master process sets a lock on a file region (byte range locking).
-Several slave processes try to perform operations on this region, such
-as: read, write, set a new lock ...
-The expected results of these operations are known.
-If the operation's result is the same as the expected one, the test
-succeeds, otherwise it fails.
-
-
-HISTORY : This program was been written to stress NFSv4 locks.
-
-Slaves are concurrent processes or threads.
--n <num> : Number of threads to use (mandatory).
--f <file> : Run the test on a test file defined by the -f option (mandatory).
--T : Use threads instead of processes (optional).
-
-
-
-* RUN NETWORK *
-
-Test server:
-./locktests -n <number of concurent processes> -f <test file> -c <number of clients>
-
-Test clients:
-./locktests --server <server host name>
-
-
-Multiple clients options
-_______________________
-
-These options have been developed to test NFSv4 locking when multiple
-clients try to use the same file. It uses a test server and several test
-clients.
-
- --------------
- | |
- | NFS SERVER |
- | |
- --------------
- |
- |
- -----------------------------------------------
- | | |
- | | |
- ------------------ ------------------- ------------------
- | NFS Client 1 | | NFS Client 1 | | NFS Client 1 |
- | running | | running | | running |
- | a CLIENT TEST | | the SERVER TEST | | a CLIENT TEST |
- ------------------ ------------------- ------------------
-
-See the DEPLOY file to know how to configure client test on each client.
-
-Server options are:
-
--n <num> : Number of threads to use (mandatory).
--f <file> : Run the test on given test file defined by the -f option (mandatory).
--c <num> : Number of clients to connect before starting the tests.
-
-
-Client options
-______________
---server <server hostname>
-
-
-* EXAMPLES *
-============
-
-Local testing:
-./locktests -n 50 -f /file/system/to/test
-
-Multiple clients:
--on the test server (called host1):
- ./locktest -n 50 -f /network/file/system/to/test -c 3
- (Server waiting for 3 clients to be connected)
-
--test clients:
- ./locktest --server host1
-
-
-HOW TO UNDERSTAND TEST RESULTS
-==============================
-Ten tests are performed:
- 1. WRITE ON A READ LOCK
- 2. WRITE ON A WRITE LOCK
- 3. READ ON A READ LOCK
- 4. READ ON A WRITE LOCK
- 5. SET A READ LOCK ON A READ LOCK
- 6. SET A WRITE LOCK ON A WRITE LOCK
- 7. SET A WRITE LOCK ON A READ LOCK
- 8. SET A READ LOCK ON A WRITE LOCK
- 9. READ LOCK THE WHOLE FILE BYTE BY BYTE
- 10. WRITE LOCK THE WHOLE FILE BYTE BY BYTE
-
-
-For each test, the MASTER process takes a lock (READ/WRITE LOCK) and
-the SLAVE processes try to perform the following operations on the
-locked section:
-
- - WRITE
- - READ
- - SET A WRITE LOCK
- - SET A WRITE LOCK
-
-If a slave process performs its test operation without error it prints
-"=", otherwise it prints "x".
-
-An operation performed "without error" means:
-
- - The operation (write, read, fcntl ...) returns no error code, and
- - errno is not changed.
-
-However, "the slave performs its test operation without error" does NOT
-mean the "result is correct". For example, a slave process is NOT
-allowed to set a READ LOCK on an already-set WRITE LOCK. When such
-operations are performed, the correct and expected result is that the
-tested function returns the EAGAIN error code.
-
-When all tests have been processed, the result of each process for each
-test is compared with the table of expected results, and a new table is
-displayed:
-
-For example:
- 200 processes of 200 successfully ran test : READ ON A READ LOCK
- 200 processes of 200 successfully ran test : SET A READ LOCK ON A WRITE LOCK
-
-This result lists the process/thread both on local and remote machines.
-
-Note that the testing locks with thread on multiple clients is disabled
-because it does not make sense: 2 different clients obviously run at
-least 2 different processes (thread information cannot be shared
-between this thread over the network).
-
-EXPECTED RESULTS
-================
-Here is the table of expected results, depending on :
- - Slave test operations (READ, WRITE, SET A WRITE LOCK ... )
- - Master Operation (SET A READ/A WRITE LOCK )
- - Slave types (Processes, threads)
- - Locking profile (POSIX locking, Mandatory locking)
-
-
-================================================================================================
- | Master process/thread |
-===================================|===========================================================|
-Slave type | Test operation | advisory locking | mandatory locking |
-___________________________________|______________________________|____________________________|
- | | read lock write lock | read lock write lock |
-___________________________________|______________________________|____________________________|
-thread | set a read lock | Allowed Allowed | Allowed Allowed |
- | set a write lock | Allowed Allowed | Allowed Allowed |
- | read | Allowed Allowed | Allowed Allowed |
- | write | Allowed Allowed | Allowed Allowed |
-===================================+==============================+============================|
-process | set a read lock | Allowed Denied | Allowed Denied |
- | set a write lock | Denied Denied | Denied Denied |
- | read | Allowed Allowed | Denied Allowed |
- | write | Allowed Allowed | Denied Denied |
-================================================================================================
-
-
-**************
-Bull SA - 2006 - http://nfsv4.bullopensource.org
-Tony Reix: [email protected]
-Aurélien Charbon: aurelien.charbon@ext bull.net
-**************
diff --git a/testcases/network/nfsv4/locks/VERSION b/testcases/network/nfsv4/locks/VERSION
deleted file mode 100644
index aead93e4f..000000000
--- a/testcases/network/nfsv4/locks/VERSION
+++ /dev/null
@@ -1,3 +0,0 @@
-* 08/02/06 copyediting (bryce)
-* 03/01/06 remove unicode and translate comments in english.
-* 21/12/05 free alocated memory before exiting
diff --git a/testcases/network/nfsv4/locks/deploy/locktests.tar.gz b/testcases/network/nfsv4/locks/deploy/locktests.tar.gz
deleted file mode 100644
index 1e0b517f2bbad3318e8036f494cfa547cd4fda89..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12354
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

diff --git a/testcases/network/nfsv4/locks/deploy_info b/testcases/network/nfsv4/locks/deploy_info
deleted file mode 100644
index b8a4660f2..000000000
--- a/testcases/network/nfsv4/locks/deploy_info
+++ /dev/null
@@ -1,37 +0,0 @@
-locktest.py script aims to help deploying and running locktests over multiple NFS
-clients accessing the same server.
-
-The source code of NFS client test is in ./deploy/locktests.tar.gz
-
-Setting up lock test with several test machines.
-================================================
-./locktests.py --setup -c <machine1> [machine2 ...] -s <my_nfs_server>:</>
-
---setup : Option to setup the test
--c <machine> [...] : Setup test on these clients
--s <server>:<mountpoint> : NFS server to use, followed by full directory to mount
-
-
-Example:
-./locktests.py --setup -c client1 client2 client3 -s NFS_Server:/exported/directory
-
-
-Running lock test over several test machines.
-=============================================
-Run test on already configured test machines.
-./locktests.py -n <pid> -f <file> -c <machine1> [machine2 ...]
-
--n <process_id> : Process number each test machine will lauch to perform the test
--f <file> : Test file. That must be the same on each machine
--c <machine> [...] : Clients. run tests from this clients
-
-
-Example:
-./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2
-
-
-
-_________________________________
- Vincent ROQUETA - Bull SA - 2005
- [email protected]
-
diff --git a/testcases/network/nfsv4/locks/locktests.c b/testcases/network/nfsv4/locks/locktests.c
deleted file mode 100644
index 961354e42..000000000
--- a/testcases/network/nfsv4/locks/locktests.c
+++ /dev/null
@@ -1,1034 +0,0 @@
-/* *************************************************
- * *********** README ******************************
- * *************************************************
- *
- * COMPILE : make
- * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
- *
- * GOAL : This test tries to stress the fcntl locking functions. A
- * master process sets a lock on a file region (this is called "byte
- * range locking"). Some slave processes try to perform operations on
- * this region, such as read, write, set a new lock ... The expected
- * results of these operations are known. If the operation result is
- * the same as the expected one, the test suceeds, else it fails.
- *
- *
- *
- * Slaves are concurent processes or thread.
- * -n <num> : Number of threads to use (mandatory).
- * -f <file> : Run the test on given test file defined by the -f option (mandatory).
- * -c <num> : Number of clients to connect before starting the tests.
- *
- * HISTORY : This program was written to stress NFSv4 locks.
- * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
- *
- *
- * Vincent ROQUETA 2005 - [email protected]
- * BULL S.A.
- */
-
-#include "locktests.h"
-
-int MAXLEN = 64;
-int MAXTEST = 10;
-extern int maxClients;
-extern int fdServer;
-
-char message[M_SIZE];
-int slaveReader;
-int masterReader;
-int slaveWriter;
-
-/* Which lock will be applied by the master process on test startup */
-int LIST_LOCKS[] = { READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- BYTELOCK_READ, BYTELOCK_WRITE
-};
-
-/* The operations the slave processes will try to perform */
-int LIST_TESTS[] = { WRONLY, WRONLY,
- RDONLY, RDONLY,
- READLOCK, WRITELOCK,
- WRITELOCK, READLOCK,
- BYTELOCK_READ, BYTELOCK_WRITE
-};
-
-/* List of test names */
-char *LIST_NAMES_TESTS[] = { "WRITE ON A READ LOCK",
- "WRITE ON A WRITE LOCK",
- "READ ON A READ LOCK",
- "READ ON A WRITE LOCK",
- "SET A READ LOCK ON A READ LOCK",
- "SET A WRITE LOCK ON A WRITE LOCK",
- "SET A WRITE LOCK ON A READ LOCK",
- "SET A READ LOCK ON A WRITE LOCK",
- "READ LOCK THE WHOLE FILE BYTE BY BYTE",
- "WRITE LOCK THE WHOLE FILE BYTE BY BYTE"
-};
-
-/* List of expected test results, when slaves are processes */
-int LIST_RESULTS_PROCESS[] = { SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, ECHEC,
- ECHEC, ECHEC,
- SUCCES, SUCCES
-};
-
-/* List of expected test results, when slaves are threads */
-int LIST_RESULTS_THREADS[] = { SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, SUCCES,
- ECHEC, ECHEC
-};
-
-int *LIST_RESULTS = NULL;
-char *eType = NULL;
-
-int TOTAL_RESULT_OK[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
-void *slave(void *data);
-int (*finish) (int a);
-
-int finishProcess(int a)
-{
- exit(a);
-}
-
-int (*load) (void);
-
-struct dataPub dp;
-
-/* Functions to access tests/tests names/tests results*/
-int testSuiv(int n)
-{
- return LIST_TESTS[n];
-}
-
-int resAttSuiv(int n)
-{
- return LIST_RESULTS[n];
-}
-
-char *nomTestSuiv(int n)
-{
- return LIST_NAMES_TESTS[n];
-}
-
-int lockSuiv(int n)
-{
- return LIST_LOCKS[n];
-}
-
-/* Verify the test result is the expected one */
-int matchResult(int r, int n)
-{
-
- P("r=%d\n", r);
- if (r == LIST_RESULTS[n])
- return 1;
- else
- return 0;
-}
-
-/* Increments the number of process which have successfully passed the test */
-void counter(int r, int n)
-{
- TOTAL_RESULT_OK[n] += matchResult(r, n);
-}
-
-/* Special case for test 'lock file byte byte by byte'.
- * We ensure each byte is correctly locked.
- */
-void validationResults(int n)
-{
- int i, u, l, fsize;
- struct flock request;
-
- fsize = dp.nclnt * (maxClients + 1);
- TOTAL_RESULT_OK[n] = 0;
- l = FALSE;
- u = TRUE;
-
- /* If the expected operation result is a success, we will have to increase the number of correct results */
- if (LIST_RESULTS[n]) {
- l = TRUE;
- u = FALSE;
- }
-
- for (i = 0; i < fsize; i++) {
- request.l_type = F_WRLCK;
- request.l_whence = SEEK_SET;
- request.l_start = i;
- request.l_len = 1;
- fcntl(dp.fd, F_GETLK, &request);
- /* Ensure the lock is correctly set */
- if (request.l_type != F_UNLCK)
- TOTAL_RESULT_OK[n] += l;
- else
- TOTAL_RESULT_OK[n] += u;
- }
-}
-
-int initTest(void)
-{
-
- P("Master opens %s\n", dp.fname);
- dp.fd = open(dp.fname, OPENFLAGS, MANDMODES);
- if (dp.fd < 0) {
- perror("lock test : can't open test file :");
- finish(1);
- }
- P("fd=%d\n", dp.fd);
- return 0;
-}
-
-struct dataChild *initClientFork(int i)
-{
- struct dataPriv *dpr;
- struct dataChild *df;
-
- /* Initialize private data fields */
- dpr = malloc(sizeof(struct dataPriv));
- df = malloc(sizeof(struct dataChild));
- dpr->whoami = i;
- df->dp = &dp;
- df->dpr = dpr;
- /* Initialize master to client pipe */
- dp.lclnt[i] = malloc(sizeof(int) * 2);
- if (pipe(dp.lclnt[i]) < 0) {
- perror("Impossible to create pipe\n");
- exit(1);
- }
- P("Initialization %d\n", i);
- write(0, ".", 1);
- return df;
-}
-
-int initialize(int clnt)
-{
-
- /* Initialize private data fields */
- printf("Init\n");
- dp.nclnt = clnt;
- dp.lclnt = malloc(sizeof(int *) * clnt);
- dp.lthreads = malloc(sizeof(pthread_t) * clnt);
-
- /* Initialize client to master pipe */
- if (pipe(dp.master) < 0) {
- perror("Master pipe creation error\n");
- exit(1);
- }
- printf("%s initialization\n", eType);
- load();
- initTest();
-
- return 0;
-}
-
-void cleanClient(struct dataChild *df)
-{
- int i;
- i = df->dpr->whoami;
- free(dp.lclnt[i]);
- free(df->dpr);
- free(df);
-}
-
-void clean(void)
-{
- free(dp.lthreads);
- free(dp.lclnt);
-}
-
-int loadProcess(void)
-{
- int i;
- struct dataChild *df;
- for (i = 0; i < dp.nclnt; i++) {
- df = initClientFork(i);
- if (!fork()) {
- P("Running slave num: %d\n", df->dpr->whoami);
- write(0, ".", 1);
- slave((void *)df);
- cleanClient(df);
- exit(0);
- }
- }
- return 0;
-}
-
-void lockWholeFile(struct flock *request)
-{
- request->l_whence = SEEK_SET;
- request->l_start = 0;
- /* Lock the whole file */
- request->l_len = 0;
-}
-
-void selectTest(int n, struct s_test *test)
-{
-
- test->test = testSuiv(n);
- test->resAtt = resAttSuiv(n);
- test->nom = nomTestSuiv(n);
- test->type = lockSuiv(n);
-}
-
-/* Final test report */
-int report(int clnt)
-{
- int rc = 0;
- int i;
- int totalClients;
- totalClients = clnt * (maxClients + 1);
- printf
- ("\n%s number : %d - Remote clients: %d local client 1 - Total client %d - Total concurent tests: %d\n",
- eType, clnt, maxClients, maxClients + 1, totalClients);
- printf("%s number running test successfully :\n", eType);
- for (i = 0; i < MAXTEST; i++) {
- if (TOTAL_RESULT_OK[i] != totalClients)
- rc = 1;
-
- printf("%d %s of %d successfully ran test : %s\n",
- TOTAL_RESULT_OK[i], eType, totalClients,
- LIST_NAMES_TESTS[i]);
- }
- return rc;
-}
-
-int serverSendLocal(void)
-{
- int i;
- /* Synchronize slave processes */
- /* Configure slaves for test */
-
- for (i = 0; i < dp.nclnt; i++)
- write(dp.lclnt[i][1], message, M_SIZE);
- return 0;
-
-}
-
-void serverSendNet(void)
-{
- writeToAllClients(message);
-}
-
-int serverReceiveNet(void)
-{
- int i, c;
- for (c = 0; c < maxClients; c++) {
- for (i = 0; i < dp.nclnt; i++) {
- serverReceiveClient(c);
- }
- }
- return 0;
-}
-
-int serverReceiveLocal(void)
-{
- int i;
- for (i = 0; i < dp.nclnt; i++)
- read(masterReader, message, M_SIZE);
- return 0;
-}
-
-int clientReceiveLocal(void)
-{
- read(slaveReader, message, M_SIZE);
- return 0;
-}
-
-int clientSend(void)
-{
- write(slaveWriter, message, M_SIZE);
- return 0;
-}
-
-int serverSend(void)
-{
- serverSendNet();
- serverSendLocal();
- return 0;
-}
-
-int serverReceive(void)
-{
- serverReceiveNet();
- serverReceiveLocal();
- return 0;
-}
-
-/* binary structure <-> ASCII functions used to ensure data will be correctly used over
- * the network, especially when multiples clients do not use the same hardware architecture.
- */
-int serializeTLock(struct s_test *tLock)
-{
- memset(message, 0, M_SIZE);
- sprintf(message, "T:%d:%d:%d::", tLock->test, tLock->type,
- tLock->resAtt);
- return 0;
-}
-
-void unSerializeTLock(struct s_test *tLock)
-{
- sscanf(message, "T:%d:%d:%d::", &(tLock->test), &(tLock->type),
- &(tLock->resAtt));
- memset(message, 0, M_SIZE);
-
-}
-
-void serializeFLock(struct flock *request)
-{
- int len, pid, start;
- memset(message, 0, M_SIZE);
- len = (int)request->l_len;
- pid = (int)request->l_pid;
- start = (int)request->l_start;
- /* Beware to length of integer conversions ... */
- sprintf(message, "L:%hd:%hd:%d:%d:%d::",
- request->l_type, request->l_whence, start, len, pid);
-}
-
-void serializeResult(int result)
-{
- memset(message, 0, M_SIZE);
- sprintf(message, "R:%d::", result);
-
-}
-
-void unSerializeResult(int *result)
-{
- sscanf(message, "R:%d::", result);
-}
-
-void unSerializeFLock(struct flock *request)
-{
- int len, pid, start;
- sscanf(message, "L:%hd:%hd:%d:%d:%d::",
- &(request->l_type), &(request->l_whence), &start, &len, &pid);
- request->l_start = (off_t) start;
- request->l_len = (off_t) len;
- request->l_pid = (pid_t) pid;
-}
-
-int serverSendLockClient(struct flock *request, int client)
-{
- serializeFLock(request);
- return serverSendClient(client);
-}
-
-int serverSendLockLocal(struct flock *request, int slave)
-{
- serializeFLock(request);
- return write(dp.lclnt[slave][1], message, M_SIZE);
-}
-
-int getLockSection(struct flock *request)
-{
- memset(message, 0, M_SIZE);
- clientReceiveLocal();
- unSerializeFLock(request);
- return 0;
-}
-
-int sendLockTest(struct s_test *tLock)
-{
- serializeTLock(tLock);
- serverSend();
- return 0;
-}
-
-int getLockTest(struct s_test *tLock)
-{
- clientReceiveLocal();
- unSerializeTLock(tLock);
- return 0;
-}
-
-int sendResult(int result)
-{
- serializeResult(result);
- clientSend();
- return 0;
-}
-
-int getResults(int ntest)
-{
- int i, c;
- int result = 0;
- /* Add remote test results */
- for (c = 0; c < maxClients; c++) {
- for (i = 0; i < dp.nclnt; i++) {
- serverReceiveClient(c);
- unSerializeResult(&result);
- counter(result, ntest);
-
- }
- }
- /* Add local test results */
- for (i = 0; i < dp.nclnt; i++) {
- read(masterReader, message, M_SIZE);
- unSerializeResult(&result);
- counter(result, ntest);
- }
-
- return 0;
-}
-
-#ifdef DEBUG
-#define P(a,b) memset(dbg,0,16);sprintf(dbg,a,b);write(0,dbg,16);
-#endif
-
-/* In the case of a network use, the master of the client application si only
- * a 'repeater' of information. It resends server-master instructions to its own slaves.
- */
-void masterClient(void)
-{
- fd_set fdread;
- struct timeval tv;
- int n, i, r, m, start;
-#ifdef DEBUG
- char dbg[16];
-#endif
- struct flock lock;
- int t;
-
- masterReader = dp.master[0];
- FD_ZERO(&fdread);
- tv.tv_sec = 50;
- tv.tv_usec = 0;
- n = fdServer > masterReader ? fdServer : masterReader;
- printf("Master Client - fdServer=%d\n", fdServer);
- while (1) {
- /* Add slave and server pipe file descriptors */
- FD_ZERO(&fdread);
- FD_SET(fdServer, &fdread);
- FD_SET(masterReader, &fdread);
- r = select(n + 1, &fdread, NULL, NULL, &tv);
- if (r < 0) {
- perror("select:\n");
- continue;
- }
- if (r == 0) {
- exit(0);
- }
-
- if (FD_ISSET(fdServer, &fdread)) {
- /* We just have received information from the server.
- * We repeat it to slaves.
- */
- i = readFromServer(message);
- t = message[0];
- switch (t) {
- case 'L':
- /* Lock instruction. We need to send a different section to lock to each process */
- unSerializeFLock(&lock);
- start = lock.l_start;
- for (i = 0; i < dp.nclnt; i++) {
- lock.l_start = start + i;
- serializeFLock(&lock);
- write(dp.lclnt[i][1], message, M_SIZE);
- }
- printf("\n");
- continue;
- case 'T':
- /* Test instruction. Ensure server is not sending the END(ish) instruction to end tests */
- /* To be rewritten asap */
- m = atoi(&(message[2]));
- if (m == END)
- break;
- if (m == CLEAN)
- printf("\n");
-
- serverSendLocal();
- continue;
- }
- break;
- } else {
- /* Else, we read information from slaves and repeat them to the server */
- for (i = 0; i < dp.nclnt; i++) {
- r = read(masterReader, message, M_SIZE);
- r = write(fdServer, message, M_SIZE);
- if (r < 0)
- perror("write : ");
-
- }
- continue;
- }
- }
-
- /* Receive the END(ish) instruction */
-
- /* Repeat it to the slaves */
- printf("Exitting...\n");
- serverSendLocal();
-
- /* Ok, we can quit */
- printf("Bye :)\n");
-
-}
-
-int master(void)
-{
- int i, n, bl;
- int clnt;
- char tmp[MAXLEN], *buf;
-#ifdef DEBUG
- char dbg[16];
-#endif
- struct flock request;
- struct s_test tLock;
- enum state_t state;
- int offset;
- /* A test sentence written in the file */
- char phraseTest[] =
- "Ceci est une phrase test ecrite par le maitre dans le fichier";
- bl = -1;
- clnt = dp.nclnt;
- masterReader = dp.master[0];
- state = SELECT;
- /* Start with the first test ;) */
- n = 0;
- printf("\n--------------------------------------\n");
- while (1) {
- switch (state) {
- case SELECT:
- /* Select the test to perform */
- printf("\n");
- E("Master: SELECT");
- selectTest(n, &tLock);
- state = tLock.type;
- bl = 0;
- if (n < MAXTEST) {
- memset(tmp, 0, MAXLEN);
- sprintf(tmp, "TEST : TRY TO %s:",
- LIST_NAMES_TESTS[n]);
- write(0, tmp, strlen(tmp));
- } else
- state = END;
- P("state=%d\n", state);
- n += 1;
- continue;
-
- case RDONLY:
- case WRONLY:
-
- case READLOCK:
- P("Read lock :%d\n", state);
- request.l_type = F_RDLCK;
- state = LOCK;
- continue;
-
- case WRITELOCK:
- P("Write lock :%d\n", state);
- request.l_type = F_WRLCK;
- state = LOCK;
- continue;
-
- case LOCK:
- /* Apply the wanted lock */
- E("Master: LOCK");
- write(dp.fd, phraseTest, strlen(phraseTest));
- lockWholeFile(&request);
- if (fcntl(dp.fd, F_SETLK, &request) < 0) {
- perror("Master: can't set lock\n");
- perror("Echec\n");
- exit(0);
- }
- E("Master");
- state = SYNC;
- continue;
-
- case BYTELOCK_READ:
- bl = 1;
- request.l_type = F_RDLCK;
- state = SYNC;
- continue;
-
- case BYTELOCK_WRITE:
- bl = 1;
- request.l_type = F_WRLCK;
- state = SYNC;
- continue;
-
- case BYTELOCK:
- /* The main idea is to lock all the bytes in a file. Each slave process locks one byte.
- *
- * We need :
- * - To create a file of a length equal to the total number of slave processes
- * - send the exact section to lock to each slave
- * - ensure locks have been correctly set
- */
-
- /* Create a string to record in the test file. Length is exactly the number of sub process */
- P("Master: BYTELOCK: %d\n", state);
- buf = malloc(clnt * (maxClients + 1));
- memset(buf, '*', clnt);
- write(dp.fd, buf, clnt);
- free(buf);
-
- /* Each slave process re-writes its own field to lock */
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 1;
-
- /* Start to send sections to lock to remote process (network clients) */
- for (i = 0; i < maxClients; i++) {
- /* Set the correct byte to lock */
- offset = (i + 1) * clnt;
- request.l_start = (off_t) offset;
- serverSendLockClient(&request, i);
- }
-
- /* Now send sections to local processes */
- for (i = 0; i < clnt; i++) {
- request.l_start = i;
- serverSendLockLocal(&request, i);
- }
- state = RESULT;
- continue;
-
- case SYNC:
- sendLockTest(&tLock);
- if (bl) {
- state = BYTELOCK;
- continue;
- }
-
- if (n < MAXTEST + 1)
- state = RESULT;
- else
- state = END;
- continue;
-
- case RESULT:
- /* Read results by one */
- getResults(n - 1);
- if (bl)
- validationResults(n - 1);
- state = CLEAN;
- continue;
-
- case CLEAN:
- /* Ask the clients to stop testing ... */
- tLock.test = CLEAN;
- serializeTLock(&tLock);
- serverSend();
- /* ... and wait for an ack before closing */
- serverReceive();
- /* Ignore message content : that is only an ack */
-
- /* close and open file */
- close(dp.fd);
- initTest();
- state = SELECT;
- continue;
- case END:
- tLock.test = END;
- serializeTLock(&tLock);
- serverSend();
- sleep(2);
- break;
-
- printf("(end)\n");
- exit(0);
-
- }
- break;
- }
-
- return report(clnt);
-}
-
-/* Slave process/thread */
-
-void *slave(void *data)
-{
- struct dataChild *df;
- int i, a, result, ftest;
- struct s_test tLock;
- struct flock request;
- char tmp[16];
-#ifdef DEBUG
- char dbg[16];
-#endif
- char *phraseTest = "L'ecriture a reussi";
- int len;
- enum state_t state;
-
- result = -1;
- ftest = -1;
- len = strlen(phraseTest);
- df = (struct dataChild *)data;
- i = df->dpr->whoami;
- P("Slave n=%d\n", i);
- slaveReader = dp.lclnt[i][0];
- slaveWriter = dp.master[1];
- state = SYNC;
- errno = 0;
- memset(tmp, 0, 16);
- while (1) {
- switch (state) {
- case SELECT:
- case SYNC:
- getLockTest(&tLock);
- state = tLock.test;
- P("Slave State=%d\n", state);
-
- continue;
- case RDONLY:
- /* Try to read a file */
- P("TEST READ ONLY %d\n", RDONLY);
- if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open:");
- continue;
- }
- P("fd=%d\n", ftest);
- a = read(ftest, tmp, 16);
- if (a < 16)
- result = ECHEC;
- else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case WRONLY:
- /* Try to write a file */
- P("TEST WRITE ONLY %d\n", WRONLY);
- if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open read only:");
- continue;
- }
- P("fd=%d\n", ftest);
- if (write(ftest, phraseTest, len) < len)
- result = ECHEC;
- else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case LOCK:
-
- case READLOCK:
- /* Try to read a read-locked section */
- P("READ LOCK %d\n", F_RDLCK);
- if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open read-write:");
- continue;
- }
-
- P("fd=%d\n", ftest);
- /* Lock the whole file */
- request.l_type = F_RDLCK;
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 0;
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("RDONLY: fcntl");
- result = ECHEC;
- } else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case WRITELOCK:
- /* Try to write a file */
- P("WRITE LOCK %d\n", F_WRLCK);
- if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("\nOpen:");
- continue;
- }
- /* Lock the whole file */
- P("fd=%d\n", ftest);
- request.l_type = F_WRLCK;
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 0;
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("\nWRONLY: fcntl");
- result = ECHEC;
- } else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case BYTELOCK_READ:
- P("BYTE LOCK READ: %d\n", state);
- state = BYTELOCK;
- continue;
-
- case BYTELOCK_WRITE:
- P("BYTE LOCK WRITE: %d\n", state);
- state = BYTELOCK;
- continue;
-
- case BYTELOCK:
- /* Wait for the exact section to lock. The whole file is sent by the master */
- P("BYTE LOCK %d\n", state);
- getLockSection(&request);
- if ((ftest = open(dp.fname, O_RDWR | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("\nOpen:");
- continue;
- }
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("\nBTLOCK: fcntl");
- result = ECHEC;
- state = RESULT;
- continue;
- }
- /* Change the character at the given position for an easier verification */
- a = lseek(ftest, request.l_start, SEEK_SET);
- write(ftest, "=", 1);
- result = SUCCES;
- state = RESULT;
- continue;
-
- case RESULT:
- if (result == SUCCES)
- write(0, "=", 1);
- else
- write(0, "x", 1);
- P("RESULT: %d\n", result);
- sendResult(result);
- state = SYNC;
- continue;
-
- case CLEAN:
- close(ftest);
- /* Send CLEAN Ack */
- sendResult(result);
- state = SYNC;
- continue;
-
- case END:
- E("(End)\n");
- finish(0);
- printf("Unknown command\n");
- finish(1);
-
- }
- }
-
-}
-
-char *nextArg(int argc, char **argv, int *i)
-{
- if (((*i) + 1) < argc) {
- (*i) += 1;
- return argv[(*i)];
- }
- return NULL;
-}
-
-int usage(void)
-{
- printf("locktest -n <number of process> -f <test file> [-T]\n");
- printf("Number of child process must be higher than 1\n");
- exit(0);
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- int rc = 0;
- int i, nThread = 0;
- char *tmp;
- int type = 0;
- int clients;
- type = PROCESS;
- dp.fname = NULL;
- dp.verbose = 0;
- int server = 1;
- char *host;
-
- host = NULL;
- clients = 0;
-
- for (i = 1; i < argc; i++) {
-
- if (!strcmp("-n", argv[i])) {
- if (!(tmp = nextArg(argc, argv, &i)))
- usage();
- nThread = atoi(tmp);
- continue;
- }
-
- if (!strcmp("-f", argv[i])) {
- if (!(dp.fname = nextArg(argc, argv, &i)))
- usage();
- continue;
- }
- if (!strcmp("-v", argv[i])) {
- dp.verbose = TRUE;
- continue;
- }
- if (!strcmp("-c", argv[i])) {
- if (!(clients = atoi(nextArg(argc, argv, &i))))
- usage();
- continue;
- }
-
- if (!strcmp("--server", argv[i])) {
- if (!(host = nextArg(argc, argv, &i)))
- usage();
- server = 0;
- continue;
- }
- printf("Ignoring unknown option: %s\n", argv[i]);
- }
-
- if (server) {
- if (!(dp.fname && nThread))
- usage();
- if (clients > 0) {
- configureServer(clients);
- setupClients(type, dp.fname, nThread);
- }
- } else {
- configureClient(host);
- dp.fname = malloc(512);
- memset(dp.fname, 0, 512);
- getConfiguration(&type, dp.fname, &nThread);
- }
-
- if (dp.verbose)
- printf("By process.\n");
- load = loadProcess;
- eType = "process";
- finish = finishProcess;
- LIST_RESULTS = LIST_RESULTS_PROCESS;
- initialize(nThread);
- if (server) {
- rc = master();
- } else {
- masterClient();
- free(dp.fname);
- }
- clean();
-
- return rc;
-}
diff --git a/testcases/network/nfsv4/locks/locktests.h b/testcases/network/nfsv4/locks/locktests.h
deleted file mode 100644
index a40e4172e..000000000
--- a/testcases/network/nfsv4/locks/locktests.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/* *************************************************
- * *********** README ******************************
- * *************************************************
- *
- * COMPILE : make
- * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
- *
- * GOAL : This test tries to stress the fcntl locking functions. A
- * master process sets a lock on a file region (this is called "byte
- * range locking"). Some slave processes try to perform operations on
- * this region, such as read, write, set a new lock ... The expected
- * results of these operations are known. If the operation's result is
- * the same as the expected one, the test suceeds, else it fails.
- *
- * Slaves are either concurent processes or threads.
- * -n <num> : Number of threads to use (mandatory).
- * -f <file> : Run the test on a test file defined by the -f option (mandatory).
- * -T : Use threads instead of processes (optional).
- *
- * HISTORY : This program has been written to stress NFSv4 locks. -P
- * option was created to verify NFSv4 locking was thread-aware, and so,
- * locking behaviour over NFSv4 was POSIX correct both using threads and
- * process. This option may not be useful to stress.
- *
- * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
- *
- *
- * Vincent ROQUETA 2005 - [email protected]
- * BULL S.A.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#ifdef STDARG
-#include <stdarg.h>
-#endif
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/param.h>
-#include <sys/times.h>
-#ifdef MMAP
-#include <sys/mman.h>
-#endif
-#include <inttypes.h>
-#include <pthread.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/select.h>
-
-#ifdef O_SYNC
-#define OPENFLAGS (O_CREAT | O_RDWR | O_SYNC )
-#else
-#define OPENFLAGS (O_CREAT | O_RDWR )
-#endif
-#define OPENMODES (0600)
-#define MANDMODES (0600)
-/*(02666)*/
-
-#define SUCCES 1
-#define ECHEC 0
-
-#define TRUE 1
-#define FALSE 0
-
-#define PROCESS 0
-#define THREAD 1
-
-
-//#define DEBUG
-#ifdef DEBUG
- #define E(a) perror(a)
- #define P(a,b) printf(a,b)
-#else
- #define E(a)
- #define P(a,b)
-#endif
-
-
-
-#ifndef LOCKTESTS_H
-#define LOCKTESTS_H
-
-#define M_SIZE 512
-
-int writeToAllClients(char *foo);
-
-int serverReceiveNet();
-int clientReceiveNet();
-int serverReceiveClient(int n);
-int setupClients(int type, char *fname, int nThread);
-int serverCloseConnection();
-int getConfiguration(int *type, char *fname, int *nThread);
-int readFromServer(char *message);
-int serverSendClient(int n);
-
-
-enum state_t {
- CLEAN,
- RDONLY,
- RESULT,
- WRONLY,
- SELECT,
- LOCK,
- SYNC,
- END,
- READLOCK,
- WRITELOCK,
- BYTELOCK,
- BYTELOCK_READ,
- BYTELOCK_WRITE
-};
-
-/* Public data */
-struct dataPub {
- /* Number of clients */
- int nclnt;
- /* List of master to slave pipes */
- int **lclnt;
- /* Slave to master pipe */
- int master[2];
- /* Thread list */
- pthread_t *lthreads;
- /* test file name */
- char *fname;
- /* test file file-descriptor */
- int fd;
- /* Detailed error messages */
- int verbose;
-};
-
-/* private data */
-struct dataPriv {
- /* thread number */
- int whoami;
-};
-
-struct dataChild{
- struct dataPub *dp;
- struct dataPriv *dpr;
-};
-
-
-struct s_test {
- int test;
- int type;
- char *nom;
- int resAtt;
-
-};
-
-
-
-
-int configureServer(int max);
-int configureClient(char *s);
-
-#endif
diff --git a/testcases/network/nfsv4/locks/locktests.py b/testcases/network/nfsv4/locks/locktests.py
deleted file mode 100755
index 9876a86ef..000000000
--- a/testcases/network/nfsv4/locks/locktests.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#!/usr/bin/env python3
-# This script aims to help to run locktests with several clients.
-#
-# Report bugs to Vincent ROQUETA : [email protected]
-
-import encodings
-import shutil
-import os, sys
-import getopt, sys
-import string
-import socket
-from stat import *
-from sys import *
-from os import *
-
-NFS4_PATH="/mnt/nfsv4"
-NFS4_SERVER=""
-TEST_HOME="/home/vincent/locks/"
-testfile=NFS4_PATH+"/testfile"
-
-app="locktests"
-SRC="locktests.tar.gz"
-SRC_PATH="deploy"
-install="'tar xzf "+SRC+"; cd locks; make `"
-user="root"
-
-
-
-
-
-class Machine:
-
- def mkdir(self,dir):
- self.command="mkdir -p "+dir
- self.do()
- def rmdir(self,dir):
- self.command="rm -rf "+dir
- self.do()
-
- def printc(self):
- print("->"+self.command)
- print("\n")
-
-class Client(Machine):
-
- def __init__(self, machine):
- self.command=""
- self.machine=machine
- self.mountPath=NFS4_PATH
-
- def do(self):
- self.command="ssh "+user+"@"+self.machine+" "+self.command
- os.system(self.command)
-
- def isomount(self, dir):
- export=NFS4_SERVER
- mntpoint=NFS4_PATH
- self.command="'mkdir -p "+mntpoint+"; mount -t nfs4 "+export+" "+mntpoint+"'"
- self.do()
-
- def umount(self, dir):
- mntpoint=self.mountPath+"/"+dir
- self.command="umount "+mntpoint
- self.do()
- def install(self, path):
- self.command="'cd "+path+"; tar xzf "+SRC+"; cd locks; make'"
- self.do()
-
- def run(self, appli):
- self.command=appli
- self.do()
- def cp(self, fichier, path):
- command="scp "+fichier+" "+user+"@"+self.machine+":"+path
- os.system(command)
-
-
-class Serveur(Machine):
-
- def __init__(self, ip, exportPath):
- self.SERVEUR=ip
- self.exportPath=exportPath
-
- def do(self):
- self.command="ssh "+self.SERVEUR+" "+self.command
- os.system(self.command)
-
- def configure(self, dir):
- exportDir=self.exportPath+'/'+dir
- self. mkdir(exportDir)
-#self.printc()
- self.export(exportDir)
-#self.printc()
- def clean(self, dir):
- unexportDir=self.exportPath+'/'+dir
- self.unexport(unexportDir)
- self.rmdir(unexportDir)
-def usage():
- print("\n")
- print("usage:")
- print("locktests.py <-n process -f testfile ><--setup -s fs_server> -c host1, host2, host3 ... ")
- print("--setup : setup the configuration, deploy test on other test machines; This option also requires -c and -s")
- print("-c <machine> : host list to deploy/run/clean the test")
- print("-s <machine> : NFS server to use to setup the test")
- print("-n <num> : number of processes each test machine will lauch to perform the test")
- print("-f <file> : test file. This must be the same on each machine")
- print(" ")
- print("Example :")
- print("=========")
- print("*Setup machines for testing")
- print("./locktests.py --setup -c testmachine1 testmachine2 testmachine3 -s my_nfs_server:/")
- print("\n")
- print("*Run test on testmachine1,testmachine2 with 50 process on each machine using /mnt/nfsv4/testfile")
- print("./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2")
- print("\n")
- print("_________________________________")
- print("Vincent ROQUETA - Bull SA - 2005\n")
-
- return 0
-
-
-
-def setup():
- path=os.path.abspath(".")
- fichier=SRC_PATH+"/"+SRC
- commande=""
- for i in clients:
- print("Setting up machine "+i)
- c=Client(i)
- c.mkdir(path)
- c.cp(fichier, path)
- c.install(path)
- c.isomount(NFS4_PATH)
- #Setup localhost
- print("Setting up localhost")
- commande="make; mkdir -p "+NFS4_PATH+" ; mount -t nfs4 "+NFS4_SERVER+" "+NFS4_PATH+" &"
- os.system(commande)
-
-
-def run():
- path=os.path.abspath(".")
- nbreClients=len(clients)
- hostname=socket.gethostname()
- # Lancement du serveur en local
- # Launch the server locally
- commande=path+"/"+app+" -n "+nbreProcess+" -f "+filename+" -c "+str(nbreClients)+" &"
- os.system(commande)
- commande=path+"/locks/"+app+" --server "+hostname
- for i in clients:
- c=Client(i)
- c.run(commande)
-
-def clean():
- for i in clients:
- client.umount(NFS4_PATH)
-
-
-
-
-
-
-args=sys.argv[1:]
-rge=list(range(len(args)))
-a=""
-r=True
-s=False
-nfsServer=False
-c=False
-f=False
-n=False
-clients=[]
-for i in rge:
- if args[i] in ("--install", "-i", "--setup"):
- r=False
- s=True
- continue
- if args[i] in ("-s", "--server"):
- a="nfsServer"
- nfsServer=True
- continue
- if args[i] in ("-h", "--help"):
- usage()
- sys.exit(1)
- if args[i] in ("--clients", "-c"):
- a="clients"
- c=True
- continue
- if args[i] == "-n":
- a="nbre"
- n=True
- continue
- if args[i] == "-f":
- a="file"
- f=True
- continue
-
- if a=="clients":
- clients.append(args[i])
- continue
- if a=="file":
- filename=args[i]
- continue
- if a=="nbre":
- nbreProcess=args[i]
- continue
- if a=="nfsServer":
- NFS4_SERVER=args[i]
- continue
-
-
- usage()
-# For ...
-if s:
- if (not c) or (not nfsServer):
- usage()
- sys.exit(1)
- print("Setup")
- print(NFS4_SERVER)
- setup()
- print("Setup complete")
-
-if r:
- if (not c) or (not f) or (not n):
- usage()
- sys.exit(1)
-
- print("Running test")
- run()
-
-
-
-
-
-
-
-
-
diff --git a/testcases/network/nfsv4/locks/netsync.c b/testcases/network/nfsv4/locks/netsync.c
deleted file mode 100644
index b40c002fe..000000000
--- a/testcases/network/nfsv4/locks/netsync.c
+++ /dev/null
@@ -1,201 +0,0 @@
-#include "locktests.h"
-
-#include <netdb.h>
-#include <string.h>
-#define PORT 12346
-#define MAX_CONNECTION 16
-
-int maxClients;
-int *fdClient;
-char *server_name;
-int fdServer;
-extern char message[M_SIZE];
-
-int serverReceiveClient(int c)
-{
- char tmp[M_SIZE];
- int r, s;
- /* Ensure we read _exactly_ M_SIZE characters in the message */
- memset(message, 0, M_SIZE);
- memset(tmp, 0, M_SIZE);
- r = 0;
- s = 0;
-
- while (s < M_SIZE) {
- r = read(fdClient[c], tmp, M_SIZE - s);
- /* Loop until we have a complete message */
- strncpy(message + s, tmp, r);
- s += r;
- }
- return s;
-}
-
-int serverSendClient(int n)
-{
- return write(fdClient[n], message, M_SIZE);
-}
-
-int clientReceiveNet(void)
-{
- readFromServer(message);
- return 0;
-}
-
-int setupConnectionServer(void)
-{
- struct sockaddr_in local;
- int c;
- socklen_t size;
- int sock;
- struct sockaddr_in remote;
-
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- perror("socket");
- exit(1);
- }
- memset(&local, 0x00, sizeof(local));
- local.sin_family = AF_INET;
- local.sin_port = htons(PORT);
- local.sin_addr.s_addr = INADDR_ANY;
- memset(&(local.sin_zero), 0x00, 8);
-
- if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) ==
- -1) {
- perror("bind");
- exit(1);
- }
-
- if (listen(sock, MAX_CONNECTION) == -1) {
- perror("listen");
- return 1;
- }
- size = sizeof(struct sockaddr_in);
- for (c = 0; c < maxClients; c++) {
- if ((fdClient[c] =
- accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
- perror("accept");
- return 1;
- }
-
- }
- return 0;
-}
-
-int writeToClient(int c, char *message)
-{
- return write(fdClient[c], message, 512);
-}
-
-int serverCloseConnection(void)
-{
- int c;
- for (c = 0; c < maxClients; c++)
- close(fdClient[c]);
- return 0;
-
-}
-
-int writeToAllClients(char *foo)
-{
- int c;
- for (c = 0; c < maxClients; c++)
- writeToClient(c, foo);
- return 0;
-}
-
-int setupClients(int type, char *fname, int nThread)
-{
- /*
- * Send parameters to all slaves :
- *
- * We must send :
- * - the position of the test file
- * - the number of slaves for each client
- * - The kind of slaves : process or thread
- */
- char message[512];
- sprintf(message, "%d:%s:%d::", type, fname, nThread);
- writeToAllClients(message);
- return 0;
-}
-
-int configureServer(int max)
-{
- maxClients = max;
- fdClient = malloc(sizeof(int) * max);
-
- setupConnectionServer();
-
- return 0;
-}
-
-int setupConnectionClient(void)
-{
-
- struct hostent *server;
- struct sockaddr_in serv_addr;
-
- if (!(server = gethostbyname(server_name))) {
- printf("erreur DNS\n");
- return 1;
- }
-
- fdServer = socket(AF_INET, SOCK_STREAM, 0);
- if (fdServer < 0) {
- perror("socket");
- return 1;
- }
-
- serv_addr.sin_addr = *(struct in_addr *)server->h_addr;
- serv_addr.sin_port = htons(PORT);
- serv_addr.sin_family = AF_INET;
- if (connect(fdServer, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
- < 0) {
- perror("connect");
- return 1;
- }
- return 0;
-}
-
-int readFromServer(char *message)
-{
- char tmp[M_SIZE];
- int r, s;
- /* Ensure we read exactly M_SIZE characters */
- memset(message, 0, M_SIZE);
- memset(tmp, 0, M_SIZE);
- r = 0;
- s = 0;
- while (s < M_SIZE) {
- r = read(fdServer, tmp, M_SIZE - s);
- /* Loop until we have a complete message */
- strncpy(message + s, tmp, r);
- s += r;
- }
- return s;
-}
-
-int getConfiguration(int *type, char *fname, int *nThread)
-{
- char conf[M_SIZE];
- char *p;
- int i;
- readFromServer(conf);
- p = strtok(conf, ":");
- printf("%s\n", p);
- *type = atoi(p);
- p = strtok(NULL, ":");
- i = strlen(p);
- strncpy(fname, p, i);
- p = strtok(NULL, ":");
- *nThread = atoi(p);
-
- return 0;
-}
-
-int configureClient(char *s)
-{
- server_name = s;
- setupConnectionClient();
- return 0;
-}
--
2.27.0


2020-07-20 13:35:58

by Trond Myklebust

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> Reasons to drop:
> * outdated tests (from 2005)
> * not used (NFS kernel maintainers use pynfs [1])
> * written in Python (we support C and shell, see [2])
>
> [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> [2] https://github.com/linux-test-project/ltp/issues/547
>

Unlike pynfs, these tests run on a real NFS client, and were designed
to test client implementations, as well as the servers.

So if they get dropped from ltp, then we will have to figure out some
other way of continuing to maintain them.

--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
[email protected]


2020-07-20 14:13:34

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > Reasons to drop:
> > * outdated tests (from 2005)
> > * not used (NFS kernel maintainers use pynfs [1])
> > * written in Python (we support C and shell, see [2])
> >
> > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > [2] https://github.com/linux-test-project/ltp/issues/547
> >
>
> Unlike pynfs, these tests run on a real NFS client, and were designed
> to test client implementations, as well as the servers.
>
> So if they get dropped from ltp, then we will have to figure out some
> other way of continuing to maintain them.

Just for fun, I grepped through old mail to see if I could find any
cases of these tests being used. I found one, in which Chuck reports an
nfslock01 failure. Looks like it did find a real bug, which we fixed:

https://lore.kernel.org/r/[email protected]
https://lore.kernel.org/r/[email protected]

--b.

2020-07-20 14:36:57

by Petr Vorel

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

Hi Bruce, Trond,

> On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > Reasons to drop:
> > > * outdated tests (from 2005)
> > > * not used (NFS kernel maintainers use pynfs [1])
> > > * written in Python (we support C and shell, see [2])

> > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > [2] https://github.com/linux-test-project/ltp/issues/547


> > Unlike pynfs, these tests run on a real NFS client, and were designed
> > to test client implementations, as well as the servers.

> > So if they get dropped from ltp, then we will have to figure out some
> > other way of continuing to maintain them.

> Just for fun, I grepped through old mail to see if I could find any
> cases of these tests being used. I found one, in which Chuck reports an
> nfslock01 failure. Looks like it did find a real bug, which we fixed:

> https://lore.kernel.org/r/[email protected]
> https://lore.kernel.org/r/[email protected]

Thanks for your explanation, this obviously justify these tests in LTP, unless
you want to move it to git.linux-nfs.org and maintain on your own.

Kind regards,
Petr

2020-07-20 15:16:18

by Petr Vorel

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

Hi Bruce, Trond,

> > On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > > Reasons to drop:
> > > > * outdated tests (from 2005)
> > > > * not used (NFS kernel maintainers use pynfs [1])
> > > > * written in Python (we support C and shell, see [2])

> > > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > > [2] https://github.com/linux-test-project/ltp/issues/547


> > > Unlike pynfs, these tests run on a real NFS client, and were designed
> > > to test client implementations, as well as the servers.

> > > So if they get dropped from ltp, then we will have to figure out some
> > > other way of continuing to maintain them.

> > Just for fun, I grepped through old mail to see if I could find any
> > cases of these tests being used. I found one, in which Chuck reports an
> > nfslock01 failure. Looks like it did find a real bug, which we fixed:

> > https://lore.kernel.org/r/[email protected]
> > https://lore.kernel.org/r/[email protected]

> Thanks for your explanation, this obviously justify these tests in LTP, unless
> you want to move it to git.linux-nfs.org and maintain on your own.
Actually, that fix 42691398be08 ("nfsd: Fix race between FREE_STATEID and LOCK")
from v4.8-rc2 reported by Alexey Kodanev (LTP network maintainer) was found by
nfslock01 test [1], which is integrated into other LTP NFS tests [2]. I'd
definitely keep these in LTP.

nfsv4 I proposed to remove as outdated and not being used are testing ACL [3]
and fcntl locking [4]. ACL tests use rsh and aren't integrated into LTP
framework (use their custom [5] runtest file thus I doubt anyone is using it).
fcntl locktests are at least integrated into LTP (use fcntl-locktests runtest
file[6], I forget to remove it in this patch).
Both tests are written in 2005. I don't want to push for removal, if you see any
use in it.

Kind regards,
Petr

[1] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfs/nfslock01/
[2] https://github.com/linux-test-project/ltp/blob/master/runtest/net.nfs
[3] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/acl
[4] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/locks
[5] https://github.com/linux-test-project/ltp/blob/master/testcases/network/nfsv4/acl/runtest
[6] https://github.com/linux-test-project/ltp/blob/master/runtest/fcntl-locktests

2020-07-20 15:20:05

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > Reasons to drop:
> > * outdated tests (from 2005)
> > * not used (NFS kernel maintainers use pynfs [1])
> > * written in Python (we support C and shell, see [2])
> >
> > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > [2] https://github.com/linux-test-project/ltp/issues/547
> >
>
> Unlike pynfs, these tests run on a real NFS client, and were designed
> to test client implementations, as well as the servers.
>
> So if they get dropped from ltp, then we will have to figure out some
> other way of continuing to maintain them.

NFS tests using the kernel sound like a prime candidate for xfstests.

2020-07-20 17:02:09

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

On Mon, Jul 20, 2020 at 05:15:08PM +0200, Petr Vorel wrote:
> Hi Bruce, Trond,
>
> > > On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > > > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > > > Reasons to drop:
> > > > > * outdated tests (from 2005)
> > > > > * not used (NFS kernel maintainers use pynfs [1])
> > > > > * written in Python (we support C and shell, see [2])
>
> > > > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > > > [2] https://github.com/linux-test-project/ltp/issues/547
>
>
> > > > Unlike pynfs, these tests run on a real NFS client, and were designed
> > > > to test client implementations, as well as the servers.
>
> > > > So if they get dropped from ltp, then we will have to figure out some
> > > > other way of continuing to maintain them.
>
> > > Just for fun, I grepped through old mail to see if I could find any
> > > cases of these tests being used. I found one, in which Chuck reports an
> > > nfslock01 failure. Looks like it did find a real bug, which we fixed:
>
> > > https://lore.kernel.org/r/[email protected]
> > > https://lore.kernel.org/r/[email protected]
>
> > Thanks for your explanation, this obviously justify these tests in LTP, unless
> > you want to move it to git.linux-nfs.org and maintain on your own.
> Actually, that fix 42691398be08 ("nfsd: Fix race between FREE_STATEID and LOCK")
> from v4.8-rc2 reported by Alexey Kodanev (LTP network maintainer) was found by
> nfslock01 test [1], which is integrated into other LTP NFS tests [2]. I'd
> definitely keep these in LTP.

Whoops, I don't know why I thought I saw nfslock01 in your patch.
Apologies.

> nfsv4 I proposed to remove as outdated and not being used are testing ACL [3]
> and fcntl locking [4]. ACL tests use rsh and aren't integrated into LTP
> framework (use their custom [5] runtest file thus I doubt anyone is using it).
> fcntl locktests are at least integrated into LTP (use fcntl-locktests runtest
> file[6], I forget to remove it in this patch).
> Both tests are written in 2005. I don't want to push for removal, if you see any
> use in it.

Looks like they may test some things (ACL enforcement, multi-client
locking), that our other test suites don't.

On the other hand, if nobody's actually running them then maybe it's on
us to adopt them if we want them. (Not volunteering for now.)

--b.

>
> Kind regards,
> Petr
>
> [1] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfs/nfslock01/
> [2] https://github.com/linux-test-project/ltp/blob/master/runtest/net.nfs
> [3] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/acl
> [4] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/locks
> [5] https://github.com/linux-test-project/ltp/blob/master/testcases/network/nfsv4/acl/runtest
> [6] https://github.com/linux-test-project/ltp/blob/master/runtest/fcntl-locktests

2020-07-20 18:13:10

by Petr Vorel

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

Hi Bruce, Trond,

> > > > On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > > > > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > > > > Reasons to drop:
> > > > > > * outdated tests (from 2005)
> > > > > > * not used (NFS kernel maintainers use pynfs [1])
> > > > > > * written in Python (we support C and shell, see [2])

> > > > > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > > > > [2] https://github.com/linux-test-project/ltp/issues/547


> > > > > Unlike pynfs, these tests run on a real NFS client, and were designed
> > > > > to test client implementations, as well as the servers.

> > > > > So if they get dropped from ltp, then we will have to figure out some
> > > > > other way of continuing to maintain them.

> > > > Just for fun, I grepped through old mail to see if I could find any
> > > > cases of these tests being used. I found one, in which Chuck reports an
> > > > nfslock01 failure. Looks like it did find a real bug, which we fixed:

> > > > https://lore.kernel.org/r/[email protected]
> > > > https://lore.kernel.org/r/[email protected]

> > > Thanks for your explanation, this obviously justify these tests in LTP, unless
> > > you want to move it to git.linux-nfs.org and maintain on your own.
> > Actually, that fix 42691398be08 ("nfsd: Fix race between FREE_STATEID and LOCK")
> > from v4.8-rc2 reported by Alexey Kodanev (LTP network maintainer) was found by
> > nfslock01 test [1], which is integrated into other LTP NFS tests [2]. I'd
> > definitely keep these in LTP.

> Whoops, I don't know why I thought I saw nfslock01 in your patch.
> Apologies.
No problem at all, I at least had a second look and find missing runtest file.

> > nfsv4 I proposed to remove as outdated and not being used are testing ACL [3]
> > and fcntl locking [4]. ACL tests use rsh and aren't integrated into LTP
> > framework (use their custom [5] runtest file thus I doubt anyone is using it).
> > fcntl locktests are at least integrated into LTP (use fcntl-locktests runtest
> > file[6], I forget to remove it in this patch).
> > Both tests are written in 2005. I don't want to push for removal, if you see any
> > use in it.

> Looks like they may test some things (ACL enforcement, multi-client
> locking), that our other test suites don't.
That justify to have them, if they really test that properly. IMHO they need
at least a cleanup/rewrite (no matter whether they stay in LTP or adopted by
other project), but maybe write new tests from scratch might be easier.

> On the other hand, if nobody's actually running them then maybe it's on
> us to adopt them if we want them. (Not volunteering for now.)
Even this brief review helped, thanks!

Kind regards,
Petr

> --b.


> > Kind regards,
> > Petr

> > [1] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfs/nfslock01/
> > [2] https://github.com/linux-test-project/ltp/blob/master/runtest/net.nfs
> > [3] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/acl
> > [4] https://github.com/linux-test-project/ltp/tree/master/testcases/network/nfsv4/locks
> > [5] https://github.com/linux-test-project/ltp/blob/master/testcases/network/nfsv4/acl/runtest
> > [6] https://github.com/linux-test-project/ltp/blob/master/runtest/fcntl-locktests

2020-07-20 18:17:34

by Petr Vorel

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

Hi Christoph,

> On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > Reasons to drop:
> > > * outdated tests (from 2005)
> > > * not used (NFS kernel maintainers use pynfs [1])
> > > * written in Python (we support C and shell, see [2])

> > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > [2] https://github.com/linux-test-project/ltp/issues/547


> > Unlike pynfs, these tests run on a real NFS client, and were designed
> > to test client implementations, as well as the servers.

> > So if they get dropped from ltp, then we will have to figure out some
> > other way of continuing to maintain them.

> NFS tests using the kernel sound like a prime candidate for xfstests.
In the past Yong Sun moved some ext4 related tests from LTP to xfstests.
LTP has various NFS related tests. IMHO more important than where these tests
should be is if anybody has a deeper look into them an cleanup them / rewrite
them from scratch.

Kind regards,
Petr

2020-07-21 09:33:05

by Petr Vorel

[permalink] [raw]
Subject: Re: [RFC PATCH 1/1] Remove nfsv4

Hi Christoph,

> > On Mon, Jul 20, 2020 at 01:32:09PM +0000, Trond Myklebust wrote:
> > > On Mon, 2020-07-20 at 11:14 +0200, Petr Vorel wrote:
> > > > Reasons to drop:
> > > > * outdated tests (from 2005)
> > > > * not used (NFS kernel maintainers use pynfs [1])
> > > > * written in Python (we support C and shell, see [2])

> > > > [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary
> > > > [2] https://github.com/linux-test-project/ltp/issues/547


> > > Unlike pynfs, these tests run on a real NFS client, and were designed
> > > to test client implementations, as well as the servers.

> > > So if they get dropped from ltp, then we will have to figure out some
> > > other way of continuing to maintain them.

> > NFS tests using the kernel sound like a prime candidate for xfstests.
> In the past Yong Sun moved some ext4 related tests from LTP to xfstests.
> LTP has various NFS related tests. IMHO more important than where these tests
> should be is if anybody has a deeper look into them an cleanup them / rewrite
> them from scratch.

Although xfstests sounds like a natural choice, atm there are quite a lot NFS
tests in LTP. xfstests contain only single NFS test.

IMHO it's a choice of anybody who rewrites these tests whether he tries to put
them to LTP or into xfstests. If it were me I'd probably keep them in LTP,
because I prefer LTP framework capabilities.

Kind regards,
Petr