bug report

2011-04-04 Thread Larry D'Anna
So i made a filesystem image 

 $ dd if=/dev/zero of=root_fs bs=1024 count=$(expr 1024 \* 1024)
 $ mkfs.btrfs root_fs 

Then I put some debian on it (my kernel is 2.6.35-27-generic #48-Ubuntu) 

 $ mkdir root 
 $ mount -o loop root_fs root 
 $ debootstrap sid root 
 $ umount root

Then i run uml.   (2.6.35-1um-0ubuntu1)

 $ linux single eth0=tuntap,tap0,fe:fd:f0:00:00:01

and then try to apt-get some stuff, and the result is this:

btrfs csum failed ino 17498 off 2412544 csum 491052325 private 446722121
btrfs csum failed ino 17498 off 2416640 csum 2077462867 private 906054605
btrfs csum failed ino 17498 off 2420736 csum 263316283 private 2215839539
btrfs csum failed ino 17498 off 2424832 csum 4177088190 private 2414263107
btrfs csum failed ino 17498 off 2428928 csum 4028205539 private 3560605623
btrfs csum failed ino 17498 off 2433024 csum 1724529595 private 200634979
btrfs csum failed ino 17498 off 2437120 csum 4038631380 private 2927872002
btrfs csum failed ino 17498 off 2441216 csum 2616837020 private 729736037
btrfs csum failed ino 17498 off 2498560 csum 2566472073 private 3417075259
btrfs csum failed ino 17498 off 2502656 csum 2566472073 private 1410567947


 $ find / -mount -inum 17498  
 /var/cache/apt/srcpkgcache.bin

I've gone through this twice now, so it's repeatable at least.  I know 2.6.35 is
kinda old but was this kind of thing to be expected back then?  


  --larry
--
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 0/2] btrfs: allow cross-subvolume BTRFS_IOC_CLONE

2011-04-02 Thread Larry D'Anna
* Ken Drummond (bt...@kendrummond.com) [110402 11:51]:
 I don't really understand the details here, but doesn't the creation of
 a snapshot already lead to data extents being shared between
 sub-volumes?  From a simple user perspective this sounds like a very
 useful capability.

I was surprised and frustrated to find it missing.  I had just copied a large
quantity of data into btrfs, realized i need to make a subvolume to try out
snapshotting, and then found out i had to copy all the data *again* to get it
into a subvolume.  There are tons of scenarios where users will want and expect
to be able to do this.
--
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


[PATCH 2/2] btrfs: allow cross-subvolume BTRFS_IOC_CLONE

2011-03-30 Thread Larry D'Anna

Signed-off-by: Larry D'Anna la...@elder-gods.org
---
 fs/btrfs/ioctl.c |   10 ++
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index f9717b6..10095c7 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1804,6 +1804,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, 
unsigned long srcfd,
 {
struct inode *inode = fdentry(file)-d_inode;
struct btrfs_root *root = BTRFS_I(inode)-root;
+   struct btrfs_root *srcroot;
struct file *src_file;
struct inode *src;
struct btrfs_trans_handle *trans;
@@ -1846,6 +1847,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, 
unsigned long srcfd,
}
 
src = src_file-f_dentry-d_inode;
+   srcroot = BTRFS_I(src)-root;
 
