X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fopenunlink.c;h=64a3eebb134d8602761b971bd7b7ab0d02355e68;hb=6fcbb85b3a9a618e8dd7ee14c9fc7da7d23dab5d;hp=e7671c842bb8d025f7f0479d582997e65358d40c;hpb=93acd158c57c4c5d0fc751d46741231490c04707;p=fs%2Flustre-release.git diff --git a/lustre/tests/openunlink.c b/lustre/tests/openunlink.c index e7671c8..64a3eeb 100644 --- a/lustre/tests/openunlink.c +++ b/lustre/tests/openunlink.c @@ -1,18 +1,54 @@ +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + #include #include #include #include #include +#include #include #include -#define T1 "write before unlink\n" -#define T2 "write after unlink\n" +#define T1 "write data before unlink\n" +#define T2 "write data after unlink\n" char buf[128]; int main(int argc, char **argv) { - char *fname, *fname2; + char *fname, *fname2; + struct stat st; int fd, rc; if (argc < 2 || argc > 3) { @@ -20,11 +56,11 @@ int main(int argc, char **argv) exit(1); } - fname = argv[1]; - if (argc == 3) - fname2 = argv[2]; - else - fname2 = argv[1]; + fname = argv[1]; + if (argc == 3) + fname2 = argv[2]; + else + fname2 = argv[1]; fprintf(stderr, "opening\n"); fd = open(fname, O_RDWR | O_TRUNC | O_CREAT, 0644); @@ -36,50 +72,55 @@ int main(int argc, char **argv) fprintf(stderr, "writing\n"); rc = write(fd, T1, strlen(T1) + 1); if (rc != strlen(T1) + 1) { - fprintf(stderr, "write (normal) %s\n", strerror(errno)); - exit(1); - } - - if (argc == 3) { - fprintf(stderr, "closing %s\n", fname); - rc = close(fd); - if (rc) { - fprintf(stderr, "close (normal) %s\n", strerror(errno)); - exit(1); - } - - fprintf(stderr, "opening %s\n", fname2); - fd = open(fname2, O_RDWR); - if (fd == -1) { - fprintf(stderr, "open (unlink) %s\n", strerror(errno)); - exit(1); - } - - fprintf (stderr, "unlinking %s\n", fname2); - rc = unlink(fname2); - if (rc) { - fprintf(stderr, "unlink %s\n", strerror(errno)); - exit(1); - } - - if (access(fname2, F_OK) == 0) { - fprintf(stderr, "%s still exists\n", fname2); - exit(1); - } - } else { - printf("unlink %s and press enter\n", fname); - getc(stdin); - } - - if (access(fname, F_OK) == 0) { - fprintf(stderr, "%s still exists\n", fname); - exit(1); - } + fprintf(stderr, "write (normal) %s (rc %d)\n", + strerror(errno), rc); + exit(1); + } + + if (argc == 3) { + fprintf (stderr, "unlinking %s\n", fname2); + rc = unlink(fname2); + if (rc) { + fprintf(stderr, "unlink %s\n", strerror(errno)); + exit(1); + } + } else { + printf("unlink %s and press enter\n", fname); + getc(stdin); + } + + fprintf(stderr, "accessing (1)\n"); + if (access(fname, F_OK) == 0) { + fprintf(stderr, "%s still exists\n", fname2); + exit(1); + } + + fprintf(stderr, "seeking (1)\n"); + rc = lseek(fd, 0, SEEK_SET); + if (rc) { + fprintf(stderr, "seek %s\n", strerror(errno)); + exit(1); + } + + fprintf(stderr, "accessing (2)\n"); + if (access(fname, F_OK) == 0) { + fprintf(stderr, "%s still exists\n", fname); + exit(1); + } + + fprintf(stderr, "fstat...\n"); + rc = fstat(fd, &st); + if (rc) { + fprintf(stderr, "fstat (unlink) %s\n", strerror(errno)); + exit(1); + } + if (st.st_nlink != 0) + fprintf(stderr, "st_nlink = %d\n", (int)st.st_nlink); fprintf(stderr, "reading\n"); rc = read(fd, buf, strlen(T1) + 1); if (rc != strlen(T1) + 1) { - fprintf(stderr, "read (unlink) %s rc %d\n", + fprintf(stderr, "read (unlink) %s (rc %d)\n", strerror(errno), rc); exit(1); } @@ -92,12 +133,12 @@ int main(int argc, char **argv) fprintf(stderr, "truncating\n"); rc = ftruncate(fd, 0); - if (rc ) { + if (rc) { fprintf(stderr, "truncate (unlink) %s\n", strerror(errno)); exit(1); } - fprintf(stderr, "seeking\n"); + fprintf(stderr, "seeking (2)\n"); rc = lseek(fd, 0, SEEK_SET); if (rc) { fprintf(stderr, "seek (after unlink trunc) %s\n", @@ -113,7 +154,7 @@ int main(int argc, char **argv) exit(1); } - fprintf(stderr, "seeking\n"); + fprintf(stderr, "seeking (3)\n"); rc = lseek(fd, 0, SEEK_SET); if (rc) { fprintf(stderr, "seek (before unlink read) %s\n", @@ -124,8 +165,8 @@ int main(int argc, char **argv) fprintf(stderr, "reading again\n"); rc = read(fd, buf, strlen(T2) + 1); if (rc != strlen(T2) + 1) { - fprintf(stderr, "read (after unlink rewrite) %s\n", - strerror(errno)); + fprintf(stderr, "read (after unlink rewrite) %s (rc %d)\n", + strerror(errno), rc); exit(1); } @@ -135,7 +176,7 @@ int main(int argc, char **argv) exit(1); } - fprintf(stderr, "closing again\n"); + fprintf(stderr, "closing\n"); rc = close(fd); if (rc) { fprintf(stderr, "close (unlink) %s\n", strerror(errno));