From patchwork Sat Apr 20 02:49:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13636973 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A578F79DD; Sat, 20 Apr 2024 02:50:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581450; cv=none; b=KSdOonYWgalh/jf4Zycya4tqdhJEvgHG43SY66m2U+0MNh7qGgDH34B9D7R4LLmAc7WqHXafl3y0fZ79nQLZPr/cPux/QGCLW0FvU2OEnZYlu5F05Hr/Ur647mbetlHRmR0iyOyw7aNfsLZEXYOIXPzASoEC7OVx/Ly83QQ/JPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581450; c=relaxed/simple; bh=4MwBE7u5de5BF4nUaoFf4BqiiTWYHEGiETIg6CUpGNc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N4JOplB1Y7MNRqMDLbfoHEupwLCqMYkPhrV0VEGu7XlRJg8J5ipw85jpb6EwxXfR8uZksriCG14TWp2LxxBY3pJA2TNttDY5FiBsOWu9HRduCIU8fCOyeyrPrqk+1NEsGwMcYijFznKJbjsiVmNP+EMnjoMbt8bydsUKolp+6sM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=SHDbkDdU; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="SHDbkDdU" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=eZyFacoFWlUHyNqrE7n/pQQL9VwstpBC8fVXbXaKtgE=; b=SHDbkDdUXYYhOmhVhYt8AuK0Tm WVxf22XfwmYx0s7guJf+stOq9LBuUgrpIIR3A9vfvIMJC8X/MTk87iVoKUlkoZSLlQ0nytX+y1cVj 2ANfN7CXd3bJW0OKIVyxxpznqc4+tA4HxljCUW1/NqWZjbIujAL2q5tDdvaDcgwBpSt9/3r+QhlpL 1pfwRTriQRgK3VGIyS+FQWstMaDiO+I11uC9Om8f/Ay8wFlwgMRgu6+b6enWHYjSdVYmnFhVnUUZN BrL9LCA0RcI5ukfmUcmAQ1HVkhnWGv9/oiiYr6XxIDuiM3oSTQwMyTMVx4Ckaqhd3Rhz/m9Yt9e4k luhV/yAw==; Received: from willy by casper.infradead.org with local (Exim 4.97.1 #2 (Red Hat Linux)) id 1ry0oO-000000095e1-1H9I; Sat, 20 Apr 2024 02:50:44 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , Chris Mason , Josef Bacik , David Sterba , linux-btrfs@vger.kernel.org Subject: [PATCH 01/30] btrfs: Use a folio in wait_dev_supers() Date: Sat, 20 Apr 2024 03:49:56 +0100 Message-ID: <20240420025029.2166544-2-willy@infradead.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240420025029.2166544-1-willy@infradead.org> References: <20240420025029.2166544-1-willy@infradead.org> Precedence: bulk X-Mailing-List: linux-btrfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Removes a few calls to compound_head() and calls to obsolete APIs. Cc: Chris Mason Cc: Josef Bacik Cc: David Sterba Cc: linux-btrfs@vger.kernel.org Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Johannes Thumshirn --- fs/btrfs/disk-io.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3d512b041977..32cf64ccd761 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3849,7 +3849,7 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors) max_mirrors = BTRFS_SUPER_MIRROR_MAX; for (i = 0; i < max_mirrors; i++) { - struct page *page; + struct folio *folio; ret = btrfs_sb_log_location(device, i, READ, &bytenr); if (ret == -ENOENT) { @@ -3864,27 +3864,27 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors) device->commit_total_bytes) break; - page = find_get_page(device->bdev->bd_mapping, + folio = filemap_get_folio(device->bdev->bd_mapping, bytenr >> PAGE_SHIFT); - if (!page) { + if (IS_ERR(folio)) { errors++; if (i == 0) primary_failed = true; continue; } - /* Page is submitted locked and unlocked once the IO completes */ - wait_on_page_locked(page); - if (PageError(page)) { + /* Folio is unlocked once the write completes */ + folio_wait_locked(folio); + if (folio_test_error(folio)) { errors++; if (i == 0) primary_failed = true; } /* Drop our reference */ - put_page(page); + folio_put(folio); /* Drop the reference from the writing run */ - put_page(page); + folio_put(folio); } /* log error, force error return */ From patchwork Sat Apr 20 02:49:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13636975 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D7D70524A; Sat, 20 Apr 2024 02:50:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581452; cv=none; b=oR2J0iBvp0LqRCtGdCtvsjJY2TnR+oHLRMiN45XjVQCg0WTr8tqkKB6ihPasc1LvDwGPL1Y8afoJ1txhjwVg0OkNXq5CLUpWUFZhaGA3VpPzBPcfcHx49AjrwRCVR9OuNYsyMt1P/TATz5FInUFzNRlVVyhJ/jEzcBYhswFlZHg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581452; c=relaxed/simple; bh=bdWKf8RrIw6HShlQnEwTvVodOrlgX9LZsrXV0XBYPAQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QWTZzfl00zXlM0kQ+uS3+70MrQ/XjfXQZRZXQsFjsfxccZldMGuUnDdUe7lJ8QO1Ll6kJBEGT+SKvlSZW+dqnJqWBTGgKdK9ywmXAPuBjUVh/R/dwrnk+eMBw9fgYmtAZVs76FgaAAAC/Zt/lgwPdfXCDdn05celggpU1WlLx3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=KuIBbNf1; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="KuIBbNf1" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=CpH16iYJrVZdrm6jz8AltnYLIb1as/vR4g26ErGz18c=; b=KuIBbNf1Q4CtYflEarqHZjLhTC Ig4lVttPNqmzWeOzJ+ejNByH9RpRor1t6QmL82jZwLbIyMsN1Qm/RiqPYnk635tsNUOC34jWV6oH4 nqQm/2vTmJJ5mrOIG2TOYf+SqLJv4SymOrmrMBLXO0AHanghfej1q9FmiJFUhOIaziD3HysJvXDkI IRg0GsKtbRt/cm82RANuGgj1aWReqBXGMdwOj8IHFv3ntxSBkx9pAb5FpZiCGIVyOE7azwlAtplCW z4phKDW9D+tBIcG1d8esWjQy4oz5exzZ8fa9BTv/g1gTAufLBCbFOM5auYGErkwBSGbqG3vRf6SCs 87DB+oDw==; Received: from willy by casper.infradead.org with local (Exim 4.97.1 #2 (Red Hat Linux)) id 1ry0oO-000000095e3-3SyE; Sat, 20 Apr 2024 02:50:44 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , Chris Mason , Josef Bacik , David Sterba , linux-btrfs@vger.kernel.org Subject: [PATCH 02/30] btrfs: Use a folio in write_dev_supers() Date: Sat, 20 Apr 2024 03:49:57 +0100 Message-ID: <20240420025029.2166544-3-willy@infradead.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240420025029.2166544-1-willy@infradead.org> References: <20240420025029.2166544-1-willy@infradead.org> Precedence: bulk X-Mailing-List: linux-btrfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Remove some calls to obsolete APIs and some hidden calls to compound_head(). Cc: Chris Mason Cc: Josef Bacik Cc: David Sterba Cc: linux-btrfs@vger.kernel.org Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Johannes Thumshirn --- fs/btrfs/disk-io.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 32cf64ccd761..8fa7c526093c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3760,9 +3760,10 @@ static int write_dev_supers(struct btrfs_device *device, shash->tfm = fs_info->csum_shash; for (i = 0; i < max_mirrors; i++) { - struct page *page; + struct folio *folio; struct bio *bio; struct btrfs_super_block *disk_super; + size_t offset; bytenr_orig = btrfs_sb_offset(i); ret = btrfs_sb_log_location(device, i, WRITE, &bytenr); @@ -3785,9 +3786,9 @@ static int write_dev_supers(struct btrfs_device *device, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE, sb->csum); - page = find_or_create_page(mapping, bytenr >> PAGE_SHIFT, - GFP_NOFS); - if (!page) { + folio = __filemap_get_folio(mapping, bytenr >> PAGE_SHIFT, + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, GFP_NOFS); + if (IS_ERR(folio)) { btrfs_err(device->fs_info, "couldn't get super block page for bytenr %llu", bytenr); @@ -3796,9 +3797,10 @@ static int write_dev_supers(struct btrfs_device *device, } /* Bump the refcount for wait_dev_supers() */ - get_page(page); + folio_get(folio); - disk_super = page_address(page); + offset = offset_in_folio(folio, bytenr); + disk_super = folio_address(folio) + offset; memcpy(disk_super, sb, BTRFS_SUPER_INFO_SIZE); /* @@ -3812,8 +3814,7 @@ static int write_dev_supers(struct btrfs_device *device, bio->bi_iter.bi_sector = bytenr >> SECTOR_SHIFT; bio->bi_private = device; bio->bi_end_io = btrfs_end_super_write; - __bio_add_page(bio, page, BTRFS_SUPER_INFO_SIZE, - offset_in_page(bytenr)); + bio_add_folio_nofail(bio, folio, BTRFS_SUPER_INFO_SIZE, offset); /* * We FUA only the first super block. The others we allow to From patchwork Sat Apr 20 02:49:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13636976 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D93228479; Sat, 20 Apr 2024 02:50:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581453; cv=none; b=O/qRKuKDQc5XQ5wwsrqQcqlR4hEkxrKsr4MqipFNeMyGAzEx7HBDNXemQXOxXzOku++HeDaWchBOXqpkArtd9arxbNgEajgB53hxdNuK7IqJhENqSsXmqVHB2cO3m5kc35ZleMp4s6+UZUtefenB3cgPFBEU5J6fwb7R0JmFenc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581453; c=relaxed/simple; bh=SaJbg29cD4jUS8oam2mSfQ8wg7ZwQ9f4NykFWaMo2sI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p0AGDuHJUekEGqtDq2jzrPfAHepUOY4p3snZ5KIU/eAikB4BOv6+EjeNagmLpz/kC7Obd9ABBrMp8Ds/yuU1+iwi2HQgFnwkRp+VJALgcQcefiOPoVt32rXVyWDZYTW1eWJYzATp/V/Ri7kxoOqE5uC3YPE02DcLzm85eA9VHRI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=hMfQKsyp; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="hMfQKsyp" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=v2Klto9l+15juQRC2IXlUpAVUx+8RwOiMD9dxj8rlPo=; b=hMfQKsypnw1fBKuFbYvazrTvrW HS8SVGLCiFtX4qgDoqT0/cmwY2guUO0vBz92UgPDqLQ3XbIAaHv3aIKCm2iKIlEHkXOKiY9Gne7m1 tcokWgbaXTamlR8vB/pv8EsHcmqSJe60DayL0Gn2/+clPjJMRJ2t5i6jHpnXIhfTA0JJQDW+ERwW9 lszJBpz3beAR/X+sIsrNqyQAcZrxaCZ4ck156Hb6XacVHgi5qO+y/z/d9rwHzIWfN3/CBWYoGb0eR m56UGox+BLxCLsHNvwI5xDlyAqNWJi/9TYbyUko7r8AielstLEeQj2ebFYNMoghA3/+XECtiyWb6a +oiPXESg==; Received: from willy by casper.infradead.org with local (Exim 4.97.1 #2 (Red Hat Linux)) id 1ry0oP-000000095e5-1cgp; Sat, 20 Apr 2024 02:50:45 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , Chris Mason , Josef Bacik , David Sterba , linux-btrfs@vger.kernel.org Subject: [PATCH 03/30] btrfs: Use the folio iterator in btrfs_end_super_write() Date: Sat, 20 Apr 2024 03:49:58 +0100 Message-ID: <20240420025029.2166544-4-willy@infradead.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240420025029.2166544-1-willy@infradead.org> References: <20240420025029.2166544-1-willy@infradead.org> Precedence: bulk X-Mailing-List: linux-btrfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Iterate over folios instead of bvecs. Switch the order of unlock and put to be the usual order; we know this folio can't be put until it's been waited for, but that's fragile. Remove the calls to ClearPageUptodate / SetPageUptodate -- if PAGE_SIZE is larger than BTRFS_SUPER_INFO_SIZE, we'd be marking the entire folio uptodate without having actually initialised all the bytes in the page. Cc: Chris Mason Cc: Josef Bacik Cc: David Sterba Cc: linux-btrfs@vger.kernel.org Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Johannes Thumshirn --- fs/btrfs/disk-io.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 8fa7c526093c..18c47bf3f383 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3627,28 +3627,21 @@ ALLOW_ERROR_INJECTION(open_ctree, ERRNO); static void btrfs_end_super_write(struct bio *bio) { struct btrfs_device *device = bio->bi_private; - struct bio_vec *bvec; - struct bvec_iter_all iter_all; - struct page *page; - - bio_for_each_segment_all(bvec, bio, iter_all) { - page = bvec->bv_page; + struct folio_iter fi; + bio_for_each_folio_all(fi, bio) { if (bio->bi_status) { btrfs_warn_rl_in_rcu(device->fs_info, - "lost page write due to IO error on %s (%d)", + "lost sb write due to IO error on %s (%d)", btrfs_dev_name(device), blk_status_to_errno(bio->bi_status)); - ClearPageUptodate(page); - SetPageError(page); + folio_set_error(fi.folio); btrfs_dev_stat_inc_and_print(device, BTRFS_DEV_STAT_WRITE_ERRS); - } else { - SetPageUptodate(page); } - put_page(page); - unlock_page(page); + folio_unlock(fi.folio); + folio_put(fi.folio); } bio_put(bio); From patchwork Sat Apr 20 02:49:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13636974 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 013BB79DE; Sat, 20 Apr 2024 02:50:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581452; cv=none; b=iEVA8vX+9YPtL62iL2SxzQxWyMzrSEmU4E3Q6SCuFGVeOaer7Ck0FdKbiSaW3OrnhqY20bu7mW9uojItO+VL8Ly52TpwPelFBtK1+kyl84/AYm/OBqEszaUdc0IK+mUdBm34g61qdIp6JJtg4FTM+qXDw+i4huI0gOTzFT4M3PQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713581452; c=relaxed/simple; bh=6zw/DGvX4iHTZ43cuv+HPFmSiAYP11zruXeXS7YT3iQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CzUjBdMK2w4rfzSp0mN6QPn8IHubbVvN2BdLAyYXK8N+pIMTC1kpNyGIy9B4/gT7h9EKxL+0CW4pbkDHxqPN1X/ITb1UbJx+QpqOWwP+RJM9vTLFpMQpAa8wvOClj/azneI/a7iFUUKXKiDVVvmFqtAXkBPoIzTzpRilK2bmUbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=Ak6RqJnJ; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="Ak6RqJnJ" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=Vh4ZxQBjoUokzSVjhM/l0v5XocbZMAs1eA/cyY2hHz0=; b=Ak6RqJnJQQHWPqZpHoQ1DxDOUr Q6/R23PF1ihBxpXV3LuUv+9ZSHofjhpRVIrf+WnR2YgFTWEowcrSrSfF20LJpsbgPemebKnnEtdo2 jQAF+tIoRGDM20Yoz01wlKT18Uf8IuOvLi923WExLrCwGFkWZCauv5F0r/YoFq+LdG+cNAhMcsa76 tz2RyRyp0VDBH4fa0e4ddPlRAoA3Z2BbJjWhIQYjrmJ9fy/W2a3eaVDfwGF//Or/wmiI83j3jouEc FE+AxERqneyA3uSL3tcTDE7khfftIhQWl9BSe3cmP0ATqgWm+jStusaP3pKSoNN5+HO0i9fxF1tlq L6vHAwYw==; Received: from willy by casper.infradead.org with local (Exim 4.97.1 #2 (Red Hat Linux)) id 1ry0oP-000000095e9-46IS; Sat, 20 Apr 2024 02:50:46 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , Chris Mason , Josef Bacik , David Sterba , linux-btrfs@vger.kernel.org Subject: [PATCH 04/30] btrfs: Remove use of the folio error flag Date: Sat, 20 Apr 2024 03:49:59 +0100 Message-ID: <20240420025029.2166544-5-willy@infradead.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240420025029.2166544-1-willy@infradead.org> References: <20240420025029.2166544-1-willy@infradead.org> Precedence: bulk X-Mailing-List: linux-btrfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Count the number of superblock writeback errors in the btrfs_device. That means we don't need the folio to stay around until it's waited for, and can avoid the extra call to folio_get/put. Also remove a mention of PageError in a comment. Cc: Chris Mason Cc: Josef Bacik Cc: David Sterba Cc: linux-btrfs@vger.kernel.org Signed-off-by: Matthew Wilcox (Oracle) --- fs/btrfs/disk-io.c | 44 ++++++++++++++++++-------------------------- fs/btrfs/extent_io.c | 2 +- fs/btrfs/volumes.h | 5 +++++ 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 18c47bf3f383..3fa073f969d8 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3635,11 +3635,15 @@ static void btrfs_end_super_write(struct bio *bio) "lost sb write due to IO error on %s (%d)", btrfs_dev_name(device), blk_status_to_errno(bio->bi_status)); - folio_set_error(fi.folio); btrfs_dev_stat_inc_and_print(device, BTRFS_DEV_STAT_WRITE_ERRS); + /* Ensure failure if a primary sb fails */ + if (bio->bi_opf & REQ_FUA) + atomic_set(&device->sb_wb_errors, + BTRFS_DEV_PRIMARY_ERROR); + else + atomic_inc(&device->sb_wb_errors); } - folio_unlock(fi.folio); folio_put(fi.folio); } @@ -3743,10 +3747,11 @@ static int write_dev_supers(struct btrfs_device *device, struct address_space *mapping = device->bdev->bd_mapping; SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); int i; - int errors = 0; int ret; u64 bytenr, bytenr_orig; + atomic_set(&device->sb_wb_errors, 0); + if (max_mirrors == 0) max_mirrors = BTRFS_SUPER_MIRROR_MAX; @@ -3766,7 +3771,7 @@ static int write_dev_supers(struct btrfs_device *device, btrfs_err(device->fs_info, "couldn't get super block location for mirror %d", i); - errors++; + atomic_inc(&device->sb_wb_errors); continue; } if (bytenr + BTRFS_SUPER_INFO_SIZE >= @@ -3785,13 +3790,10 @@ static int write_dev_supers(struct btrfs_device *device, btrfs_err(device->fs_info, "couldn't get super block page for bytenr %llu", bytenr); - errors++; + atomic_inc(&device->sb_wb_errors); continue; } - /* Bump the refcount for wait_dev_supers() */ - folio_get(folio); - offset = offset_in_folio(folio, bytenr); disk_super = folio_address(folio) + offset; memcpy(disk_super, sb, BTRFS_SUPER_INFO_SIZE); @@ -3819,9 +3821,9 @@ static int write_dev_supers(struct btrfs_device *device, submit_bio(bio); if (btrfs_advance_sb_log(device, i)) - errors++; + atomic_inc(&device->sb_wb_errors); } - return errors < i ? 0 : -1; + return atomic_read(&device->sb_wb_errors) < i ? 0 : -1; } /* @@ -3860,27 +3862,17 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors) folio = filemap_get_folio(device->bdev->bd_mapping, bytenr >> PAGE_SHIFT); - if (IS_ERR(folio)) { - errors++; - if (i == 0) - primary_failed = true; + /* If the folio has been removed, then we know it completed */ + if (IS_ERR(folio)) continue; - } - /* Folio is unlocked once the write completes */ + /* Folio is unlocked once the IO completes */ folio_wait_locked(folio); - if (folio_test_error(folio)) { - errors++; - if (i == 0) - primary_failed = true; - } - - /* Drop our reference */ - folio_put(folio); - - /* Drop the reference from the writing run */ folio_put(folio); } + errors += atomic_read(&device->sb_wb_errors); + if (errors >= BTRFS_DEV_PRIMARY_ERROR) + primary_failed = true; /* log error, force error return */ if (primary_failed) { btrfs_err(device->fs_info, "error writing primary super block to device %llu", diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 7b10f47d8f83..7a1bd23833e5 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -1602,7 +1602,7 @@ static void set_btree_ioerr(struct extent_buffer *eb) * can be no longer dirty nor marked anymore for writeback (if a * subsequent modification to the extent buffer didn't happen before the * transaction commit), which makes filemap_fdata[write|wait]_range not - * able to find the pages tagged with SetPageError at transaction + * able to find the pages which contain errors at transaction * commit time. So if this happens we must abort the transaction, * otherwise we commit a super block with btree roots that point to * btree nodes/leafs whose content on disk is invalid - either garbage diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index cf555f5b47ce..cdab144410a8 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -92,6 +92,9 @@ enum btrfs_raid_types { #define BTRFS_DEV_STATE_FLUSH_SENT (4) #define BTRFS_DEV_STATE_NO_READA (5) +/* We'll never have this many superblocks */ +#define BTRFS_DEV_PRIMARY_ERROR (INT_MAX / 2) + struct btrfs_fs_devices; struct btrfs_device { @@ -142,6 +145,8 @@ struct btrfs_device { /* type and info about this device */ u64 type; + atomic_t sb_wb_errors; + /* minimal io size for this device */ u32 sector_size;