linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 1/1] Remove nfsv4
@ 2020-07-20  9:14 Petr Vorel
  2020-07-20 13:32 ` Trond Myklebust
  0 siblings, 1 reply; 10+ messages in thread
From: Petr Vorel @ 2020-07-20  9:14 UTC (permalink / raw)
  To: ltp
  Cc: Petr Vorel, Alexey Kodanev, Xiao Yang, linux-nfs, Chuck Lever,
	J . Bruce Fields

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 <pvorel@suse.cz>
---
@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: tony.reix@bull.net
-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
- vincent.roqueta@ext.bull.net
-
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 - vincent.roqueta@ext.bull.net
- * 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 - vincent.roqueta@ext.bull.net
- * 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 : vincent.roqueta@ext.bull.net
-
-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


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-07-21  9:31 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-20  9:14 [RFC PATCH 1/1] Remove nfsv4 Petr Vorel
2020-07-20 13:32 ` Trond Myklebust
2020-07-20 14:12   ` bfields
2020-07-20 14:36     ` Petr Vorel
2020-07-20 15:15       ` Petr Vorel
2020-07-20 17:01         ` bfields
2020-07-20 18:12           ` Petr Vorel
2020-07-20 15:17   ` Christoph Hellwig
2020-07-20 18:16     ` Petr Vorel
2020-07-21  9:31       ` Petr Vorel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).