The commit 5fed9d696c70 introduced change of cluster_make_fs() and the change had vnode info leak.
Cc: Saeki Masaki <[email protected]> Signed-off-by: Hitoshi Mitake <[email protected]> --- sheep/ops.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/sheep/ops.c b/sheep/ops.c index dad03a6..b6ce84f 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -291,7 +291,7 @@ static int get_vnodes(struct vnode_info *vinfo, int *nr_vnodes) static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp, void *data, const struct sd_node *sender) { - int i, ret; + int i, ret = SD_RES_SUCCESS; uint32_t latest_epoch; struct store_driver *driver; char *store_name = data; @@ -299,8 +299,10 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp, struct vnode_info *vinfo = get_vnode_info(); driver = find_store_driver(data); - if (!driver) - return SD_RES_NO_STORE; + if (!driver) { + ret = SD_RES_NO_STORE; + goto out; + } pstrcpy((char *)sys->cinfo.store, sizeof(sys->cinfo.store), store_name); @@ -309,16 +311,16 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp, ret = sd_store->format(); if (ret != SD_RES_SUCCESS) - return ret; + goto out; ret = sd_store->init(); if (ret != SD_RES_SUCCESS) - return ret; + goto out; if (sys->gateway_only) { ret = get_vnodes(vinfo, &nr_vnodes); if (ret != SD_RES_SUCCESS) - return ret; + goto out; } sys->cinfo.nr_copies = req->cluster.copies; @@ -342,12 +344,16 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp, sys->cinfo.epoch = 0; ret = inc_and_log_epoch(); - if (ret) - return SD_RES_EIO; + if (ret) { + ret = SD_RES_EIO; + goto out; + } sys->cinfo.status = SD_STATUS_OK; - return SD_RES_SUCCESS; +out: + put_vnode_info(vinfo); + return ret; } static int cluster_shutdown(const struct sd_req *req, struct sd_rsp *rsp, -- 1.9.1 -- sheepdog mailing list [email protected] https://lists.wpkg.org/mailman/listinfo/sheepdog
