Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp685207rwb; Wed, 7 Dec 2022 03:55:14 -0800 (PST) X-Google-Smtp-Source: AA0mqf7GyZFZx3KMfRCARGG0LdVSN9/gypqn2XP/MuhzUeQiDdTcVrV+xb+IgFQKtxn+gTQhefOK X-Received: by 2002:a17:907:8b9b:b0:7b7:90c1:8263 with SMTP id tb27-20020a1709078b9b00b007b790c18263mr26368574ejc.604.1670414114427; Wed, 07 Dec 2022 03:55:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670414114; cv=none; d=google.com; s=arc-20160816; b=EZGF1X13/pg/wmbosSRottdsqs800rrTrgXxCK+lSW7BDyzW/p/tIyDvGhF3N8x0tz VKwWWbazRMdBEkAsUlJRWDYZOzYVbjegTkQ2vduZxqoldmoikmIlrwvNfR30oeAM8B+p VOCamHVzf3X0EStzi5+scV4JQfAM7x+FdFoxv/NIGZhG+nY+F5Z/9v8z19Jtq3afrgcl UHYk/z5uofWbYFv4cpLVrzNEtyMbVZxAGVVjEV3OoDeBjRj83CuPRKLdE0ed6ieFMC2a wE9HUjHCxlQ4U2wXCzhtW5m4uvj9QzHoYaX8YYQaubmxxNUYZ3hU0Q6vMoFtHv2d+pUf rNHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-signature; bh=77G42jyCLCxqHXtKUfKLyfMpUWH1ePC4gHzKYHeOcPM=; b=s13Hzr1APyDb/hhwRkzLPE8SA2YZJ0/3cDjpFhf8T4P/3KhtvfcLEvkqkyNkNjOPqd rQo5z/wO+l5kpg13P84roVAR0g5cdEB4lUaSMQemPfCZTDx8RtIKr4vhzJLy/9WEcZyv Ockb4aGg8RDXJtdqArWkSNjZnxAmuLKQvF9BgQNVzN6bOhJk7NXVMpMU2Xe1IyOW9vPG dAVCMv2xeuoEvMlru+uMjwNuXLwTAXcUIWkc35wQFWCW+4VY+wjQfz2r9H7zXdMNEZus d8fEi5WlfgnL9d20NlEGnxMZGQn6f+day4hMoeThptz6qtfMoXbjoM/x+4H0ahhbSu9M VqAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=yZkIB1lB; dkim=neutral (no key) header.i=@suse.cz header.b=GWTMQVLG; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s19-20020a170906455300b007c0b03b23b5si8064849ejq.542.2022.12.07.03.54.48; Wed, 07 Dec 2022 03:55:14 -0800 (PST) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=yZkIB1lB; dkim=neutral (no key) header.i=@suse.cz header.b=GWTMQVLG; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229899AbiLGL10 (ORCPT + 99 others); Wed, 7 Dec 2022 06:27:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229709AbiLGL1Z (ORCPT ); Wed, 7 Dec 2022 06:27:25 -0500 Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9ACA6228 for ; Wed, 7 Dec 2022 03:27:24 -0800 (PST) Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 57DCA21C95; Wed, 7 Dec 2022 11:27:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1670412443; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=77G42jyCLCxqHXtKUfKLyfMpUWH1ePC4gHzKYHeOcPM=; b=yZkIB1lBc7dEfc+a+AxbYfVfWkv4KM+M3sS4HhYXSl414Wbv+j5zXyGjvIPgdKMVV2Hfnu nnyiiSr1fVArVe+8gz9S4g916ItUjGtD72Bjp9lDV4mc97813mUs4yNPF/cLd4lUp9spr+ O5XyotmndpIooT3jAumWyRo7G7MsVrY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1670412443; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=77G42jyCLCxqHXtKUfKLyfMpUWH1ePC4gHzKYHeOcPM=; b=GWTMQVLGtEiDbzpFhVi9ACr5gmTuWdshqNK9Ikas26VUwq/mRYYzFkKrezbR4DVBRZG/Cc Cr1RmasrVXPm/cBg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id 4682D136B4; Wed, 7 Dec 2022 11:27:23 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id nTkuEZt4kGMsLAAAGKfGzw (envelope-from ); Wed, 07 Dec 2022 11:27:23 +0000 Received: by quack3.suse.cz (Postfix, from userid 1000) id D3152A0728; Wed, 7 Dec 2022 12:27:22 +0100 (CET) From: Jan Kara To: Ted Tso Cc: , Christoph Hellwig , "Ritesh Harjani (IBM)" , Jan Kara Subject: [PATCH v4 02/13] ext4: Move keep_towrite handling to ext4_bio_write_page() Date: Wed, 7 Dec 2022 12:27:05 +0100 Message-Id: <20221207112722.22220-2-jack@suse.cz> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20221207112259.8143-1-jack@suse.cz> References: <20221207112259.8143-1-jack@suse.cz> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5311; i=jack@suse.cz; h=from:subject; bh=4BEBMuubTi6wzu1p0dUteVLsznv1GLCDItrtKTNYI5E=; b=owEBbQGS/pANAwAIAZydqgc/ZEDZAcsmYgBjkHiKkEjDDlFxxdvGxblAV29RSyx82jUQUUJxApPT AwBuFt6JATMEAAEIAB0WIQSrWdEr1p4yirVVKBycnaoHP2RA2QUCY5B4igAKCRCcnaoHP2RA2WmDB/ wLYCsTrpXx55IK6zhY2EEYFVtTz/pDA5XcuCyjkf/ajfQQ2m5aRSijjCgiPf6Bvy1DnYDlSOqKk/BD cS0OVoBXMTGIcbdgjWGJq6bxRmaSs3uHPcQAtXdTp5oDXTYQAxBeE+ddlwVLDYDnwO0e+DS2y2JpYN fW6KSj3C7tkQmnDlOXoIzGBvWllIEtxxaYjz7aj0X2ssdj85O2xOm0a6Sibd8F2CiOLVJliXCW/b3y FBMOeNDlPdl8xE72g6Mofukyvy1nmlDkxn+tStP0vNsHUB3XG9PLWlWd3fC1iyRJJZH2X1QWOg0PLq tqZsOreXFXi/3UExsfglwgQFAmKkC6 X-Developer-Key: i=jack@suse.cz; a=openpgp; fpr=93C6099A142276A28BBE35D815BC833443038D8C Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_SOFTFAIL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org When we are writing back page but we cannot for some reason write all its buffers (e.g. because we cannot allocate blocks in current context) we have to keep TOWRITE tag set in the mapping as otherwise racing WB_SYNC_ALL writeback that could write these buffers can skip the page and result in data loss. We will need this logic for writeback during transaction commit so move the logic from ext4_writepage() to ext4_bio_write_page(). Reviewed-by: Ritesh Harjani (IBM) Signed-off-by: Jan Kara --- fs/ext4/ext4.h | 3 +-- fs/ext4/inode.c | 6 ++---- fs/ext4/page-io.c | 36 +++++++++++++++++++++--------------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 8d5453852f98..1b3bffc04fd0 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -3756,8 +3756,7 @@ extern void ext4_end_io_rsv_work(struct work_struct *work); extern void ext4_io_submit(struct ext4_io_submit *io); extern int ext4_bio_write_page(struct ext4_io_submit *io, struct page *page, - int len, - bool keep_towrite); + int len); extern struct ext4_io_end_vec *ext4_alloc_io_end_vec(ext4_io_end_t *io_end); extern struct ext4_io_end_vec *ext4_last_io_end_vec(ext4_io_end_t *io_end); diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2b5ef1b64249..43eb175d0c1c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2009,7 +2009,6 @@ static int ext4_writepage(struct page *page, struct buffer_head *page_bufs = NULL; struct inode *inode = page->mapping->host; struct ext4_io_submit io_submit; - bool keep_towrite = false; if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { folio_invalidate(folio, 0, folio_size(folio)); @@ -2067,7 +2066,6 @@ static int ext4_writepage(struct page *page, unlock_page(page); return 0; } - keep_towrite = true; } if (PageChecked(page) && ext4_should_journal_data(inode)) @@ -2084,7 +2082,7 @@ static int ext4_writepage(struct page *page, unlock_page(page); return -ENOMEM; } - ret = ext4_bio_write_page(&io_submit, page, len, keep_towrite); + ret = ext4_bio_write_page(&io_submit, page, len); ext4_io_submit(&io_submit); /* Drop io_end reference we got from init */ ext4_put_io_end_defer(io_submit.io_end); @@ -2118,7 +2116,7 @@ static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) len = size & ~PAGE_MASK; else len = PAGE_SIZE; - err = ext4_bio_write_page(&mpd->io_submit, page, len, false); + err = ext4_bio_write_page(&mpd->io_submit, page, len); if (!err) mpd->wbc->nr_to_write--; mpd->first_page++; diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 4e68ace86f11..4f9ecacd10aa 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -430,8 +430,7 @@ static void io_submit_add_bh(struct ext4_io_submit *io, int ext4_bio_write_page(struct ext4_io_submit *io, struct page *page, - int len, - bool keep_towrite) + int len) { struct page *bounce_page = NULL; struct inode *inode = page->mapping->host; @@ -441,14 +440,11 @@ int ext4_bio_write_page(struct ext4_io_submit *io, int nr_submitted = 0; int nr_to_submit = 0; struct writeback_control *wbc = io->io_wbc; + bool keep_towrite = false; BUG_ON(!PageLocked(page)); BUG_ON(PageWriteback(page)); - if (keep_towrite) - set_page_writeback_keepwrite(page); - else - set_page_writeback(page); ClearPageError(page); /* @@ -483,12 +479,17 @@ int ext4_bio_write_page(struct ext4_io_submit *io, if (!buffer_mapped(bh)) clear_buffer_dirty(bh); /* - * Keeping dirty some buffer we cannot write? Make - * sure to redirty the page. This happens e.g. when - * doing writeout for transaction commit. + * Keeping dirty some buffer we cannot write? Make sure + * to redirty the page and keep TOWRITE tag so that + * racing WB_SYNC_ALL writeback does not skip the page. + * This happens e.g. when doing writeout for + * transaction commit. */ - if (buffer_dirty(bh) && !PageDirty(page)) - redirty_page_for_writepage(wbc, page); + if (buffer_dirty(bh)) { + if (!PageDirty(page)) + redirty_page_for_writepage(wbc, page); + keep_towrite = true; + } if (io->io_bio) ext4_io_submit(io); continue; @@ -500,6 +501,10 @@ int ext4_bio_write_page(struct ext4_io_submit *io, nr_to_submit++; } while ((bh = bh->b_this_page) != head); + /* Nothing to submit? Just unlock the page... */ + if (!nr_to_submit) + goto unlock; + bh = head = page_buffers(page); /* @@ -550,6 +555,11 @@ int ext4_bio_write_page(struct ext4_io_submit *io, } } + if (keep_towrite) + set_page_writeback_keepwrite(page); + else + set_page_writeback(page); + /* Now submit buffers to write */ do { if (!buffer_async_write(bh)) @@ -558,11 +568,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, bounce_page ? bounce_page : page, bh); nr_submitted++; } while ((bh = bh->b_this_page) != head); - unlock: unlock_page(page); - /* Nothing submitted - we have to end page writeback */ - if (!nr_submitted) - end_page_writeback(page); return ret; } -- 2.35.3