diff options
-rw-r--r-- | libglusterfs/src/store.c | 22 | ||||
-rw-r--r-- | libglusterfs/src/store.h | 1 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 53 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 3 | ||||
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 2 |
6 files changed, 40 insertions, 45 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() */ }; diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 7f798ad26de..3ed0196c15a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -746,10 +746,6 @@ out: close (conf_fd); } - if (fd != -1) { - close (fd); - } - if (ret && (fd > 0)) { gf_store_unlink_tmppath (volinfo->quota_conf_shandle); } else if (!ret) { diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 26de774e3f5..eda176d1b6b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -330,8 +330,6 @@ glusterd_store_perform_brick_store (glusterd_brickinfo_t *brickinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (brickinfo->shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1094,8 +1092,6 @@ glusterd_store_perform_rbstate_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->rb_shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1175,8 +1171,6 @@ glusterd_store_perform_node_state_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->node_state_shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1205,8 +1199,6 @@ glusterd_store_perform_volume_store (glusterd_volinfo_t *volinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (volinfo->shandle); - if (fd > 0) - close (fd); gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -1733,7 +1725,6 @@ out: gf_store_unlink_tmppath (handle); if (handle->fd > 0) { - close (handle->fd); handle->fd = 0; } } @@ -2705,9 +2696,9 @@ glusterd_store_options (xlator_t *this, dict_t *opts) if (ret) goto out; out: + if ((ret < 0) && (fd > 0)) + gf_store_unlink_tmppath (shandle); gf_store_handle_destroy (shandle); - if (fd >=0 ) - close (fd); return ret; } @@ -3455,9 +3446,6 @@ out: ret = -1; } - if (fd > 0) - close (fd); - gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); return ret; } @@ -3681,8 +3669,6 @@ glusterd_store_perform_peer_store (glusterd_peerinfo_t *peerinfo) out: if (ret && (fd > 0)) gf_store_unlink_tmppath (peerinfo->shandle); - if (fd > 0) - close (fd); gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); return ret; } @@ -4114,28 +4100,28 @@ out: int glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo) { - int ret = -1; - char cksum_path[PATH_MAX] = {0,}; - char path[PATH_MAX] = {0,}; - xlator_t *this = NULL; - glusterd_conf_t *conf = NULL; - char buf[256] = {0,}; - int fd = -1; + gf_store_handle_t *shandle = NULL; + glusterd_conf_t *conf = NULL; + xlator_t *this = NULL; + char path[PATH_MAX] = {0}; + char cksum_path[PATH_MAX] = {0,}; + char buf[256] = {0}; + int fd = -1; + int32_t ret = -1; this = THIS; - GF_ASSERT (this); conf = this->private; - GF_ASSERT (conf); GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, GLUSTERD_VOL_QUOTA_CKSUM_FILE); - fd = open (cksum_path, O_RDWR | O_APPEND | O_CREAT| O_TRUNC, 0600); + ret = gf_store_handle_new (cksum_path, &shandle); + if (ret) + goto out; - if (-1 == fd) { - gf_log (this->name, GF_LOG_ERROR, "Unable to open %s," - "Reason: %s", cksum_path, strerror (errno)); + fd = gf_store_mkstemp (shandle); + if (fd <= 0) { ret = -1; goto out; } @@ -4155,10 +4141,13 @@ glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo) goto out; } - ret = 0; + ret = gf_store_rename_tmppath (shandle); + if (ret) + goto out; out: - if (fd != -1) - close (fd); + if ((ret < 0) && (fd > 0)) + gf_store_unlink_tmppath (shandle); + gf_store_handle_destroy (shandle); return ret; } diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 7fd7eaeec5c..eb5cb33bb0e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -3698,9 +3698,6 @@ glusterd_import_quota_conf (dict_t *peer_data, int vol_idx, ret = 0; out: - if (fd != -1) - close (fd); - if (!ret) { ret = glusterd_compute_cksum (new_volinfo, _gf_true); if (ret) diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index 47ff3845e9d..e4cfcebefc5 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -356,7 +356,6 @@ __mount_rewrite_rmtab(struct mount3_state *ms, gf_store_handle_t *sh) gf_log (GF_MNT, GF_LOG_DEBUG, "Updated rmtab with %d entries", idx); - close (fd); if (gf_store_rename_tmppath (sh)) gf_log (GF_MNT, GF_LOG_ERROR, "Failed to overwrite rwtab %s", sh->path); @@ -365,7 +364,6 @@ __mount_rewrite_rmtab(struct mount3_state *ms, gf_store_handle_t *sh) fail: gf_log (GF_MNT, GF_LOG_ERROR, "Failed to update %s", sh->path); - close (fd); gf_store_unlink_tmppath (sh); } |