btrfs: handle btrfs_record_root_in_trans failure in btrfs_delete_subvolume
[platform/kernel/linux-rpi.git] / fs / btrfs / inode.c
index 18408b9..1a34975 100644 (file)
@@ -4329,7 +4329,11 @@ int btrfs_delete_subvolume(struct inode *dir, struct dentry *dentry)
                goto out_end_trans;
        }
 
-       btrfs_record_root_in_trans(trans, dest);
+       ret = btrfs_record_root_in_trans(trans, dest);
+       if (ret) {
+               btrfs_abort_transaction(trans, ret);
+               goto out_end_trans;
+       }
 
        memset(&dest->root_item.drop_progress, 0,
                sizeof(dest->root_item.drop_progress));
@@ -8413,15 +8417,11 @@ again:
                 * for the finish_ordered_io
                 */
                if (TestClearPagePrivate2(page)) {
-                       struct btrfs_ordered_inode_tree *tree;
-
-                       tree = &inode->ordered_tree;
-
-                       spin_lock_irq(&tree->lock);
+                       spin_lock_irq(&inode->ordered_tree.lock);
                        set_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags);
                        ordered->truncated_len = min(ordered->truncated_len,
                                                     start - ordered->file_offset);
-                       spin_unlock_irq(&tree->lock);
+                       spin_unlock_irq(&inode->ordered_tree.lock);
 
                        if (btrfs_dec_test_ordered_pending(inode, &ordered,
                                                           start,
@@ -9112,8 +9112,11 @@ static int btrfs_rename_exchange(struct inode *old_dir,
                goto out_notrans;
        }
 
-       if (dest != root)
-               btrfs_record_root_in_trans(trans, dest);
+       if (dest != root) {
+               ret = btrfs_record_root_in_trans(trans, dest);
+               if (ret)
+                       goto out_fail;
+       }
 
        /*
         * We need to find a free sequence number both in the source and
@@ -9417,8 +9420,11 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                goto out_notrans;
        }
 
-       if (dest != root)
-               btrfs_record_root_in_trans(trans, dest);
+       if (dest != root) {
+               ret = btrfs_record_root_in_trans(trans, dest);
+               if (ret)
+                       goto out_fail;
+       }
 
        ret = btrfs_set_inode_index(BTRFS_I(new_dir), &index);
        if (ret)