From: liuy Date: Thu, 16 Aug 2007 14:23:28 +0000 (+0000) Subject: Branch b1_6 X-Git-Tag: v1_8_0_110~1326 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=124abb517925ad7fe4cc0062cfa31d4134abbd5a;p=fs%2Flustre-release.git Branch b1_6 b=12192 i=adilger, green add llapi_file_open() --- diff --git a/lustre/ChangeLog b/lustre/ChangeLog index d6bf0a2..f3bc113 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -25,6 +25,12 @@ Description: sanity.sh failed test 103 Details : RHEL mis-interpret setfacl "-X" param, so we won't test setfacl with param "-X". +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-27 Cluster File Systems, Inc. diff --git a/lustre/include/lustre/liblustreapi.h b/lustre/include/lustre/liblustreapi.h index ea1c9d0..087d56f 100644 --- a/lustre/include/lustre/liblustreapi.h +++ b/lustre/include/lustre/liblustreapi.h @@ -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); diff --git a/lustre/tests/Makefile.am b/lustre/tests/Makefile.am index 8ab7804..7ad7416 100644 --- a/lustre/tests/Makefile.am +++ b/lustre/tests/Makefile.am @@ -55,6 +55,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 diff --git a/lustre/tests/multiop.c b/lustre/tests/multiop.c index 389e26f..765c00b 100755 --- a/lustre/tests/multiop.c +++ b/lustre/tests/multiop.c @@ -14,6 +14,7 @@ #include #include #include +#include #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; diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index c975189..d171723 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -816,6 +816,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 =============================================' diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index bf98b26..760ef1d 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -57,7 +57,6 @@ #include #include #include -#include static void err_msg(char *fmt, ...) { @@ -70,23 +69,24 @@ 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++; } if (fd < 0) { rc = -errno; - err_msg("unable to open '%s'",name); + err_msg("unable to open '%s'", name); return rc; } @@ -139,12 +139,26 @@ int llapi_file_create(const char *name, unsigned long stripe_size, (__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);