X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Futime.c;h=8d8cd08dd3d22a806c0d0e5ebd2939be57631838;hb=bd8b65394f0a1ffd0c7f8dd0d875c55ba219d9ec;hp=9fe9f26bd09eea01ea4fdd6e958bc2c481c5f90e;hpb=a2a0746305449dbd925879b14dc2c0d6040bb8bf;p=fs%2Flustre-release.git diff --git a/lustre/tests/utime.c b/lustre/tests/utime.c index 9fe9f26..8d8cd08 100644 --- a/lustre/tests/utime.c +++ b/lustre/tests/utime.c @@ -14,20 +14,34 @@ void usage(char *prog) { - fprintf(stderr, "usage: %s \n", prog); + fprintf(stderr, "usage: %s [-s ]\n", prog); exit(1); } int main(int argc, char *argv[]) { long before_mknod, after_mknod; - long before_utime, after_utime; const char *prog = argv[0]; - const char *filename = argv[1]; - struct stat st; + const char *filename = argv[1]; + char *secname = NULL; + struct utimbuf utb; + struct stat st, st2; int rc; + int c; - if (argc != 2) + utb.actime = 200000; + utb.modtime = 100000; + + while ((c = getopt(argc, argv, "s:")) != -1) { + switch(c) { + case 's': + secname = optarg; + break; + default: + usage(argv[0]); + } + } + if (optind + 1 > argc) usage(argv[0]); /* Adjust the before time back one second, because the kernel's @@ -59,39 +73,89 @@ int main(int argc, char *argv[]) return 4; } - printf("%s: good mknod times %lu%s <= %lu <= %lu\n", + printf("%s: good mknod times %lu%s <= %lu <= %lu for %s\n", prog, before_mknod, before_mknod == st.st_mtime ? "*":"", - st.st_mtime, after_mknod); + st.st_mtime, after_mknod, filename); + + if (secname) { + sleep(1); + rc = stat(secname, &st2); + if (rc) { + fprintf(stderr, "%s: stat(%s) failed: rc %d: " + "%s\n", prog, secname, errno, + strerror(errno)); + return 5; + } - sleep(5); + if (st2.st_mtime < before_mknod || + st2.st_mtime > after_mknod) { + fprintf(stderr, "%s: bad mknod times %lu <= %lu" + " <= %lu false\n", prog, before_mknod, + st2.st_mtime, after_mknod); + return 6; + } + + printf("%s: good mknod times %lu%s <= %lu <= %lu " + "for %s\n", prog, before_mknod, + before_mknod == st.st_mtime ? "*":"", + st2.st_mtime, after_mknod, secname); + } } /* See above */ - before_utime = time(0) - 1; - rc = utime(filename, NULL); - after_utime = time(0); + rc = utime(filename, &utb); if (rc) { fprintf(stderr, "%s: utime(%s) failed: rc %d: %s\n", prog, filename, errno, strerror(errno)); - return 5; + return 7; } - + rc = stat(filename, &st); if (rc) { fprintf(stderr, "%s: second stat(%s) failed: rc %d: %s\n", prog, filename, errno, strerror(errno)); - return 6; + return 8; } - if (st.st_mtime < before_utime || st.st_mtime > after_utime) { - fprintf(stderr, "%s: bad utime times %lu <= %lu <= %lu false\n", - prog, before_utime, st.st_mtime, after_utime); - return 7; + if (st.st_mtime != utb.modtime ) { + fprintf(stderr, "%s: bad utime mtime %lu should be %lu\n", + prog, st.st_mtime, utb.modtime); + return 9; + } + + if (st.st_atime != utb.actime ) { + fprintf(stderr, "%s: bad utime atime %lu should be %lu\n", + prog, st.st_atime, utb.actime); + return 10; } - printf("%s: good utime times %lu%s <= %lu <= %lu\n", - prog, before_utime, before_utime == st.st_mtime ? "*" : "", - st.st_mtime, after_utime); + printf("%s: good utime mtimes %lu, atime %lu\n", + prog, utb.modtime, utb.actime); + + if (secname == NULL) + return 0; + + /* Checking that times in past get updated on another client. */ + rc = stat(secname, &st2); + if (rc) { + fprintf(stderr, "%s: second stat(%s) failed: rc %d: %s\n", + prog, secname, errno, strerror(errno)); + return 12; + } + if (st2.st_mtime != st.st_mtime) { + fprintf(stderr, "%s: not synced mtime between clients: %lu " + "should be %lu\n", prog, st2.st_mtime, st.st_mtime); + return 13; + } + + if (st2.st_ctime != st.st_ctime) { + fprintf(stderr, "%s: not synced ctime between clients: %lu " + " should be %lu\n", prog, st2.st_ctime, st.st_ctime); + return 14; + } + + printf("%s: updated times for %s\n", prog, secname); + return 0; }