]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.suse/ocfs2-Support-nested-transactions.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.suse / ocfs2-Support-nested-transactions.patch
diff --git a/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Support-nested-transactions.patch b/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Support-nested-transactions.patch
new file mode 100644 (file)
index 0000000..2c03150
--- /dev/null
@@ -0,0 +1,53 @@
+From: Jan Kara <jack@suse.cz>
+References: fate#302681
+Subject: [PATCH 19/28] ocfs2: Support nested transactions
+Patch-mainline: 2.6.29?
+
+OCFS2 can easily support nested transactions. We just have to
+take care and not spoil statistics acquire semaphore unnecessarily.
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+---
+ fs/ocfs2/journal.c |   14 +++++++-------
+ 1 files changed, 7 insertions(+), 7 deletions(-)
+
+Index: linux-2.6.27/fs/ocfs2/journal.c
+===================================================================
+--- linux-2.6.27.orig/fs/ocfs2/journal.c       2008-10-24 11:40:35.000000000 +0200
++++ linux-2.6.27/fs/ocfs2/journal.c    2008-10-24 14:19:31.000000000 +0200
+@@ -256,11 +256,9 @@
+       BUG_ON(osb->journal->j_state == OCFS2_JOURNAL_FREE);
+       BUG_ON(max_buffs <= 0);
+-      /* JBD might support this, but our journalling code doesn't yet. */
+-      if (journal_current_handle()) {
+-              mlog(ML_ERROR, "Recursive transaction attempted!\n");
+-              BUG();
+-      }
++      /* Nested transaction? Just return the handle... */
++      if (journal_current_handle())
++              return jbd2_journal_start(journal, max_buffs);
+       down_read(&osb->journal->j_trans_barrier);
+@@ -285,16 +283,18 @@
+ int ocfs2_commit_trans(struct ocfs2_super *osb,
+                      handle_t *handle)
+ {
+-      int ret;
++      int ret, nested;
+       struct ocfs2_journal *journal = osb->journal;
+       BUG_ON(!handle);
++      nested = handle->h_ref > 1;
+       ret = jbd2_journal_stop(handle);
+       if (ret < 0)
+               mlog_errno(ret);
+-      up_read(&journal->j_trans_barrier);
++      if (!nested)
++              up_read(&journal->j_trans_barrier);
+       return ret;
+ }