Message ID | 20150304031231.GA16583@localhost.localdomain (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
On 03/03/2015 10:12 PM, Liu Bo wrote: > On Tue, Mar 03, 2015 at 05:35:33PM +0100, David Sterba wrote: >> On Tue, Mar 03, 2015 at 07:02:58PM +0800, Liu Bo wrote: >>> On Mon, Mar 02, 2015 at 12:46:55PM -0500, Josef Bacik wrote: >>>> Dave could hit this assert consistently running btrfs/078. This is because >>>> when we update the block groups we could truncate the free space, which would >>>> try to delete the csums for that range and dirty the csum root. For this to >>>> happen we have to have already written out the csum root so it's kind of hard to >>>> hit this case. This patch fixes this by changing the logic to only write the >>>> dirty block groups if the dirty_cowonly_roots list is empty. This will get us >>>> the same effect as before since we add the extent root last, and will cover the >>>> case that we dirty some other root again but not the extent root. Thanks, >>> >>> Free space inode is NODATASUM, so its searching csum tree in >>> __btrfs_free_extent() is really unnecessary, by skipping that, csum tree >>> won't be inserted into dirty_cowonly_roots list again, so it also passed btrfs/078, >>> at least on my box. >> >> I can hit the bug [1] even with Josef's patch, I'm can test your fix if you >> want. >> >> MKFS_OPTIONS -- -O skinny-metadata,extref -m single -d single --mixed /dev/sdc1 >> MOUNT_OPTIONS -- -o enospc_debug,space_cache,noatime /dev/sdc1 /mnt/a2 >> >> on top of 3.19-rc5 with Chris' for-linus. > > I tested this fix on top of 4.0.0-rc1 which has the same commits with > Chris's for-linus, I looply ran btrfs/078 for 10 times(5 times with the > default mkfs option while 5 with your mkfs option), works good so far. > > So here it is, > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 571f402..111380c 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -6033,7 +6033,7 @@ static int __btrfs_free_extent(struct > btrfs_trans_handle *trans, > } > btrfs_release_path(path); > > - if (is_data) { > + if (is_data && root_objectid != BTRFS_ROOT_TREE_OBJECTID) { > ret = btrfs_del_csums(trans, root, bytenr, num_bytes); > if (ret) { > btrfs_abort_transaction(trans, extent_root, ret); > > I have this locally but it was causing problems with xfstests (or there's unrelated problems that I just haven't noticed before), so I didn't send it out yet. My patch _should_ have fixed the problem, so if it didn't I want to figure out why before we go fixing other things. Thanks, Josef -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 571f402..111380c 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -6033,7 +6033,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, } btrfs_release_path(path); - if (is_data) { + if (is_data && root_objectid != BTRFS_ROOT_TREE_OBJECTID) { ret = btrfs_del_csums(trans, root, bytenr, num_bytes); if (ret) {