From: David Sterba <dsterba@suse.cz>
To: fdmanana@kernel.org
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v2] Btrfs: fix file corruption after snapshotting due to mix of buffered/DIO writes
Date: Wed, 27 Feb 2019 18:26:29 +0100 [thread overview]
Message-ID: <20190227172629.GB24609@twin.jikos.cz> (raw)
In-Reply-To: <20190227134230.11860-1-fdmanana@kernel.org>
On Wed, Feb 27, 2019 at 01:42:30PM +0000, fdmanana@kernel.org wrote:
> @@ -1897,15 +1899,45 @@ static inline int btrfs_start_delalloc_flush(struct btrfs_fs_info *fs_info)
> * from already being in a transaction and our join_transaction doesn't
> * have to re-take the fs freeze lock.
> */
> - if (btrfs_test_opt(fs_info, FLUSHONCOMMIT))
> + if (btrfs_test_opt(fs_info, FLUSHONCOMMIT)) {
> writeback_inodes_sb(fs_info->sb, WB_REASON_SYNC);
> + } else {
> + struct btrfs_pending_snapshot *pending;
> + struct list_head *head = &trans->transaction->pending_snapshots;
> +
> + /*
> + * Flush dellaloc for any root that is going to be snapshotted.
> + * This is done to avoid a corrupted version of files, in the
> + * snapshots, that had both buffered and direct IO writes (even
> + * if they were done sequentially) due to an unordered update of
> + * the inode's size on disk.
> + */
> + list_for_each_entry(pending, head, list)
> + btrfs_start_delalloc_snapshot(pending->root);
> + }
A diff would be better than words, incremental on top of your patch:
@@ -1912,8 +1912,15 @@ static inline int btrfs_start_delalloc_flush(struct btrfs_trans_handle *trans)
* if they were done sequentially) due to an unordered update of
* the inode's size on disk.
*/
- list_for_each_entry(pending, head, list)
- btrfs_start_delalloc_snapshot(pending->root);
+ list_for_each_entry(pending, head, list) {
+ int ret;
+
+ ret = btrfs_start_delalloc_snapshot(pending->root);
+ if (ret < 0) {
+ writeback_inodes_sb(fs_info->sb, WB_REASON_SYNC);
+ break;
+ }
+ }
}
return 0;
}
---
Making a switch by the exact error is probably not necessary and wouldn't be
future proof anyway.
next prev parent reply other threads:[~2019-02-27 17:25 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-04 14:28 [PATCH] Btrfs: fix file corruption after snapshotting fdmanana
2019-02-18 17:11 ` David Sterba
2019-02-18 17:27 ` Filipe Manana
2019-02-27 12:47 ` David Sterba
2019-02-27 13:42 ` Filipe Manana
2019-02-27 17:19 ` David Sterba
2019-02-27 13:42 ` [PATCH v2] Btrfs: fix file corruption after snapshotting due to mix of buffered/DIO writes fdmanana
2019-02-27 17:26 ` David Sterba [this message]
2019-02-27 17:32 ` Filipe Manana
2019-02-27 18:31 ` David Sterba
2019-02-27 18:56 ` Filipe Manana
2019-03-12 17:13 ` David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190227172629.GB24609@twin.jikos.cz \
--to=dsterba@suse.cz \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).