]> git.hungrycats.org Git - linux/commitdiff
Revert "Btrfs: fix fsync log replay for inodes with a mix of regular refs and extrefs"
authorZygo Blaxell <zblaxell@serenity.furryterror.org>
Sun, 8 Mar 2015 04:56:01 +0000 (23:56 -0500)
committerZygo Blaxell <zblaxell@serenity.furryterror.org>
Sun, 8 Mar 2015 04:56:01 +0000 (23:56 -0500)
This reverts commit 99bc1632b2d56af01b340032359a57deaa16cfaa.

fs/btrfs/inode-item.c
fs/btrfs/tree-log.c

index 265e03c73f4daaea4ac1b69ab0a606c63f50895f..8ffa4783cbf438ed182e6f94e39711ded5207558 100644 (file)
@@ -344,7 +344,6 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                return -ENOMEM;
 
        path->leave_spinning = 1;
-       path->skip_release_on_error = 1;
        ret = btrfs_insert_empty_item(trans, root, path, &key,
                                      ins_len);
        if (ret == -EEXIST) {
@@ -363,12 +362,8 @@ int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans,
                ptr = (unsigned long)(ref + 1);
                ret = 0;
        } else if (ret < 0) {
-               if (ret == -EOVERFLOW) {
-                       if (find_name_in_backref(path, name, name_len, &ref))
-                               ret = -EEXIST;
-                       else
-                               ret = -EMLINK;
-               }
+               if (ret == -EOVERFLOW)
+                       ret = -EMLINK;
                goto out;
        } else {
                ref = btrfs_item_ptr(path->nodes[0], path->slots[0],
index 06dd8e9d45d6944485d9c58390e2f2303ffa48ea..0ac47555131c189f7ab518f793e35d9079d82aad 100644 (file)
@@ -453,13 +453,11 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans,
 insert:
        btrfs_release_path(path);
        /* try to insert the key into the destination tree */
-       path->skip_release_on_error = 1;
        ret = btrfs_insert_empty_item(trans, root, path,
                                      key, item_size);
-       path->skip_release_on_error = 0;
 
        /* make sure any existing item is the correct size */
-       if (ret == -EEXIST || ret == -EOVERFLOW) {
+       if (ret == -EEXIST) {
                u32 found_size;
                found_size = btrfs_item_size_nr(path->nodes[0],
                                                path->slots[0]);
@@ -858,7 +856,7 @@ out:
 static noinline int backref_in_log(struct btrfs_root *log,
                                   struct btrfs_key *key,
                                   u64 ref_objectid,
-                                  const char *name, int namelen)
+                                  char *name, int namelen)
 {
        struct btrfs_path *path;
        struct btrfs_inode_ref *ref;
@@ -1569,30 +1567,6 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans,
        return ret;
 }
 
-/*
- * Return true if an inode reference exists in the log for the given name,
- * inode and parent inode.
- */
-static bool name_in_log_ref(struct btrfs_root *log_root,
-                           const char *name, const int name_len,
-                           const u64 dirid, const u64 ino)
-{
-       struct btrfs_key search_key;
-
-       search_key.objectid = ino;
-       search_key.type = BTRFS_INODE_REF_KEY;
-       search_key.offset = dirid;
-       if (backref_in_log(log_root, &search_key, dirid, name, name_len))
-               return true;
-
-       search_key.type = BTRFS_INODE_EXTREF_KEY;
-       search_key.offset = btrfs_extref_hash(dirid, name, name_len);
-       if (backref_in_log(log_root, &search_key, dirid, name, name_len))
-               return true;
-
-       return false;
-}
-
 /*
  * take a single entry in a log directory item and replay it into
  * the subvolume.
@@ -1703,17 +1677,10 @@ out:
        return ret;
 
 insert:
-       if (name_in_log_ref(root->log_root, name, name_len,
-                           key->objectid, log_key.objectid)) {
-               /* The dentry will be added later. */
-               ret = 0;
-               update_size = false;
-               goto out;
-       }
        btrfs_release_path(path);
        ret = insert_one_name(trans, root, path, key->objectid, key->offset,
                              name, name_len, log_type, &log_key);
-       if (ret && ret != -ENOENT && ret != -EEXIST)
+       if (ret && ret != -ENOENT)
                goto out;
        update_size = false;
        ret = 0;