Received: by 2002:a05:6a10:8395:0:0:0:0 with SMTP id n21csp114210pxh; Tue, 9 Nov 2021 22:19:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJxruuoHgUFgSpfCKNmWiZLweNESGGmfvzSy7iPb32pLAYNomWSopVH1tV1o+8ctsnKgRjDx X-Received: by 2002:a17:907:7f2a:: with SMTP id qf42mr18308858ejc.388.1636525175295; Tue, 09 Nov 2021 22:19:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1636525175; cv=none; d=google.com; s=arc-20160816; b=X9d8LMwVZuCW1HIOkneaVoSOOn09S/0Z+GEwUGqOzmAMl9nQfzHf7ImZOdssnq6x6l 1MsBvbsNbBNkJzN7BuNrfyTHOUu+eTKXJAFEwskeCVUlW+IQYZi8WjjnH91L19mV33SN xVSfcz9nGCJBruBd0MMWlLlmMjnXBM/wVVaN9P3xZKo9usvxpCeCPKA8uCduU4EVJ/uT VuZ/AQA37OUDWb003dGo5r1uzBHoz8mxsq3FsorUnpQ9Objo1RBp7gTQK03WtJvSrVDw eS0rqcsxReMbseGQSxViN12/fHlPOfYhSEJr4wuawHWBM41LjHobcZfhIWI5tQhn6Mwm sbmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=rDGuBRcsb7Tycg7/cgbLFUUtChrAPqK1ujIiiJ0D7YY=; b=SllJiBlwWVfx2WIM7KAyBzsCJoAuV70csxtKRZwBxgTJtHm4lVkSA6icEF8A1rM8Wq l/+LM6RQrFnPHzkxm6mQ3QBJ/Z0lUFHYbmuPzsUvKhvaDSrfr7RMloZXjEdvXqbJ5xsL uQQZ9BPRr33trkGSxQ5pCH4zNdvmsc7hf4ZX+QKHvEoj4w/tVUoCpX0AOjm7u1D5BqrZ HcGYDo0ca19IfABfSmdLoH8NP1dlQAK2EeD3tD4CRelKmXUJ34HEyhPTQn7/7guvcHrm Tx6DUL5upDcoA5JbS8dR7gW+mfuNpgxLUsiDDth+Qr754095YYhqELULr7Lrb7vlKjT0 2OOQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q16si36208483edd.19.2021.11.09.22.19.03; Tue, 09 Nov 2021 22:19:35 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229772AbhKJGSR (ORCPT + 99 others); Wed, 10 Nov 2021 01:18:17 -0500 Received: from zg8tmja5ljk3lje4mi4ymjia.icoremail.net ([209.97.182.222]:53208 "HELO zg8tmja5ljk3lje4mi4ymjia.icoremail.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S229572AbhKJGSQ (ORCPT ); Wed, 10 Nov 2021 01:18:16 -0500 X-Greylist: delayed 93737 seconds by postgrey-1.27 at vger.kernel.org; Wed, 10 Nov 2021 01:18:15 EST Received: from [10.8.148.37] (unknown [59.61.78.138]) by app2 (Coremail) with SMTP id 4zNnewCnr0N+Y4th6_kAAA--.117S2; Wed, 10 Nov 2021 14:15:26 +0800 (CST) Message-ID: <5f6cc0b9-50d0-de90-3a52-09abb959b991@wangsu.com> Date: Wed, 10 Nov 2021 14:15:26 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.1.0 Subject: Re: [PATCH] bcache: fix NULL pointer reference in cached_dev_detach_finish Content-Language: en-US To: colyli@suse.de, kent.overstreet@gmail.com Cc: linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org References: <20211109041304.87225-1-linf@wangsu.com> From: Lin Feng In-Reply-To: <20211109041304.87225-1-linf@wangsu.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-CM-TRANSID: 4zNnewCnr0N+Y4th6_kAAA--.117S2 X-Coremail-Antispam: 1UD129KBjvJXoWxWF47JF4kKw4xCrWDZrWkWFg_yoW5Jw4fpr Z3XFyjyFWvqw48Ww43Zr43Wryrt34DAFyfWr1Fya1Y9ryfW347trW5Was8C3yUJrW7uF42 yr45Kr4kZF4kGaUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnUUvcSsGvfC2KfnxnUUI43ZEXa7xR_UUUUUUUUU== X-CM-SenderInfo: holqwq5zdqw23xof0z/ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Coly, Since previous patch(faulted) has been merged into upstream, this issue has to be fix ASAP, else kernel will crash once detach runs, I'm so sorry for my mistake! Thanks, LinFeng On 11/9/21 12:13, Lin Feng wrote: > Commit 0259d4498ba484("bcache: move calc_cached_dev_sectors to proper > place on backing device detach") tries to fix calc_cached_dev_sectors > when bcache device detaches, but now we have: > > cached_dev_detach_finish > ... > bcache_device_detach(&dc->disk); > ... > closure_put(&d->c->caching); > d->c = NULL; [*explicitly set dc->disk.c to NULL*] > list_move(&dc->list, &uncached_devices); > calc_cached_dev_sectors(dc->disk.c); [*passing a NULL pointer*] > ... > > Upper codeflows shows how bug happens, this patch fix the problem by > caching dc->disk.c beforehand, and cache_set won't be freed under us > because c->caching closure at least holds a reference count and closure > callback __cache_set_unregister only being called by bch_cache_set_stop > which using closure_queue(&c->caching), that means c->caching closure > callback for destroying cache_set won't be trigger by previous > closure_put(&d->c->caching). > So at this stage(while cached_dev_detach_finish is calling) it's safe to > access cache_set dc->disk.c. > > Fixes: 0259d4498ba484("bcache: move calc_cached_dev_sectors to proper place on backing device detach") > Signed-off-by: Lin Feng > --- > drivers/md/bcache/super.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c > index 4a9a65dff95e..3d9bc7cd27f8 100644 > --- a/drivers/md/bcache/super.c > +++ b/drivers/md/bcache/super.c > @@ -1139,6 +1139,7 @@ static void cancel_writeback_rate_update_dwork(struct cached_dev *dc) > static void cached_dev_detach_finish(struct work_struct *w) > { > struct cached_dev *dc = container_of(w, struct cached_dev, detach); > + struct cache_set *c = dc->disk.c; > > BUG_ON(!test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags)); > BUG_ON(refcount_read(&dc->count)); > @@ -1156,7 +1157,7 @@ static void cached_dev_detach_finish(struct work_struct *w) > > bcache_device_detach(&dc->disk); > list_move(&dc->list, &uncached_devices); > - calc_cached_dev_sectors(dc->disk.c); > + calc_cached_dev_sectors(c); > > clear_bit(BCACHE_DEV_DETACHING, &dc->disk.flags); > clear_bit(BCACHE_DEV_UNLINK_DONE, &dc->disk.flags); >