Merge branch 'cleanups' of git://repo.or.cz/linux-2.6/btrfs-unstable into inode_numbers
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / btrfs / dir-item.c
index c62f02f6ae693728ce9286d963b78708428a86fb..1ddfca78e9109e484c8227d5c6022b907dd51438 100644 (file)
@@ -124,8 +124,9 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans,
  * to use for the second index (if one is created).
  */
 int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
-                         *root, const char *name, int name_len, u64 dir,
-                         struct btrfs_key *location, u8 type, u64 index)
+                         *root, const char *name, int name_len,
+                         struct inode *dir, struct btrfs_key *location,
+                         u8 type, u64 index)
 {
        int ret = 0;
        int ret2 = 0;
@@ -137,13 +138,17 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
        struct btrfs_disk_key disk_key;
        u32 data_size;
 
-       key.objectid = dir;
+       key.objectid = btrfs_ino(dir);
        btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY);
        key.offset = btrfs_name_hash(name, name_len);
 
        path = btrfs_alloc_path();
+       if (!path)
+               return -ENOMEM;
        path->leave_spinning = 1;
 
+       btrfs_cpu_key_to_disk(&disk_key, location);
+
        data_size = sizeof(*dir_item) + name_len;
        dir_item = insert_with_overflow(trans, root, path, &key, data_size,
                                        name, name_len);
@@ -155,7 +160,6 @@ int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
        }
 
        leaf = path->nodes[0];
-       btrfs_cpu_key_to_disk(&disk_key, location);
        btrfs_set_dir_item_key(leaf, dir_item, &disk_key);
        btrfs_set_dir_type(leaf, dir_item, type);
        btrfs_set_dir_data_len(leaf, dir_item, 0);
@@ -172,29 +176,11 @@ second_insert:
                ret = 0;
                goto out_free;
        }
-       btrfs_release_path(root, path);
-
-       btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY);
-       key.offset = index;
-       dir_item = insert_with_overflow(trans, root, path, &key, data_size,
-                                       name, name_len);
-       if (IS_ERR(dir_item)) {
-               ret2 = PTR_ERR(dir_item);
-               goto out_free;
-       }
-       leaf = path->nodes[0];
-       btrfs_cpu_key_to_disk(&disk_key, location);
-       btrfs_set_dir_item_key(leaf, dir_item, &disk_key);
-       btrfs_set_dir_type(leaf, dir_item, type);
-       btrfs_set_dir_data_len(leaf, dir_item, 0);
-       btrfs_set_dir_name_len(leaf, dir_item, name_len);
-       btrfs_set_dir_transid(leaf, dir_item, trans->transid);
-       name_ptr = (unsigned long)(dir_item + 1);
-       write_extent_buffer(leaf, name, name_ptr, name_len);
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_release_path(path);
 
+       ret2 = btrfs_insert_delayed_dir_index(trans, root, name, name_len, dir,
+                                             &disk_key, type, index);
 out_free:
-
        btrfs_free_path(path);
        if (ret)
                return ret;