diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-11-18 01:16:57 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-11-18 21:14:28 -0800 |
commit | 6b65a11e4e1e351a85cddd86f18b320addec49fb (patch) | |
tree | 8909b1bd8179c2e57d044729c01c3f2d2db6e440 | |
parent | 1e401ee2a94091154d114c11b55853bda3f49e29 (diff) |
booster: implement creat64.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 369 (Samba does not work with booster.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=369
-rw-r--r-- | booster/src/booster.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/booster/src/booster.c b/booster/src/booster.c index 43c84890b..2e0d8de9d 100644 --- a/booster/src/booster.c +++ b/booster/src/booster.c @@ -104,6 +104,7 @@ write (int fd, const void *buf, size_t count); static int (*real_open) (const char *pathname, int flags, ...); static int (*real_open64) (const char *pathname, int flags, ...); static int (*real_creat) (const char *pathname, mode_t mode); +static int (*real_creat64) (const char *pathname, mode_t mode); /* read, readv, pread, pread64 */ static ssize_t (*real_read) (int fd, void *buf, size_t count); @@ -607,6 +608,8 @@ out: int __REDIRECT (booster_false_creat, (const char *pathname, mode_t mode), creat) __nonnull ((1)); +int __REDIRECT (booster_false_creat64, (const char *pathname, mode_t mode), + creat64) __nonnull ((1)); int booster_false_creat (const char *pathname, mode_t mode) @@ -651,6 +654,49 @@ out: } +int +booster_false_creat64 (const char *pathname, mode_t mode) +{ + int ret = -1; + if (!pathname) { + errno = EINVAL; + goto out; + } + + gf_log ("booster", GF_LOG_TRACE, "Create: %s", pathname); + ret = vmp_creat (pathname, mode); + + if ((ret == -1) && (errno != ENODEV)) { + gf_log ("booster", GF_LOG_ERROR, "VMP create failed: %s", + strerror (errno)); + goto out; + } + + if (ret > 0) { + gf_log ("booster", GF_LOG_TRACE, "File created"); + goto out; + } + + if (real_creat64 == NULL) { + errno = ENOSYS; + ret = -1; + goto out; + } + + ret = real_creat64 (pathname, mode); + + if (ret != -1) { + do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode, + BOOSTER_CREAT); + } else + gf_log ("booster", GF_LOG_ERROR, "real create failed: %s", + strerror (errno)); + +out: + return ret; +} + + /* pread */ ssize_t @@ -2907,6 +2953,7 @@ booster_lib_init (void) RESOLVE (open); RESOLVE (open64); RESOLVE (creat); + RESOLVE (creat64); RESOLVE (read); RESOLVE (readv); |