|
@@ -799,14 +799,15 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
|
|
struct extent_buffer *eb, int slot,
|
|
struct extent_buffer *eb, int slot,
|
|
struct btrfs_key *key)
|
|
struct btrfs_key *key)
|
|
{
|
|
{
|
|
- struct inode *dir;
|
|
|
|
- int ret;
|
|
|
|
struct btrfs_inode_ref *ref;
|
|
struct btrfs_inode_ref *ref;
|
|
|
|
+ struct btrfs_dir_item *di;
|
|
|
|
+ struct inode *dir;
|
|
struct inode *inode;
|
|
struct inode *inode;
|
|
- char *name;
|
|
|
|
- int namelen;
|
|
|
|
unsigned long ref_ptr;
|
|
unsigned long ref_ptr;
|
|
unsigned long ref_end;
|
|
unsigned long ref_end;
|
|
|
|
+ char *name;
|
|
|
|
+ int namelen;
|
|
|
|
+ int ret;
|
|
int search_done = 0;
|
|
int search_done = 0;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -909,6 +910,25 @@ again:
|
|
}
|
|
}
|
|
btrfs_release_path(path);
|
|
btrfs_release_path(path);
|
|
|
|
|
|
|
|
+ /* look for a conflicting sequence number */
|
|
|
|
+ di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
|
|
|
|
+ btrfs_inode_ref_index(eb, ref),
|
|
|
|
+ name, namelen, 0);
|
|
|
|
+ if (di && !IS_ERR(di)) {
|
|
|
|
+ ret = drop_one_dir_item(trans, root, path, dir, di);
|
|
|
|
+ BUG_ON(ret);
|
|
|
|
+ }
|
|
|
|
+ btrfs_release_path(path);
|
|
|
|
+
|
|
|
|
+ /* look for a conflicing name */
|
|
|
|
+ di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
|
|
|
|
+ name, namelen, 0);
|
|
|
|
+ if (di && !IS_ERR(di)) {
|
|
|
|
+ ret = drop_one_dir_item(trans, root, path, dir, di);
|
|
|
|
+ BUG_ON(ret);
|
|
|
|
+ }
|
|
|
|
+ btrfs_release_path(path);
|
|
|
|
+
|
|
insert:
|
|
insert:
|
|
/* insert our name */
|
|
/* insert our name */
|
|
ret = btrfs_add_link(trans, dir, inode, name, namelen, 0,
|
|
ret = btrfs_add_link(trans, dir, inode, name, namelen, 0,
|