From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756069Ab0AWAVy (ORCPT ); Fri, 22 Jan 2010 19:21:54 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755832Ab0AWAVk (ORCPT ); Fri, 22 Jan 2010 19:21:40 -0500 Received: from mail-bw0-f227.google.com ([209.85.218.227]:45172 "EHLO mail-bw0-f227.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753388Ab0AWAVh (ORCPT ); Fri, 22 Jan 2010 19:21:37 -0500 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:in-reply-to:references:content-type:date :message-id:mime-version:x-mailer:content-transfer-encoding; b=IuTDvFLJ6dYacS/Lyz81ljN8tXMh1lZWMxdUVn1SNDPhp6Yuj948dQ0xVuW5V63p6i QPLDdOPxr+sM3imm47bLcb3LW5iQm5C5p1m9ndWcwg5iIS/roP3x185/XyggWF2fndpe X9o2QcsiBlBj/gDL5cUYJ+MYtfbo6f8n6ceyI= Subject: [PATCH 2/8] blktrans: track open and close calls. From: Maxim Levitsky To: Artem Bityutskiy Cc: linux-mtd , linux-kernel , Alex Dubov , joern , Thomas Gleixner , David Woodhouse In-Reply-To: <1264205925.31827.3.camel@maxim-laptop> References: <1264205925.31827.3.camel@maxim-laptop> Content-Type: text/plain; charset="UTF-8" Date: Sat, 23 Jan 2010 02:21:32 +0200 Message-ID: <1264206092.31827.6.camel@maxim-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org >>From 1ed89e9f7355284eaebbacb1d083e3bbd54aa3bc Mon Sep 17 00:00:00 2001 From: Maxim Levitsky Date: Sat, 23 Jan 2010 02:03:13 +0200 Subject: [PATCH 2/8] blktrans: track open and close calls. This patch adds tracking for open and close calls. Now trans ->open and ->release are never called twise in a row ->release is also called once before mtd device disappers Proper locking will be added in follow up patch Signed-off-by: Maxim Levitsky --- drivers/mtd/mtd_blkdevs.c | 19 +++++++++++++++++++ include/linux/mtd/blktrans.h | 1 + 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 3d9802e..c2d97a0 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c @@ -128,6 +128,9 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) if (!get_mtd_device(NULL, dev->mtd->index)) goto out; + if (dev->open++) + goto out; + if (!try_module_get(tr->owner)) goto out_tr; @@ -153,6 +156,10 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) struct mtd_blktrans_ops *tr = dev->tr; int ret = 0; + dev->open--; + if (dev->open) + return 0; + if (tr->release) ret = tr->release(dev); @@ -304,6 +311,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new) if (new->readonly) set_disk_ro(gd, 1); + new->open = 0; add_disk(gd); return 0; @@ -332,6 +340,17 @@ int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) /* Stop the thread */ kthread_stop(old->thread); + + if (old->open) { + if (old->tr->release) + old->tr->release(old); + put_mtd_device(old->mtd); + } + + /* From now on, no calls into trans can be made */ + /* Mtd device will be gone real soon now */ + old->mtd = NULL; + blk_cleanup_queue(old->rq); return 0; diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index a4b3928..507f7b2 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h @@ -24,6 +24,7 @@ struct mtd_blktrans_dev { int devnum; unsigned long size; int readonly; + int open; struct gendisk *disk; struct task_struct *thread; struct request_queue *rq; -- 1.6.3.3