From patchwork Sat Nov 13 10:59:54 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tejun Heo X-Patchwork-Id: 71045 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from canuck.infradead.org (canuck.infradead.org [134.117.69.58]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9322DB70F6 for ; Sat, 13 Nov 2010 22:03:36 +1100 (EST) Received: from localhost ([127.0.0.1] helo=canuck.infradead.org) by canuck.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1PHDqv-00020A-5r; Sat, 13 Nov 2010 11:01:01 +0000 Received: from hera.kernel.org ([140.211.167.34]) by canuck.infradead.org with esmtps (Exim 4.72 #1 (Red Hat Linux)) id 1PHDqs-0001zv-Io for linux-mtd@lists.infradead.org; Sat, 13 Nov 2010 11:00:58 +0000 Received: from htj.dyndns.org (localhost [127.0.0.1]) by hera.kernel.org (8.14.4/8.14.3) with ESMTP id oADAxtAk029754; Sat, 13 Nov 2010 10:59:56 GMT X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.96.1 at hera.kernel.org Received: from [127.0.0.2] (htj.dyndns.org [127.0.0.2]) by htj.dyndns.org (Postfix) with ESMTPSA id 0CC241CC0632; Sat, 13 Nov 2010 11:59:55 +0100 (CET) Message-ID: <4CDE6FAA.9030605@kernel.org> Date: Sat, 13 Nov 2010 11:59:54 +0100 From: Tejun Heo User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.12) Gecko/20101027 Lightning/1.0b2 Thunderbird/3.1.6 MIME-Version: 1.0 To: axboe@kernel.dk, dedekind1@gmail.com Subject: [PATCH UPDATED 1/5] mtd: fix bdev exclusive open bugs in block2mtd::add_device() References: <1288628129-12811-1-git-send-email-tj@kernel.org> <1288628129-12811-2-git-send-email-tj@kernel.org> In-Reply-To: <1288628129-12811-2-git-send-email-tj@kernel.org> X-Enigmail-Version: 1.1.1 X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on hera.kernel.org X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.2.3 (hera.kernel.org [127.0.0.1]); Sat, 13 Nov 2010 11:00:02 +0000 (UTC) Cc: jack@suse.cz, leochen@broadcom.com, neilb@suse.de, heiko.carstens@de.ibm.com, dm-devel@redhat.com, adilger.kernel@dilger.ca, konishi.ryusuke@lab.ntt.co.jp, shaggy@linux.vnet.ibm.com, drbd-dev@lists.linbit.com, joel.becker@oracle.com, hch@infradead.org, aelder@sgi.com, mfasheh@suse.com, joern@logfs.org, reiserfs-devel@vger.kernel.org, viro@zeniv.linux.org.uk, swhiteho@redhat.com, chris.mason@oracle.com, tytso@mit.edu, petero2@telia.com, linux-kernel@vger.kernel.org, schwidefsky@de.ibm.com, linux-mtd@lists.infradead.org, akpm@linux-foundation.org X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list 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 There are two bdev exclusive open bugs. * open_bdev_exclusive() must not be called with NULL holder. Use dev as the holder. * open_by_devnum() doesn't open the bdev exclusively but block2mtd_free_device() always assumes it. Explicitly claim the bdev. The latter is rather clumsy but will be simplified with future blkdev_get/put() cleanups. - Updated to use local variable @mode to cache FMODE_* masks as suggested by Artem Bityutskiy. Signed-off-by: Tejun Heo Cc: linux-mtd@lists.infradead.org Cc: Artem Bityutskiy Acked-by: Artem Bityutskiy --- This change will cause two conflicts in the series. I'm not reposting them now as they're mostly trivial. Git tree is fully updated. git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc.git cleanup-bd_claim Jens, please let me know when/if you want the full series reposted. Thanks. drivers/mtd/devices/block2mtd.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) Index: work/drivers/mtd/devices/block2mtd.c =================================================================== --- work.orig/drivers/mtd/devices/block2mtd.c +++ work/drivers/mtd/devices/block2mtd.c @@ -234,6 +234,7 @@ static void block2mtd_free_device(struct /* FIXME: ensure that mtd->size % erase_size == 0 */ static struct block2mtd_dev *add_device(char *devname, int erase_size) { + const fmode_t mode = FMODE_READ | FMODE_WRITE; struct block_device *bdev; struct block2mtd_dev *dev; char *name; @@ -246,7 +247,7 @@ static struct block2mtd_dev *add_device( return NULL; /* Get a handle on the device */ - bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL); + bdev = open_bdev_exclusive(devname, mode, dev); #ifndef MODULE if (IS_ERR(bdev)) { @@ -255,7 +256,15 @@ static struct block2mtd_dev *add_device( dev_t devt = name_to_dev_t(devname); if (devt) { - bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ); + bdev = open_by_devnum(devt, mode); + if (!IS_ERR(bdev)) { + int ret; + ret = bd_claim(bdev, dev); + if (ret) { + blkdev_put(bdev, mode); + bdev = ERR_PTR(ret); + } + } } } #endif