Whamcloud - gitweb
LU-4253 osc: Don't flush active extents.
[fs/lustre-release.git] / lustre / tests / multiop.c
index b1a157d..0bb9826 100644 (file)
@@ -51,6 +51,7 @@
 #include <unistd.h>
 #include <semaphore.h>
 #include <time.h>
+#include <err.h>
 
 #include <lustre/lustre_idl.h>
 #include <lustre/lustreapi.h>
@@ -71,8 +72,11 @@ char usage[] =
 "       C[num] create with optional stripes\n"
 "       d  mkdir\n"
 "       D  open(O_DIRECTORY)\n"
+"       e[R|W|U] apply lease. R: Read; W: Write; U: Unlock\n"
+"       E[+|-] get lease. +/-: expect lease to (not) exist\n"
 "       f  statfs\n"
 "       F  print FID\n"
+"       H[num] create HSM released file with num stripes\n"
 "       G gid get grouplock\n"
 "       g gid put grouplock\n"
 "       K  link path to filename\n"
@@ -146,6 +150,9 @@ struct flag_mapping {
 #ifdef O_DIRECT
        {"O_DIRECT", O_DIRECT},
 #endif
+#ifdef O_NOATIME
+       {"O_NOATIME", O_NOATIME},
+#endif
        {"O_LARGEFILE", O_LARGEFILE},
        {"O_DIRECTORY", O_DIRECTORY},
        {"O_NOFOLLOW", O_NOFOLLOW},
@@ -285,13 +292,71 @@ int main(int argc, char **argv)
                                 exit(save_errno);
                         }
                         break;
-                case 'f':
-                        if (statfs(fname, &stfs) == -1) {
-                                save_errno = errno;
-                                perror("statfs()");
-                                exit(save_errno);
-                        }
-                        break;
+               case 'e':
+                       commands++;
+                       switch (*commands) {
+                       case 'U':
+                               flags = F_UNLCK;
+                               break;
+                       case 'R':
+                               flags = F_RDLCK;
+                               break;
+                       case 'W':
+                               flags = F_WRLCK;
+                               break;
+                       default:
+                               errx(-1, "unknown mode: %c", *commands);
+                       }
+
+                       rc = ioctl(fd, LL_IOC_SET_LEASE, flags);
+                       if (rc < 0)
+                               err(errno, "apply lease error");
+
+                       if (flags != F_UNLCK)
+                               break;
+
+                       /* F_UNLCK, interpret return code */
+                       if (rc > 0) {
+                               const char *str = "Unknown";
+                               if (rc == FMODE_READ)
+                                       str = "FMODE_READ";
+                               else if (rc == FMODE_WRITE)
+                                       str = "FMODE_WRITE";
+                               fprintf(stdout, "%s lease(%d) released.\n",
+                                       str, rc);
+                       } else if (rc == 0) {
+                               fprintf(stdout, "lease already broken.\n");
+                       }
+                       break;
+               case 'E':
+                       commands++;
+                       if (*commands != '-' && *commands != '+')
+                               errx(-1, "unknown mode: %c\n", *commands);
+
+                       rc = ioctl(fd, LL_IOC_GET_LEASE);
+                       if (rc > 0) {
+                               const char *str = "Unknown";
+
+                               if (rc == FMODE_READ)
+                                       str = "FMODE_READ";
+                               else if (rc == FMODE_WRITE)
+                                       str = "FMODE_WRITE";
+                               fprintf(stdout, "%s lease(%d) has applied.\n",
+                                       str, rc);
+                               if (*commands == '-')
+                                       errx(-1, "expect lease to not exist");
+                       } else if (rc == 0) {
+                               fprintf(stdout, "no lease applied.\n");
+                               if (*commands == '+')
+                                       errx(-1, "expect lease exists");
+                       } else {
+                               err(errno, "free lease error");
+                       }
+                       break;
+               case 'f':
+                       if (statfs(fname, &stfs) == -1)
+                               errx(-1, "statfs()");
+                       break;
                case 'F':
                        if (fd == -1)
                                rc = llapi_path2fid(fname, &fid);
@@ -320,6 +385,17 @@ int main(int argc, char **argv)
                                 exit(save_errno);
                         }
                         break;
+               case 'H':
+                       len = atoi(commands+1);
+                       fd = llapi_file_open(fname, O_CREAT | O_WRONLY,
+                               0644, 0, 0, len,
+                               LOV_PATTERN_RAID0 | LOV_PATTERN_F_RELEASED);
+                       if (fd == -1) {
+                               save_errno = errno;
+                               perror("create stripe file");
+                               exit(save_errno);
+                       }
+                       break;
                case 'K':
                        oldpath = POP_ARG();
                        if (oldpath == NULL)
@@ -559,11 +635,12 @@ int main(int argc, char **argv)
                         }
                         break;
                 case 'Y':
-                        if (fdatasync(fd) == -1) {
-                                save_errno = errno;
-                                perror("fdatasync");
-                                exit(save_errno);
-                        }
+                       if (fdatasync(fd) == -1) {
+                               save_errno = errno;
+                               perror("fdatasync");
+                               exit(save_errno);
+                       }
+                       break;
                 case 'z':
                         len = atoi(commands+1);
                         if (lseek(fd, len, SEEK_SET) == -1) {