diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-05-04 10:00:16 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-05-04 10:00:16 -0400 |
commit | 3a20ac2c52b1317f5a5f0bd9cd3cbe8495ddd026 (patch) | |
tree | 9a912f2609cefb9698b5cce09cd240bd6dbd09fb /fs/jbd | |
parent | 18cc8d8d9b74c446832336d8f6e1afb145f9431b (diff) | |
parent | 3e5b50165fd0be080044586f43fcdd460ed27610 (diff) |
Merge branch 'fix/pcm-jiffies-check' into fix/asoc
Diffstat (limited to 'fs/jbd')
-rw-r--r-- | fs/jbd/commit.c | 30 | ||||
-rw-r--r-- | fs/jbd/journal.c | 51 | ||||
-rw-r--r-- | fs/jbd/revoke.c | 44 | ||||
-rw-r--r-- | fs/jbd/transaction.c | 2 |
4 files changed, 88 insertions, 39 deletions
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c index 3fbffb1ea714..06560c520f49 100644 --- a/fs/jbd/commit.c +++ b/fs/jbd/commit.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
23 | #include <linux/bio.h> | ||
23 | 24 | ||
24 | /* | 25 | /* |
25 | * Default IO end handler for temporary BJ_IO buffer_heads. | 26 | * Default IO end handler for temporary BJ_IO buffer_heads. |
@@ -171,14 +172,15 @@ static int journal_write_commit_record(journal_t *journal, | |||
171 | return (ret == -EIO); | 172 | return (ret == -EIO); |
172 | } | 173 | } |
173 | 174 | ||
174 | static void journal_do_submit_data(struct buffer_head **wbuf, int bufs) | 175 | static void journal_do_submit_data(struct buffer_head **wbuf, int bufs, |
176 | int write_op) | ||
175 | { | 177 | { |
176 | int i; | 178 | int i; |
177 | 179 | ||
178 | for (i = 0; i < bufs; i++) { | 180 | for (i = 0; i < bufs; i++) { |
179 | wbuf[i]->b_end_io = end_buffer_write_sync; | 181 | wbuf[i]->b_end_io = end_buffer_write_sync; |
180 | /* We use-up our safety reference in submit_bh() */ | 182 | /* We use-up our safety reference in submit_bh() */ |
181 | submit_bh(WRITE, wbuf[i]); | 183 | submit_bh(write_op, wbuf[i]); |
182 | } | 184 | } |
183 | } | 185 | } |
184 | 186 | ||
@@ -186,7 +188,8 @@ static void journal_do_submit_data(struct buffer_head **wbuf, int bufs) | |||
186 | * Submit all the data buffers to disk | 188 | * Submit all the data buffers to disk |
187 | */ | 189 | */ |
188 | static int journal_submit_data_buffers(journal_t *journal, | 190 | static int journal_submit_data_buffers(journal_t *journal, |
189 | transaction_t *commit_transaction) | 191 | transaction_t *commit_transaction, |
192 | int write_op) | ||
190 | { | 193 | { |
191 | struct journal_head *jh; | 194 | struct journal_head *jh; |
192 | struct buffer_head *bh; | 195 | struct buffer_head *bh; |
@@ -225,7 +228,7 @@ write_out_data: | |||
225 | BUFFER_TRACE(bh, "needs blocking lock"); | 228 | BUFFER_TRACE(bh, "needs blocking lock"); |
226 | spin_unlock(&journal->j_list_lock); | 229 | spin_unlock(&journal->j_list_lock); |
227 | /* Write out all data to prevent deadlocks */ | 230 | /* Write out all data to prevent deadlocks */ |
228 | journal_do_submit_data(wbuf, bufs); | 231 | journal_do_submit_data(wbuf, bufs, write_op); |
229 | bufs = 0; | 232 | bufs = 0; |
230 | lock_buffer(bh); | 233 | lock_buffer(bh); |
231 | spin_lock(&journal->j_list_lock); | 234 | spin_lock(&journal->j_list_lock); |
@@ -256,7 +259,7 @@ write_out_data: | |||
256 | jbd_unlock_bh_state(bh); | 259 | jbd_unlock_bh_state(bh); |
257 | if (bufs == journal->j_wbufsize) { | 260 | if (bufs == journal->j_wbufsize) { |
258 | spin_unlock(&journal->j_list_lock); | 261 | spin_unlock(&journal->j_list_lock); |
259 | journal_do_submit_data(wbuf, bufs); | 262 | journal_do_submit_data(wbuf, bufs, write_op); |
260 | bufs = 0; | 263 | bufs = 0; |
261 | goto write_out_data; | 264 | goto write_out_data; |
262 | } | 265 | } |
@@ -286,7 +289,7 @@ write_out_data: | |||
286 | } | 289 | } |
287 | } | 290 | } |
288 | spin_unlock(&journal->j_list_lock); | 291 | spin_unlock(&journal->j_list_lock); |
289 | journal_do_submit_data(wbuf, bufs); | 292 | journal_do_submit_data(wbuf, bufs, write_op); |
290 | 293 | ||
291 | return err; | 294 | return err; |
292 | } | 295 | } |
@@ -315,6 +318,7 @@ void journal_commit_transaction(journal_t *journal) | |||
315 | int first_tag = 0; | 318 | int first_tag = 0; |
316 | int tag_flag; | 319 | int tag_flag; |
317 | int i; | 320 | int i; |
321 | int write_op = WRITE; | ||
318 | 322 | ||
319 | /* | 323 | /* |
320 | * First job: lock down the current transaction and wait for | 324 | * First job: lock down the current transaction and wait for |
@@ -347,6 +351,13 @@ void journal_commit_transaction(journal_t *journal) | |||
347 | spin_lock(&journal->j_state_lock); | 351 | spin_lock(&journal->j_state_lock); |
348 | commit_transaction->t_state = T_LOCKED; | 352 | commit_transaction->t_state = T_LOCKED; |
349 | 353 | ||
354 | /* | ||
355 | * Use plugged writes here, since we want to submit several before | ||
356 | * we unplug the device. We don't do explicit unplugging in here, | ||
357 | * instead we rely on sync_buffer() doing the unplug for us. | ||
358 | */ | ||
359 | if (commit_transaction->t_synchronous_commit) | ||
360 | write_op = WRITE_SYNC_PLUG; | ||
350 | spin_lock(&commit_transaction->t_handle_lock); | 361 | spin_lock(&commit_transaction->t_handle_lock); |
351 | while (commit_transaction->t_updates) { | 362 | while (commit_transaction->t_updates) { |
352 | DEFINE_WAIT(wait); | 363 | DEFINE_WAIT(wait); |
@@ -431,7 +442,8 @@ void journal_commit_transaction(journal_t *journal) | |||
431 | * Now start flushing things to disk, in the order they appear | 442 | * Now start flushing things to disk, in the order they appear |
432 | * on the transaction lists. Data blocks go first. | 443 | * on the transaction lists. Data blocks go first. |
433 | */ | 444 | */ |
434 | err = journal_submit_data_buffers(journal, commit_transaction); | 445 | err = journal_submit_data_buffers(journal, commit_transaction, |
446 | write_op); | ||
435 | 447 | ||
436 | /* | 448 | /* |
437 | * Wait for all previously submitted IO to complete. | 449 | * Wait for all previously submitted IO to complete. |
@@ -490,7 +502,7 @@ void journal_commit_transaction(journal_t *journal) | |||
490 | err = 0; | 502 | err = 0; |
491 | } | 503 | } |
492 | 504 | ||
493 | journal_write_revoke_records(journal, commit_transaction); | 505 | journal_write_revoke_records(journal, commit_transaction, write_op); |
494 | 506 | ||
495 | /* | 507 | /* |
496 | * If we found any dirty or locked buffers, then we should have | 508 | * If we found any dirty or locked buffers, then we should have |
@@ -660,7 +672,7 @@ start_journal_io: | |||
660 | clear_buffer_dirty(bh); | 672 | clear_buffer_dirty(bh); |
661 | set_buffer_uptodate(bh); | 673 | set_buffer_uptodate(bh); |
662 | bh->b_end_io = journal_end_buffer_io_sync; | 674 | bh->b_end_io = journal_end_buffer_io_sync; |
663 | submit_bh(WRITE, bh); | 675 | submit_bh(write_op, bh); |
664 | } | 676 | } |
665 | cond_resched(); | 677 | cond_resched(); |
666 | 678 | ||
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 9e4fa52d7dc8..737f7246a4b5 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
@@ -427,7 +427,7 @@ int __log_space_left(journal_t *journal) | |||
427 | } | 427 | } |
428 | 428 | ||
429 | /* | 429 | /* |
430 | * Called under j_state_lock. Returns true if a transaction was started. | 430 | * Called under j_state_lock. Returns true if a transaction commit was started. |
431 | */ | 431 | */ |
432 | int __log_start_commit(journal_t *journal, tid_t target) | 432 | int __log_start_commit(journal_t *journal, tid_t target) |
433 | { | 433 | { |
@@ -495,7 +495,8 @@ int journal_force_commit_nested(journal_t *journal) | |||
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Start a commit of the current running transaction (if any). Returns true | 497 | * Start a commit of the current running transaction (if any). Returns true |
498 | * if a transaction was started, and fills its tid in at *ptid | 498 | * if a transaction is going to be committed (or is currently already |
499 | * committing), and fills its tid in at *ptid | ||
499 | */ | 500 | */ |
500 | int journal_start_commit(journal_t *journal, tid_t *ptid) | 501 | int journal_start_commit(journal_t *journal, tid_t *ptid) |
501 | { | 502 | { |
@@ -505,15 +506,19 @@ int journal_start_commit(journal_t *journal, tid_t *ptid) | |||
505 | if (journal->j_running_transaction) { | 506 | if (journal->j_running_transaction) { |
506 | tid_t tid = journal->j_running_transaction->t_tid; | 507 | tid_t tid = journal->j_running_transaction->t_tid; |
507 | 508 | ||
508 | ret = __log_start_commit(journal, tid); | 509 | __log_start_commit(journal, tid); |
509 | if (ret && ptid) | 510 | /* There's a running transaction and we've just made sure |
511 | * it's commit has been scheduled. */ | ||
512 | if (ptid) | ||
510 | *ptid = tid; | 513 | *ptid = tid; |
511 | } else if (journal->j_committing_transaction && ptid) { | 514 | ret = 1; |
515 | } else if (journal->j_committing_transaction) { | ||
512 | /* | 516 | /* |
513 | * If ext3_write_super() recently started a commit, then we | 517 | * If ext3_write_super() recently started a commit, then we |
514 | * have to wait for completion of that transaction | 518 | * have to wait for completion of that transaction |
515 | */ | 519 | */ |
516 | *ptid = journal->j_committing_transaction->t_tid; | 520 | if (ptid) |
521 | *ptid = journal->j_committing_transaction->t_tid; | ||
517 | ret = 1; | 522 | ret = 1; |
518 | } | 523 | } |
519 | spin_unlock(&journal->j_state_lock); | 524 | spin_unlock(&journal->j_state_lock); |
@@ -632,6 +637,8 @@ struct journal_head *journal_get_descriptor_buffer(journal_t *journal) | |||
632 | return NULL; | 637 | return NULL; |
633 | 638 | ||
634 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 639 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
640 | if (!bh) | ||
641 | return NULL; | ||
635 | lock_buffer(bh); | 642 | lock_buffer(bh); |
636 | memset(bh->b_data, 0, journal->j_blocksize); | 643 | memset(bh->b_data, 0, journal->j_blocksize); |
637 | set_buffer_uptodate(bh); | 644 | set_buffer_uptodate(bh); |
@@ -728,9 +735,7 @@ journal_t * journal_init_dev(struct block_device *bdev, | |||
728 | if (!journal->j_wbuf) { | 735 | if (!journal->j_wbuf) { |
729 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 736 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
730 | __func__); | 737 | __func__); |
731 | kfree(journal); | 738 | goto out_err; |
732 | journal = NULL; | ||
733 | goto out; | ||
734 | } | 739 | } |
735 | journal->j_dev = bdev; | 740 | journal->j_dev = bdev; |
736 | journal->j_fs_dev = fs_dev; | 741 | journal->j_fs_dev = fs_dev; |
@@ -738,11 +743,19 @@ journal_t * journal_init_dev(struct block_device *bdev, | |||
738 | journal->j_maxlen = len; | 743 | journal->j_maxlen = len; |
739 | 744 | ||
740 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); | 745 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); |
741 | J_ASSERT(bh != NULL); | 746 | if (!bh) { |
747 | printk(KERN_ERR | ||
748 | "%s: Cannot get buffer for journal superblock\n", | ||
749 | __func__); | ||
750 | goto out_err; | ||
751 | } | ||
742 | journal->j_sb_buffer = bh; | 752 | journal->j_sb_buffer = bh; |
743 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 753 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
744 | out: | 754 | |
745 | return journal; | 755 | return journal; |
756 | out_err: | ||
757 | kfree(journal); | ||
758 | return NULL; | ||
746 | } | 759 | } |
747 | 760 | ||
748 | /** | 761 | /** |
@@ -782,8 +795,7 @@ journal_t * journal_init_inode (struct inode *inode) | |||
782 | if (!journal->j_wbuf) { | 795 | if (!journal->j_wbuf) { |
783 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 796 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
784 | __func__); | 797 | __func__); |
785 | kfree(journal); | 798 | goto out_err; |
786 | return NULL; | ||
787 | } | 799 | } |
788 | 800 | ||
789 | err = journal_bmap(journal, 0, &blocknr); | 801 | err = journal_bmap(journal, 0, &blocknr); |
@@ -791,16 +803,23 @@ journal_t * journal_init_inode (struct inode *inode) | |||
791 | if (err) { | 803 | if (err) { |
792 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", | 804 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", |
793 | __func__); | 805 | __func__); |
794 | kfree(journal); | 806 | goto out_err; |
795 | return NULL; | ||
796 | } | 807 | } |
797 | 808 | ||
798 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 809 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
799 | J_ASSERT(bh != NULL); | 810 | if (!bh) { |
811 | printk(KERN_ERR | ||
812 | "%s: Cannot get buffer for journal superblock\n", | ||
813 | __func__); | ||
814 | goto out_err; | ||
815 | } | ||
800 | journal->j_sb_buffer = bh; | 816 | journal->j_sb_buffer = bh; |
801 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 817 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
802 | 818 | ||
803 | return journal; | 819 | return journal; |
820 | out_err: | ||
821 | kfree(journal); | ||
822 | return NULL; | ||
804 | } | 823 | } |
805 | 824 | ||
806 | /* | 825 | /* |
diff --git a/fs/jbd/revoke.c b/fs/jbd/revoke.c index c7bd649bbbdc..da6cd9bdaabc 100644 --- a/fs/jbd/revoke.c +++ b/fs/jbd/revoke.c | |||
@@ -55,6 +55,25 @@ | |||
55 | * need do nothing. | 55 | * need do nothing. |
56 | * RevokeValid set, Revoked set: | 56 | * RevokeValid set, Revoked set: |
57 | * buffer has been revoked. | 57 | * buffer has been revoked. |
58 | * | ||
59 | * Locking rules: | ||
60 | * We keep two hash tables of revoke records. One hashtable belongs to the | ||
61 | * running transaction (is pointed to by journal->j_revoke), the other one | ||
62 | * belongs to the committing transaction. Accesses to the second hash table | ||
63 | * happen only from the kjournald and no other thread touches this table. Also | ||
64 | * journal_switch_revoke_table() which switches which hashtable belongs to the | ||
65 | * running and which to the committing transaction is called only from | ||
66 | * kjournald. Therefore we need no locks when accessing the hashtable belonging | ||
67 | * to the committing transaction. | ||
68 | * | ||
69 | * All users operating on the hash table belonging to the running transaction | ||
70 | * have a handle to the transaction. Therefore they are safe from kjournald | ||
71 | * switching hash tables under them. For operations on the lists of entries in | ||
72 | * the hash table j_revoke_lock is used. | ||
73 | * | ||
74 | * Finally, also replay code uses the hash tables but at this moment noone else | ||
75 | * can touch them (filesystem isn't mounted yet) and hence no locking is | ||
76 | * needed. | ||
58 | */ | 77 | */ |
59 | 78 | ||
60 | #ifndef __KERNEL__ | 79 | #ifndef __KERNEL__ |
@@ -67,6 +86,7 @@ | |||
67 | #include <linux/slab.h> | 86 | #include <linux/slab.h> |
68 | #include <linux/list.h> | 87 | #include <linux/list.h> |
69 | #include <linux/init.h> | 88 | #include <linux/init.h> |
89 | #include <linux/bio.h> | ||
70 | #endif | 90 | #endif |
71 | #include <linux/log2.h> | 91 | #include <linux/log2.h> |
72 | 92 | ||
@@ -99,8 +119,8 @@ struct jbd_revoke_table_s | |||
99 | #ifdef __KERNEL__ | 119 | #ifdef __KERNEL__ |
100 | static void write_one_revoke_record(journal_t *, transaction_t *, | 120 | static void write_one_revoke_record(journal_t *, transaction_t *, |
101 | struct journal_head **, int *, | 121 | struct journal_head **, int *, |
102 | struct jbd_revoke_record_s *); | 122 | struct jbd_revoke_record_s *, int); |
103 | static void flush_descriptor(journal_t *, struct journal_head *, int); | 123 | static void flush_descriptor(journal_t *, struct journal_head *, int, int); |
104 | #endif | 124 | #endif |
105 | 125 | ||
106 | /* Utility functions to maintain the revoke table */ | 126 | /* Utility functions to maintain the revoke table */ |
@@ -402,8 +422,6 @@ int journal_revoke(handle_t *handle, unsigned long blocknr, | |||
402 | * the second time we would still have a pending revoke to cancel. So, | 422 | * the second time we would still have a pending revoke to cancel. So, |
403 | * do not trust the Revoked bit on buffers unless RevokeValid is also | 423 | * do not trust the Revoked bit on buffers unless RevokeValid is also |
404 | * set. | 424 | * set. |
405 | * | ||
406 | * The caller must have the journal locked. | ||
407 | */ | 425 | */ |
408 | int journal_cancel_revoke(handle_t *handle, struct journal_head *jh) | 426 | int journal_cancel_revoke(handle_t *handle, struct journal_head *jh) |
409 | { | 427 | { |
@@ -481,12 +499,9 @@ void journal_switch_revoke_table(journal_t *journal) | |||
481 | /* | 499 | /* |
482 | * Write revoke records to the journal for all entries in the current | 500 | * Write revoke records to the journal for all entries in the current |
483 | * revoke hash, deleting the entries as we go. | 501 | * revoke hash, deleting the entries as we go. |
484 | * | ||
485 | * Called with the journal lock held. | ||
486 | */ | 502 | */ |
487 | |||
488 | void journal_write_revoke_records(journal_t *journal, | 503 | void journal_write_revoke_records(journal_t *journal, |
489 | transaction_t *transaction) | 504 | transaction_t *transaction, int write_op) |
490 | { | 505 | { |
491 | struct journal_head *descriptor; | 506 | struct journal_head *descriptor; |
492 | struct jbd_revoke_record_s *record; | 507 | struct jbd_revoke_record_s *record; |
@@ -510,14 +525,14 @@ void journal_write_revoke_records(journal_t *journal, | |||
510 | hash_list->next; | 525 | hash_list->next; |
511 | write_one_revoke_record(journal, transaction, | 526 | write_one_revoke_record(journal, transaction, |
512 | &descriptor, &offset, | 527 | &descriptor, &offset, |
513 | record); | 528 | record, write_op); |
514 | count++; | 529 | count++; |
515 | list_del(&record->hash); | 530 | list_del(&record->hash); |
516 | kmem_cache_free(revoke_record_cache, record); | 531 | kmem_cache_free(revoke_record_cache, record); |
517 | } | 532 | } |
518 | } | 533 | } |
519 | if (descriptor) | 534 | if (descriptor) |
520 | flush_descriptor(journal, descriptor, offset); | 535 | flush_descriptor(journal, descriptor, offset, write_op); |
521 | jbd_debug(1, "Wrote %d revoke records\n", count); | 536 | jbd_debug(1, "Wrote %d revoke records\n", count); |
522 | } | 537 | } |
523 | 538 | ||
@@ -530,7 +545,8 @@ static void write_one_revoke_record(journal_t *journal, | |||
530 | transaction_t *transaction, | 545 | transaction_t *transaction, |
531 | struct journal_head **descriptorp, | 546 | struct journal_head **descriptorp, |
532 | int *offsetp, | 547 | int *offsetp, |
533 | struct jbd_revoke_record_s *record) | 548 | struct jbd_revoke_record_s *record, |
549 | int write_op) | ||
534 | { | 550 | { |
535 | struct journal_head *descriptor; | 551 | struct journal_head *descriptor; |
536 | int offset; | 552 | int offset; |
@@ -549,7 +565,7 @@ static void write_one_revoke_record(journal_t *journal, | |||
549 | /* Make sure we have a descriptor with space left for the record */ | 565 | /* Make sure we have a descriptor with space left for the record */ |
550 | if (descriptor) { | 566 | if (descriptor) { |
551 | if (offset == journal->j_blocksize) { | 567 | if (offset == journal->j_blocksize) { |
552 | flush_descriptor(journal, descriptor, offset); | 568 | flush_descriptor(journal, descriptor, offset, write_op); |
553 | descriptor = NULL; | 569 | descriptor = NULL; |
554 | } | 570 | } |
555 | } | 571 | } |
@@ -586,7 +602,7 @@ static void write_one_revoke_record(journal_t *journal, | |||
586 | 602 | ||
587 | static void flush_descriptor(journal_t *journal, | 603 | static void flush_descriptor(journal_t *journal, |
588 | struct journal_head *descriptor, | 604 | struct journal_head *descriptor, |
589 | int offset) | 605 | int offset, int write_op) |
590 | { | 606 | { |
591 | journal_revoke_header_t *header; | 607 | journal_revoke_header_t *header; |
592 | struct buffer_head *bh = jh2bh(descriptor); | 608 | struct buffer_head *bh = jh2bh(descriptor); |
@@ -601,7 +617,7 @@ static void flush_descriptor(journal_t *journal, | |||
601 | set_buffer_jwrite(bh); | 617 | set_buffer_jwrite(bh); |
602 | BUFFER_TRACE(bh, "write"); | 618 | BUFFER_TRACE(bh, "write"); |
603 | set_buffer_dirty(bh); | 619 | set_buffer_dirty(bh); |
604 | ll_rw_block(SWRITE, 1, &bh); | 620 | ll_rw_block((write_op == WRITE) ? SWRITE : SWRITE_SYNC_PLUG, 1, &bh); |
605 | } | 621 | } |
606 | #endif | 622 | #endif |
607 | 623 | ||
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index e6a117431277..ed886e6db399 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -1440,6 +1440,8 @@ int journal_stop(handle_t *handle) | |||
1440 | } | 1440 | } |
1441 | } | 1441 | } |
1442 | 1442 | ||
1443 | if (handle->h_sync) | ||
1444 | transaction->t_synchronous_commit = 1; | ||
1443 | current->journal_info = NULL; | 1445 | current->journal_info = NULL; |
1444 | spin_lock(&journal->j_state_lock); | 1446 | spin_lock(&journal->j_state_lock); |
1445 | spin_lock(&transaction->t_handle_lock); | 1447 | spin_lock(&transaction->t_handle_lock); |