From 2db9c21fa65f74749521a84431978e099ef00282 Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Sun, 29 Jan 2012 13:57:43 -0600 Subject: [PATCH] --- yaml --- r: 287165 b: refs/heads/master c: d23a4b3fd6ef70b80411b39b8c8bc548a219ce70 h: refs/heads/master i: 287163: 20f5b15a6df62572fededc3bc968dc5aeacee8a5 v: v3 --- [refs] | 2 +- trunk/drivers/block/rbd.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 4cac15409336..962f1b615d80 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 97bb59a03dd6767fcc00be09b0c6d9e5294eeea6 +refs/heads/master: d23a4b3fd6ef70b80411b39b8c8bc548a219ce70 diff --git a/trunk/drivers/block/rbd.c b/trunk/drivers/block/rbd.c index 7d8f8ddb3359..7f40cb4553c9 100644 --- a/trunk/drivers/block/rbd.c +++ b/trunk/drivers/block/rbd.c @@ -407,15 +407,15 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr, /* * Destroy ceph client + * + * Caller must hold node_lock. */ static void rbd_client_release(struct kref *kref) { struct rbd_client *rbdc = container_of(kref, struct rbd_client, kref); dout("rbd_release_client %p\n", rbdc); - spin_lock(&node_lock); list_del(&rbdc->node); - spin_unlock(&node_lock); ceph_destroy_client(rbdc->client); kfree(rbdc->rbd_opts); @@ -428,7 +428,9 @@ static void rbd_client_release(struct kref *kref) */ static void rbd_put_client(struct rbd_device *rbd_dev) { + spin_lock(&node_lock); kref_put(&rbd_dev->rbd_client->kref, rbd_client_release); + spin_unlock(&node_lock); rbd_dev->rbd_client = NULL; rbd_dev->client = NULL; }