diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/store.c | 22 | ||||
| -rw-r--r-- | libglusterfs/src/store.h | 1 | 
2 files changed, 19 insertions, 4 deletions
diff --git a/libglusterfs/src/store.c b/libglusterfs/src/store.c index 5beafaf3551..55a2ab459e2 100644 --- a/libglusterfs/src/store.c +++ b/libglusterfs/src/store.c @@ -59,20 +59,19 @@ gf_store_handle_create_on_absence (gf_store_handle_t **shandle,  int32_t  gf_store_mkstemp (gf_store_handle_t *shandle)  { -        int     fd = -1;          char    tmppath[PATH_MAX] = {0,};          GF_VALIDATE_OR_GOTO ("store", shandle, out);          GF_VALIDATE_OR_GOTO ("store", shandle->path, out);          snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path); -        fd = open (tmppath, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 0600); -        if (fd <= 0) { +        shandle->tmp_fd = open (tmppath, O_RDWR | O_CREAT | O_TRUNC, 0600); +        if (shandle->tmp_fd < 0) {                  gf_log ("", GF_LOG_ERROR, "Failed to open %s, error: %s",                          tmppath, strerror (errno));          }  out: -        return fd; +        return shandle->tmp_fd;  }  int @@ -130,6 +129,12 @@ gf_store_rename_tmppath (gf_store_handle_t *shandle)          GF_VALIDATE_OR_GOTO ("store", shandle, out);          GF_VALIDATE_OR_GOTO ("store", shandle->path, out); +        ret = fsync (shandle->tmp_fd); +        if (ret) { +                gf_log (THIS->name, GF_LOG_ERROR, "Failed to fsync %s, " +                        "error: %s", shandle->path, strerror (errno)); +                goto out; +        }          snprintf (tmppath, sizeof (tmppath), "%s.tmp", shandle->path);          ret = rename (tmppath, shandle->path);          if (ret) { @@ -140,6 +145,10 @@ gf_store_rename_tmppath (gf_store_handle_t *shandle)          ret = gf_store_sync_direntry (tmppath);  out: +        if (shandle && shandle->tmp_fd >= 0) { +                close (shandle->tmp_fd); +                shandle->tmp_fd = -1; +        }          return ret;  } @@ -161,6 +170,10 @@ gf_store_unlink_tmppath (gf_store_handle_t *shandle)                  ret = 0;          }  out: +        if (shandle && shandle->tmp_fd >= 0) { +                close (shandle->tmp_fd); +                shandle->tmp_fd = -1; +        }          return ret;  } @@ -390,6 +403,7 @@ gf_store_handle_new (char *path, gf_store_handle_t **handle)          shandle->path = spath;          shandle->locked = F_ULOCK;          *handle = shandle; +        shandle->tmp_fd = -1;          ret = 0;  out: diff --git a/libglusterfs/src/store.h b/libglusterfs/src/store.h index 337103ff73e..beb17ac4a2f 100644 --- a/libglusterfs/src/store.h +++ b/libglusterfs/src/store.h @@ -20,6 +20,7 @@  struct gf_store_handle_ {          char    *path;          int     fd; +        int     tmp_fd;          FILE    *read;          int     locked;   /* state of lockf() */  };  | 
