All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Sterba <dsterba@suse.com>
To: stable@vger.kernel.org
Subject: [PATCH 10/17] Btrfs: do not collect ordered extents when logging that inode exists
Date: Wed, 11 May 2016 14:47:42 +0200	[thread overview]
Message-ID: <1462970862-17100-1-git-send-email-dsterba@suse.com> (raw)
In-Reply-To: <20160511124536.GB29353@suse.cz>

From: Filipe Manana <fdmanana@suse.com>

commit 5e33a2bd7ca7fa687fb0965869196eea6815d1f3 upstream.

When logging that an inode exists, for example as part of a directory
fsync operation, we were collecting any ordered extents for the inode but
we ended up doing nothing with them except tagging them as processed, by
setting the flag BTRFS_ORDERED_LOGGED on them, which prevented a
subsequent fsync of that inode (using the LOG_INODE_ALL mode) from
collecting and processing them. This created a time window where a second
fsync against the inode, using the fast path, ended up not logging the
checksums for the new extents but it logged the extents since they were
part of the list of modified extents. This happened because the ordered
extents were not collected and checksums were not yet added to the csum
tree - the ordered extents have not gone through btrfs_finish_ordered_io()
yet (which is where we add them to the csum tree by calling
inode.c:add_pending_csums()).

So fix this by not collecting an inode's ordered extents if we are logging
it with the LOG_INODE_EXISTS mode.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
---
 fs/btrfs/tree-log.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 05dc41317182..58ae0a2ce65c 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -4621,7 +4621,22 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
 
 	mutex_lock(&BTRFS_I(inode)->log_mutex);
 
-	btrfs_get_logged_extents(inode, &logged_list, start, end);
+	/*
+	 * Collect ordered extents only if we are logging data. This is to
+	 * ensure a subsequent request to log this inode in LOG_INODE_ALL mode
+	 * will process the ordered extents if they still exists at the time,
+	 * because when we collect them we test and set for the flag
+	 * BTRFS_ORDERED_LOGGED to prevent multiple log requests to process the
+	 * same ordered extents. The consequence for the LOG_INODE_ALL log mode
+	 * not processing the ordered extents is that we end up logging the
+	 * corresponding file extent items, based on the extent maps in the
+	 * inode's extent_map_tree's modified_list, without logging the
+	 * respective checksums (since the may still be only attached to the
+	 * ordered extents and have not been inserted in the csum tree by
+	 * btrfs_finish_ordered_io() yet).
+	 */
+	if (inode_only == LOG_INODE_ALL)
+		btrfs_get_logged_extents(inode, &logged_list, start, end);
 
 	/*
 	 * a brute force approach to making sure we get the most uptodate
-- 
2.7.1


  parent reply	other threads:[~2016-05-11 12:48 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-11 12:45 Btrfs stable fixes for 4.5.x (with added commit references) David Sterba
2016-05-11 12:47 ` [PATCH 01/17] btrfs: reada: Fix in-segment calculation for reada David Sterba
2016-05-11 12:47 ` [PATCH 02/17] Btrfs: fix truncate_space_check David Sterba
2016-05-11 12:47 ` [PATCH 03/17] btrfs: remove error message from search ioctl for nonexistent tree David Sterba
2016-05-11 12:47 ` [PATCH 04/17] btrfs: change max_inline default to 2048 David Sterba
2016-05-11 12:47 ` [PATCH 05/17] Btrfs: fix unreplayable log after snapshot delete + parent dir fsync David Sterba
2016-05-11 12:47 ` [PATCH 06/17] Btrfs: fix file loss on log replay after renaming a file and fsync David Sterba
2016-05-11 12:47 ` [PATCH 07/17] Btrfs: fix extent_same allowing destination offset beyond i_size David Sterba
2016-05-11 12:47 ` [PATCH 08/17] Btrfs: fix deadlock between direct IO reads and buffered writes David Sterba
2016-05-11 12:47 ` [PATCH 09/17] Btrfs: fix race when checking if we can skip fsync'ing an inode David Sterba
2016-05-11 12:47 ` David Sterba [this message]
2016-05-11 12:47 ` [PATCH 11/17] btrfs: csum_tree_block: return proper errno value David Sterba
2016-05-11 12:47 ` [PATCH 12/17] btrfs: do not write corrupted metadata blocks to disk David Sterba
2016-05-11 12:47 ` [PATCH 13/17] Btrfs: fix invalid reference in replace_path David Sterba
2016-05-11 12:47 ` [PATCH 14/17] btrfs: handle non-fatal errors in btrfs_qgroup_inherit() David Sterba
2016-05-11 12:47 ` [PATCH 15/17] btrfs: fallback to vmalloc in btrfs_compare_tree David Sterba
2016-05-11 12:47 ` [PATCH 16/17] Btrfs: don't use src fd for printk David Sterba
2016-05-11 12:47 ` [PATCH 17/17] btrfs: Reset IO error counters before start of device replacing David Sterba
2016-05-17  1:12 ` Btrfs stable fixes for 4.5.x (with added commit references) Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2016-05-05  9:40 Btrfs stable fixes for 4.5.x David Sterba
2016-05-05  9:44 ` [PATCH 10/17] Btrfs: do not collect ordered extents when logging that inode exists 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=1462970862-17100-1-git-send-email-dsterba@suse.com \
    --to=dsterba@suse.com \
    --cc=stable@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.