Whamcloud - gitweb
Branch HEAD
authorliuy <liuy>
Thu, 16 Aug 2007 05:44:53 +0000 (05:44 +0000)
committerliuy <liuy>
Thu, 16 Aug 2007 05:44:53 +0000 (05:44 +0000)
b=12192
i=adilger, green

add llapi_file_open()

lustre/ChangeLog
lustre/include/lustre/liblustreapi.h
lustre/tests/Makefile.am
lustre/tests/multiop.c
lustre/tests/sanity.sh
lustre/utils/liblustreapi.c

index 7f7c51c..8e3b012 100644 (file)
@@ -111,6 +111,12 @@ Bugzilla   : 12932
 Description: obd_health_check_timeout too short
 Details    : set obd_health_check_timeout as 1.5x of obd_timeout
 
+Severity   : normal
+Bugzilla   : 12192
+Description: llapi_file_create() does not allow some changes
+Details    : add llapi_file_open() that allows specifying the mode and 
+            open flags, and also returns an open file handle.
+
 --------------------------------------------------------------------------------
 
 2007-08-10         Cluster File Systems, Inc. <info@clusterfs.com>
index 5371b87..27433f7 100644 (file)
@@ -14,6 +14,9 @@ typedef void (*llapi_cb_t)(char *obd_type_name, char *obd_name, char *obd_uuid,
 extern int llapi_file_create(const char *name, unsigned long stripe_size,
                              int stripe_offset, int stripe_count,
                              int stripe_pattern);
+extern int llapi_file_open(const char *name, int flags, int mode,
+                           unsigned long stripe_size, int stripe_offset,
+                           int stripe_count, int stripe_pattern);
 extern int llapi_file_get_stripe(const char *path, struct lov_user_md *lum);
 #define HAVE_LLAPI_FILE_LOOKUP
 extern int llapi_file_lookup(int dirfd, const char *name);
index d3d60f0..acf01ce 100644 (file)
@@ -54,6 +54,7 @@ mmap_sanity_SOURCES= mmap_sanity.c
 
 LIBLUSTREAPI := $(top_builddir)/lustre/utils/liblustreapi.a
 ll_getstripe_info_LDADD=$(LIBLUSTREAPI)
+multiop_LDADD=$(LIBLUSTREAPI)
 
 if MPITESTS
 LAM_LD_FLAGS=-L/opt/lam/lib -lmpi -llam -lpthread
index 389e26f..765c00b 100755 (executable)
@@ -14,6 +14,7 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <lustre/liblustreapi.h>
 
 #define T1 "write data before unlink\n"
 #define T2 "write data after unlink\n"
@@ -26,6 +27,7 @@ char usage[] =
 "Usage: %s filename command-sequence\n"
 "    command-sequence items:\n"
 "        c  close\n"
+"        C[num] create with optional stripes\n"
 "        d  mkdir\n"
 "        D  open(O_DIRECTORY)\n"
 "        L  link\n"
@@ -169,6 +171,16 @@ int main(int argc, char **argv)
                         }
                         fd = -1;
                         break;
+                case 'C':
+                        len = atoi(commands+1);
+                        fd = llapi_file_open(fname, O_CREAT | O_WRONLY, 0644,
+                                             0, 0, len, 0);
+                        if (fd == -1) {
+                                save_errno = errno;
+                                perror("create stripe file");
+                                exit(save_errno);
+                        }
+                        break;
                 case 'd':
                         if (mkdir(fname, 0755) == -1) {
                                 save_errno = errno;
index 4660081..af3abfe 100644 (file)
@@ -843,6 +843,12 @@ test_24t() {
 }
 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
 
+test_24u() { # bug12192
+        multiop $DIR/$tfile C2w$((2048 * 1024))c || error
+        $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
+}
+run_test 24u "create stripe file"
+
 test_25a() {
        echo '== symlink sanity ============================================='
 
index 406c629..c5e410e 100644 (file)
@@ -69,16 +69,17 @@ static void err_msg(char *fmt, ...)
         fprintf(stderr, ": %s (%d)\n", strerror(tmp_errno), tmp_errno);
 }
 
-int llapi_file_create(const char *name, unsigned long stripe_size, int stripe_offset,
-                      int stripe_count, int stripe_pattern)
+int llapi_file_open(const char *name, int flags, int mode,
+                    unsigned long stripe_size, int stripe_offset,
+                    int stripe_count, int stripe_pattern)
 {
         struct lov_user_md lum = { 0 };
         int fd, rc = 0;
         int isdir = 0;
         int page_size;
 
-        fd = open(name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
-        if (errno == EISDIR) {
+        fd = open(name, flags | O_LOV_DELAY_CREATE, mode);
+        if (fd < 0 && errno == EISDIR) {
                 fd = open(name, O_DIRECTORY | O_RDONLY);
                 isdir++;
         }
@@ -138,12 +139,26 @@ int llapi_file_create(const char *name, unsigned long stripe_size, int stripe_of
                         (__u64)LL_IOC_LOV_SETSTRIPE, name, fd, errmsg);
         }
 out:
-        if (close(fd) < 0) {
-                if (rc == 0)
-                        rc = -errno;
-                err_msg("error on close for '%s' (%d)", name, fd);
+        if (rc) {
+                close(fd);
+                fd = rc;
         }
-        return rc;
+
+        return fd;
+}
+
+int llapi_file_create(const char *name, unsigned long stripe_size,
+                      int stripe_offset, int stripe_count, int stripe_pattern)
+{
+        int fd;
+
+        fd = llapi_file_open(name, O_CREAT | O_WRONLY, 0644, stripe_size,
+                             stripe_offset, stripe_count, stripe_pattern);
+        if (fd < 0)
+                return fd;
+
+        close(fd);
+        return 0;
 }
 
 typedef int (semantic_func_t)(char *path, DIR *parent, DIR *d, void *data);