struct btrfs_fs_info *fs_info = trans->fs_info;
        int ret;
        struct btrfs_root *dev_root = fs_info->dev_root;
-       struct btrfs_path *path;
+       BTRFS_PATH_AUTO_FREE(path);
        struct btrfs_key key;
        struct extent_buffer *eb;
        struct btrfs_dev_replace_item *ptr;
        key.offset = 0;
 
        path = btrfs_alloc_path();
-       if (!path) {
-               ret = -ENOMEM;
-               goto out;
-       }
+       if (!path)
+               return -ENOMEM;
+
        ret = btrfs_search_slot(trans, dev_root, &key, path, -1, 1);
        if (ret < 0) {
                btrfs_warn(fs_info,
                           "error %d while searching for dev_replace item!",
                           ret);
-               goto out;
+               return ret;
        }
 
        if (ret == 0 &&
                        btrfs_warn(fs_info,
                                   "delete too small dev_replace item failed %d!",
                                   ret);
-                       goto out;
+                       return ret;
                }
                ret = 1;
        }
                if (ret < 0) {
                        btrfs_warn(fs_info,
                                   "insert dev_replace item failed %d!", ret);
-                       goto out;
+                       return ret;
                }
        }
 
                dev_replace->cursor_right);
        dev_replace->item_needs_writeback = 0;
        up_write(&dev_replace->rwsem);
-out:
-       btrfs_free_path(path);
 
        return ret;
 }