checkpoint.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/checkpoint.c
  3.  * 
  4.  * Written by Stephen C. Tweedie <sct@redhat.com>, 1999
  5.  *
  6.  * Copyright 1999 Red Hat Software --- All Rights Reserved
  7.  *
  8.  * This file is part of the Linux kernel and is made available under
  9.  * the terms of the GNU General Public License, version 2, or at your
  10.  * option, any later version, incorporated herein by reference.
  11.  *
  12.  * Checkpoint routines for the generic filesystem journaling code.  
  13.  * Part of the ext2fs journaling system.  
  14.  *
  15.  * Checkpointing is the process of ensuring that a section of the log is
  16.  * committed fully to disk, so that that portion of the log can be
  17.  * reused.
  18.  */
  19. #include <linux/sched.h>
  20. #include <linux/fs.h>
  21. #include <linux/jbd.h>
  22. #include <linux/errno.h>
  23. #include <linux/slab.h>
  24. #include <linux/locks.h>
  25. extern spinlock_t journal_datalist_lock;
  26. /*
  27.  * Unlink a buffer from a transaction. 
  28.  *
  29.  * Called with journal_datalist_lock held.
  30.  */
  31. static inline void __buffer_unlink(struct journal_head *jh)
  32. {
  33. transaction_t *transaction;
  34. transaction = jh->b_cp_transaction;
  35. jh->b_cp_transaction = NULL;
  36. jh->b_cpnext->b_cpprev = jh->b_cpprev;
  37. jh->b_cpprev->b_cpnext = jh->b_cpnext;
  38. if (transaction->t_checkpoint_list == jh)
  39. transaction->t_checkpoint_list = jh->b_cpnext;
  40. if (transaction->t_checkpoint_list == jh)
  41. transaction->t_checkpoint_list = NULL;
  42. }
  43. /*
  44.  * Try to release a checkpointed buffer from its transaction.
  45.  * Returns 1 if we released it.
  46.  * Requires journal_datalist_lock
  47.  */
  48. static int __try_to_free_cp_buf(struct journal_head *jh)
  49. {
  50. int ret = 0;
  51. struct buffer_head *bh = jh2bh(jh);
  52. if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) {
  53. JBUFFER_TRACE(jh, "remove from checkpoint list");
  54. __journal_remove_checkpoint(jh);
  55. __journal_remove_journal_head(bh);
  56. BUFFER_TRACE(bh, "release");
  57. /* BUF_LOCKED -> BUF_CLEAN (fwiw) */
  58. refile_buffer(bh);
  59. __brelse(bh);
  60. ret = 1;
  61. }
  62. return ret;
  63. }
  64. /*
  65.  * log_wait_for_space: wait until there is space in the journal.
  66.  *
  67.  * Called with the journal already locked, but it will be unlocked if we have
  68.  * to wait for a checkpoint to free up some space in the log.
  69.  */
  70. void log_wait_for_space(journal_t *journal, int nblocks)
  71. {
  72. while (log_space_left(journal) < nblocks) {
  73. if (journal->j_flags & JFS_ABORT)
  74. return;
  75. unlock_journal(journal);
  76. down(&journal->j_checkpoint_sem);
  77. lock_journal(journal);
  78. /* Test again, another process may have checkpointed
  79.  * while we were waiting for the checkpoint lock */
  80. if (log_space_left(journal) < nblocks) {
  81. log_do_checkpoint(journal, nblocks);
  82. }
  83. up(&journal->j_checkpoint_sem);
  84. }
  85. }
  86. /*
  87.  * Clean up a transaction's checkpoint list.  
  88.  *
  89.  * We wait for any pending IO to complete and make sure any clean
  90.  * buffers are removed from the transaction. 
  91.  *
  92.  * Return 1 if we performed any actions which might have destroyed the
  93.  * checkpoint.  (journal_remove_checkpoint() deletes the transaction when
  94.  * the last checkpoint buffer is cleansed)
  95.  *
  96.  * Called with the journal locked.
  97.  * Called with journal_datalist_lock held.
  98.  */
  99. static int __cleanup_transaction(journal_t *journal, transaction_t *transaction)
  100. {
  101. struct journal_head *jh, *next_jh, *last_jh;
  102. struct buffer_head *bh;
  103. int ret = 0;
  104. assert_spin_locked(&journal_datalist_lock);
  105. jh = transaction->t_checkpoint_list;
  106. if (!jh)
  107. return 0;
  108. last_jh = jh->b_cpprev;
  109. next_jh = jh;
  110. do {
  111. jh = next_jh;
  112. bh = jh2bh(jh);
  113. if (buffer_locked(bh)) {
  114. atomic_inc(&bh->b_count);
  115. spin_unlock(&journal_datalist_lock);
  116. unlock_journal(journal);
  117. wait_on_buffer(bh);
  118. /* the journal_head may have gone by now */
  119. BUFFER_TRACE(bh, "brelse");
  120. __brelse(bh);
  121. goto out_return_1;
  122. }
  123. if (jh->b_transaction != NULL) {
  124. transaction_t *transaction = jh->b_transaction;
  125. tid_t tid = transaction->t_tid;
  126. spin_unlock(&journal_datalist_lock);
  127. log_start_commit(journal, transaction);
  128. unlock_journal(journal);
  129. log_wait_commit(journal, tid);
  130. goto out_return_1;
  131. }
  132. /*
  133.  * We used to test for (jh->b_list != BUF_CLEAN) here.
  134.  * But unmap_underlying_metadata() can place buffer onto
  135.  * BUF_CLEAN. Since refile_buffer() no longer takes buffers
  136.  * off checkpoint lists, we cope with it here
  137.  */
  138. /*
  139.  * AKPM: I think the buffer_jdirty test is redundant - it
  140.  * shouldn't have NULL b_transaction?
  141.  */
  142. next_jh = jh->b_cpnext;
  143. if (!buffer_dirty(bh) && !buffer_jdirty(bh)) {
  144. BUFFER_TRACE(bh, "remove from checkpoint");
  145. __journal_remove_checkpoint(jh);
  146. __journal_remove_journal_head(bh);
  147. refile_buffer(bh);
  148. __brelse(bh);
  149. ret = 1;
  150. }
  151. jh = next_jh;
  152. } while (jh != last_jh);
  153. return ret;
  154. out_return_1:
  155. lock_journal(journal);
  156. spin_lock(&journal_datalist_lock);
  157. return 1;
  158. }
  159. #define NR_BATCH 64
  160. static void __flush_batch(struct buffer_head **bhs, int *batch_count)
  161. {
  162. int i;
  163. spin_unlock(&journal_datalist_lock);
  164. ll_rw_block(WRITE, *batch_count, bhs);
  165. run_task_queue(&tq_disk);
  166. spin_lock(&journal_datalist_lock);
  167. for (i = 0; i < *batch_count; i++) {
  168. struct buffer_head *bh = bhs[i];
  169. clear_bit(BH_JWrite, &bh->b_state);
  170. BUFFER_TRACE(bh, "brelse");
  171. __brelse(bh);
  172. }
  173. *batch_count = 0;
  174. }
  175. /*
  176.  * Try to flush one buffer from the checkpoint list to disk.
  177.  *
  178.  * Return 1 if something happened which requires us to abort the current
  179.  * scan of the checkpoint list.  
  180.  *
  181.  * Called with journal_datalist_lock held.
  182.  */
  183. static int __flush_buffer(journal_t *journal, struct journal_head *jh,
  184. struct buffer_head **bhs, int *batch_count,
  185. int *drop_count)
  186. {
  187. struct buffer_head *bh = jh2bh(jh);
  188. int ret = 0;
  189. if (buffer_dirty(bh) && !buffer_locked(bh) && jh->b_jlist == BJ_None) {
  190. J_ASSERT_JH(jh, jh->b_transaction == NULL);
  191. /*
  192.  * Important: we are about to write the buffer, and
  193.  * possibly block, while still holding the journal lock.
  194.  * We cannot afford to let the transaction logic start
  195.  * messing around with this buffer before we write it to
  196.  * disk, as that would break recoverability.  
  197.  */
  198. BUFFER_TRACE(bh, "queue");
  199. atomic_inc(&bh->b_count);
  200. J_ASSERT_BH(bh, !test_bit(BH_JWrite, &bh->b_state));
  201. set_bit(BH_JWrite, &bh->b_state);
  202. bhs[*batch_count] = bh;
  203. (*batch_count)++;
  204. if (*batch_count == NR_BATCH) {
  205. __flush_batch(bhs, batch_count);
  206. ret = 1;
  207. }
  208. } else {
  209. int last_buffer = 0;
  210. if (jh->b_cpnext == jh) {
  211. /* We may be about to drop the transaction.  Tell the
  212.  * caller that the lists have changed.
  213.  */
  214. last_buffer = 1;
  215. }
  216. if (__try_to_free_cp_buf(jh)) {
  217. (*drop_count)++;
  218. ret = last_buffer;
  219. }
  220. }
  221. return ret;
  222. }
  223. /*
  224.  * Perform an actual checkpoint.  We don't write out only enough to
  225.  * satisfy the current blocked requests: rather we submit a reasonably
  226.  * sized chunk of the outstanding data to disk at once for
  227.  * efficiency.  log_wait_for_space() will retry if we didn't free enough.
  228.  * 
  229.  * However, we _do_ take into account the amount requested so that once
  230.  * the IO has been queued, we can return as soon as enough of it has
  231.  * completed to disk.  
  232.  *
  233.  * The journal should be locked before calling this function.
  234.  */
  235. /* @@@ `nblocks' is unused.  Should it be used? */
  236. int log_do_checkpoint (journal_t *journal, int nblocks)
  237. {
  238. transaction_t *transaction, *last_transaction, *next_transaction;
  239. int result;
  240. int target;
  241. int batch_count = 0;
  242. struct buffer_head *bhs[NR_BATCH];
  243. jbd_debug(1, "Start checkpointn");
  244. /* 
  245.  * First thing: if there are any transactions in the log which
  246.  * don't need checkpointing, just eliminate them from the
  247.  * journal straight away.  
  248.  */
  249. result = cleanup_journal_tail(journal);
  250. jbd_debug(1, "cleanup_journal_tail returned %dn", result);
  251. if (result <= 0)
  252. return result;
  253. /*
  254.  * OK, we need to start writing disk blocks.  Try to free up a
  255.  * quarter of the log in a single checkpoint if we can.
  256.  */
  257. /*
  258.  * AKPM: check this code.  I had a feeling a while back that it
  259.  * degenerates into a busy loop at unmount time.
  260.  */
  261. target = (journal->j_last - journal->j_first) / 4;
  262. spin_lock(&journal_datalist_lock);
  263. repeat:
  264. transaction = journal->j_checkpoint_transactions;
  265. if (transaction == NULL)
  266. goto done;
  267. last_transaction = transaction->t_cpprev;
  268. next_transaction = transaction;
  269. do {
  270. struct journal_head *jh, *last_jh, *next_jh;
  271. int drop_count = 0;
  272. int cleanup_ret, retry = 0;
  273. transaction = next_transaction;
  274. next_transaction = transaction->t_cpnext;
  275. jh = transaction->t_checkpoint_list;
  276. last_jh = jh->b_cpprev;
  277. next_jh = jh;
  278. do {
  279. jh = next_jh;
  280. next_jh = jh->b_cpnext;
  281. retry = __flush_buffer(journal, jh, bhs, &batch_count,
  282. &drop_count);
  283. } while (jh != last_jh && !retry);
  284. if (batch_count) {
  285. __flush_batch(bhs, &batch_count);
  286. goto repeat;
  287. }
  288. if (retry)
  289. goto repeat;
  290. /*
  291.  * We have walked the whole transaction list without
  292.  * finding anything to write to disk.  We had better be
  293.  * able to make some progress or we are in trouble. 
  294.  */
  295. cleanup_ret = __cleanup_transaction(journal, transaction);
  296. J_ASSERT(drop_count != 0 || cleanup_ret != 0);
  297. goto repeat; /* __cleanup may have dropped lock */
  298. } while (transaction != last_transaction);
  299. done:
  300. spin_unlock(&journal_datalist_lock);
  301. result = cleanup_journal_tail(journal);
  302. if (result < 0)
  303. return result;
  304. return 0;
  305. }
  306. /*
  307.  * Check the list of checkpoint transactions for the journal to see if
  308.  * we have already got rid of any since the last update of the log tail
  309.  * in the journal superblock.  If so, we can instantly roll the
  310.  * superblock forward to remove those transactions from the log.
  311.  * 
  312.  * Return <0 on error, 0 on success, 1 if there was nothing to clean up.
  313.  * 
  314.  * Called with the journal lock held.
  315.  *
  316.  * This is the only part of the journaling code which really needs to be
  317.  * aware of transaction aborts.  Checkpointing involves writing to the
  318.  * main filesystem area rather than to the journal, so it can proceed
  319.  * even in abort state, but we must not update the journal superblock if
  320.  * we have an abort error outstanding.
  321.  */
  322. int cleanup_journal_tail(journal_t *journal)
  323. {
  324. transaction_t * transaction;
  325. tid_t first_tid;
  326. unsigned long blocknr, freed;
  327. /* OK, work out the oldest transaction remaining in the log, and
  328.  * the log block it starts at. 
  329.  * 
  330.  * If the log is now empty, we need to work out which is the
  331.  * next transaction ID we will write, and where it will
  332.  * start. */
  333. /* j_checkpoint_transactions needs locking */
  334. spin_lock(&journal_datalist_lock);
  335. transaction = journal->j_checkpoint_transactions;
  336. if (transaction) {
  337. first_tid = transaction->t_tid;
  338. blocknr = transaction->t_log_start;
  339. } else if ((transaction = journal->j_committing_transaction) != NULL) {
  340. first_tid = transaction->t_tid;
  341. blocknr = transaction->t_log_start;
  342. } else if ((transaction = journal->j_running_transaction) != NULL) {
  343. first_tid = transaction->t_tid;
  344. blocknr = journal->j_head;
  345. } else {
  346. first_tid = journal->j_transaction_sequence;
  347. blocknr = journal->j_head;
  348. }
  349. spin_unlock(&journal_datalist_lock);
  350. J_ASSERT (blocknr != 0);
  351. /* If the oldest pinned transaction is at the tail of the log
  352.            already then there's not much we can do right now. */
  353. if (journal->j_tail_sequence == first_tid)
  354. return 1;
  355. /* OK, update the superblock to recover the freed space.
  356.  * Physical blocks come first: have we wrapped beyond the end of
  357.  * the log?  */
  358. freed = blocknr - journal->j_tail;
  359. if (blocknr < journal->j_tail)
  360. freed = freed + journal->j_last - journal->j_first;
  361. jbd_debug(1,
  362.   "Cleaning journal tail from %d to %d (offset %lu), "
  363.   "freeing %lun",
  364.   journal->j_tail_sequence, first_tid, blocknr, freed);
  365. journal->j_free += freed;
  366. journal->j_tail_sequence = first_tid;
  367. journal->j_tail = blocknr;
  368. if (!(journal->j_flags & JFS_ABORT))
  369. journal_update_superblock(journal, 1);
  370. return 0;
  371. }
  372. /* Checkpoint list management */
  373. /*
  374.  * journal_clean_checkpoint_list
  375.  *
  376.  * Find all the written-back checkpoint buffers in the journal and release them.
  377.  *
  378.  * Called with the journal locked.
  379.  * Called with journal_datalist_lock held.
  380.  * Returns number of bufers reaped (for debug)
  381.  */
  382. int __journal_clean_checkpoint_list(journal_t *journal)
  383. {
  384. transaction_t *transaction, *last_transaction, *next_transaction;
  385. int ret = 0;
  386. transaction = journal->j_checkpoint_transactions;
  387. if (transaction == 0)
  388. goto out;
  389. last_transaction = transaction->t_cpprev;
  390. next_transaction = transaction;
  391. do {
  392. struct journal_head *jh;
  393. transaction = next_transaction;
  394. next_transaction = transaction->t_cpnext;
  395. jh = transaction->t_checkpoint_list;
  396. if (jh) {
  397. struct journal_head *last_jh = jh->b_cpprev;
  398. struct journal_head *next_jh = jh;
  399. do {
  400. jh = next_jh;
  401. next_jh = jh->b_cpnext;
  402. ret += __try_to_free_cp_buf(jh);
  403. } while (jh != last_jh);
  404. }
  405. } while (transaction != last_transaction);
  406. out:
  407. return ret;
  408. }
  409. /* 
  410.  * journal_remove_checkpoint: called after a buffer has been committed
  411.  * to disk (either by being write-back flushed to disk, or being
  412.  * committed to the log).
  413.  *
  414.  * We cannot safely clean a transaction out of the log until all of the
  415.  * buffer updates committed in that transaction have safely been stored
  416.  * elsewhere on disk.  To achieve this, all of the buffers in a
  417.  * transaction need to be maintained on the transaction's checkpoint
  418.  * list until they have been rewritten, at which point this function is
  419.  * called to remove the buffer from the existing transaction's
  420.  * checkpoint list.  
  421.  *
  422.  * This function is called with the journal locked.
  423.  * This function is called with journal_datalist_lock held.
  424.  */
  425. void __journal_remove_checkpoint(struct journal_head *jh)
  426. {
  427. transaction_t *transaction;
  428. journal_t *journal;
  429. JBUFFER_TRACE(jh, "entry");
  430. if ((transaction = jh->b_cp_transaction) == NULL) {
  431. JBUFFER_TRACE(jh, "not on transaction");
  432. goto out;
  433. }
  434. journal = transaction->t_journal;
  435. __buffer_unlink(jh);
  436. if (transaction->t_checkpoint_list != NULL)
  437. goto out;
  438. JBUFFER_TRACE(jh, "transaction has no more buffers");
  439. /* There is one special case to worry about: if we have just
  440.            pulled the buffer off a committing transaction's forget list,
  441.            then even if the checkpoint list is empty, the transaction
  442.            obviously cannot be dropped! */
  443. if (transaction == journal->j_committing_transaction) {
  444. JBUFFER_TRACE(jh, "belongs to committing transaction");
  445. goto out;
  446. }
  447. /* OK, that was the last buffer for the transaction: we can now
  448.    safely remove this transaction from the log */
  449. __journal_drop_transaction(journal, transaction);
  450. /* Just in case anybody was waiting for more transactions to be
  451.            checkpointed... */
  452. wake_up(&journal->j_wait_logspace);
  453. out:
  454. JBUFFER_TRACE(jh, "exit");
  455. }
  456. void journal_remove_checkpoint(struct journal_head *jh)
  457. {
  458. spin_lock(&journal_datalist_lock);
  459. __journal_remove_checkpoint(jh);
  460. spin_unlock(&journal_datalist_lock);
  461. }
  462. /*
  463.  * journal_insert_checkpoint: put a committed buffer onto a checkpoint
  464.  * list so that we know when it is safe to clean the transaction out of
  465.  * the log.
  466.  *
  467.  * Called with the journal locked.
  468.  * Called with journal_datalist_lock held.
  469.  */
  470. void __journal_insert_checkpoint(struct journal_head *jh, 
  471.        transaction_t *transaction)
  472. {
  473. JBUFFER_TRACE(jh, "entry");
  474. J_ASSERT_JH(jh, buffer_dirty(jh2bh(jh)) || buffer_jdirty(jh2bh(jh)));
  475. J_ASSERT_JH(jh, jh->b_cp_transaction == NULL);
  476. assert_spin_locked(&journal_datalist_lock);
  477. jh->b_cp_transaction = transaction;
  478. if (!transaction->t_checkpoint_list) {
  479. jh->b_cpnext = jh->b_cpprev = jh;
  480. } else {
  481. jh->b_cpnext = transaction->t_checkpoint_list;
  482. jh->b_cpprev = transaction->t_checkpoint_list->b_cpprev;
  483. jh->b_cpprev->b_cpnext = jh;
  484. jh->b_cpnext->b_cpprev = jh;
  485. }
  486. transaction->t_checkpoint_list = jh;
  487. }
  488. void journal_insert_checkpoint(struct journal_head *jh, 
  489.        transaction_t *transaction)
  490. {
  491. spin_lock(&journal_datalist_lock);
  492. __journal_insert_checkpoint(jh, transaction);
  493. spin_unlock(&journal_datalist_lock);
  494. }
  495. /*
  496.  * We've finished with this transaction structure: adios...
  497.  * 
  498.  * The transaction must have no links except for the checkpoint by this
  499.  * point.
  500.  *
  501.  * Called with the journal locked.
  502.  * Called with journal_datalist_lock held.
  503.  */
  504. void __journal_drop_transaction(journal_t *journal, transaction_t *transaction)
  505. {
  506. assert_spin_locked(&journal_datalist_lock);
  507. if (transaction->t_cpnext) {
  508. transaction->t_cpnext->t_cpprev = transaction->t_cpprev;
  509. transaction->t_cpprev->t_cpnext = transaction->t_cpnext;
  510. if (journal->j_checkpoint_transactions == transaction)
  511. journal->j_checkpoint_transactions =
  512. transaction->t_cpnext;
  513. if (journal->j_checkpoint_transactions == transaction)
  514. journal->j_checkpoint_transactions = NULL;
  515. }
  516. J_ASSERT (transaction->t_ilist == NULL);
  517. J_ASSERT (transaction->t_buffers == NULL);
  518. J_ASSERT (transaction->t_sync_datalist == NULL);
  519. J_ASSERT (transaction->t_async_datalist == NULL);
  520. J_ASSERT (transaction->t_forget == NULL);
  521. J_ASSERT (transaction->t_iobuf_list == NULL);
  522. J_ASSERT (transaction->t_shadow_list == NULL);
  523. J_ASSERT (transaction->t_log_list == NULL);
  524. J_ASSERT (transaction->t_checkpoint_list == NULL);
  525. J_ASSERT (transaction->t_updates == 0);
  526. J_ASSERT (transaction->t_journal->j_committing_transaction !=
  527. transaction);
  528. jbd_debug (1, "Dropping transaction %d, all donen", 
  529.    transaction->t_tid);
  530. kfree (transaction);
  531. }