Merge tag 'hwlock-v4.8' of git://github.com/andersson/remoteproc
[cascardo/linux.git] / include / linux / jbd2.h
index efb232c..dfaa1f4 100644 (file)
@@ -491,10 +491,6 @@ struct jbd2_journal_handle
 
        unsigned long           h_start_jiffies;
        unsigned int            h_requested_credits;
-
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-       struct lockdep_map      h_lockdep_map;
-#endif
 };
 
 
@@ -793,6 +789,7 @@ jbd2_time_diff(unsigned long start, unsigned long end)
  * @j_proc_entry: procfs entry for the jbd statistics directory
  * @j_stats: Overall statistics
  * @j_private: An opaque pointer to fs-private information.
+ * @j_trans_commit_map: Lockdep entity to track transaction commit dependencies
  */
 
 struct journal_s
@@ -1035,8 +1032,26 @@ struct journal_s
 
        /* Precomputed journal UUID checksum for seeding other checksums */
        __u32 j_csum_seed;
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+       /*
+        * Lockdep entity to track transaction commit dependencies. Handles
+        * hold this "lock" for read, when we wait for commit, we acquire the
+        * "lock" for writing. This matches the properties of jbd2 journalling
+        * where the running transaction has to wait for all handles to be
+        * dropped to commit that transaction and also acquiring a handle may
+        * require transaction commit to finish.
+        */
+       struct lockdep_map      j_trans_commit_map;
+#endif
 };
 
+#define jbd2_might_wait_for_commit(j) \
+       do { \
+               rwsem_acquire(&j->j_trans_commit_map, 0, 0, _THIS_IP_); \
+               rwsem_release(&j->j_trans_commit_map, 1, _THIS_IP_); \
+       } while (0)
+
 /* journal feature predicate functions */
 #define JBD2_FEATURE_COMPAT_FUNCS(name, flagname) \
 static inline bool jbd2_has_feature_##name(journal_t *j) \