Btrfs: fix deadlock with free space handling and user transactions
authorSage Weil <sage@newdream.net>
Tue, 29 Sep 2009 22:38:44 +0000 (18:38 -0400)
committerChris Mason <chris.mason@oracle.com>
Tue, 29 Sep 2009 23:50:07 +0000 (19:50 -0400)
If an ioctl-initiated transaction is open, we can't force a commit during
the free space checks in order to free up pinned extents or else we
deadlock.  Just ENOSPC instead.

A more satisfying solution that reserves space for the entire user
transaction up front is forthcoming...

Signed-off-by: Sage Weil <sage@newdream.net>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c

index a4b2b03cd682b74cb5417765c466bb1ea5647da5..d119c0388af1b22b6f39a50bb1e3f890106d6b64 100644 (file)
@@ -3168,7 +3168,7 @@ alloc:
                spin_unlock(&data_sinfo->lock);
 
                /* commit the current transaction and try again */
-               if (!committed) {
+               if (!committed && !root->fs_info->open_ioctl_trans) {
                        committed = 1;
                        trans = btrfs_join_transaction(root, 1);
                        if (!trans)