Received: by 10.223.185.116 with SMTP id b49csp7819300wrg; Thu, 1 Mar 2018 11:40:01 -0800 (PST) X-Google-Smtp-Source: AG47ELs4j1iROmnTF2wV4AtQRY9KXIfQXcvs+jIe9TtcUrXb+Xc/tjIJYMV88ASjVg9PoFJW9zQ+ X-Received: by 10.98.3.131 with SMTP id 125mr3067003pfd.65.1519933201744; Thu, 01 Mar 2018 11:40:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519933201; cv=none; d=google.com; s=arc-20160816; b=SdxpkAVL+ULMFBPF9KcekctLQLxscra10px4H7GDuUlp6bq2T1QNEX1b+itefo+UmT nUs0/3LugyrC/fZ99uDmw2Qm+a7aGFMfw+2+fVQo2/6BGyHheinO9eRePjky0XiDy3NH MNOYKvkcJzwPQh2Vx988gT1hq5L6OgyRoPsnYoLFTkCcKSrPZUexb0BMQU9bG9DsvkaC Ld3TSTNzAJrHg2zQb2B0cpqr9td42XQTLrQkT//KODm7fi40JMtM/oRFLkzXNJ3/RIaf I7S/WOYoMVR161C6mPPhwrPSMhArY4MubDqAYkh56UxC2u73He4ahM/O0xkPFt6mkH4G JzrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=GiXJ9Fu308x2OYtNIFVGoKE+5xSaiMVpA6N7tlhn86k=; b=oW0Ok42WOtz/3iDpcJMKiUPOVISNVE1NerduPVRk4EhvaIRCpRTPWyzKTWlUCvNDkW 5ISE/bHkNB4zQctN+3V0AZ0Yq68eyhFpeHUNcWROqFxCo/8/Q0ijBn81LM2AQiKuzooj cnyIb0di3RxXnRhbvJf563A8Rbej9hjeTwaHzgl0b/bTRlgR81sxWTZ5wziz8ZymDnQd u2Hepp8ZQwJSwEnFh7CcCkRdl8f649Tu7IEYQJyz085F2KZo0SGJI22mpapvRAp87ZZ/ 6nplk8jV1RTBdHy/FbeL9p6zx2Gd3d4AHAOKeMzb7bedzU2RzWKkbKRHYPBEavQq4lwW WTzQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e11si2812355pgn.261.2018.03.01.11.39.47; Thu, 01 Mar 2018 11:40:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161398AbeCATiw (ORCPT + 99 others); Thu, 1 Mar 2018 14:38:52 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:35851 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1033435AbeCATit (ORCPT ); Thu, 1 Mar 2018 14:38:49 -0500 Received: from 1.general.jsalisbury.us.vpn ([10.172.67.212] helo=salisbury) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1erU2R-0003Vh-07; Thu, 01 Mar 2018 19:38:47 +0000 Received: by salisbury (Postfix, from userid 1000) id 0CD6B7E117F; Thu, 1 Mar 2018 14:38:46 -0500 (EST) From: Joseph Salisbury To: mlyle@lyle.org, kent.overstreet@gmail.com, linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org Cc: ryan.harper@canonical.com, stable@vger.kernel.org Subject: [PATCH] bcache: decouple emitting a cached_dev CHANGE uevent Date: Thu, 1 Mar 2018 14:38:46 -0500 Message-Id: <07844d5b6f5e3273f774db248815da4d50cb4e3c.1513001217.git.joseph.salisbury@canonical.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ryan Harper BugLink: http://bugs.launchpad.net/bugs/1729145 A bug is preventing /dev/bcache/by-uuid links from being created after reboot. It appears that since the initramfs loads the bcache module which probes and finds all of the cache devices and backing devices then once the rootfs is mounted and udev gets to run, the bcache kernel module does not emit the CACHED_UUID value into the environment if the underlying devices are already registered. With this patch, instead of just failing with "device already registered" the kernel emits another uevent with CACHED_UUID which would be processed another time to set up a symlink. - decouple emitting a cached_dev CHANGE uevent which includes dev.uuid and dev.label from bch_cached_dev_run() which only happens when a bcacheX device is bound to the actual backing block device (bcache0 -> vdb) - update bch_cached_dev_run() to invoke bch_cached_dev_emit_change() as needed; no functional code path changes here - Modify register_bcache to detect a re-registering of a bcache cached_dev, and in that case call bcache_cached_dev_emit_change() to Cc: stable@vger.kernel.org Signed-off-by: Ryan Harper Signed-off-by: Joseph Salisbury --- drivers/md/bcache/bcache.h | 1 + drivers/md/bcache/super.c | 53 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 02619ca..8ed7e7a 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -906,6 +906,7 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size); int bch_cached_dev_attach(struct cached_dev *, struct cache_set *); void bch_cached_dev_detach(struct cached_dev *); +void bch_cached_dev_emit_change(struct cached_dev *); void bch_cached_dev_run(struct cached_dev *); void bcache_device_stop(struct bcache_device *); diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 04608da..9ff0aac 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -834,7 +834,7 @@ static void calc_cached_dev_sectors(struct cache_set *c) c->cached_dev_sectors = sectors; } -void bch_cached_dev_run(struct cached_dev *dc) +void bch_cached_dev_emit_change(struct cached_dev *dc) { struct bcache_device *d = &dc->disk; char buf[SB_LABEL_SIZE + 1]; @@ -849,9 +849,18 @@ void bch_cached_dev_run(struct cached_dev *dc) buf[SB_LABEL_SIZE] = '\0'; env[2] = kasprintf(GFP_KERNEL, "CACHED_LABEL=%s", buf); + /* won't show up in the uevent file, use udevadm monitor -e instead + * only class / kset properties are persistent */ + kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env); + kfree(env[1]); + kfree(env[2]); + +} + +void bch_cached_dev_run(struct cached_dev *dc) +{ + struct bcache_device *d = &dc->disk; if (atomic_xchg(&dc->running, 1)) { - kfree(env[1]); - kfree(env[2]); return; } @@ -867,11 +876,9 @@ void bch_cached_dev_run(struct cached_dev *dc) add_disk(d->disk); bd_link_disk_holder(dc->bdev, dc->disk.disk); - /* won't show up in the uevent file, use udevadm monitor -e instead - * only class / kset properties are persistent */ - kobject_uevent_env(&disk_to_dev(d->disk)->kobj, KOBJ_CHANGE, env); - kfree(env[1]); - kfree(env[2]); + + /* emit change event */ + bch_cached_dev_emit_change(dc); if (sysfs_create_link(&d->kobj, &disk_to_dev(d->disk)->kobj, "dev") || sysfs_create_link(&disk_to_dev(d->disk)->kobj, &d->kobj, "bcache")) @@ -1916,6 +1923,21 @@ static bool bch_is_open_backing(struct block_device *bdev) { return false; } +static struct cached_dev *bch_find_cached_dev(struct block_device *bdev) { + struct cache_set *c, *tc; + struct cached_dev *dc, *t; + + list_for_each_entry_safe(c, tc, &bch_cache_sets, list) + list_for_each_entry_safe(dc, t, &c->cached_devs, list) + if (dc->bdev == bdev) + return dc; + list_for_each_entry_safe(dc, t, &uncached_devices, list) + if (dc->bdev == bdev) + return dc; + + return NULL; +} + static bool bch_is_open_cache(struct block_device *bdev) { struct cache_set *c, *tc; struct cache *ca; @@ -1941,6 +1963,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, struct cache_sb *sb = NULL; struct block_device *bdev = NULL; struct page *sb_page = NULL; + struct cached_dev *dc = NULL; if (!try_module_get(THIS_MODULE)) return -EBUSY; @@ -1957,10 +1980,20 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, if (bdev == ERR_PTR(-EBUSY)) { bdev = lookup_bdev(strim(path), 0); mutex_lock(&bch_register_lock); - if (!IS_ERR(bdev) && bch_is_open(bdev)) + if (!IS_ERR(bdev) && bch_is_open(bdev)) { err = "device already registered"; - else + /* emit CHANGE event for backing devices to export + * CACHED_{UUID/LABEL} values to udev */ + if (bch_is_open_backing(bdev)) { + dc = bch_find_cached_dev(bdev); + if (dc) { + bch_cached_dev_emit_change(dc); + err = "device already registered (emitting change event)"; + } + } + } else { err = "device busy"; + } mutex_unlock(&bch_register_lock); if (!IS_ERR(bdev)) bdput(bdev); -- 2.7.4