Message ID | 50585420.6060407@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Miao, > wrong because it is possbile that ->generation may equal to the first > variant of the next item. When can this happen ? Can you provide a scenario to run through. ? Thanks, Anand -- 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
On wed, 19 Sep 2012 09:55:19 +0800, Anand Jain wrote: > > Miao, > >> wrong because it is possbile that ->generation may equal to the first >> variant of the next item. > > When can this happen ? Can you provide a scenario to run through. ? On the old kernel: # mkfs.btrfs <partition> # mount <partition> <mnt> # btrfs sub snap <mnt> <mnt>/snap0 # btrfs sub snap <mnt> <mnt>/snap1 # btrfs sub list -u <mnt> Thanks Miao > > Thanks, Anand > -- > 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 > -- 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/btrfs-list.c b/btrfs-list.c index ef621f0..ed28021 100644 --- a/btrfs-list.c +++ b/btrfs-list.c @@ -737,7 +737,8 @@ again: } else if (get_gen && sh->type == BTRFS_ROOT_ITEM_KEY) { ri = (struct btrfs_root_item *)(args.buf + off); gen = btrfs_root_generation(ri); - if(ri->generation == ri->generation_v2) { + if(sh->len > + sizeof(struct btrfs_root_item_v0)) { t = ri->otime.sec; memcpy(uuid, ri->uuid, BTRFS_UUID_SIZE); } else { @@ -844,9 +845,11 @@ static int __list_snapshot_search(int fd, struct root_lookup *root_lookup) off += sizeof(*sh); if (sh->type == BTRFS_ROOT_ITEM_KEY && sh->offset) { item = (struct btrfs_root_item *)(args.buf + off); - if(item->generation == item->generation_v2) { + if(sh->len > + sizeof(struct btrfs_root_item_v0)) { t = item->otime.sec; - memcpy(uuid, item->uuid, BTRFS_UUID_SIZE); + memcpy(uuid, item->uuid, + BTRFS_UUID_SIZE); } else { t = 0; memset(uuid, 0, BTRFS_UUID_SIZE); diff --git a/ctree.h b/ctree.h index 7f55229..c55d033 100644 --- a/ctree.h +++ b/ctree.h @@ -637,6 +637,21 @@ struct btrfs_dir_item { u8 type; } __attribute__ ((__packed__)); +struct btrfs_root_item_v0 { + struct btrfs_inode_item inode; + __le64 generation; + __le64 root_dirid; + __le64 bytenr; + __le64 byte_limit; + __le64 bytes_used; + __le64 last_snapshot; + __le64 flags; + __le32 refs; + struct btrfs_disk_key drop_progress; + u8 drop_level; + u8 level; +} __attribute__ ((__packed__)); + struct btrfs_root_item { struct btrfs_inode_item inode; __le64 generation;