atomic_t log_commit[2];
        /* Used only for log trees of subvolumes, not for the log root tree */
        atomic_t log_batch;
+       /*
+        * Protected by the 'log_mutex' lock but can be read without holding
+        * that lock to avoid unnecessary lock contention, in which case it
+        * should be read using btrfs_get_root_log_transid() except if it's a
+        * log tree in which case it can be directly accessed. Updates to this
+        * field should always use btrfs_set_root_log_transid(), except for log
+        * trees where the field can be updated directly.
+        */
        int log_transid;
        /* No matter the commit succeeds or not*/
        int log_transid_committed;
        return root->root_key.objectid;
 }
 
+static inline int btrfs_get_root_log_transid(const struct btrfs_root *root)
+{
+       return READ_ONCE(root->log_transid);
+}
+
+static inline void btrfs_set_root_log_transid(struct btrfs_root *root, int log_transid)
+{
+       WRITE_ONCE(root->log_transid, log_transid);
+}
+
 static inline int btrfs_get_root_last_log_commit(const struct btrfs_root *root)
 {
        return READ_ONCE(root->last_log_commit);
 
        refcount_set(&root->refs, 1);
        atomic_set(&root->snapshot_force_cow, 0);
        atomic_set(&root->nr_swapfiles, 0);
-       root->log_transid = 0;
+       btrfs_set_root_log_transid(root, 0);
        root->log_transid_committed = -1;
        btrfs_set_root_last_log_commit(root, 0);
        root->anon_dev = 0;
 
        WARN_ON(root->log_root);
        root->log_root = log_root;
-       root->log_transid = 0;
+       btrfs_set_root_log_transid(root, 0);
        root->log_transid_committed = -1;
        btrfs_set_root_last_log_commit(root, 0);
        return 0;
 
 {
        spin_lock(&inode->lock);
        inode->last_trans = trans->transaction->transid;
-       inode->last_sub_trans = inode->root->log_transid;
+       inode->last_sub_trans = btrfs_get_root_log_transid(inode->root);
        inode->last_log_commit = inode->last_sub_trans - 1;
        spin_unlock(&inode->lock);
 }
 
        btrfs_set_root_node(&log->root_item, log->node);
        memcpy(&new_root_item, &log->root_item, sizeof(new_root_item));
 
-       root->log_transid++;
+       btrfs_set_root_log_transid(root, root->log_transid + 1);
        log->log_transid = root->log_transid;
        root->log_start_pid = 0;
        /*