Btrfs: rework csums and extent item ordering
authorChris Mason <chris.mason@oracle.com>
Tue, 17 Apr 2007 19:39:32 +0000 (15:39 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Tue, 17 Apr 2007 19:39:32 +0000 (15:39 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/ctree.h
fs/btrfs/dir-item.c
fs/btrfs/disk-io.c
fs/btrfs/file-item.c
fs/btrfs/super.c

index 43d4779..5c160c2 100644 (file)
@@ -115,14 +115,14 @@ static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
                return 1;
        if (k1.objectid < k2->objectid)
                return -1;
-       if (k1.offset > k2->offset)
-               return 1;
-       if (k1.offset < k2->offset)
-               return -1;
        if (k1.flags > k2->flags)
                return 1;
        if (k1.flags < k2->flags)
                return -1;
+       if (k1.offset > k2->offset)
+               return 1;
+       if (k1.offset < k2->offset)
+               return -1;
        return 0;
 }
 
@@ -1292,7 +1292,6 @@ int btrfs_truncate_item(struct btrfs_trans_handle *trans,
                                      ioff + size_diff);
        }
        /* shift the data */
-printk("truncate item, new_size %u old_size %u, diff %u, bufp %p, dst, %p, num %u, old_data_start %u, data_end %u\n", new_size, old_size, size_diff, leaf, btrfs_leaf_data(leaf) + data_end + size_diff, old_data_start-data_end, old_data_start, data_end);
        btrfs_memmove(root, leaf, btrfs_leaf_data(leaf) +
                      data_end + size_diff, btrfs_leaf_data(leaf) +
                      data_end, old_data_start + new_size - data_end);
index ca3ab16..d75a4d5 100644 (file)
@@ -44,14 +44,14 @@ extern struct kmem_cache *btrfs_path_cachep;
  */
 struct btrfs_disk_key {
        __le64 objectid;
-       __le64 offset;
        __le32 flags;
+       __le64 offset;
 } __attribute__ ((__packed__));
 
 struct btrfs_key {
        u64 objectid;
-       u64 offset;
        u32 flags;
+       u64 offset;
 } __attribute__ ((__packed__));
 
 /*
@@ -227,7 +227,6 @@ struct btrfs_file_extent_item {
 } __attribute__ ((__packed__));
 
 struct btrfs_csum_item {
-       __le64 extent_offset;
        u8 csum[BTRFS_CSUM_SIZE];
 } __attribute__ ((__packed__));
 
@@ -925,17 +924,6 @@ static inline void btrfs_set_file_extent_num_blocks(struct
        e->num_blocks = cpu_to_le64(val);
 }
 
-static inline u64 btrfs_csum_extent_offset(struct btrfs_csum_item *c)
-{
-       return le64_to_cpu(c->extent_offset);
-}
-
-static inline void btrfs_set_csum_extent_offset(struct btrfs_csum_item *c,
-                                               u64 val)
-{
-       c->extent_offset = cpu_to_le64(val);
-}
-
 static inline u16 btrfs_device_pathlen(struct btrfs_device_item *d)
 {
        return le16_to_cpu(d->pathlen);
@@ -1091,7 +1079,6 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
 int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
                          struct btrfs_root *root,
                          u64 objectid, u64 offset,
-                         u64 extent_offset,
                          char *data, size_t len);
 int btrfs_csum_verify_file_block(struct btrfs_root *root,
                                 u64 objectid, u64 offset,
index 0ba46bc..cd4137a 100644 (file)
@@ -103,7 +103,7 @@ int btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
        key.objectid = dir;
        key.flags = 0;
        btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
-       btrfs_set_key_overflow(&key, BTRFS_KEY_OVERFLOW_MAX - 1);
+       // btrfs_set_key_overflow(&key, BTRFS_KEY_OVERFLOW_MAX - 1);
        ret = btrfs_name_hash(name, name_len, &key.offset);
        BUG_ON(ret);
        while(1) {
@@ -146,19 +146,29 @@ int btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans,
        int cow = mod != 0;
        struct btrfs_disk_key *found_key;
        struct btrfs_leaf *leaf;
+       int overflow = 0;
 
        key.objectid = dir;
        key.flags = 0;
        btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY);
-       btrfs_set_key_overflow(&key, BTRFS_KEY_OVERFLOW_MAX - 1);
        key.offset = objectid;
-       ret = btrfs_search_slot(trans, root, &key, path, ins_len, cow);
-       if (ret < 0)
-               return ret;
-       if (ret > 0) {
-               if (path->slots[0] == 0)
-                       return 1;
-               path->slots[0]--;
+
+       while(1) {
+               btrfs_set_key_overflow(&key, overflow);
+               ret = btrfs_search_slot(trans, root, &key, path, ins_len, cow);
+               if (ret < 0)
+                       return ret;
+               if (ret > 0) {
+                       if (overflow >= BTRFS_KEY_OVERFLOW_MAX)
+                               return 1;
+                       overflow++;
+                       btrfs_set_key_overflow(&key, overflow);
+                       btrfs_release_path(root, path);
+                       continue;
+               } else {
+                       /* found */
+                       break;
+               }
        }
        leaf = btrfs_buffer_leaf(path->nodes[0]);
        found_key = &leaf->items[path->slots[0]].key;
Simple merge
Simple merge
Simple merge