diff options
Diffstat (limited to 'fs/btrfs/dir-item.c')
| -rw-r--r-- | fs/btrfs/dir-item.c | 34 | 
1 files changed, 10 insertions, 24 deletions
diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c index c62f02f6ae6..f53fb3847c9 100644 --- a/fs/btrfs/dir-item.c +++ b/fs/btrfs/dir-item.c @@ -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 = dir->i_ino;  	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); @@ -174,27 +178,9 @@ second_insert:  	}  	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); - +	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;  |