From patchwork Mon Dec 8 17:59:32 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: dmitry pervushin X-Patchwork-Id: 12811 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id EB0FFDDED2 for ; Tue, 9 Dec 2008 05:01:25 +1100 (EST) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.68 #1 (Red Hat Linux)) id 1L9kOV-0006nO-I9; Mon, 08 Dec 2008 17:59:43 +0000 Received: from nf-out-0910.google.com ([64.233.182.184]) by bombadil.infradead.org with esmtp (Exim 4.68 #1 (Red Hat Linux)) id 1L9kOT-0006aq-G9 for linux-mtd@lists.infradead.org; Mon, 08 Dec 2008 17:59:41 +0000 Received: by nf-out-0910.google.com with SMTP id d21so613346nfb.22 for ; Mon, 08 Dec 2008 09:59:41 -0800 (PST) Received: by 10.210.124.8 with SMTP id w8mr3864180ebc.92.1228759181188; Mon, 08 Dec 2008 09:59:41 -0800 (PST) Received: from ?192.168.66.247? ([62.140.235.235]) by mx.google.com with ESMTPS id 32sm10256970nfu.50.2008.12.08.09.59.39 (version=SSLv3 cipher=RC4-MD5); Mon, 08 Dec 2008 09:59:40 -0800 (PST) Subject: [PATCH] [UBI] 3/4 UBI volume notifications - allow register null mtd in mtd_blktrans From: dmitry pervushin To: linux-mtd@lists.infradead.org Organization: Home, sweet home... Date: Mon, 08 Dec 2008 20:59:32 +0300 Message-Id: <1228759172.7622.33.camel@hp.diimka.lan> Mime-Version: 1.0 X-Mailer: Evolution 2.22.1.1 X-Spam-Score: 0.0 (/) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.9 Precedence: list Reply-To: dpervushin@gmail.com List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Signed-off-by: dmitry pervushin drivers/mtd/mtd_blkdevs.c | 54 ++++++++++++++++++++++++++++++-------------- 1 files changed, 37 insertions(+), 17 deletions(-) diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 1409f01..4906eaa 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -132,6 +132,24 @@ static void mtd_blktrans_request(struct request_queue *rq) wake_up_process(tr->blkcore_priv->thread); } +static int mtd_blktrans_get(struct mtd_info *mtd) +{ + if (mtd) { + if (!try_module_get(mtd->owner)) + return -ENODEV; + mtd->usecount++; + } + return 0; +} + +static int mtd_blktrans_put(struct mtd_info *mtd) +{ + if (mtd) { + mtd->usecount--; + module_put(mtd->owner); + } + return 0; +} static int blktrans_open(struct block_device *bdev, fmode_t mode) { @@ -139,25 +157,26 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) struct mtd_blktrans_ops *tr = dev->tr; int ret = -ENODEV; - if (!try_module_get(dev->mtd->owner)) - goto out; - - if (!try_module_get(tr->owner)) - goto out_tr; - /* FIXME: Locking. A hot pluggable device can go away (del_mtd_device can be called for it) without its module being unloaded. */ - dev->mtd->usecount++; + if (dev->mtd) + if (!mtd_blktrans_get(dev->mtd)) + goto out; + + if (!try_module_get(tr->owner)) + goto out_tr; ret = 0; - if (tr->open && (ret = tr->open(dev))) { - dev->mtd->usecount--; - module_put(dev->mtd->owner); - out_tr: - module_put(tr->owner); - } - out: + if (tr->open && (ret = tr->open(dev))) + goto out_all; + return ret; + +out_all: + module_put(tr->owner); +out_tr: + mtd_blktrans_put(dev->mtd); +out: return ret; } @@ -171,8 +190,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) ret = tr->release(dev); if (!ret) { - dev->mtd->usecount--; - module_put(dev->mtd->owner); + mtd_blktrans_put(dev->mtd); module_put(tr->owner); } @@ -354,13 +372,15 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) mutex_lock(&mtd_table_mutex); ret = register_blkdev(tr->major, tr->name); - if (ret) { + if (ret < 0) { printk(KERN_WARNING "Unable to register %s block device on major %d: %d\n", tr->name, tr->major, ret); kfree(tr->blkcore_priv); mutex_unlock(&mtd_table_mutex); return ret; } + if (!tr->major) + tr->major = ret; spin_lock_init(&tr->blkcore_priv->queue_lock); tr->blkcore_priv->rq = blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);