| From 4c6e7c0fcc6da66cf81c0714bf907762194eedf2 Mon Sep 17 00:00:00 2001 |
| From: Chris Leech <cleech@redhat.com> |
| Date: Tue, 13 Aug 2013 11:34:31 -0700 |
| Subject: [PATCH] idbm_rec_write, seperate old and new style writes |
| |
| Duplicates a small bit of code, but easier to understand and extened. |
| --- |
| usr/idbm.c | 129 +++++++++++++++++++++++++++++++++++------------------ |
| 1 file changed, 86 insertions(+), 43 deletions(-) |
| |
| --- a/usr/idbm.c |
| +++ b/usr/idbm.c |
| @@ -2130,12 +2130,7 @@ mkdir_portal: |
| return f; |
| } |
| |
| -/* |
| - * When the disable_lock param is true, the idbm_lock/idbm_unlock needs |
| - * to be holt by the caller, this will avoid overwriting each other in |
| - * case of updating(read-modify-write) the recs in parallel. |
| - */ |
| -static int idbm_rec_write(node_rec_t *rec, bool disable_lock) |
| +static int idbm_rec_write_new(node_rec_t *rec) |
| { |
| struct stat statb; |
| FILE *f; |
| @@ -2148,39 +2143,8 @@ static int idbm_rec_write(node_rec_t *re |
| return ISCSI_ERR_NOMEM; |
| } |
| |
| - snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); |
| - if (access(portal, F_OK) != 0) { |
| - if (mkdir(portal, 0660) != 0) { |
| - log_error("Could not make %s: %s", portal, |
| - strerror(errno)); |
| - rc = ISCSI_ERR_IDBM; |
| - goto free_portal; |
| - } |
| - } |
| - |
| - snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); |
| - if (access(portal, F_OK) != 0) { |
| - if (mkdir(portal, 0660) != 0) { |
| - log_error("Could not make %s: %s", portal, |
| - strerror(errno)); |
| - rc = ISCSI_ERR_IDBM; |
| - goto free_portal; |
| - } |
| - } |
| - |
| snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, |
| rec->name, rec->conn[0].address, rec->conn[0].port); |
| - log_debug(5, "Looking for config file %s", portal); |
| - |
| - if (!disable_lock) { |
| - rc = idbm_lock(); |
| - if (rc) |
| - goto free_portal; |
| - } |
| - |
| - if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) |
| - /* drop down to old style portal as config */ |
| - goto open_conf; |
| |
| rc = stat(portal, &statb); |
| if (rc) { |
| @@ -2201,11 +2165,11 @@ static int idbm_rec_write(node_rec_t *re |
| log_error("Could not convert %s: %s", portal, |
| strerror(errno)); |
| rc = ISCSI_ERR_IDBM; |
| - goto unlock; |
| + goto free_portal; |
| } |
| } else { |
| rc = ISCSI_ERR_INVAL; |
| - goto unlock; |
| + goto free_portal; |
| } |
| |
| mkdir_portal: |
| @@ -2216,24 +2180,103 @@ mkdir_portal: |
| log_error("Could not make dir %s: %s", |
| portal, strerror(errno)); |
| rc = ISCSI_ERR_IDBM; |
| - goto unlock; |
| + goto free_portal; |
| } |
| } |
| |
| snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR, |
| rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt, |
| rec->iface.name); |
| -open_conf: |
| + |
| f = fopen(portal, "w"); |
| if (!f) { |
| log_error("Could not open %s: %s", portal, strerror(errno)); |
| rc = ISCSI_ERR_IDBM; |
| - goto unlock; |
| + goto free_portal; |
| + } |
| + |
| + idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); |
| + fclose(f); |
| +free_portal: |
| + free(portal); |
| + return rc; |
| +} |
| + |
| +static int idbm_rec_write_old(node_rec_t *rec) |
| +{ |
| + FILE *f; |
| + char *portal; |
| + int rc = 0; |
| + |
| + portal = malloc(PATH_MAX); |
| + if (!portal) { |
| + log_error("Could not alloc portal"); |
| + return ISCSI_ERR_NOMEM; |
| } |
| + snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, |
| + rec->name, rec->conn[0].address, rec->conn[0].port); |
| |
| + f = fopen(portal, "w"); |
| + if (!f) { |
| + log_error("Could not open %s: %sd", portal, strerror(errno)); |
| + rc = ISCSI_ERR_IDBM; |
| + goto free_portal; |
| + } |
| idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); |
| fclose(f); |
| -unlock: |
| +free_portal: |
| + free(portal); |
| + return rc; |
| +} |
| + |
| +/* |
| + * When the disable_lock param is true, the idbm_lock/idbm_unlock needs |
| + * to be holt by the caller, this will avoid overwriting each other in |
| + * case of updating(read-modify-write) the recs in parallel. |
| + */ |
| +static int idbm_rec_write(node_rec_t *rec, bool disable_lock) |
| +{ |
| + char *portal; |
| + int rc = 0; |
| + |
| + portal = malloc(PATH_MAX); |
| + if (!portal) { |
| + log_error("Could not alloc portal"); |
| + return ISCSI_ERR_NOMEM; |
| + } |
| + |
| + snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR); |
| + if (access(portal, F_OK) != 0) { |
| + if (mkdir(portal, 0660) != 0) { |
| + log_error("Could not make %s: %s", portal, |
| + strerror(errno)); |
| + rc = ISCSI_ERR_IDBM; |
| + goto free_portal; |
| + } |
| + } |
| + |
| + snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name); |
| + if (access(portal, F_OK) != 0) { |
| + if (mkdir(portal, 0660) != 0) { |
| + log_error("Could not make %s: %s", portal, |
| + strerror(errno)); |
| + rc = ISCSI_ERR_IDBM; |
| + goto free_portal; |
| + } |
| + } |
| + |
| + if (!disable_lock) { |
| + rc = idbm_lock(); |
| + if (rc) |
| + goto free_portal; |
| + } |
| + |
| + if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN) |
| + /* old style portal as config */ |
| + rc = idbm_rec_write_old(rec); |
| + else |
| + rc = idbm_rec_write_new(rec); |
| + |
| if (!disable_lock) |
| idbm_unlock(); |
| free_portal: |