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;
}
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);
*/
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__));
/*
} __attribute__ ((__packed__));
struct btrfs_csum_item {
- __le64 extent_offset;
u8 csum[BTRFS_CSUM_SIZE];
} __attribute__ ((__packed__));
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);
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,
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) {
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;