diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-08-18 18:38:03 +0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-08-18 18:38:03 +0400 |
commit | 81d86e1b70961f4816f961875e0c706b0954acad (patch) | |
tree | ac69ce2e8d174260770d1a84d7d8fe910939c923 /fs/btrfs/tree-log.c | |
parent | 9a4327ca1f45f82edad7dc0a4e52ce9316e0950c (diff) | |
parent | f1e490a7ebe41e06324abbbcd86005b0af02a375 (diff) | |
download | linux-81d86e1b70961f4816f961875e0c706b0954acad.tar.xz |
Merge branch 'btrfs-3.0' into for-linus
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r-- | fs/btrfs/tree-log.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index babee65f8eda..786639fca067 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -799,14 +799,15 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, struct extent_buffer *eb, int slot, struct btrfs_key *key) { - struct inode *dir; - int ret; struct btrfs_inode_ref *ref; + struct btrfs_dir_item *di; + struct inode *dir; struct inode *inode; - char *name; - int namelen; unsigned long ref_ptr; unsigned long ref_end; + char *name; + int namelen; + int ret; int search_done = 0; /* @@ -909,6 +910,25 @@ again: } 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 our name */ ret = btrfs_add_link(trans, dir, inode, name, namelen, 0, |