Excerpts from Andrea Gelmini's message of 2011-05-30 07:59:30 -0400: > 2011/5/30 Chris Mason <chris.mason@xxxxxxxxxx>: > > These are perfect, thank you. ÂWe're failing to write out the inode > > cache. ÂSince you're on a 32 bit machine, I'm guessing that we failed to > > kmap something properly. > > Thanks a lot for detailed info. > I recompiled, and get this: > gelma@dell:~$ gdb /lib/modules/3.0.0-rc1/kernel/fs/btrfs/* > GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 > Copyright (C) 2010 Free Software Foundation, Inc. > License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> > This is free software: you are free to change and redistribute it. > There is NO WARRANTY, to the extent permitted by law. Type "show copying" > and "show warranty" for details. > This GDB was configured as "i686-linux-gnu". > For bug reporting instructions, please see: > <http://www.gnu.org/software/gdb/bugs/>... > Reading symbols from /lib/modules/3.0.0-rc1/kernel/fs/btrfs/btrfs.ko...done. > (gdb) list *__btrfs_write_out_cache+0x43a > 0x5fada is in __btrfs_write_out_cache (fs/btrfs/free-space-cache.c:676). > 671 struct btrfs_free_space *e; > 672 > 673 e = rb_entry(node, struct btrfs_free_space, offset_index); > 674 entries++; > 675 > 676 entry->offset = cpu_to_le64(e->offset); > 677 entry->bytes = cpu_to_le64(e->bytes); > 678 if (e->bitmap) { > 679 entry->type = BTRFS_FREE_SPACE_BITMAP; > 680 list_add_tail(&e->list, &bitmap_list); > (gdb) Ok, so I think we're blowing past the end of the page we've kmap'd. But I don't think that can happen without something like the patch below triggering: Josef, what do you think? diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index 70d4579..a95b72e 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -596,6 +596,11 @@ int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, */ first_page_offset = (sizeof(u32) * num_pages) + sizeof(u64); + if (first_page_offset + sizeof(struct btrfs_free_space_entry) >= PAGE_CACHE_SIZE) { + printk(KERN_CRIT "bad first page offset %lu\n", first_page_offset); + BUG(); + } + /* Get the cluster for this block_group if it exists */ if (block_group && !list_empty(&block_group->cluster_list)) cluster = list_entry(block_group->cluster_list.next, -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
