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

Reply via email to