ret = -EINVAL;
if (src == inode)
@@ -1860,11 +1862,11 @@ static noinline long btrfs_ioctl_clone(struct file 
*file, unsigned long srcfd,
goto out_fput;
 
ret = -EXDEV;
-   if (src-i_sb != inode-i_sb || BTRFS_I(src)-root != root)
+   if (src-i_sb != inode-i_sb)
goto out_fput;
 
ret = -ENOMEM;
-   buf = vmalloc(btrfs_level_size(root, 0));
+   buf = vmalloc(btrfs_level_size(srcroot, 0));
if (!buf)
goto out_fput;
 
@@ -1924,13 +1926,13 @@ static noinline long btrfs_ioctl_clone(struct file 
*file, unsigned long srcfd,
 * note the key will change type as we walk through the
 * tree.
 */
-   ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
+   ret = btrfs_search_slot(NULL, srcroot, key, path, 0, 0);
if (ret  0)
goto out;
 
nritems = btrfs_header_nritems(path-nodes[0]);
if (path-slots[0] = nritems) {
-   ret = btrfs_next_leaf(root, path);
+   ret = btrfs_next_leaf(srcroot, path);
if (ret  0)
goto out;
if (ret  0)
-- 
1.7.0.rc2.40.g7d8aa

--
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


[PATCH 1/2] btrfs: remove unused argument 'root' from btrfs_release_path

2011-03-30 Thread Larry D'Anna

Signed-off-by: Larry D'Anna la...@elder-gods.org
---
 fs/btrfs/ctree.c|   28 ++--
 fs/btrfs/ctree.h|2 +-
 fs/btrfs/dir-item.c |2 +-
 fs/btrfs/extent-tree.c  |   74 
 fs/btrfs/file-item.c|   12 +++---
 fs/btrfs/file.c |   12 +++---
 fs/btrfs/free-space-cache.c |   14 +++---
 fs/btrfs/inode.c|   42 +-
 fs/btrfs/ioctl.c|   12 +++---
 fs/btrfs/relocation.c   |   30 +++---
 fs/btrfs/root-tree.c|   10 ++--
 fs/btrfs/tree-defrag.c  |2 +-
 fs/btrfs/tree-log.c |   98 +-
 fs/btrfs/volumes.c  |   16 
 fs/btrfs/xattr.c|4 +-
 15 files changed, 179 insertions(+), 179 deletions(-)

diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 84d7ca1..70211e8 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -107,7 +107,7 @@ void btrfs_free_path(struct btrfs_path *p)
 {
if (!p)
return;
-   btrfs_release_path(NULL, p);
+   btrfs_release_path(p);
kmem_cache_free(btrfs_path_cachep, p);
 }
 
@@ -117,7 +117,7 @@ void btrfs_free_path(struct btrfs_path *p)
  *
  * It is safe to call this on paths that no locks or extent buffers held.
  */
-noinline void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p)
+noinline void btrfs_release_path(struct btrfs_path *p)
 {
int i;
 
@@ -1328,7 +1328,7 @@ static noinline int reada_for_balance(struct btrfs_root 
*root,
ret = -EAGAIN;
 
/* release the whole path */
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
 
/* read the blocks */
if (block1)
@@ -1475,7 +1475,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,
return 0;
}
free_extent_buffer(tmp);
-   btrfs_release_path(NULL, p);
+   btrfs_release_path(p);
return -EIO;
}
}
@@ -1494,7 +1494,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,
if (p-reada)
reada_for_search(root, p, level, slot, key-objectid);
 
-   btrfs_release_path(NULL, p);
+   btrfs_release_path(p);
 
ret = -EAGAIN;
tmp = read_tree_block(root, blocknr, blocksize, 0);
@@ -1563,7 +1563,7 @@ setup_nodes_for_search(struct btrfs_trans_handle *trans,
}
b = p-nodes[level];
if (!b) {
-   btrfs_release_path(NULL, p);
+   btrfs_release_path(p);
goto again;
}
BUG_ON(btrfs_header_nritems(b) == 1);
@@ -1753,7 +1753,7 @@ done:
if (!p-leave_spinning)
btrfs_set_path_blocking(p);
if (ret  0)
-   btrfs_release_path(root, p);
+   btrfs_release_path(p);
return ret;
 }
 
@@ -3026,7 +3026,7 @@ static noinline int setup_leaf_for_split(struct 
btrfs_trans_handle *trans,
struct btrfs_file_extent_item);
extent_len = btrfs_file_extent_num_bytes(leaf, fi);
}
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
 
path-keep_locks = 1;
path-search_for_split = 1;
@@ -3949,7 +3949,7 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct 
btrfs_path *path)
else
return 1;
 
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
if (ret  0)
return ret;
@@ -4073,7 +4073,7 @@ find_next_key:
sret = btrfs_find_next_key(root, path, min_key, level,
  cache_only, min_trans);
if (sret == 0) {
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
goto again;
} else {
goto out;
@@ -4152,7 +4152,7 @@ next:
btrfs_node_key_to_cpu(c, cur_key, slot);
 
orig_lowest = path-lowest_level;
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
path-lowest_level = level;
ret = btrfs_search_slot(NULL, root, cur_key, path,
0, 0);
@@ -4229,7 +4229,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct 
btrfs_path *path)
 again:
level = 1;
next = NULL;
-   btrfs_release_path(root, path);
+   btrfs_release_path(path);
 
path-keep_locks = 1;
 
@@ -4285,7 +4285,7 @@ again