[PATCH 1/2 v4] Btrfs: snapshot-aware defrag
This comes from one of btrfs's project ideas, As we defragment files, we break any sharing from other snapshots. The balancing code will preserve the sharing, and defrag needs to grow this as well. Now we're able to fill the blank with this patch, in which we make full use of backref walking stuff. Here is the basic idea, o set the writeback ranges started by defragment with flag EXTENT_DEFRAG o at endio, after we finish updating fs tree, we use backref walking to find all parents of the ranges and re-link them with the new COWed file layout by adding corresponding backrefs. Originally patch by Li Zefan Signed-off-by: Liu Bo --- v3->v4: - fix duplicated refs bugs detected by mounting with autodefrag, thanks for the bug report from Mitch and Chris. fs/btrfs/inode.c | 609 ++ 1 files changed, 609 insertions(+), 0 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 85a1e50..35e6993 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -54,6 +54,7 @@ #include "locking.h" #include "free-space-cache.h" #include "inode-map.h" +#include "backref.h" struct btrfs_iget_args { u64 ino; @@ -1839,6 +1840,600 @@ out: return ret; } +/* snapshot-aware defrag */ +struct sa_defrag_extent_backref { + struct rb_node node; + struct old_sa_defrag_extent *old; + u64 root_id; + u64 inum; + u64 file_pos; + u64 extent_offset; + u64 num_bytes; + u64 generation; +}; + +struct old_sa_defrag_extent { + struct list_head list; + struct new_sa_defrag_extent *new; + + u64 extent_offset; + u64 bytenr; + u64 offset; + u64 len; + int count; +}; + +struct new_sa_defrag_extent { + struct rb_root root; + struct list_head head; + struct btrfs_path *path; + struct inode *inode; + u64 file_pos; + u64 len; + u64 bytenr; + u64 disk_len; + u8 compress_type; +}; + +static int backref_comp(struct sa_defrag_extent_backref *b1, + struct sa_defrag_extent_backref *b2) +{ + if (b1->root_id < b2->root_id) + return -1; + else if (b1->root_id > b2->root_id) + return 1; + + if (b1->inum < b2->inum) + return -1; + else if (b1->inum > b2->inum) + return 1; + + if (b1->file_pos < b2->file_pos) + return -1; + else if (b1->file_pos > b2->file_pos) + return 1; + + return 0; +} + +static void backref_insert(struct rb_root *root, + struct sa_defrag_extent_backref *backref) +{ + struct rb_node **p = &root->rb_node; + struct rb_node *parent = NULL; + struct sa_defrag_extent_backref *entry; + int ret; + + while (*p) { + parent = *p; + entry = rb_entry(parent, struct sa_defrag_extent_backref, node); + + ret = backref_comp(backref, entry); + if (ret < 0) + p = &(*p)->rb_left; + else + /* +* Since space can be shared, so there can be +* some backrefs(extent tree to fs/file tree) +* whoes fs/file extents map to the same address. +* If so, we just put it after what we've found. +*/ + p = &(*p)->rb_right; + } + + rb_link_node(&backref->node, parent, p); + rb_insert_color(&backref->node, root); +} + +/* + * Note the backref might has changed, and in this case we just return 0. + */ +static noinline int record_one_backref(u64 inum, u64 offset, u64 root_id, + void *ctx) +{ + struct btrfs_file_extent_item *extent; + struct btrfs_fs_info *fs_info; + struct old_sa_defrag_extent *old = ctx; + struct new_sa_defrag_extent *new = old->new; + struct btrfs_path *path = new->path; + struct btrfs_key key; + struct btrfs_root *root; + struct sa_defrag_extent_backref *backref; + struct extent_buffer *leaf; + struct inode *inode = new->inode; + int slot; + int ret; + u64 extent_offset; + u64 num_bytes; + + if (BTRFS_I(inode)->root->root_key.objectid == root_id && + inum == btrfs_ino(inode)) + return 0; + + key.objectid = root_id; + key.type = BTRFS_ROOT_ITEM_KEY; + key.offset = (u64)-1; + + fs_info = BTRFS_I(inode)->root->fs_info; + root = btrfs_read_fs_root_no_name(fs_info, &key); + if (IS_ERR(root)) { + if (PTR_ERR(root) == -ENOENT) + return 0; + WARN_ON(1); + pr_debug("inum=%llu, offset=%llu, root_id=%llu\n", +inum, offset, root_id); + return PTR_ERR(root); + } + +
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Sat, Oct 27, 2012 at 5:28 AM, Liu Bo wrote: > This comes from one of btrfs's project ideas, > As we defragment files, we break any sharing from other snapshots. > The balancing code will preserve the sharing, and defrag needs to grow this > as well. > > Now we're able to fill the blank with this patch, in which we make full use of > backref walking stuff. > > Here is the basic idea, > o set the writeback ranges started by defragment with flag EXTENT_DEFRAG > o at endio, after we finish updating fs tree, we use backref walking to find >all parents of the ranges and re-link them with the new COWed file layout > by >adding corresponding backrefs. > > Originally patch by Li Zefan > Signed-off-by: Liu Bo > --- > v3->v4: > - fix duplicated refs bugs detected by mounting with autodefrag, thanks > for the bug report from Mitch and Chris. > I'm picking up many WARN_ON messages while testing this patch. I'm testing a snapshot script that uses kernel git sources along with some git manipulations. The kernel is a 3.6.4 kernel merged with the latest for-linus branch. I mounted with -o compress-force=lzo,autodefrag. I also have the second patch in this set (Btrfs: make snapshot-aware defrag as a mount option). However, I did not mount with 'snap_aware_defrag'. I did not find any corrupted data, and the partition passes a btrfsck without error after these warnings were observed. Here's a summary of the WARN_ON messages: $ cat local/dmesg-3.6.4-x+ | grep "WARNING:" [ 610.407561] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 610.407757] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 610.407929] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 661.211849] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 661.212004] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 661.212236] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 719.882942] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 719.883112] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 719.883232] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 786.978869] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 786.979003] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 786.979140] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 845.605176] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 845.605323] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 845.605445] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 912.300307] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 912.300454] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 912.300577] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 968.835873] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 968.836032] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 968.836156] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1023.778160] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1023.778316] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1023.778435] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1064.342768] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1064.342914] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1064.343112] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1177.892047] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1177.892189] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1177.892312] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1281.951715] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1281.951857] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1281.951978] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1282.804376] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1282.804524] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1282.804645] WARNING: at fs/btrfs/inode.c:7782 btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() [ 1351.187114] WARNING: at fs/btrfs/inode.c:7779 btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() [ 1351.187263] WARNING: at fs/btrfs/inode.c:7780 btrfs_destroy_inode+0x296/0x2e6 [btrfs]() [ 1351.187391] WARNING: at
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On 10/30/2012 04:06 AM, Mitch Harder wrote: > On Sat, Oct 27, 2012 at 5:28 AM, Liu Bo wrote: >> This comes from one of btrfs's project ideas, >> As we defragment files, we break any sharing from other snapshots. >> The balancing code will preserve the sharing, and defrag needs to grow this >> as well. >> >> Now we're able to fill the blank with this patch, in which we make full use >> of >> backref walking stuff. >> >> Here is the basic idea, >> o set the writeback ranges started by defragment with flag EXTENT_DEFRAG >> o at endio, after we finish updating fs tree, we use backref walking to find >>all parents of the ranges and re-link them with the new COWed file layout >> by >>adding corresponding backrefs. >> >> Originally patch by Li Zefan >> Signed-off-by: Liu Bo >> --- >> v3->v4: >> - fix duplicated refs bugs detected by mounting with autodefrag, thanks >> for the bug report from Mitch and Chris. >> > > I'm picking up many WARN_ON messages while testing this patch. > > I'm testing a snapshot script that uses kernel git sources along with > some git manipulations. > > The kernel is a 3.6.4 kernel merged with the latest for-linus branch. > > I mounted with -o compress-force=lzo,autodefrag. > > I also have the second patch in this set (Btrfs: make snapshot-aware > defrag as a mount option). However, I did not mount with > 'snap_aware_defrag'. > > I did not find any corrupted data, and the partition passes a btrfsck > without error after these warnings were observed. > Hi Mitch, Well, good report, but I don't think it has anything to do with this patch(since you didn't mount with 'snap_aware_defrag' :) After going through the below messages, the bug comes from the space side where we must have mis-used our reservation somehow. So can you show me your script so that I can give it a shot to reproduce locally? thanks, liubo > Here's a summary of the WARN_ON messages: > > $ cat local/dmesg-3.6.4-x+ | grep "WARNING:" > [ 610.407561] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 610.407757] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 610.407929] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 661.211849] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 661.212004] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 661.212236] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 719.882942] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 719.883112] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 719.883232] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 786.978869] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 786.979003] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 786.979140] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 845.605176] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 845.605323] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 845.605445] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 912.300307] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 912.300454] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 912.300577] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 968.835873] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 968.836032] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 968.836156] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 1023.778160] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 1023.778316] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 1023.778435] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 1064.342768] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 1064.342914] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 1064.343112] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 1177.892047] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 1177.892189] WARNING: at fs/btrfs/inode.c:7780 > btrfs_destroy_inode+0x296/0x2e6 [btrfs]() > [ 1177.892312] WARNING: at fs/btrfs/inode.c:7782 > btrfs_destroy_inode+0x26a/0x2e6 [btrfs]() > [ 1281.951715] WARNING: at fs/btrfs/inode.c:7779 > btrfs_destroy_inode+0x2ac/0x2e6 [btrfs]() > [ 1281.951857] WARNING: at fs/btrfs/inode.c:7780 > btrfs_
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Mon, Oct 29, 2012 at 8:20 PM, Liu Bo wrote: > On 10/30/2012 04:06 AM, Mitch Harder wrote: >> On Sat, Oct 27, 2012 at 5:28 AM, Liu Bo wrote: >>> This comes from one of btrfs's project ideas, >>> As we defragment files, we break any sharing from other snapshots. >>> The balancing code will preserve the sharing, and defrag needs to grow this >>> as well. >>> >>> Now we're able to fill the blank with this patch, in which we make full use >>> of >>> backref walking stuff. >>> >>> Here is the basic idea, >>> o set the writeback ranges started by defragment with flag EXTENT_DEFRAG >>> o at endio, after we finish updating fs tree, we use backref walking to >>> find >>>all parents of the ranges and re-link them with the new COWed file >>> layout by >>>adding corresponding backrefs. >>> >>> Originally patch by Li Zefan >>> Signed-off-by: Liu Bo >>> --- >>> v3->v4: >>> - fix duplicated refs bugs detected by mounting with autodefrag, >>> thanks >>> for the bug report from Mitch and Chris. >>> >> >> I'm picking up many WARN_ON messages while testing this patch. >> >> I'm testing a snapshot script that uses kernel git sources along with >> some git manipulations. >> >> The kernel is a 3.6.4 kernel merged with the latest for-linus branch. >> >> I mounted with -o compress-force=lzo,autodefrag. >> >> I also have the second patch in this set (Btrfs: make snapshot-aware >> defrag as a mount option). However, I did not mount with >> 'snap_aware_defrag'. >> >> I did not find any corrupted data, and the partition passes a btrfsck >> without error after these warnings were observed. >> > > Hi Mitch, > > Well, good report, but I don't think it has anything to do with this > patch(since you > didn't mount with 'snap_aware_defrag' :) > I've re-run my my testing script with a combination of no compression and lzo compression, combined with no further options, only -o autodefrag, and -o autodefrag,snap_aware_defrag. I only get the WARN_ONs when I run with autodefrag only (no snap_aware_defrag). My logs are clean when I avoid all defrag options, or use both autodefrag and snap_aware_defrag. > After going through the below messages, the bug comes from the space side > where we > must have mis-used our reservation somehow. > > So can you show me your script so that I can give it a shot to reproduce > locally? > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
Hi LiuBo: I am seeing another warning with your patch applied btrfs-next. [ 5224.531560] [ cut here ] [ 5224.531565] WARNING: at fs/btrfs/inode.c:2054 record_extent_backrefs+0x87/0xe0() [ 5224.531567] Hardware name: Bochs [ 5224.531568] Modules linked in: microcode ppdev psmouse nfsd nfs_acl auth_rpcgss serio_raw nfs fscache lockd binfmt_misc sunrpc cirrus parport_pc ttm drm_kms_helper drm sysimgblt i2c_piix4 sysfillrect syscopyarea i2c_core lp parport floppy [ 5224.531591] Pid: 2485, comm: btrfs-endio-wri Tainted: GW 3.7.0-rc1-v11+ #53 [ 5224.531592] Call Trace: [ 5224.531598] [] warn_slowpath_common+0x93/0xc0 [ 5224.531600] [] warn_slowpath_null+0x1a/0x20 [ 5224.531603] [] record_extent_backrefs+0x87/0xe0 [ 5224.531606] [] btrfs_finish_ordered_io+0x8bb/0xa80 [ 5224.531611] [] ? trace_hardirqs_off_caller+0xb0/0x140 [ 5224.531614] [] finish_ordered_fn+0x15/0x20 [ 5224.531617] [] worker_loop+0x157/0x580 [ 5224.531620] [] ? btrfs_queue_worker+0x2f0/0x2f0 [ 5224.531624] [] kthread+0xe8/0xf0 [ 5224.531627] [] ? get_lock_stats+0x22/0x70 [ 5224.531630] [] ? kthread_create_on_node+0x160/0x160 [ 5224.531634] [] ret_from_fork+0x7c/0xb0 [ 5224.531636] [] ? kthread_create_on_node+0x160/0x160 [ 5224.531638] ---[ end trace 0256d2b5a195208c ]--- I've compared some of the old extents logical addresses with the corresponding object ids and offsets from the extent tree; some are just 8k off from the found extents and some keys are totally off. Itaru On Sat, Oct 27, 2012 at 7:28 PM, Liu Bo wrote: > This comes from one of btrfs's project ideas, > As we defragment files, we break any sharing from other snapshots. > The balancing code will preserve the sharing, and defrag needs to grow this > as well. > > Now we're able to fill the blank with this patch, in which we make full use of > backref walking stuff. > > Here is the basic idea, > o set the writeback ranges started by defragment with flag EXTENT_DEFRAG > o at endio, after we finish updating fs tree, we use backref walking to find >all parents of the ranges and re-link them with the new COWed file layout > by >adding corresponding backrefs. > > Originally patch by Li Zefan > Signed-off-by: Liu Bo > --- > v3->v4: > - fix duplicated refs bugs detected by mounting with autodefrag, thanks > for the bug report from Mitch and Chris. > > fs/btrfs/inode.c | 609 > ++ > 1 files changed, 609 insertions(+), 0 deletions(-) > > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index 85a1e50..35e6993 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -54,6 +54,7 @@ > #include "locking.h" > #include "free-space-cache.h" > #include "inode-map.h" > +#include "backref.h" > > struct btrfs_iget_args { > u64 ino; > @@ -1839,6 +1840,600 @@ out: > return ret; > } > > +/* snapshot-aware defrag */ > +struct sa_defrag_extent_backref { > + struct rb_node node; > + struct old_sa_defrag_extent *old; > + u64 root_id; > + u64 inum; > + u64 file_pos; > + u64 extent_offset; > + u64 num_bytes; > + u64 generation; > +}; > + > +struct old_sa_defrag_extent { > + struct list_head list; > + struct new_sa_defrag_extent *new; > + > + u64 extent_offset; > + u64 bytenr; > + u64 offset; > + u64 len; > + int count; > +}; > + > +struct new_sa_defrag_extent { > + struct rb_root root; > + struct list_head head; > + struct btrfs_path *path; > + struct inode *inode; > + u64 file_pos; > + u64 len; > + u64 bytenr; > + u64 disk_len; > + u8 compress_type; > +}; > + > +static int backref_comp(struct sa_defrag_extent_backref *b1, > + struct sa_defrag_extent_backref *b2) > +{ > + if (b1->root_id < b2->root_id) > + return -1; > + else if (b1->root_id > b2->root_id) > + return 1; > + > + if (b1->inum < b2->inum) > + return -1; > + else if (b1->inum > b2->inum) > + return 1; > + > + if (b1->file_pos < b2->file_pos) > + return -1; > + else if (b1->file_pos > b2->file_pos) > + return 1; > + > + return 0; > +} > + > +static void backref_insert(struct rb_root *root, > + struct sa_defrag_extent_backref *backref) > +{ > + struct rb_node **p = &root->rb_node; > + struct rb_node *parent = NULL; > + struct sa_defrag_extent_backref *entry; > + int ret; > + > + while (*p) { > + parent = *p; > + entry = rb_entry(parent, struct sa_defrag_extent_backref, > node); > + > + ret = backref_comp(backref, entry); > + if (ret < 0) > + p = &(*p)->rb_left; > + else > + /* > +* Since space can be shared, so there ca
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On 10/31/2012 08:13 PM, Itaru Kitayama wrote: > Hi LiuBo: > > I am seeing another warning with your patch applied btrfs-next. > Hi Itaru, Thanks for testing, you seems to be using an old version, since in the new version record_extent_backrefs() does not own a WARN_ON(). Could you please test it again with the new patches applied? thanks, liubo > [ 5224.531560] [ cut here ] > [ 5224.531565] WARNING: at fs/btrfs/inode.c:2054 > record_extent_backrefs+0x87/0xe0() > [ 5224.531567] Hardware name: Bochs > [ 5224.531568] Modules linked in: microcode ppdev psmouse nfsd nfs_acl > auth_rpcgss serio_raw nfs fscache lockd binfmt_misc sunrpc cirrus > parport_pc ttm drm_kms_helper drm sysimgblt i2c_piix4 sysfillrect > syscopyarea i2c_core lp parport floppy > [ 5224.531591] Pid: 2485, comm: btrfs-endio-wri Tainted: GW > 3.7.0-rc1-v11+ #53 > [ 5224.531592] Call Trace: > [ 5224.531598] [] warn_slowpath_common+0x93/0xc0 > [ 5224.531600] [] warn_slowpath_null+0x1a/0x20 > [ 5224.531603] [] record_extent_backrefs+0x87/0xe0 > [ 5224.531606] [] btrfs_finish_ordered_io+0x8bb/0xa80 > [ 5224.531611] [] ? trace_hardirqs_off_caller+0xb0/0x140 > [ 5224.531614] [] finish_ordered_fn+0x15/0x20 > [ 5224.531617] [] worker_loop+0x157/0x580 > [ 5224.531620] [] ? btrfs_queue_worker+0x2f0/0x2f0 > [ 5224.531624] [] kthread+0xe8/0xf0 > [ 5224.531627] [] ? get_lock_stats+0x22/0x70 > [ 5224.531630] [] ? kthread_create_on_node+0x160/0x160 > [ 5224.531634] [] ret_from_fork+0x7c/0xb0 > [ 5224.531636] [] ? kthread_create_on_node+0x160/0x160 > [ 5224.531638] ---[ end trace 0256d2b5a195208c ]--- > > I've compared some of the old extents logical addresses with the corresponding > object ids and offsets from the extent tree; some are just 8k off from > the found extents > and some keys are totally off. > > Itaru > > On Sat, Oct 27, 2012 at 7:28 PM, Liu Bo wrote: >> This comes from one of btrfs's project ideas, >> As we defragment files, we break any sharing from other snapshots. >> The balancing code will preserve the sharing, and defrag needs to grow this >> as well. >> >> Now we're able to fill the blank with this patch, in which we make full use >> of >> backref walking stuff. >> >> Here is the basic idea, >> o set the writeback ranges started by defragment with flag EXTENT_DEFRAG >> o at endio, after we finish updating fs tree, we use backref walking to find >>all parents of the ranges and re-link them with the new COWed file layout >> by >>adding corresponding backrefs. >> >> Originally patch by Li Zefan >> Signed-off-by: Liu Bo >> --- >> v3->v4: >> - fix duplicated refs bugs detected by mounting with autodefrag, thanks >> for the bug report from Mitch and Chris. >> >> fs/btrfs/inode.c | 609 >> ++ >> 1 files changed, 609 insertions(+), 0 deletions(-) >> >> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c >> index 85a1e50..35e6993 100644 >> --- a/fs/btrfs/inode.c >> +++ b/fs/btrfs/inode.c >> @@ -54,6 +54,7 @@ >> #include "locking.h" >> #include "free-space-cache.h" >> #include "inode-map.h" >> +#include "backref.h" >> >> struct btrfs_iget_args { >> u64 ino; >> @@ -1839,6 +1840,600 @@ out: >> return ret; >> } >> >> +/* snapshot-aware defrag */ >> +struct sa_defrag_extent_backref { >> + struct rb_node node; >> + struct old_sa_defrag_extent *old; >> + u64 root_id; >> + u64 inum; >> + u64 file_pos; >> + u64 extent_offset; >> + u64 num_bytes; >> + u64 generation; >> +}; >> + >> +struct old_sa_defrag_extent { >> + struct list_head list; >> + struct new_sa_defrag_extent *new; >> + >> + u64 extent_offset; >> + u64 bytenr; >> + u64 offset; >> + u64 len; >> + int count; >> +}; >> + >> +struct new_sa_defrag_extent { >> + struct rb_root root; >> + struct list_head head; >> + struct btrfs_path *path; >> + struct inode *inode; >> + u64 file_pos; >> + u64 len; >> + u64 bytenr; >> + u64 disk_len; >> + u8 compress_type; >> +}; >> + >> +static int backref_comp(struct sa_defrag_extent_backref *b1, >> + struct sa_defrag_extent_backref *b2) >> +{ >> + if (b1->root_id < b2->root_id) >> + return -1; >> + else if (b1->root_id > b2->root_id) >> + return 1; >> + >> + if (b1->inum < b2->inum) >> + return -1; >> + else if (b1->inum > b2->inum) >> + return 1; >> + >> + if (b1->file_pos < b2->file_pos) >> + return -1; >> + else if (b1->file_pos > b2->file_pos) >> + return 1; >> + >> + return 0; >> +} >> + >> +static void backref_insert(struct rb_root *root, >> + struct sa_defrag_extent_backref *backref) >> +{ >> + struct rb_node **p = &root->rb_node; >> + struct rb_node *parent = NULL; >> + s
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
Hi Liubo, I couldn't apply your V4 patch against the btrfs-next HEAD. Do you have a github branch which I can checkout? Thanks, Itaru On Wed, Oct 31, 2012 at 9:55 PM, Liu Bo wrote: > On 10/31/2012 08:13 PM, Itaru Kitayama wrote: >> Hi LiuBo: >> >> I am seeing another warning with your patch applied btrfs-next. >> > > Hi Itaru, > > Thanks for testing, you seems to be using an old version, since in the new > version > record_extent_backrefs() does not own a WARN_ON(). > > Could you please test it again with the new patches applied? > > thanks, > liubo > > >> [ 5224.531560] [ cut here ] >> [ 5224.531565] WARNING: at fs/btrfs/inode.c:2054 >> record_extent_backrefs+0x87/0xe0() >> [ 5224.531567] Hardware name: Bochs >> [ 5224.531568] Modules linked in: microcode ppdev psmouse nfsd nfs_acl >> auth_rpcgss serio_raw nfs fscache lockd binfmt_misc sunrpc cirrus >> parport_pc ttm drm_kms_helper drm sysimgblt i2c_piix4 sysfillrect >> syscopyarea i2c_core lp parport floppy >> [ 5224.531591] Pid: 2485, comm: btrfs-endio-wri Tainted: GW >> 3.7.0-rc1-v11+ #53 >> [ 5224.531592] Call Trace: >> [ 5224.531598] [] warn_slowpath_common+0x93/0xc0 >> [ 5224.531600] [] warn_slowpath_null+0x1a/0x20 >> [ 5224.531603] [] record_extent_backrefs+0x87/0xe0 >> [ 5224.531606] [] btrfs_finish_ordered_io+0x8bb/0xa80 >> [ 5224.531611] [] ? trace_hardirqs_off_caller+0xb0/0x140 >> [ 5224.531614] [] finish_ordered_fn+0x15/0x20 >> [ 5224.531617] [] worker_loop+0x157/0x580 >> [ 5224.531620] [] ? btrfs_queue_worker+0x2f0/0x2f0 >> [ 5224.531624] [] kthread+0xe8/0xf0 >> [ 5224.531627] [] ? get_lock_stats+0x22/0x70 >> [ 5224.531630] [] ? kthread_create_on_node+0x160/0x160 >> [ 5224.531634] [] ret_from_fork+0x7c/0xb0 >> [ 5224.531636] [] ? kthread_create_on_node+0x160/0x160 >> [ 5224.531638] ---[ end trace 0256d2b5a195208c ]--- >> >> I've compared some of the old extents logical addresses with the >> corresponding >> object ids and offsets from the extent tree; some are just 8k off from >> the found extents >> and some keys are totally off. >> >> Itaru >> >> On Sat, Oct 27, 2012 at 7:28 PM, Liu Bo wrote: >>> This comes from one of btrfs's project ideas, >>> As we defragment files, we break any sharing from other snapshots. >>> The balancing code will preserve the sharing, and defrag needs to grow this >>> as well. >>> >>> Now we're able to fill the blank with this patch, in which we make full use >>> of >>> backref walking stuff. >>> >>> Here is the basic idea, >>> o set the writeback ranges started by defragment with flag EXTENT_DEFRAG >>> o at endio, after we finish updating fs tree, we use backref walking to >>> find >>>all parents of the ranges and re-link them with the new COWed file >>> layout by >>>adding corresponding backrefs. >>> >>> Originally patch by Li Zefan >>> Signed-off-by: Liu Bo >>> --- >>> v3->v4: >>> - fix duplicated refs bugs detected by mounting with autodefrag, >>> thanks >>> for the bug report from Mitch and Chris. >>> >>> fs/btrfs/inode.c | 609 >>> ++ >>> 1 files changed, 609 insertions(+), 0 deletions(-) >>> >>> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c >>> index 85a1e50..35e6993 100644 >>> --- a/fs/btrfs/inode.c >>> +++ b/fs/btrfs/inode.c >>> @@ -54,6 +54,7 @@ >>> #include "locking.h" >>> #include "free-space-cache.h" >>> #include "inode-map.h" >>> +#include "backref.h" >>> >>> struct btrfs_iget_args { >>> u64 ino; >>> @@ -1839,6 +1840,600 @@ out: >>> return ret; >>> } >>> >>> +/* snapshot-aware defrag */ >>> +struct sa_defrag_extent_backref { >>> + struct rb_node node; >>> + struct old_sa_defrag_extent *old; >>> + u64 root_id; >>> + u64 inum; >>> + u64 file_pos; >>> + u64 extent_offset; >>> + u64 num_bytes; >>> + u64 generation; >>> +}; >>> + >>> +struct old_sa_defrag_extent { >>> + struct list_head list; >>> + struct new_sa_defrag_extent *new; >>> + >>> + u64 extent_offset; >>> + u64 bytenr; >>> + u64 offset; >>> + u64 len; >>> + int count; >>> +}; >>> + >>> +struct new_sa_defrag_extent { >>> + struct rb_root root; >>> + struct list_head head; >>> + struct btrfs_path *path; >>> + struct inode *inode; >>> + u64 file_pos; >>> + u64 len; >>> + u64 bytenr; >>> + u64 disk_len; >>> + u8 compress_type; >>> +}; >>> + >>> +static int backref_comp(struct sa_defrag_extent_backref *b1, >>> + struct sa_defrag_extent_backref *b2) >>> +{ >>> + if (b1->root_id < b2->root_id) >>> + return -1; >>> + else if (b1->root_id > b2->root_id) >>> + return 1; >>> + >>> + if (b1->inum < b2->inum) >>> + return -1; >>> + else if (b1->inum > b2->inum) >>> + return 1; >>> + >>> + if (b1->file_pos < b2->file_pos) >>> + return -1;
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Thu, Nov 01, 2012 at 08:08:52PM +0900, Itaru Kitayama wrote: > Hi Liubo, > > I couldn't apply your V4 patch against the btrfs-next HEAD. Do you have > a github branch which I can checkout? > The current btrfs-next HEAD actually have included this v4 patch, so just pull btrfs-next and give it a shot :) thanks, liubo > Thanks, > > Itaru > > On Wed, Oct 31, 2012 at 9:55 PM, Liu Bo wrote: > > On 10/31/2012 08:13 PM, Itaru Kitayama wrote: > >> Hi LiuBo: > >> > >> I am seeing another warning with your patch applied btrfs-next. > >> > > > > Hi Itaru, > > > > Thanks for testing, you seems to be using an old version, since in the new > > version > > record_extent_backrefs() does not own a WARN_ON(). > > > > Could you please test it again with the new patches applied? > > > > thanks, > > liubo > > > > > >> [ 5224.531560] [ cut here ] > >> [ 5224.531565] WARNING: at fs/btrfs/inode.c:2054 > >> record_extent_backrefs+0x87/0xe0() > >> [ 5224.531567] Hardware name: Bochs > >> [ 5224.531568] Modules linked in: microcode ppdev psmouse nfsd nfs_acl > >> auth_rpcgss serio_raw nfs fscache lockd binfmt_misc sunrpc cirrus > >> parport_pc ttm drm_kms_helper drm sysimgblt i2c_piix4 sysfillrect > >> syscopyarea i2c_core lp parport floppy > >> [ 5224.531591] Pid: 2485, comm: btrfs-endio-wri Tainted: GW > >> 3.7.0-rc1-v11+ #53 > >> [ 5224.531592] Call Trace: > >> [ 5224.531598] [] warn_slowpath_common+0x93/0xc0 > >> [ 5224.531600] [] warn_slowpath_null+0x1a/0x20 > >> [ 5224.531603] [] record_extent_backrefs+0x87/0xe0 > >> [ 5224.531606] [] btrfs_finish_ordered_io+0x8bb/0xa80 > >> [ 5224.531611] [] ? trace_hardirqs_off_caller+0xb0/0x140 > >> [ 5224.531614] [] finish_ordered_fn+0x15/0x20 > >> [ 5224.531617] [] worker_loop+0x157/0x580 > >> [ 5224.531620] [] ? btrfs_queue_worker+0x2f0/0x2f0 > >> [ 5224.531624] [] kthread+0xe8/0xf0 > >> [ 5224.531627] [] ? get_lock_stats+0x22/0x70 > >> [ 5224.531630] [] ? kthread_create_on_node+0x160/0x160 > >> [ 5224.531634] [] ret_from_fork+0x7c/0xb0 > >> [ 5224.531636] [] ? kthread_create_on_node+0x160/0x160 > >> [ 5224.531638] ---[ end trace 0256d2b5a195208c ]--- > >> > >> I've compared some of the old extents logical addresses with the > >> corresponding > >> object ids and offsets from the extent tree; some are just 8k off from > >> the found extents > >> and some keys are totally off. > >> > >> Itaru > >> > >> On Sat, Oct 27, 2012 at 7:28 PM, Liu Bo wrote: > >>> This comes from one of btrfs's project ideas, > >>> As we defragment files, we break any sharing from other snapshots. > >>> The balancing code will preserve the sharing, and defrag needs to grow > >>> this > >>> as well. > >>> > >>> Now we're able to fill the blank with this patch, in which we make full > >>> use of > >>> backref walking stuff. > >>> > >>> Here is the basic idea, > >>> o set the writeback ranges started by defragment with flag EXTENT_DEFRAG > >>> o at endio, after we finish updating fs tree, we use backref walking to > >>> find > >>>all parents of the ranges and re-link them with the new COWed file > >>> layout by > >>>adding corresponding backrefs. > >>> > >>> Originally patch by Li Zefan > >>> Signed-off-by: Liu Bo > >>> --- > >>> v3->v4: > >>> - fix duplicated refs bugs detected by mounting with autodefrag, > >>> thanks > >>> for the bug report from Mitch and Chris. > >>> > >>> fs/btrfs/inode.c | 609 > >>> ++ > >>> 1 files changed, 609 insertions(+), 0 deletions(-) > >>> > >>> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > >>> index 85a1e50..35e6993 100644 > >>> --- a/fs/btrfs/inode.c > >>> +++ b/fs/btrfs/inode.c > >>> @@ -54,6 +54,7 @@ > >>> #include "locking.h" > >>> #include "free-space-cache.h" > >>> #include "inode-map.h" > >>> +#include "backref.h" > >>> > >>> struct btrfs_iget_args { > >>> u64 ino; > >>> @@ -1839,6 +1840,600 @@ out: > >>> return ret; > >>> } > >>> > >>> +/* snapshot-aware defrag */ > >>> +struct sa_defrag_extent_backref { > >>> + struct rb_node node; > >>> + struct old_sa_defrag_extent *old; > >>> + u64 root_id; > >>> + u64 inum; > >>> + u64 file_pos; > >>> + u64 extent_offset; > >>> + u64 num_bytes; > >>> + u64 generation; > >>> +}; > >>> + > >>> +struct old_sa_defrag_extent { > >>> + struct list_head list; > >>> + struct new_sa_defrag_extent *new; > >>> + > >>> + u64 extent_offset; > >>> + u64 bytenr; > >>> + u64 offset; > >>> + u64 len; > >>> + int count; > >>> +}; > >>> + > >>> +struct new_sa_defrag_extent { > >>> + struct rb_root root; > >>> + struct list_head head; > >>> + struct btrfs_path *path; > >>> + struct inode *inode; > >>> + u64 file_pos; > >>> + u64 len; > >>> + u64 bytenr; > >>> + u64 disk_len; > >>> + u8 compress_type; > >>> +}; > >>> + > >>> +static int backref_comp(s
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
Hi Liubo: The V4 leaves only warnings from btrfs_destroy_inode(). So, you think it's normal an "old" extent recorded can be removed from the extent tree by the time relink_file_extents() invoked? Itaru On Thu, Nov 1, 2012 at 8:21 PM, Liu Bo wrote: > The current btrfs-next HEAD actually have included this v4 patch, so > just pull btrfs-next and give it a shot :) > > thanks, > liubo -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On 11/01/2012 10:05 PM, Itaru Kitayama wrote: > Hi Liubo: > > The V4 leaves only warnings from btrfs_destroy_inode(). So, you think > it's normal > an "old" extent recorded can be removed from the extent tree by the time > relink_file_extents() invoked? > Yeah, it could be if only we run delayed refs in time. But I don't think that often happens since we run delayed refs when the amount reaches its limit(64). thanks, liubo > Itaru > > On Thu, Nov 1, 2012 at 8:21 PM, Liu Bo wrote: > >> The current btrfs-next HEAD actually have included this v4 patch, so >> just pull btrfs-next and give it a shot :) >> >> thanks, >> liubo > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Sun, Nov 25, 2012 at 12:48:33PM +0900, Itaru Kitayama wrote: > Hi Liubo: > > At the relinking stage, in some situations, looking up the extent tree with > the extent logical start objectid key from one of the old extents fails, > but the found previous item's objectid + offset is exactly the original > search objectid. As you say, usually old extents are retrieved from the > extent tree without a problem, but if the Delayed or some other mechanisms > change extents layout in the finish ordered IO function, we need to take > care of those rejected extents, not simply returning ENOENT. What do you > think? Hi Itaru san, Thanks for the suggestion. It's all right to ignore ENOENT. An extent stands for a range of space, which owns an item in extent tree. If old extents' item is not found in the extent tree, i.e. rejected extents, it means that this range of space is not shared by any snapshots(the extent refs is now 0), and so it's safe. So the worst case is that due to COW, a file and its snapshots share nothing after some time, the defrag on the file won't change its snapshots, but this can be solved when we always with autodefrag and snapshot-aware defrag. thanks, liubo -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Thu, Nov 1, 2012 at 6:21 AM, Liu Bo wrote: > On Thu, Nov 01, 2012 at 08:08:52PM +0900, Itaru Kitayama wrote: >> Hi Liubo, >> >> I couldn't apply your V4 patch against the btrfs-next HEAD. Do you have >> a github branch which I can checkout? >> > > The current btrfs-next HEAD actually have included this v4 patch, so > just pull btrfs-next and give it a shot :) > I'm still seeing similar issues using Josef's current btrfs-next branch (which still includes the v4 version of the snapshot-aware defrag patches). [44507.850693] [ cut here ] [44507.850728] WARNING: at fs/btrfs/inode.c:7755 btrfs_destroy_inode+0x231/0x2c4 [btrfs]() [44507.850732] Hardware name: OptiPlex 745 [44507.850735] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic btrfs libcrc32c [44507.850753] Pid: 15719, comm: umount Tainted: GW 3.7.0-btrfs-next+ #1 [44507.850756] Call Trace: [44507.850766] [] warn_slowpath_common+0x74/0xa2 [44507.850770] [] warn_slowpath_null+0x1a/0x1c [44507.850787] [] btrfs_destroy_inode+0x231/0x2c4 [btrfs] [44507.850793] [] destroy_inode+0x3c/0x5f [44507.850797] [] evict+0x122/0x1ac [44507.850800] [] iput+0xed/0x169 [44507.850816] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] [44507.850831] [] btrfs_commit_super+0x2c/0xfd [btrfs] [44507.850845] [] close_ctree+0x2c1/0x300 [btrfs] [44507.850850] [] ? evict_inodes+0x106/0x115 [44507.850861] [] btrfs_put_super+0x19/0x1b [btrfs] [44507.850866] [] generic_shutdown_super+0x5b/0xdc [44507.850869] [] kill_anon_super+0x16/0x24 [44507.850880] [] btrfs_kill_super+0x1a/0x8f [btrfs] [44507.850884] [] deactivate_locked_super+0x33/0x6c [44507.850887] [] deactivate_super+0x4e/0x66 [44507.850892] [] mntput_no_expire+0xf7/0x14d [44507.850896] [] sys_umount+0x63/0x37a [44507.850901] [] system_call_fastpath+0x16/0x1b [44507.850905] ---[ end trace ba14fbf3de68a237 ]--- [44507.850907] [ cut here ] [44507.850924] WARNING: at fs/btrfs/inode.c:7756 btrfs_destroy_inode+0x2b9/0x2c4 [btrfs]() [44507.850927] Hardware name: OptiPlex 745 [44507.850930] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic btrfs libcrc32c [44507.850947] Pid: 15719, comm: umount Tainted: GW 3.7.0-btrfs-next+ #1 [44507.850949] Call Trace: [44507.850956] [] warn_slowpath_common+0x74/0xa2 [44507.850961] [] warn_slowpath_null+0x1a/0x1c [44507.850978] [] btrfs_destroy_inode+0x2b9/0x2c4 [btrfs] [44507.850982] [] destroy_inode+0x3c/0x5f [44507.850986] [] evict+0x122/0x1ac [44507.850990] [] iput+0xed/0x169 [44507.851003] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] [44507.851033] [] btrfs_commit_super+0x2c/0xfd [btrfs] [44507.851048] [] close_ctree+0x2c1/0x300 [btrfs] [44507.851052] [] ? evict_inodes+0x106/0x115 [44507.851063] [] btrfs_put_super+0x19/0x1b [btrfs] [44507.851066] [] generic_shutdown_super+0x5b/0xdc [44507.851070] [] kill_anon_super+0x16/0x24 [44507.851080] [] btrfs_kill_super+0x1a/0x8f [btrfs] [44507.851084] [] deactivate_locked_super+0x33/0x6c [44507.851087] [] deactivate_super+0x4e/0x66 [44507.851091] [] mntput_no_expire+0xf7/0x14d [44507.851095] [] sys_umount+0x63/0x37a [44507.851099] [] system_call_fastpath+0x16/0x1b [44507.851101] ---[ end trace ba14fbf3de68a238 ]--- [44507.851104] [ cut here ] [44507.851121] WARNING: at fs/btrfs/inode.c:7758 btrfs_destroy_inode+0x28d/0x2c4 [btrfs]() [44507.851123] Hardware name: OptiPlex 745 [44507.851124] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic btrfs libcrc32c [44507.851140] Pid: 15719, comm: umount Tainted: GW 3.7.0-btrfs-next+ #1 [44507.851142] Call Trace: [44507.851148] [] warn_slowpath_common+0x74/0xa2 [44507.851152] [] warn_slowpath_null+0x1a/0x1c [44507.851168] [] btrfs_destroy_inode+0x28d/0x2c4 [btrfs] [44507.851172] [] destroy_inode+0x3c/0x5f [44507.851176] [] evict+0x122/0x1ac [44507.851180] [] iput+0xed/0x169 [44507.851195] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] [44507.851209] [] btrfs_commit_super+0x2c/0xfd [btrfs] [44507.851223] [] close_ctree+0x2c1/0x300 [btrfs] [44507.851227] [] ? evict_inodes+0x106/0x115 [44507.851237] [] btrfs_put_super+0x19/0x1b [btrfs] [44507.851241] [] generic_shutdown_super+0x5b/0xdc [44507.851245] [] kill_anon_super+0x16/0x24 [44507.851255] [] btrfs_kill_super+0x1a/0x8f [btrfs] [44507.851259] [] deactivate_locked_super+0x33/0x6c [44507.851263] [] deactivate_super+0x4e/0x66 [44507.851266] [] mntput_no_expire+0xf7/0x14d [44507.851270] [] sys_umount+0x63/0x37a [44507.851274] [] system_call_fastpath+0x16/0x1b [44507.851277] ---[ end trace ba14fbf3de68a239 ]--- [44507.969039] [ cut here ] [44507.969069] WARNING: at fs/btrfs/extent-tree.c:4351 btrfs_free_block_groups+0x2ad/0x34c [btrfs]() [44507.969074] Hardware name: OptiP
Re: [PATCH 1/2 v4] Btrfs: snapshot-aware defrag
On Wed, Dec 12, 2012 at 01:37:21PM -0600, Mitch Harder wrote: > On Thu, Nov 1, 2012 at 6:21 AM, Liu Bo wrote: > > On Thu, Nov 01, 2012 at 08:08:52PM +0900, Itaru Kitayama wrote: > >> Hi Liubo, > >> > >> I couldn't apply your V4 patch against the btrfs-next HEAD. Do you have > >> a github branch which I can checkout? > >> > > > > The current btrfs-next HEAD actually have included this v4 patch, so > > just pull btrfs-next and give it a shot :) > > > > I'm still seeing similar issues using Josef's current btrfs-next > branch (which still includes the v4 version of the snapshot-aware > defrag patches). Well, it seems that there is something wrong about delalloc reservation. thanks, liubo > > [44507.850693] [ cut here ] > [44507.850728] WARNING: at fs/btrfs/inode.c:7755 > btrfs_destroy_inode+0x231/0x2c4 [btrfs]() > [44507.850732] Hardware name: OptiPlex 745 > [44507.850735] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich > mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic > btrfs libcrc32c > [44507.850753] Pid: 15719, comm: umount Tainted: GW > 3.7.0-btrfs-next+ #1 > [44507.850756] Call Trace: > [44507.850766] [] warn_slowpath_common+0x74/0xa2 > [44507.850770] [] warn_slowpath_null+0x1a/0x1c > [44507.850787] [] btrfs_destroy_inode+0x231/0x2c4 [btrfs] > [44507.850793] [] destroy_inode+0x3c/0x5f > [44507.850797] [] evict+0x122/0x1ac > [44507.850800] [] iput+0xed/0x169 > [44507.850816] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] > [44507.850831] [] btrfs_commit_super+0x2c/0xfd [btrfs] > [44507.850845] [] close_ctree+0x2c1/0x300 [btrfs] > [44507.850850] [] ? evict_inodes+0x106/0x115 > [44507.850861] [] btrfs_put_super+0x19/0x1b [btrfs] > [44507.850866] [] generic_shutdown_super+0x5b/0xdc > [44507.850869] [] kill_anon_super+0x16/0x24 > [44507.850880] [] btrfs_kill_super+0x1a/0x8f [btrfs] > [44507.850884] [] deactivate_locked_super+0x33/0x6c > [44507.850887] [] deactivate_super+0x4e/0x66 > [44507.850892] [] mntput_no_expire+0xf7/0x14d > [44507.850896] [] sys_umount+0x63/0x37a > [44507.850901] [] system_call_fastpath+0x16/0x1b > [44507.850905] ---[ end trace ba14fbf3de68a237 ]--- > [44507.850907] [ cut here ] > [44507.850924] WARNING: at fs/btrfs/inode.c:7756 > btrfs_destroy_inode+0x2b9/0x2c4 [btrfs]() > [44507.850927] Hardware name: OptiPlex 745 > [44507.850930] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich > mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic > btrfs libcrc32c > [44507.850947] Pid: 15719, comm: umount Tainted: GW > 3.7.0-btrfs-next+ #1 > [44507.850949] Call Trace: > [44507.850956] [] warn_slowpath_common+0x74/0xa2 > [44507.850961] [] warn_slowpath_null+0x1a/0x1c > [44507.850978] [] btrfs_destroy_inode+0x2b9/0x2c4 [btrfs] > [44507.850982] [] destroy_inode+0x3c/0x5f > [44507.850986] [] evict+0x122/0x1ac > [44507.850990] [] iput+0xed/0x169 > [44507.851003] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] > [44507.851033] [] btrfs_commit_super+0x2c/0xfd [btrfs] > [44507.851048] [] close_ctree+0x2c1/0x300 [btrfs] > [44507.851052] [] ? evict_inodes+0x106/0x115 > [44507.851063] [] btrfs_put_super+0x19/0x1b [btrfs] > [44507.851066] [] generic_shutdown_super+0x5b/0xdc > [44507.851070] [] kill_anon_super+0x16/0x24 > [44507.851080] [] btrfs_kill_super+0x1a/0x8f [btrfs] > [44507.851084] [] deactivate_locked_super+0x33/0x6c > [44507.851087] [] deactivate_super+0x4e/0x66 > [44507.851091] [] mntput_no_expire+0xf7/0x14d > [44507.851095] [] sys_umount+0x63/0x37a > [44507.851099] [] system_call_fastpath+0x16/0x1b > [44507.851101] ---[ end trace ba14fbf3de68a238 ]--- > [44507.851104] [ cut here ] > [44507.851121] WARNING: at fs/btrfs/inode.c:7758 > btrfs_destroy_inode+0x28d/0x2c4 [btrfs]() > [44507.851123] Hardware name: OptiPlex 745 > [44507.851124] Modules linked in: iTCO_wdt iTCO_vendor_support lpc_ich > mfd_core lrw xts gf128mul ablk_helper cryptd aes_x86_64 sha256_generic > btrfs libcrc32c > [44507.851140] Pid: 15719, comm: umount Tainted: GW > 3.7.0-btrfs-next+ #1 > [44507.851142] Call Trace: > [44507.851148] [] warn_slowpath_common+0x74/0xa2 > [44507.851152] [] warn_slowpath_null+0x1a/0x1c > [44507.851168] [] btrfs_destroy_inode+0x28d/0x2c4 [btrfs] > [44507.851172] [] destroy_inode+0x3c/0x5f > [44507.851176] [] evict+0x122/0x1ac > [44507.851180] [] iput+0xed/0x169 > [44507.851195] [] btrfs_run_delayed_iputs+0xd6/0xf6 [btrfs] > [44507.851209] [] btrfs_commit_super+0x2c/0xfd [btrfs] > [44507.851223] [] close_ctree+0x2c1/0x300 [btrfs] > [44507.851227] [] ? evict_inodes+0x106/0x115 > [44507.851237] [] btrfs_put_super+0x19/0x1b [btrfs] > [44507.851241] [] generic_shutdown_super+0x5b/0xdc > [44507.851245] [] kill_anon_super+0x16/0x24 > [44507.851255] [] btrfs_kill_super+0x1a/0x8f [btrfs] > [44507.851259] [] deactivate_locked_super+0x33/0x6c > [44507.851263] [] deactivate_super+0x4e/0x66 > [44507.851266] [] m