mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-02 10:43:57 +08:00
rbd: encapsulate probing for parent devices
Encapsulate the code that probes for an rbd device's parent images into a new function, rbd_dev_probe_parent(). Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
parent
b5156e76da
commit
124afba25d
@ -4702,11 +4702,49 @@ out_err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
|
static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
|
||||||
{
|
{
|
||||||
struct rbd_device *parent = NULL;
|
struct rbd_device *parent = NULL;
|
||||||
struct rbd_spec *parent_spec = NULL;
|
struct rbd_spec *parent_spec;
|
||||||
struct rbd_client *rbdc = NULL;
|
struct rbd_client *rbdc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!rbd_dev->parent_spec)
|
||||||
|
return 0;
|
||||||
|
/*
|
||||||
|
* We need to pass a reference to the client and the parent
|
||||||
|
* spec when creating the parent rbd_dev. Images related by
|
||||||
|
* parent/child relationships always share both.
|
||||||
|
*/
|
||||||
|
parent_spec = rbd_spec_get(rbd_dev->parent_spec);
|
||||||
|
rbdc = __rbd_get_client(rbd_dev->rbd_client);
|
||||||
|
|
||||||
|
ret = -ENOMEM;
|
||||||
|
parent = rbd_dev_create(rbdc, parent_spec);
|
||||||
|
if (!parent)
|
||||||
|
goto out_err;
|
||||||
|
|
||||||
|
ret = rbd_dev_image_probe(parent);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_err;
|
||||||
|
rbd_dev->parent = parent;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
out_err:
|
||||||
|
if (parent) {
|
||||||
|
rbd_spec_put(rbd_dev->parent_spec);
|
||||||
|
kfree(rbd_dev->header_name);
|
||||||
|
rbd_dev_destroy(parent);
|
||||||
|
} else {
|
||||||
|
rbd_put_client(rbdc);
|
||||||
|
rbd_spec_put(parent_spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
|
||||||
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* no need to lock here, as rbd_dev is not registered yet */
|
/* no need to lock here, as rbd_dev is not registered yet */
|
||||||
@ -4747,34 +4785,9 @@ static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_out_disk;
|
goto err_out_disk;
|
||||||
|
|
||||||
/*
|
ret = rbd_dev_probe_parent(rbd_dev);
|
||||||
* At this point cleanup in the event of an error is the job
|
if (ret)
|
||||||
* of the sysfs code (initiated by rbd_bus_del_dev()).
|
goto err_out_bus;
|
||||||
*/
|
|
||||||
/* Probe the parent if there is one */
|
|
||||||
|
|
||||||
if (rbd_dev->parent_spec) {
|
|
||||||
/*
|
|
||||||
* We need to pass a reference to the client and the
|
|
||||||
* parent spec when creating the parent rbd_dev.
|
|
||||||
* Images related by parent/child relationships
|
|
||||||
* always share both.
|
|
||||||
*/
|
|
||||||
parent_spec = rbd_spec_get(rbd_dev->parent_spec);
|
|
||||||
rbdc = __rbd_get_client(rbd_dev->rbd_client);
|
|
||||||
|
|
||||||
parent = rbd_dev_create(rbdc, parent_spec);
|
|
||||||
if (!parent) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto err_out_spec;
|
|
||||||
}
|
|
||||||
rbdc = NULL; /* parent now owns reference */
|
|
||||||
parent_spec = NULL; /* parent now owns reference */
|
|
||||||
ret = rbd_dev_image_probe(parent);
|
|
||||||
if (ret < 0)
|
|
||||||
goto err_out_parent;
|
|
||||||
rbd_dev->parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = rbd_dev_header_watch_sync(rbd_dev, 1);
|
ret = rbd_dev_header_watch_sync(rbd_dev, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -4791,13 +4804,6 @@ static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
err_out_parent:
|
|
||||||
rbd_spec_put(rbd_dev->parent_spec);
|
|
||||||
kfree(rbd_dev->header_name);
|
|
||||||
rbd_dev_destroy(parent);
|
|
||||||
err_out_spec:
|
|
||||||
rbd_spec_put(parent_spec);
|
|
||||||
rbd_put_client(rbdc);
|
|
||||||
err_out_bus:
|
err_out_bus:
|
||||||
/* this will also clean up rest of rbd_dev stuff */
|
/* this will also clean up rest of rbd_dev stuff */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user