From patchwork Tue May 9 19:14:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: tang.junhui@zte.com.cn X-Patchwork-Id: 9819151 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9164A603D7 for ; Fri, 30 Jun 2017 10:21:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 844A02856E for ; Fri, 30 Jun 2017 10:21:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 77F4528634; Fri, 30 Jun 2017 10:21:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00, DATE_IN_PAST_96_XX, RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BC6D528610 for ; Fri, 30 Jun 2017 10:21:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751988AbdF3KVo (ORCPT ); Fri, 30 Jun 2017 06:21:44 -0400 Received: from iad1-shared-relay2.dreamhost.com ([208.113.157.41]:45148 "EHLO iad1-shared-relay2.dreamhost.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751565AbdF3KVU (ORCPT ); Fri, 30 Jun 2017 06:21:20 -0400 Received: from iad1-shared-relay1.dreamhost.com (iad1-shared-relay1.dreamhost.com [208.113.157.50]) by iad1-shared-relay2.dreamhost.com (Postfix) with ESMTP id C22323E5681 for ; Thu, 29 Jun 2017 15:21:08 -0700 (PDT) Received: from ware.dreamhost.com (ware.dreamhost.com [64.111.127.160]) by iad1-shared-relay1.dreamhost.com (Postfix) with ESMTP id 1795AB40097 for ; Thu, 29 Jun 2017 15:21:08 -0700 (PDT) Received: by ware.dreamhost.com (Postfix, from userid 2406546) id E21BD10012D; Thu, 29 Jun 2017 15:21:07 -0700 (PDT) In-Reply-To: <20170629134510.GA32385@infradead.org> References: <20170629134510.GA32385@infradead.org> From: Tang Junhui Date: Tue, 9 May 2017 12:14:06 -0700 Subject: [PATCH 05/19] bcache: fix calling ida_simple_remove() with incorrect minor To: linux-block@vger.kernel.org Message-Id: <20170629222107.E21BD10012D@ware.dreamhost.com> Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP bcache called ida_simple_remove() with minor which have multiplied by BCACHE_MINORS, it would cause minor wrong release and leakage. In addition, when adding partition support to bcache, the name assignment was not updated, resulting in numbers jumping (bcache0, bcache16, bcache32...). This has been fixed implicitly by the rework. Signed-off-by: tang.junhui Reviewed-by: Coly Li Reviewed-by: Eric Wheeler Cc: stable@vger.kernel.org # 4.10 Cc: Stefan Bader Fixes: b8c0d91 (bcache: partition support: add 16 minors per bcacheN device) BugLink: https://bugs.launchpad.net/bugs/1667078 --- drivers/md/bcache/super.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 9a2c190..48b8c20 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -58,7 +58,10 @@ static wait_queue_head_t unregister_wait; struct workqueue_struct *bcache_wq; #define BTREE_MAX_PAGES (256 * 1024 / PAGE_SIZE) -#define BCACHE_MINORS 16 /* partition support */ +#define BCACHE_MINORS_BITS 4 /* bcache partition support */ +#define BCACHE_MINORS (1 << BCACHE_MINORS_BITS) +#define BCACHE_TO_IDA_MINORS(first_minor) ((first_minor) >> BCACHE_MINORS_BITS) +#define IDA_TO_BCACHE_MINORS(minor) ((minor) << BCACHE_MINORS_BITS) /* Superblock */ @@ -734,7 +737,8 @@ static void bcache_device_free(struct bcache_device *d) if (d->disk && d->disk->queue) blk_cleanup_queue(d->disk->queue); if (d->disk) { - ida_simple_remove(&bcache_minor, d->disk->first_minor); + ida_simple_remove(&bcache_minor, + BCACHE_TO_IDA_MINORS(d->disk->first_minor)); put_disk(d->disk); } @@ -776,11 +780,11 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size, if (!d->full_dirty_stripes) return -ENOMEM; - minor = ida_simple_get(&bcache_minor, 0, MINORMASK + 1, GFP_KERNEL); + minor = ida_simple_get(&bcache_minor, 0, + BCACHE_TO_IDA_MINORS(MINORMASK) + 1, GFP_KERNEL); if (minor < 0) return minor; - minor *= BCACHE_MINORS; if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio), BIOSET_NEED_BVECS | @@ -794,7 +798,7 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size, snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", minor); d->disk->major = bcache_major; - d->disk->first_minor = minor; + d->disk->first_minor = IDA_TO_BCACHE_MINORS(minor); d->disk->fops = &bcache_ops; d->disk->private_data = d;