From c2052063da79ccfae6155324c6951599459f84d6 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Mon, 31 Mar 2008 10:03:38 +0900 Subject: [PATCH] --- yaml --- r: 89775 b: refs/heads/master c: d45ac4fa8f277e1ec5acfb67ce5d6406555760cf h: refs/heads/master i: 89773: 641a72111be6cb430c3ad7cf9262f020365de75b 89771: 7549a9461306d4d645f6b07dc61d7cd7a5a0ba63 89767: adb7f9b2ceccff9eb7b4fc1730490bfc0957b151 89759: 7c0b573c0b82cd80a40910d9a03dc03d4388155e v: v3 --- [refs] | 2 +- trunk/block/bsg.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index c13bb97bae1b..f188d3b2b5d5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0e4ff797d7f2f2bb860b8f31dc5d1f2273b2f05a +refs/heads/master: d45ac4fa8f277e1ec5acfb67ce5d6406555760cf diff --git a/trunk/block/bsg.c b/trunk/block/bsg.c index 8917c5174dc2..d8e0cb8dd6be 100644 --- a/trunk/block/bsg.c +++ b/trunk/block/bsg.c @@ -705,6 +705,7 @@ static struct bsg_device *bsg_alloc_device(void) static int bsg_put_device(struct bsg_device *bd) { int ret = 0; + struct device *dev = bd->queue->bsg_dev.dev; mutex_lock(&bsg_mutex); @@ -730,6 +731,7 @@ static int bsg_put_device(struct bsg_device *bd) kfree(bd); out: mutex_unlock(&bsg_mutex); + put_device(dev); return ret; } @@ -789,21 +791,27 @@ static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file) struct bsg_device *bd; struct bsg_class_device *bcd; - bd = __bsg_get_device(iminor(inode)); - if (bd) - return bd; - /* * find the class device */ mutex_lock(&bsg_mutex); bcd = idr_find(&bsg_minor_idr, iminor(inode)); + if (bcd) + get_device(bcd->dev); mutex_unlock(&bsg_mutex); if (!bcd) return ERR_PTR(-ENODEV); - return bsg_add_device(inode, bcd->queue, file); + bd = __bsg_get_device(iminor(inode)); + if (bd) + return bd; + + bd = bsg_add_device(inode, bcd->queue, file); + if (IS_ERR(bd)) + put_device(bcd->dev); + + return bd; } static int bsg_open(struct inode *inode, struct file *file) @@ -942,7 +950,6 @@ void bsg_unregister_queue(struct request_queue *q) class_device_unregister(bcd->class_dev); put_device(bcd->dev); bcd->class_dev = NULL; - bcd->dev = NULL; mutex_unlock(&bsg_mutex); } EXPORT_SYMBOL_GPL(bsg_unregister_queue);