summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@dreamhost.com>2012-01-29 20:57:43 +0100
committerAlex Elder <elder@dreamhost.com>2012-03-22 16:47:47 +0100
commitb7f23c361b65a0bdcc81acd8d38471b7810df3ff (patch)
tree6ff42f4ebe263453ba14d61d6b0cf56c98d22e42 /drivers/block/rbd.c
parentrbd: use a single value of snap_name to mean no snap (diff)
downloadlinux-b7f23c361b65a0bdcc81acd8d38471b7810df3ff.tar.xz
linux-b7f23c361b65a0bdcc81acd8d38471b7810df3ff.zip
rbd: encapsulate new rbd id selection
Move the loop that finds a new unique rbd id to use into its own helper function. Signed-off-by: Alex Elder <elder@dreamhost.com> Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r--drivers/block/rbd.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index d8d052d42258..aaa19d8c3670 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2149,6 +2149,23 @@ static int rbd_init_watch_dev(struct rbd_device *rbd_dev)
return ret;
}
+/* caller must hold ctl_mutex */
+static int rbd_id_get(void)
+{
+ struct list_head *tmp;
+ int new_id = 0;
+
+ list_for_each(tmp, &rbd_dev_list) {
+ struct rbd_device *rbd_dev;
+
+ rbd_dev = list_entry(tmp, struct rbd_device, node);
+ if (rbd_dev->id >= new_id)
+ new_id = rbd_dev->id + 1;
+ }
+
+ return new_id;
+}
+
static ssize_t rbd_add(struct bus_type *bus,
const char *buf,
size_t count)
@@ -2156,8 +2173,7 @@ static ssize_t rbd_add(struct bus_type *bus,
struct ceph_osd_client *osdc;
struct rbd_device *rbd_dev;
ssize_t rc = -ENOMEM;
- int irc, new_id = 0;
- struct list_head *tmp;
+ int irc;
char *mon_dev_name;
char *options;
@@ -2187,15 +2203,7 @@ static ssize_t rbd_add(struct bus_type *bus,
/* generate unique id: find highest unique id, add one */
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
- list_for_each(tmp, &rbd_dev_list) {
- struct rbd_device *rbd_dev;
-
- rbd_dev = list_entry(tmp, struct rbd_device, node);
- if (rbd_dev->id >= new_id)
- new_id = rbd_dev->id + 1;
- }
-
- rbd_dev->id = new_id;
+ rbd_dev->id = rbd_id_get();
/* add to global list */
list_add_tail(&rbd_dev->node, &rbd_dev_list);