From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751311AbdFBPoX (ORCPT ); Fri, 2 Jun 2017 11:44:23 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:33747 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751193AbdFBPoU (ORCPT ); Fri, 2 Jun 2017 11:44:20 -0400 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Joern Engel , David Woodhouse , Brian Norris , Boris Brezillon , Marek Vasut , Richard Weinberger , Cyrille Pitchen , Artem Bityutskiy Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, =?UTF-8?q?Pali=20Roh=C3=A1r?= Subject: [PATCH 4/5] mtd: block2mtd: Add support for deleting block2mtd mapping Date: Fri, 2 Jun 2017 17:43:41 +0200 Message-Id: <1496418222-23483-5-git-send-email-pali.rohar@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1496418222-23483-1-git-send-email-pali.rohar@gmail.com> References: <1496418222-23483-1-git-send-email-pali.rohar@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch allows user to delete block2mtd mapping via parameters file /sys/module/block2mtd/parameters/block2mtd Syntax is "del=device", e.g.: $ echo -n del=/dev/loop0 > /sys/module/block2mtd/parameters/block2mtd Signed-off-by: Pali Rohár --- drivers/mtd/devices/block2mtd.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index ad96937..9b6f7b5 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -355,6 +355,19 @@ static struct block2mtd_dev *add_device(char *devname, uint32_t erase_size, return NULL; } +static void del_device(struct block2mtd_dev *dev) +{ + if (!dev->ro_mode) + block2mtd_sync(&dev->mtd); + mtd_device_unregister(&dev->mtd); + mutex_destroy(&dev->write_mutex); + pr_info("mtd%d: [%s] removed\n", + dev->mtd.index, + dev->mtd.name + strlen("block2mtd: ")); + list_del(&dev->list); + block2mtd_free_device(dev); +} + /* This function works similar to reguler strtoul. In addition, it * allows some suffixes for a more human-readable number format: @@ -477,6 +490,19 @@ static int block2mtd_setup2(const char *val) } } + if (strncmp(name, "del=", strlen("del=")) == 0) { + struct list_head *pos, *next; + list_for_each_safe(pos, next, &blkmtd_device_list) { + struct block2mtd_dev *dev = + list_entry(pos, typeof(*dev), list); + if (strcmp(dev->mtd.name + strlen("block2mtd: "), + name + strlen("del=")) != 0) + continue; + del_device(dev); + return 0; + } + } + add_device(name, erase_size, write_size, subpage_sft, timeout); return 0; @@ -536,14 +562,7 @@ static void block2mtd_exit(void) /* Remove the MTD devices */ list_for_each_safe(pos, next, &blkmtd_device_list) { struct block2mtd_dev *dev = list_entry(pos, typeof(*dev), list); - block2mtd_sync(&dev->mtd); - mtd_device_unregister(&dev->mtd); - mutex_destroy(&dev->write_mutex); - pr_info("mtd%d: [%s] removed\n", - dev->mtd.index, - dev->mtd.name + strlen("block2mtd: ")); - list_del(&dev->list); - block2mtd_free_device(dev); + del_device(dev); } } -- 1.7.9.5