Btrfs: don't wait for all the writers circularly during the transaction commit
[pandora-kernel.git] / fs / btrfs / transaction.h
index 3c8e0d2..5cc77b0 100644 (file)
 
 struct btrfs_transaction {
        u64 transid;
+       /*
+        * total external writers(USERSPACE/START/ATTACH) in this
+        * transaction, it must be zero before the transaction is
+        * being committed
+        */
+       atomic_t num_extwriters;
        /*
         * total writers in this transaction, it must be zero before the
         * transaction can end
@@ -48,13 +54,22 @@ struct btrfs_transaction {
        int aborted;
 };
 
-enum btrfs_trans_type {
-       TRANS_START,
-       TRANS_JOIN,
-       TRANS_USERSPACE,
-       TRANS_JOIN_NOLOCK,
-       TRANS_ATTACH,
-};
+#define __TRANS_FREEZABLE      (1U << 0)
+
+#define __TRANS_USERSPACE      (1U << 8)
+#define __TRANS_START          (1U << 9)
+#define __TRANS_ATTACH         (1U << 10)
+#define __TRANS_JOIN           (1U << 11)
+#define __TRANS_JOIN_NOLOCK    (1U << 12)
+
+#define TRANS_USERSPACE                (__TRANS_USERSPACE | __TRANS_FREEZABLE)
+#define TRANS_START            (__TRANS_START | __TRANS_FREEZABLE)
+#define TRANS_ATTACH           (__TRANS_ATTACH)
+#define TRANS_JOIN             (__TRANS_JOIN | __TRANS_FREEZABLE)
+#define TRANS_JOIN_NOLOCK      (__TRANS_JOIN_NOLOCK)
+
+#define TRANS_EXTWRITERS       (__TRANS_USERSPACE | __TRANS_START |    \
+                                __TRANS_ATTACH)
 
 struct btrfs_trans_handle {
        u64 transid;
@@ -70,7 +85,7 @@ struct btrfs_trans_handle {
        short aborted;
        short adding_csums;
        bool allocating_chunk;
-       enum btrfs_trans_type type;
+       unsigned int type;
        /*
         * this root is only needed to validate that the root passed to
         * start_transaction is the same as the one passed to end_transaction.
@@ -123,7 +138,7 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
 
 int btrfs_add_dead_root(struct btrfs_root *root);
 int btrfs_defrag_root(struct btrfs_root *root);
-int btrfs_clean_old_snapshots(struct btrfs_root *root);
+int btrfs_clean_one_deleted_snapshot(struct btrfs_root *root);
 int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
                             struct btrfs_root *root);
 int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans,
@@ -146,5 +161,4 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
                                struct extent_io_tree *dirty_pages, int mark);
 int btrfs_transaction_blocked(struct btrfs_fs_info *info);
 int btrfs_transaction_in_commit(struct btrfs_fs_info *info);
-void put_transaction(struct btrfs_transaction *transaction);
 #endif