diff --git a/lustre/tests/multiop.c b/lustre/tests/multiop.c index b42bfb8..f1e69b2 100755 --- a/lustre/tests/multiop.c +++ b/lustre/tests/multiop.c @@ -68,6 +68,8 @@ char usage[] = " d mkdir\n" " D open(O_DIRECTORY)\n" " f statfs\n" +" G get grouplock gid\n" +" g put grouplock gid\n" " L link\n" " l symlink\n" " m mknod\n" @@ -194,6 +196,7 @@ int main(int argc, char **argv) int flags; int save_errno; int verbose = 0; + int gid = 0; if (argc < 3) { fprintf(stderr, usage, argv[0]); @@ -257,6 +260,22 @@ int main(int argc, char **argv) exit(save_errno); } break; + case 'G': + gid = atoi(commands+1); + if (ioctl(fd, LL_IOC_GROUP_LOCK, gid) == -1) { + save_errno = errno; + perror("ioctl(GROUP_LOCK)"); + exit(save_errno); + } + break; + case 'g': + gid = atoi(commands+1); + if (ioctl(fd, LL_IOC_GROUP_UNLOCK, gid) == -1) { + save_errno = errno; + perror("ioctl(GROUP_UNLOCK)"); + exit(save_errno); + } + break; case 'l': newfile = POP_ARG(); if (!newfile) diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 052a207..18e0d22 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -2013,6 +2013,20 @@ test_34g() { } run_test 34g "truncate long file ===============================" +test_34h() { + dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 + GID=10 + multiop $DIR/$tfile OG${GID}Tg${GID}C & + MULTIPID=$! + sleep 1 + + if [[ `ps h -o comm -p $MULTIPID` == "multiop" ]]; then + error "Multiop blocked on ftruncate, pid=$MULTIPID" + fi + kill -9 $MULTIPID +} +run_test 34h "ftruncate file under grouplock, should not block" + test_35a() { cp /bin/sh $DIR/f35a chmod 444 $DIR/f35a