handle_t *journal_start(journal_t *journal, int nblocks) { handle_t *handle = journal_current_handle(); int err; if (!journal) return ERR_PTR(-EROFS); if (handle) { J_ASSERT(handle->h_transaction->t_journal == journal); handle->h_ref++; return handle; } handle = new_handle(nblocks); if (!handle) return ERR_PTR(-ENOMEM); current->journal_info = handle; err = start_this_handle(journal, handle); if (err < 0) { jbd_free_handle(handle); current->journal_info = NULL; handle = ERR_PTR(err); goto out; } out: return handle; }
int jbd2__journal_restart(handle_t *handle, int nblocks, gfp_t gfp_mask) { transaction_t *transaction = handle->h_transaction; journal_t *journal = transaction->t_journal; tid_t tid; int need_to_start, ret; if (is_handle_aborted(handle)) return 0; J_ASSERT(atomic_read(&transaction->t_updates) > 0); J_ASSERT(journal_current_handle() == handle); read_lock(&journal->j_state_lock); spin_lock(&transaction->t_handle_lock); atomic_sub(handle->h_buffer_credits, &transaction->t_outstanding_credits); if (atomic_dec_and_test(&transaction->t_updates)) wake_up(&journal->j_wait_updates); spin_unlock(&transaction->t_handle_lock); jbd_debug(2, "restarting handle %p\n", handle); tid = transaction->t_tid; need_to_start = !tid_geq(journal->j_commit_request, tid); read_unlock(&journal->j_state_lock); if (need_to_start) jbd2_log_start_commit(journal, tid); lock_map_release(&handle->h_lockdep_map); handle->h_buffer_credits = nblocks; ret = start_this_handle(journal, handle, gfp_mask); return ret; }
handle_t *journal_start (journal_t *journal, int nblocks) { handle_t *handle; int err; if (!journal) return ERR_PTR(-EROFS); if (current->j_handle) { handle = current->j_handle; J_ASSERT(handle->h_transaction->t_journal == journal); handle->h_ref++; return handle; } handle = kmalloc (sizeof (handle_t), GFP_KERNEL); if (!handle) return ERR_PTR(-ENOMEM); memset (handle, 0, sizeof (handle_t)); handle->h_buffer_credits = nblocks; handle->h_ref = 1; current->j_handle = handle; /* Our outdated kernel doesn't have this locking support yet. * hope we don't need it. -mcomb */ // current->fs_locks++; err = start_this_handle(journal, handle); if (err < 0) { kfree(handle); current->j_handle = NULL; // current->fs_locks--; return ERR_PTR(err); } return handle; }
int journal_restart(handle_t *handle, int nblocks) { transaction_t *transaction = handle->h_transaction; journal_t *journal = transaction->t_journal; /* First unlink the handle from its current transaction, and * start the commit on that. */ J_ASSERT (transaction->t_updates > 0); J_ASSERT (current->j_handle == handle); transaction->t_outstanding_credits -= handle->h_buffer_credits; transaction->t_updates--; if (!transaction->t_updates) wake_up(&journal->j_wait_updates); jfs_debug(2, "restarting handle %p\n", handle); log_start_commit(journal, transaction); handle->h_buffer_credits = nblocks; return start_this_handle(journal, handle); }
int journal_restart(handle_t *handle, int nblocks) { transaction_t *transaction = handle->h_transaction; journal_t *journal = transaction->t_journal; int ret; /* If we've had an abort of any type, don't even think about * actually doing the restart! */ if (is_handle_aborted(handle)) return 0; /* * First unlink the handle from its current transaction, and start the * commit on that. */ J_ASSERT(transaction->t_updates > 0); J_ASSERT(journal_current_handle() == handle); spin_lock(&journal->j_state_lock); spin_lock(&transaction->t_handle_lock); transaction->t_outstanding_credits -= handle->h_buffer_credits; transaction->t_updates--; if (!transaction->t_updates) wake_up(&journal->j_wait_updates); spin_unlock(&transaction->t_handle_lock); jbd_debug(2, "restarting handle %p\n", handle); __log_start_commit(journal, transaction->t_tid); spin_unlock(&journal->j_state_lock); lock_map_release(&handle->h_lockdep_map); handle->h_buffer_credits = nblocks; ret = start_this_handle(journal, handle); return ret; }