Commit 516e0cf7 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] JBD: implement t_jcb locking

Provide the designed locking around the transaction's t_jcb callback list.

It turns out that this is wholly redundant at present.
parent 8c379633
......@@ -607,10 +607,14 @@ void journal_commit_transaction(journal_t *journal)
unlock_journal(journal);
}
/* Call any callbacks that had been registered for handles in this
/*
* Call any callbacks that had been registered for handles in this
* transaction. It is up to the callback to free any allocated
* memory.
*
* The spinlocking (t_jcb_lock) here is surely unnecessary...
*/
spin_lock(&commit_transaction->t_jcb_lock);
if (!list_empty(&commit_transaction->t_jcb)) {
struct list_head *p, *n;
int error = is_journal_aborted(journal);
......@@ -620,9 +624,12 @@ void journal_commit_transaction(journal_t *journal)
jcb = list_entry(p, struct journal_callback, jcb_list);
list_del(p);
spin_unlock(&commit_transaction->t_jcb_lock);
jcb->jcb_func(jcb, error);
spin_lock(&commit_transaction->t_jcb_lock);
}
}
spin_unlock(&commit_transaction->t_jcb_lock);
lock_journal(journal);
......
......@@ -41,15 +41,15 @@
* processes trying to touch the journal while it is in transition.
*/
static transaction_t * get_transaction (journal_t * journal, int is_try)
static transaction_t *get_transaction(journal_t *journal)
{
transaction_t * transaction;
transaction = jbd_kmalloc (sizeof (transaction_t), GFP_NOFS);
transaction = jbd_kmalloc(sizeof(*transaction), GFP_NOFS);
if (!transaction)
return NULL;
memset (transaction, 0, sizeof (transaction_t));
memset(transaction, 0, sizeof(*transaction));
transaction->t_journal = journal;
transaction->t_state = T_RUNNING;
......@@ -120,7 +120,7 @@ static int start_this_handle(journal_t *journal, handle_t *handle)
repeat_locked:
if (!journal->j_running_transaction)
get_transaction(journal, 0);
get_transaction(journal);
/* @@@ Error? */
J_ASSERT(journal->j_running_transaction);
......@@ -1277,16 +1277,15 @@ void journal_forget (handle_t *handle, struct buffer_head *bh)
* and has the caller-specific data afterwards.
*/
void journal_callback_set(handle_t *handle,
void (*func)(struct journal_callback *jcb, int error),
struct journal_callback *jcb)
void (*func)(struct journal_callback *jcb, int error),
struct journal_callback *jcb)
{
lock_kernel();
spin_lock(&handle->h_transaction->t_jcb_lock);
list_add_tail(&jcb->jcb_list, &handle->h_jcb);
spin_unlock(&handle->h_transaction->t_jcb_lock);
jcb->jcb_func = func;
unlock_kernel();
}
/**
* int journal_stop() - complete a transaction
* @handle: tranaction to complete.
......@@ -1357,7 +1356,9 @@ int journal_stop(handle_t *handle)
}
/* Move callbacks from the handle to the transaction. */
spin_lock(&transaction->t_jcb_lock);
list_splice(&handle->h_jcb, &transaction->t_jcb);
spin_unlock(&transaction->t_jcb_lock);
/*
* If the handle is marked SYNC, we need to set another commit
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment