btrfs: introduce a FORCE_COMMIT_TRANS flush operation
authorJosef Bacik <josef@toxicpanda.com>
Fri, 9 Oct 2020 13:28:21 +0000 (09:28 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:58:58 +0000 (22:58 +0100)
Solely for preemptive flushing, we want to be able to force the
transaction commit without any of the ambiguity of
may_commit_transaction().  This is because may_commit_transaction()
checks tickets and such, and in preemptive flushing we already know
it'll be helpful, so use this to keep the code nice and clean and
straightforward.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
[ add comment ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h
fs/btrfs/space-info.c
include/trace/events/btrfs.h

index 7d8660227520ec7060f0ee12bd06d25759aed298..90726954b883d6d270d1715c9ee778756a75654c 100644 (file)
@@ -2740,6 +2740,7 @@ enum btrfs_flush_state {
        ALLOC_CHUNK_FORCE       =       8,
        RUN_DELAYED_IPUTS       =       9,
        COMMIT_TRANS            =       10,
+       FORCE_COMMIT_TRANS      =       11,
 };
 
 int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
index 711beacd75d60f43544ee001e0e85d7062a52aa8..e677b5451f82df3cd98da756772577d5cdb730ca 100644 (file)
  *     be freed, plus any delayed work we may not have gotten rid of in the case
  *     of metadata.
  *
+ *   FORCE_COMMIT_TRANS
+ *     For use by the preemptive flusher.  We use this to bypass the ticketing
+ *     checks in may_commit_transaction, as we have more information about the
+ *     overall state of the system and may want to commit the transaction ahead
+ *     of actual ENOSPC conditions.
+ *
  * OVERCOMMIT
  *
  *   Because we hold so many reservations for metadata we will allow you to
@@ -735,6 +741,14 @@ static void flush_space(struct btrfs_fs_info *fs_info,
        case COMMIT_TRANS:
                ret = may_commit_transaction(fs_info, space_info);
                break;
+       case FORCE_COMMIT_TRANS:
+               trans = btrfs_join_transaction(root);
+               if (IS_ERR(trans)) {
+                       ret = PTR_ERR(trans);
+                       break;
+               }
+               ret = btrfs_commit_transaction(trans);
+               break;
        default:
                ret = -ENOSPC;
                break;
index b0ea2a108be3e1a24ba598f728389baa4021a77b..8a7c163907a211cf6f06ec8f4d620c0944db2341 100644 (file)
@@ -99,7 +99,8 @@ struct btrfs_space_info;
        EM( ALLOC_CHUNK,                "ALLOC_CHUNK")                  \
        EM( ALLOC_CHUNK_FORCE,          "ALLOC_CHUNK_FORCE")            \
        EM( RUN_DELAYED_IPUTS,          "RUN_DELAYED_IPUTS")            \
-       EMe(COMMIT_TRANS,               "COMMIT_TRANS")
+       EM( COMMIT_TRANS,               "COMMIT_TRANS")                 \
+       EMe(FORCE_COMMIT_TRANS,         "FORCE_COMMIT_TRANS")
 
 /*
  * First define the enums in the above macros to be exported to userspace via