0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #include <linux/time.h>
0039 #include <linux/semaphore.h>
0040 #include <linux/vmalloc.h>
0041 #include "reiserfs.h"
0042 #include <linux/kernel.h>
0043 #include <linux/errno.h>
0044 #include <linux/fcntl.h>
0045 #include <linux/stat.h>
0046 #include <linux/string.h>
0047 #include <linux/buffer_head.h>
0048 #include <linux/workqueue.h>
0049 #include <linux/writeback.h>
0050 #include <linux/blkdev.h>
0051 #include <linux/backing-dev.h>
0052 #include <linux/uaccess.h>
0053 #include <linux/slab.h>
0054
0055
0056
0057 #define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
0058 j_list))
0059
0060
0061 #define JOURNAL_TRANS_HALF 1018
0062 #define BUFNR 64
0063
0064
0065
0066
0067 #define BLOCK_FREED 2
0068
0069 #define BLOCK_FREED_HOLDER 3
0070
0071
0072 #define BLOCK_NEEDS_FLUSH 4
0073 #define BLOCK_DIRTIED 5
0074
0075
0076 #define LIST_TOUCHED 1
0077 #define LIST_DIRTY 2
0078 #define LIST_COMMIT_PENDING 4
0079
0080
0081 #define FLUSH_ALL 1
0082 #define COMMIT_NOW 2
0083 #define WAIT 4
0084
0085 static int do_journal_end(struct reiserfs_transaction_handle *, int flags);
0086 static int flush_journal_list(struct super_block *s,
0087 struct reiserfs_journal_list *jl, int flushall);
0088 static int flush_commit_list(struct super_block *s,
0089 struct reiserfs_journal_list *jl, int flushall);
0090 static int can_dirty(struct reiserfs_journal_cnode *cn);
0091 static int journal_join(struct reiserfs_transaction_handle *th,
0092 struct super_block *sb);
0093 static void release_journal_dev(struct super_block *super,
0094 struct reiserfs_journal *journal);
0095 static void dirty_one_transaction(struct super_block *s,
0096 struct reiserfs_journal_list *jl);
0097 static void flush_async_commits(struct work_struct *work);
0098 static void queue_log_writer(struct super_block *s);
0099
0100
0101 enum {
0102 JBEGIN_REG = 0,
0103
0104 JBEGIN_JOIN = 1,
0105
0106 JBEGIN_ABORT = 2,
0107 };
0108
0109 static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
0110 struct super_block *sb,
0111 unsigned long nblocks, int join);
0112
0113 static void init_journal_hash(struct super_block *sb)
0114 {
0115 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0116 memset(journal->j_hash_table, 0,
0117 JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
0118 }
0119
0120
0121
0122
0123
0124
0125
0126 static int reiserfs_clean_and_file_buffer(struct buffer_head *bh)
0127 {
0128 if (bh) {
0129 clear_buffer_dirty(bh);
0130 clear_buffer_journal_test(bh);
0131 }
0132 return 0;
0133 }
0134
0135 static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
0136 *sb)
0137 {
0138 struct reiserfs_bitmap_node *bn;
0139 static int id;
0140
0141 bn = kmalloc(sizeof(struct reiserfs_bitmap_node), GFP_NOFS);
0142 if (!bn) {
0143 return NULL;
0144 }
0145 bn->data = kzalloc(sb->s_blocksize, GFP_NOFS);
0146 if (!bn->data) {
0147 kfree(bn);
0148 return NULL;
0149 }
0150 bn->id = id++;
0151 INIT_LIST_HEAD(&bn->list);
0152 return bn;
0153 }
0154
0155 static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *sb)
0156 {
0157 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0158 struct reiserfs_bitmap_node *bn = NULL;
0159 struct list_head *entry = journal->j_bitmap_nodes.next;
0160
0161 journal->j_used_bitmap_nodes++;
0162 repeat:
0163
0164 if (entry != &journal->j_bitmap_nodes) {
0165 bn = list_entry(entry, struct reiserfs_bitmap_node, list);
0166 list_del(entry);
0167 memset(bn->data, 0, sb->s_blocksize);
0168 journal->j_free_bitmap_nodes--;
0169 return bn;
0170 }
0171 bn = allocate_bitmap_node(sb);
0172 if (!bn) {
0173 yield();
0174 goto repeat;
0175 }
0176 return bn;
0177 }
0178 static inline void free_bitmap_node(struct super_block *sb,
0179 struct reiserfs_bitmap_node *bn)
0180 {
0181 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0182 journal->j_used_bitmap_nodes--;
0183 if (journal->j_free_bitmap_nodes > REISERFS_MAX_BITMAP_NODES) {
0184 kfree(bn->data);
0185 kfree(bn);
0186 } else {
0187 list_add(&bn->list, &journal->j_bitmap_nodes);
0188 journal->j_free_bitmap_nodes++;
0189 }
0190 }
0191
0192 static void allocate_bitmap_nodes(struct super_block *sb)
0193 {
0194 int i;
0195 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0196 struct reiserfs_bitmap_node *bn = NULL;
0197 for (i = 0; i < REISERFS_MIN_BITMAP_NODES; i++) {
0198 bn = allocate_bitmap_node(sb);
0199 if (bn) {
0200 list_add(&bn->list, &journal->j_bitmap_nodes);
0201 journal->j_free_bitmap_nodes++;
0202 } else {
0203
0204 break;
0205 }
0206 }
0207 }
0208
0209 static int set_bit_in_list_bitmap(struct super_block *sb,
0210 b_blocknr_t block,
0211 struct reiserfs_list_bitmap *jb)
0212 {
0213 unsigned int bmap_nr = block / (sb->s_blocksize << 3);
0214 unsigned int bit_nr = block % (sb->s_blocksize << 3);
0215
0216 if (!jb->bitmaps[bmap_nr]) {
0217 jb->bitmaps[bmap_nr] = get_bitmap_node(sb);
0218 }
0219 set_bit(bit_nr, (unsigned long *)jb->bitmaps[bmap_nr]->data);
0220 return 0;
0221 }
0222
0223 static void cleanup_bitmap_list(struct super_block *sb,
0224 struct reiserfs_list_bitmap *jb)
0225 {
0226 int i;
0227 if (jb->bitmaps == NULL)
0228 return;
0229
0230 for (i = 0; i < reiserfs_bmap_count(sb); i++) {
0231 if (jb->bitmaps[i]) {
0232 free_bitmap_node(sb, jb->bitmaps[i]);
0233 jb->bitmaps[i] = NULL;
0234 }
0235 }
0236 }
0237
0238
0239
0240
0241 static int free_list_bitmaps(struct super_block *sb,
0242 struct reiserfs_list_bitmap *jb_array)
0243 {
0244 int i;
0245 struct reiserfs_list_bitmap *jb;
0246 for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
0247 jb = jb_array + i;
0248 jb->journal_list = NULL;
0249 cleanup_bitmap_list(sb, jb);
0250 vfree(jb->bitmaps);
0251 jb->bitmaps = NULL;
0252 }
0253 return 0;
0254 }
0255
0256 static int free_bitmap_nodes(struct super_block *sb)
0257 {
0258 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0259 struct list_head *next = journal->j_bitmap_nodes.next;
0260 struct reiserfs_bitmap_node *bn;
0261
0262 while (next != &journal->j_bitmap_nodes) {
0263 bn = list_entry(next, struct reiserfs_bitmap_node, list);
0264 list_del(next);
0265 kfree(bn->data);
0266 kfree(bn);
0267 next = journal->j_bitmap_nodes.next;
0268 journal->j_free_bitmap_nodes--;
0269 }
0270
0271 return 0;
0272 }
0273
0274
0275
0276
0277
0278 int reiserfs_allocate_list_bitmaps(struct super_block *sb,
0279 struct reiserfs_list_bitmap *jb_array,
0280 unsigned int bmap_nr)
0281 {
0282 int i;
0283 int failed = 0;
0284 struct reiserfs_list_bitmap *jb;
0285 int mem = bmap_nr * sizeof(struct reiserfs_bitmap_node *);
0286
0287 for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
0288 jb = jb_array + i;
0289 jb->journal_list = NULL;
0290 jb->bitmaps = vzalloc(mem);
0291 if (!jb->bitmaps) {
0292 reiserfs_warning(sb, "clm-2000", "unable to "
0293 "allocate bitmaps for journal lists");
0294 failed = 1;
0295 break;
0296 }
0297 }
0298 if (failed) {
0299 free_list_bitmaps(sb, jb_array);
0300 return -1;
0301 }
0302 return 0;
0303 }
0304
0305
0306
0307
0308
0309 static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *sb,
0310 struct reiserfs_journal_list
0311 *jl)
0312 {
0313 int i, j;
0314 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0315 struct reiserfs_list_bitmap *jb = NULL;
0316
0317 for (j = 0; j < (JOURNAL_NUM_BITMAPS * 3); j++) {
0318 i = journal->j_list_bitmap_index;
0319 journal->j_list_bitmap_index = (i + 1) % JOURNAL_NUM_BITMAPS;
0320 jb = journal->j_list_bitmap + i;
0321 if (journal->j_list_bitmap[i].journal_list) {
0322 flush_commit_list(sb,
0323 journal->j_list_bitmap[i].
0324 journal_list, 1);
0325 if (!journal->j_list_bitmap[i].journal_list) {
0326 break;
0327 }
0328 } else {
0329 break;
0330 }
0331 }
0332
0333 if (jb->journal_list)
0334 return NULL;
0335 jb->journal_list = jl;
0336 return jb;
0337 }
0338
0339
0340
0341
0342
0343
0344 static struct reiserfs_journal_cnode *allocate_cnodes(int num_cnodes)
0345 {
0346 struct reiserfs_journal_cnode *head;
0347 int i;
0348 if (num_cnodes <= 0) {
0349 return NULL;
0350 }
0351 head = vzalloc(array_size(num_cnodes,
0352 sizeof(struct reiserfs_journal_cnode)));
0353 if (!head) {
0354 return NULL;
0355 }
0356 head[0].prev = NULL;
0357 head[0].next = head + 1;
0358 for (i = 1; i < num_cnodes; i++) {
0359 head[i].prev = head + (i - 1);
0360 head[i].next = head + (i + 1);
0361 }
0362 head[num_cnodes - 1].next = NULL;
0363 return head;
0364 }
0365
0366
0367 static struct reiserfs_journal_cnode *get_cnode(struct super_block *sb)
0368 {
0369 struct reiserfs_journal_cnode *cn;
0370 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0371
0372 reiserfs_check_lock_depth(sb, "get_cnode");
0373
0374 if (journal->j_cnode_free <= 0) {
0375 return NULL;
0376 }
0377 journal->j_cnode_used++;
0378 journal->j_cnode_free--;
0379 cn = journal->j_cnode_free_list;
0380 if (!cn) {
0381 return cn;
0382 }
0383 if (cn->next) {
0384 cn->next->prev = NULL;
0385 }
0386 journal->j_cnode_free_list = cn->next;
0387 memset(cn, 0, sizeof(struct reiserfs_journal_cnode));
0388 return cn;
0389 }
0390
0391
0392
0393
0394 static void free_cnode(struct super_block *sb,
0395 struct reiserfs_journal_cnode *cn)
0396 {
0397 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0398
0399 reiserfs_check_lock_depth(sb, "free_cnode");
0400
0401 journal->j_cnode_used--;
0402 journal->j_cnode_free++;
0403
0404 cn->next = journal->j_cnode_free_list;
0405 if (journal->j_cnode_free_list) {
0406 journal->j_cnode_free_list->prev = cn;
0407 }
0408 cn->prev = NULL;
0409 journal->j_cnode_free_list = cn;
0410 }
0411
0412 static void clear_prepared_bits(struct buffer_head *bh)
0413 {
0414 clear_buffer_journal_prepared(bh);
0415 clear_buffer_journal_restore_dirty(bh);
0416 }
0417
0418
0419
0420
0421
0422 static inline struct reiserfs_journal_cnode *get_journal_hash_dev(struct
0423 super_block
0424 *sb,
0425 struct
0426 reiserfs_journal_cnode
0427 **table,
0428 long bl)
0429 {
0430 struct reiserfs_journal_cnode *cn;
0431 cn = journal_hash(table, sb, bl);
0432 while (cn) {
0433 if (cn->blocknr == bl && cn->sb == sb)
0434 return cn;
0435 cn = cn->hnext;
0436 }
0437 return (struct reiserfs_journal_cnode *)0;
0438 }
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459 int reiserfs_in_journal(struct super_block *sb,
0460 unsigned int bmap_nr, int bit_nr, int search_all,
0461 b_blocknr_t * next_zero_bit)
0462 {
0463 struct reiserfs_journal *journal = SB_JOURNAL(sb);
0464 struct reiserfs_list_bitmap *jb;
0465 int i;
0466 unsigned long bl;
0467
0468 *next_zero_bit = 0;
0469
0470 PROC_INFO_INC(sb, journal.in_journal);
0471
0472
0473
0474
0475
0476
0477 if (search_all) {
0478 for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
0479 PROC_INFO_INC(sb, journal.in_journal_bitmap);
0480 jb = journal->j_list_bitmap + i;
0481 if (jb->journal_list && jb->bitmaps[bmap_nr] &&
0482 test_bit(bit_nr,
0483 (unsigned long *)jb->bitmaps[bmap_nr]->
0484 data)) {
0485 *next_zero_bit =
0486 find_next_zero_bit((unsigned long *)
0487 (jb->bitmaps[bmap_nr]->
0488 data),
0489 sb->s_blocksize << 3,
0490 bit_nr + 1);
0491 return 1;
0492 }
0493 }
0494 }
0495
0496 bl = bmap_nr * (sb->s_blocksize << 3) + bit_nr;
0497
0498 if (search_all
0499 && (get_journal_hash_dev(sb, journal->j_list_hash_table, bl))) {
0500 return 1;
0501 }
0502
0503
0504 if ((get_journal_hash_dev(sb, journal->j_hash_table, bl))) {
0505 BUG();
0506 return 1;
0507 }
0508
0509 PROC_INFO_INC(sb, journal.in_journal_reusable);
0510
0511 return 0;
0512 }
0513
0514
0515 static inline void insert_journal_hash(struct reiserfs_journal_cnode **table,
0516 struct reiserfs_journal_cnode *cn)
0517 {
0518 struct reiserfs_journal_cnode *cn_orig;
0519
0520 cn_orig = journal_hash(table, cn->sb, cn->blocknr);
0521 cn->hnext = cn_orig;
0522 cn->hprev = NULL;
0523 if (cn_orig) {
0524 cn_orig->hprev = cn;
0525 }
0526 journal_hash(table, cn->sb, cn->blocknr) = cn;
0527 }
0528
0529
0530 static inline void lock_journal(struct super_block *sb)
0531 {
0532 PROC_INFO_INC(sb, journal.lock_journal);
0533
0534 reiserfs_mutex_lock_safe(&SB_JOURNAL(sb)->j_mutex, sb);
0535 }
0536
0537
0538 static inline void unlock_journal(struct super_block *sb)
0539 {
0540 mutex_unlock(&SB_JOURNAL(sb)->j_mutex);
0541 }
0542
0543 static inline void get_journal_list(struct reiserfs_journal_list *jl)
0544 {
0545 jl->j_refcount++;
0546 }
0547
0548 static inline void put_journal_list(struct super_block *s,
0549 struct reiserfs_journal_list *jl)
0550 {
0551 if (jl->j_refcount < 1) {
0552 reiserfs_panic(s, "journal-2", "trans id %u, refcount at %d",
0553 jl->j_trans_id, jl->j_refcount);
0554 }
0555 if (--jl->j_refcount == 0)
0556 kfree(jl);
0557 }
0558
0559
0560
0561
0562
0563
0564 static void cleanup_freed_for_journal_list(struct super_block *sb,
0565 struct reiserfs_journal_list *jl)
0566 {
0567
0568 struct reiserfs_list_bitmap *jb = jl->j_list_bitmap;
0569 if (jb) {
0570 cleanup_bitmap_list(sb, jb);
0571 }
0572 jl->j_list_bitmap->journal_list = NULL;
0573 jl->j_list_bitmap = NULL;
0574 }
0575
0576 static int journal_list_still_alive(struct super_block *s,
0577 unsigned int trans_id)
0578 {
0579 struct reiserfs_journal *journal = SB_JOURNAL(s);
0580 struct list_head *entry = &journal->j_journal_list;
0581 struct reiserfs_journal_list *jl;
0582
0583 if (!list_empty(entry)) {
0584 jl = JOURNAL_LIST_ENTRY(entry->next);
0585 if (jl->j_trans_id <= trans_id) {
0586 return 1;
0587 }
0588 }
0589 return 0;
0590 }
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602 static void release_buffer_page(struct buffer_head *bh)
0603 {
0604 struct folio *folio = page_folio(bh->b_page);
0605 if (!folio->mapping && folio_trylock(folio)) {
0606 folio_get(folio);
0607 put_bh(bh);
0608 if (!folio->mapping)
0609 try_to_free_buffers(folio);
0610 folio_unlock(folio);
0611 folio_put(folio);
0612 } else {
0613 put_bh(bh);
0614 }
0615 }
0616
0617 static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate)
0618 {
0619 if (buffer_journaled(bh)) {
0620 reiserfs_warning(NULL, "clm-2084",
0621 "pinned buffer %lu:%pg sent to disk",
0622 bh->b_blocknr, bh->b_bdev);
0623 }
0624 if (uptodate)
0625 set_buffer_uptodate(bh);
0626 else
0627 clear_buffer_uptodate(bh);
0628
0629 unlock_buffer(bh);
0630 release_buffer_page(bh);
0631 }
0632
0633 static void reiserfs_end_ordered_io(struct buffer_head *bh, int uptodate)
0634 {
0635 if (uptodate)
0636 set_buffer_uptodate(bh);
0637 else
0638 clear_buffer_uptodate(bh);
0639 unlock_buffer(bh);
0640 put_bh(bh);
0641 }
0642
0643 static void submit_logged_buffer(struct buffer_head *bh)
0644 {
0645 get_bh(bh);
0646 bh->b_end_io = reiserfs_end_buffer_io_sync;
0647 clear_buffer_journal_new(bh);
0648 clear_buffer_dirty(bh);
0649 if (!test_clear_buffer_journal_test(bh))
0650 BUG();
0651 if (!buffer_uptodate(bh))
0652 BUG();
0653 submit_bh(REQ_OP_WRITE, bh);
0654 }
0655
0656 static void submit_ordered_buffer(struct buffer_head *bh)
0657 {
0658 get_bh(bh);
0659 bh->b_end_io = reiserfs_end_ordered_io;
0660 clear_buffer_dirty(bh);
0661 if (!buffer_uptodate(bh))
0662 BUG();
0663 submit_bh(REQ_OP_WRITE, bh);
0664 }
0665
0666 #define CHUNK_SIZE 32
0667 struct buffer_chunk {
0668 struct buffer_head *bh[CHUNK_SIZE];
0669 int nr;
0670 };
0671
0672 static void write_chunk(struct buffer_chunk *chunk)
0673 {
0674 int i;
0675 for (i = 0; i < chunk->nr; i++) {
0676 submit_logged_buffer(chunk->bh[i]);
0677 }
0678 chunk->nr = 0;
0679 }
0680
0681 static void write_ordered_chunk(struct buffer_chunk *chunk)
0682 {
0683 int i;
0684 for (i = 0; i < chunk->nr; i++) {
0685 submit_ordered_buffer(chunk->bh[i]);
0686 }
0687 chunk->nr = 0;
0688 }
0689
0690 static int add_to_chunk(struct buffer_chunk *chunk, struct buffer_head *bh,
0691 spinlock_t * lock, void (fn) (struct buffer_chunk *))
0692 {
0693 int ret = 0;
0694 BUG_ON(chunk->nr >= CHUNK_SIZE);
0695 chunk->bh[chunk->nr++] = bh;
0696 if (chunk->nr >= CHUNK_SIZE) {
0697 ret = 1;
0698 if (lock) {
0699 spin_unlock(lock);
0700 fn(chunk);
0701 spin_lock(lock);
0702 } else {
0703 fn(chunk);
0704 }
0705 }
0706 return ret;
0707 }
0708
0709 static atomic_t nr_reiserfs_jh = ATOMIC_INIT(0);
0710 static struct reiserfs_jh *alloc_jh(void)
0711 {
0712 struct reiserfs_jh *jh;
0713 while (1) {
0714 jh = kmalloc(sizeof(*jh), GFP_NOFS);
0715 if (jh) {
0716 atomic_inc(&nr_reiserfs_jh);
0717 return jh;
0718 }
0719 yield();
0720 }
0721 }
0722
0723
0724
0725
0726
0727 void reiserfs_free_jh(struct buffer_head *bh)
0728 {
0729 struct reiserfs_jh *jh;
0730
0731 jh = bh->b_private;
0732 if (jh) {
0733 bh->b_private = NULL;
0734 jh->bh = NULL;
0735 list_del_init(&jh->list);
0736 kfree(jh);
0737 if (atomic_read(&nr_reiserfs_jh) <= 0)
0738 BUG();
0739 atomic_dec(&nr_reiserfs_jh);
0740 put_bh(bh);
0741 }
0742 }
0743
0744 static inline int __add_jh(struct reiserfs_journal *j, struct buffer_head *bh,
0745 int tail)
0746 {
0747 struct reiserfs_jh *jh;
0748
0749 if (bh->b_private) {
0750 spin_lock(&j->j_dirty_buffers_lock);
0751 if (!bh->b_private) {
0752 spin_unlock(&j->j_dirty_buffers_lock);
0753 goto no_jh;
0754 }
0755 jh = bh->b_private;
0756 list_del_init(&jh->list);
0757 } else {
0758 no_jh:
0759 get_bh(bh);
0760 jh = alloc_jh();
0761 spin_lock(&j->j_dirty_buffers_lock);
0762
0763
0764
0765
0766 BUG_ON(bh->b_private);
0767 jh->bh = bh;
0768 bh->b_private = jh;
0769 }
0770 jh->jl = j->j_current_jl;
0771 if (tail)
0772 list_add_tail(&jh->list, &jh->jl->j_tail_bh_list);
0773 else {
0774 list_add_tail(&jh->list, &jh->jl->j_bh_list);
0775 }
0776 spin_unlock(&j->j_dirty_buffers_lock);
0777 return 0;
0778 }
0779
0780 int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh)
0781 {
0782 return __add_jh(SB_JOURNAL(inode->i_sb), bh, 1);
0783 }
0784 int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh)
0785 {
0786 return __add_jh(SB_JOURNAL(inode->i_sb), bh, 0);
0787 }
0788
0789 #define JH_ENTRY(l) list_entry((l), struct reiserfs_jh, list)
0790 static int write_ordered_buffers(spinlock_t * lock,
0791 struct reiserfs_journal *j,
0792 struct reiserfs_journal_list *jl,
0793 struct list_head *list)
0794 {
0795 struct buffer_head *bh;
0796 struct reiserfs_jh *jh;
0797 int ret = j->j_errno;
0798 struct buffer_chunk chunk;
0799 struct list_head tmp;
0800 INIT_LIST_HEAD(&tmp);
0801
0802 chunk.nr = 0;
0803 spin_lock(lock);
0804 while (!list_empty(list)) {
0805 jh = JH_ENTRY(list->next);
0806 bh = jh->bh;
0807 get_bh(bh);
0808 if (!trylock_buffer(bh)) {
0809 if (!buffer_dirty(bh)) {
0810 list_move(&jh->list, &tmp);
0811 goto loop_next;
0812 }
0813 spin_unlock(lock);
0814 if (chunk.nr)
0815 write_ordered_chunk(&chunk);
0816 wait_on_buffer(bh);
0817 cond_resched();
0818 spin_lock(lock);
0819 goto loop_next;
0820 }
0821
0822
0823
0824
0825
0826 if (!buffer_uptodate(bh) && buffer_dirty(bh)) {
0827 clear_buffer_dirty(bh);
0828 ret = -EIO;
0829 }
0830 if (buffer_dirty(bh)) {
0831 list_move(&jh->list, &tmp);
0832 add_to_chunk(&chunk, bh, lock, write_ordered_chunk);
0833 } else {
0834 reiserfs_free_jh(bh);
0835 unlock_buffer(bh);
0836 }
0837 loop_next:
0838 put_bh(bh);
0839 cond_resched_lock(lock);
0840 }
0841 if (chunk.nr) {
0842 spin_unlock(lock);
0843 write_ordered_chunk(&chunk);
0844 spin_lock(lock);
0845 }
0846 while (!list_empty(&tmp)) {
0847 jh = JH_ENTRY(tmp.prev);
0848 bh = jh->bh;
0849 get_bh(bh);
0850 reiserfs_free_jh(bh);
0851
0852 if (buffer_locked(bh)) {
0853 spin_unlock(lock);
0854 wait_on_buffer(bh);
0855 spin_lock(lock);
0856 }
0857 if (!buffer_uptodate(bh)) {
0858 ret = -EIO;
0859 }
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869 if (buffer_dirty(bh) && unlikely(bh->b_page->mapping == NULL)) {
0870 spin_unlock(lock);
0871 ll_rw_block(REQ_OP_WRITE, 1, &bh);
0872 spin_lock(lock);
0873 }
0874 put_bh(bh);
0875 cond_resched_lock(lock);
0876 }
0877 spin_unlock(lock);
0878 return ret;
0879 }
0880
0881 static int flush_older_commits(struct super_block *s,
0882 struct reiserfs_journal_list *jl)
0883 {
0884 struct reiserfs_journal *journal = SB_JOURNAL(s);
0885 struct reiserfs_journal_list *other_jl;
0886 struct reiserfs_journal_list *first_jl;
0887 struct list_head *entry;
0888 unsigned int trans_id = jl->j_trans_id;
0889 unsigned int other_trans_id;
0890
0891 find_first:
0892
0893
0894
0895 first_jl = jl;
0896 entry = jl->j_list.prev;
0897 while (1) {
0898 other_jl = JOURNAL_LIST_ENTRY(entry);
0899 if (entry == &journal->j_journal_list ||
0900 atomic_read(&other_jl->j_older_commits_done))
0901 break;
0902
0903 first_jl = other_jl;
0904 entry = other_jl->j_list.prev;
0905 }
0906
0907
0908 if (first_jl == jl) {
0909 return 0;
0910 }
0911
0912 entry = &first_jl->j_list;
0913 while (1) {
0914 other_jl = JOURNAL_LIST_ENTRY(entry);
0915 other_trans_id = other_jl->j_trans_id;
0916
0917 if (other_trans_id < trans_id) {
0918 if (atomic_read(&other_jl->j_commit_left) != 0) {
0919 flush_commit_list(s, other_jl, 0);
0920
0921
0922 if (!journal_list_still_alive(s, trans_id))
0923 return 1;
0924
0925
0926
0927
0928
0929
0930
0931 if (!journal_list_still_alive
0932 (s, other_trans_id)) {
0933 goto find_first;
0934 }
0935 }
0936 entry = entry->next;
0937 if (entry == &journal->j_journal_list)
0938 return 0;
0939 } else {
0940 return 0;
0941 }
0942 }
0943 return 0;
0944 }
0945
0946 static int reiserfs_async_progress_wait(struct super_block *s)
0947 {
0948 struct reiserfs_journal *j = SB_JOURNAL(s);
0949
0950 if (atomic_read(&j->j_async_throttle)) {
0951 int depth;
0952
0953 depth = reiserfs_write_unlock_nested(s);
0954 wait_var_event_timeout(&j->j_async_throttle,
0955 atomic_read(&j->j_async_throttle) == 0,
0956 HZ / 10);
0957 reiserfs_write_lock_nested(s, depth);
0958 }
0959
0960 return 0;
0961 }
0962
0963
0964
0965
0966
0967
0968
0969
0970 static int flush_commit_list(struct super_block *s,
0971 struct reiserfs_journal_list *jl, int flushall)
0972 {
0973 int i;
0974 b_blocknr_t bn;
0975 struct buffer_head *tbh = NULL;
0976 unsigned int trans_id = jl->j_trans_id;
0977 struct reiserfs_journal *journal = SB_JOURNAL(s);
0978 int retval = 0;
0979 int write_len;
0980 int depth;
0981
0982 reiserfs_check_lock_depth(s, "flush_commit_list");
0983
0984 if (atomic_read(&jl->j_older_commits_done)) {
0985 return 0;
0986 }
0987
0988
0989
0990
0991
0992 BUG_ON(jl->j_len <= 0);
0993 BUG_ON(trans_id == journal->j_trans_id);
0994
0995 get_journal_list(jl);
0996 if (flushall) {
0997 if (flush_older_commits(s, jl) == 1) {
0998
0999
1000
1001
1002 goto put_jl;
1003 }
1004 }
1005
1006
1007 reiserfs_mutex_lock_safe(&jl->j_commit_mutex, s);
1008
1009 if (!journal_list_still_alive(s, trans_id)) {
1010 mutex_unlock(&jl->j_commit_mutex);
1011 goto put_jl;
1012 }
1013 BUG_ON(jl->j_trans_id == 0);
1014
1015
1016 if (atomic_read(&jl->j_commit_left) <= 0) {
1017 if (flushall) {
1018 atomic_set(&jl->j_older_commits_done, 1);
1019 }
1020 mutex_unlock(&jl->j_commit_mutex);
1021 goto put_jl;
1022 }
1023
1024 if (!list_empty(&jl->j_bh_list)) {
1025 int ret;
1026
1027
1028
1029
1030
1031 depth = reiserfs_write_unlock_nested(s);
1032 ret = write_ordered_buffers(&journal->j_dirty_buffers_lock,
1033 journal, jl, &jl->j_bh_list);
1034 if (ret < 0 && retval == 0)
1035 retval = ret;
1036 reiserfs_write_lock_nested(s, depth);
1037 }
1038 BUG_ON(!list_empty(&jl->j_bh_list));
1039
1040
1041
1042
1043
1044
1045
1046 atomic_inc(&journal->j_async_throttle);
1047 write_len = jl->j_len + 1;
1048 if (write_len < 256)
1049 write_len = 256;
1050 for (i = 0 ; i < write_len ; i++) {
1051 bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start + i) %
1052 SB_ONDISK_JOURNAL_SIZE(s);
1053 tbh = journal_find_get_block(s, bn);
1054 if (tbh) {
1055 if (buffer_dirty(tbh)) {
1056 depth = reiserfs_write_unlock_nested(s);
1057 ll_rw_block(REQ_OP_WRITE, 1, &tbh);
1058 reiserfs_write_lock_nested(s, depth);
1059 }
1060 put_bh(tbh) ;
1061 }
1062 }
1063 if (atomic_dec_and_test(&journal->j_async_throttle))
1064 wake_up_var(&journal->j_async_throttle);
1065
1066 for (i = 0; i < (jl->j_len + 1); i++) {
1067 bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) +
1068 (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s);
1069 tbh = journal_find_get_block(s, bn);
1070
1071 depth = reiserfs_write_unlock_nested(s);
1072 __wait_on_buffer(tbh);
1073 reiserfs_write_lock_nested(s, depth);
1074
1075
1076
1077
1078
1079 if (buffer_dirty(tbh)) {
1080 depth = reiserfs_write_unlock_nested(s);
1081 sync_dirty_buffer(tbh);
1082 reiserfs_write_lock_nested(s, depth);
1083 }
1084 if (unlikely(!buffer_uptodate(tbh))) {
1085 #ifdef CONFIG_REISERFS_CHECK
1086 reiserfs_warning(s, "journal-601",
1087 "buffer write failed");
1088 #endif
1089 retval = -EIO;
1090 }
1091
1092 put_bh(tbh);
1093
1094 put_bh(tbh);
1095 atomic_dec(&jl->j_commit_left);
1096 }
1097
1098 BUG_ON(atomic_read(&jl->j_commit_left) != 1);
1099
1100
1101
1102
1103
1104
1105
1106 if (likely(!retval && !reiserfs_is_journal_aborted (journal))) {
1107 if (buffer_dirty(jl->j_commit_bh))
1108 BUG();
1109 mark_buffer_dirty(jl->j_commit_bh) ;
1110 depth = reiserfs_write_unlock_nested(s);
1111 if (reiserfs_barrier_flush(s))
1112 __sync_dirty_buffer(jl->j_commit_bh,
1113 REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
1114 else
1115 sync_dirty_buffer(jl->j_commit_bh);
1116 reiserfs_write_lock_nested(s, depth);
1117 }
1118
1119
1120
1121
1122
1123
1124 if (unlikely(!buffer_uptodate(jl->j_commit_bh))) {
1125 #ifdef CONFIG_REISERFS_CHECK
1126 reiserfs_warning(s, "journal-615", "buffer write failed");
1127 #endif
1128 retval = -EIO;
1129 }
1130 bforget(jl->j_commit_bh);
1131 if (journal->j_last_commit_id != 0 &&
1132 (jl->j_trans_id - journal->j_last_commit_id) != 1) {
1133 reiserfs_warning(s, "clm-2200", "last commit %lu, current %lu",
1134 journal->j_last_commit_id, jl->j_trans_id);
1135 }
1136 journal->j_last_commit_id = jl->j_trans_id;
1137
1138
1139
1140
1141
1142 cleanup_freed_for_journal_list(s, jl);
1143
1144 retval = retval ? retval : journal->j_errno;
1145
1146
1147 if (!retval)
1148 dirty_one_transaction(s, jl);
1149 atomic_dec(&jl->j_commit_left);
1150
1151 if (flushall) {
1152 atomic_set(&jl->j_older_commits_done, 1);
1153 }
1154 mutex_unlock(&jl->j_commit_mutex);
1155 put_jl:
1156 put_journal_list(s, jl);
1157
1158 if (retval)
1159 reiserfs_abort(s, retval, "Journal write error in %s",
1160 __func__);
1161 return retval;
1162 }
1163
1164
1165
1166
1167
1168 static struct reiserfs_journal_list *find_newer_jl_for_cn(struct
1169 reiserfs_journal_cnode
1170 *cn)
1171 {
1172 struct super_block *sb = cn->sb;
1173 b_blocknr_t blocknr = cn->blocknr;
1174
1175 cn = cn->hprev;
1176 while (cn) {
1177 if (cn->sb == sb && cn->blocknr == blocknr && cn->jlist) {
1178 return cn->jlist;
1179 }
1180 cn = cn->hprev;
1181 }
1182 return NULL;
1183 }
1184
1185 static void remove_journal_hash(struct super_block *,
1186 struct reiserfs_journal_cnode **,
1187 struct reiserfs_journal_list *, unsigned long,
1188 int);
1189
1190
1191
1192
1193
1194
1195
1196 static void remove_all_from_journal_list(struct super_block *sb,
1197 struct reiserfs_journal_list *jl,
1198 int debug)
1199 {
1200 struct reiserfs_journal *journal = SB_JOURNAL(sb);
1201 struct reiserfs_journal_cnode *cn, *last;
1202 cn = jl->j_realblock;
1203
1204
1205
1206
1207
1208 while (cn) {
1209 if (cn->blocknr != 0) {
1210 if (debug) {
1211 reiserfs_warning(sb, "reiserfs-2201",
1212 "block %u, bh is %d, state %ld",
1213 cn->blocknr, cn->bh ? 1 : 0,
1214 cn->state);
1215 }
1216 cn->state = 0;
1217 remove_journal_hash(sb, journal->j_list_hash_table,
1218 jl, cn->blocknr, 1);
1219 }
1220 last = cn;
1221 cn = cn->next;
1222 free_cnode(sb, last);
1223 }
1224 jl->j_realblock = NULL;
1225 }
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235 static int _update_journal_header_block(struct super_block *sb,
1236 unsigned long offset,
1237 unsigned int trans_id)
1238 {
1239 struct reiserfs_journal_header *jh;
1240 struct reiserfs_journal *journal = SB_JOURNAL(sb);
1241 int depth;
1242
1243 if (reiserfs_is_journal_aborted(journal))
1244 return -EIO;
1245
1246 if (trans_id >= journal->j_last_flush_trans_id) {
1247 if (buffer_locked((journal->j_header_bh))) {
1248 depth = reiserfs_write_unlock_nested(sb);
1249 __wait_on_buffer(journal->j_header_bh);
1250 reiserfs_write_lock_nested(sb, depth);
1251 if (unlikely(!buffer_uptodate(journal->j_header_bh))) {
1252 #ifdef CONFIG_REISERFS_CHECK
1253 reiserfs_warning(sb, "journal-699",
1254 "buffer write failed");
1255 #endif
1256 return -EIO;
1257 }
1258 }
1259 journal->j_last_flush_trans_id = trans_id;
1260 journal->j_first_unflushed_offset = offset;
1261 jh = (struct reiserfs_journal_header *)(journal->j_header_bh->
1262 b_data);
1263 jh->j_last_flush_trans_id = cpu_to_le32(trans_id);
1264 jh->j_first_unflushed_offset = cpu_to_le32(offset);
1265 jh->j_mount_id = cpu_to_le32(journal->j_mount_id);
1266
1267 set_buffer_dirty(journal->j_header_bh);
1268 depth = reiserfs_write_unlock_nested(sb);
1269
1270 if (reiserfs_barrier_flush(sb))
1271 __sync_dirty_buffer(journal->j_header_bh,
1272 REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
1273 else
1274 sync_dirty_buffer(journal->j_header_bh);
1275
1276 reiserfs_write_lock_nested(sb, depth);
1277 if (!buffer_uptodate(journal->j_header_bh)) {
1278 reiserfs_warning(sb, "journal-837",
1279 "IO error during journal replay");
1280 return -EIO;
1281 }
1282 }
1283 return 0;
1284 }
1285
1286 static int update_journal_header_block(struct super_block *sb,
1287 unsigned long offset,
1288 unsigned int trans_id)
1289 {
1290 return _update_journal_header_block(sb, offset, trans_id);
1291 }
1292
1293
1294
1295
1296
1297 static int flush_older_journal_lists(struct super_block *sb,
1298 struct reiserfs_journal_list *jl)
1299 {
1300 struct list_head *entry;
1301 struct reiserfs_journal_list *other_jl;
1302 struct reiserfs_journal *journal = SB_JOURNAL(sb);
1303 unsigned int trans_id = jl->j_trans_id;
1304
1305
1306
1307
1308
1309 restart:
1310 entry = journal->j_journal_list.next;
1311
1312 if (entry == &journal->j_journal_list)
1313 return 0;
1314 other_jl = JOURNAL_LIST_ENTRY(entry);
1315 if (other_jl->j_trans_id < trans_id) {
1316 BUG_ON(other_jl->j_refcount <= 0);
1317
1318 flush_journal_list(sb, other_jl, 0);
1319
1320
1321 goto restart;
1322 }
1323 return 0;
1324 }
1325
1326 static void del_from_work_list(struct super_block *s,
1327 struct reiserfs_journal_list *jl)
1328 {
1329 struct reiserfs_journal *journal = SB_JOURNAL(s);
1330 if (!list_empty(&jl->j_working_list)) {
1331 list_del_init(&jl->j_working_list);
1332 journal->j_num_work_lists--;
1333 }
1334 }
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346 static int flush_journal_list(struct super_block *s,
1347 struct reiserfs_journal_list *jl, int flushall)
1348 {
1349 struct reiserfs_journal_list *pjl;
1350 struct reiserfs_journal_cnode *cn;
1351 int count;
1352 int was_jwait = 0;
1353 int was_dirty = 0;
1354 struct buffer_head *saved_bh;
1355 unsigned long j_len_saved = jl->j_len;
1356 struct reiserfs_journal *journal = SB_JOURNAL(s);
1357 int err = 0;
1358 int depth;
1359
1360 BUG_ON(j_len_saved <= 0);
1361
1362 if (atomic_read(&journal->j_wcount) != 0) {
1363 reiserfs_warning(s, "clm-2048", "called with wcount %d",
1364 atomic_read(&journal->j_wcount));
1365 }
1366
1367
1368 if (flushall) {
1369 reiserfs_mutex_lock_safe(&journal->j_flush_mutex, s);
1370 } else if (mutex_trylock(&journal->j_flush_mutex)) {
1371 BUG();
1372 }
1373
1374 count = 0;
1375 if (j_len_saved > journal->j_trans_max) {
1376 reiserfs_panic(s, "journal-715", "length is %lu, trans id %lu",
1377 j_len_saved, jl->j_trans_id);
1378 return 0;
1379 }
1380
1381
1382 if (atomic_read(&jl->j_nonzerolen) <= 0 &&
1383 atomic_read(&jl->j_commit_left) <= 0) {
1384 goto flush_older_and_return;
1385 }
1386
1387
1388
1389
1390
1391 flush_commit_list(s, jl, 1);
1392
1393 if (!(jl->j_state & LIST_DIRTY)
1394 && !reiserfs_is_journal_aborted(journal))
1395 BUG();
1396
1397
1398 if (atomic_read(&jl->j_nonzerolen) <= 0 &&
1399 atomic_read(&jl->j_commit_left) <= 0) {
1400 goto flush_older_and_return;
1401 }
1402
1403
1404
1405
1406
1407 if (atomic_read(&journal->j_wcount) != 0) {
1408 reiserfs_panic(s, "journal-844", "journal list is flushing, "
1409 "wcount is not 0");
1410 }
1411 cn = jl->j_realblock;
1412 while (cn) {
1413 was_jwait = 0;
1414 was_dirty = 0;
1415 saved_bh = NULL;
1416
1417 if (cn->blocknr == 0) {
1418 goto free_cnode;
1419 }
1420
1421
1422
1423
1424
1425 if (!(jl->j_state & LIST_DIRTY))
1426 goto free_cnode;
1427
1428 pjl = find_newer_jl_for_cn(cn);
1429
1430
1431
1432
1433
1434 if (!pjl && cn->bh) {
1435 saved_bh = cn->bh;
1436
1437
1438
1439
1440
1441 get_bh(saved_bh);
1442
1443 if (buffer_journal_dirty(saved_bh)) {
1444 BUG_ON(!can_dirty(cn));
1445 was_jwait = 1;
1446 was_dirty = 1;
1447 } else if (can_dirty(cn)) {
1448
1449
1450
1451
1452 BUG();
1453 }
1454 }
1455
1456
1457
1458
1459
1460 if (pjl) {
1461 if (atomic_read(&pjl->j_commit_left))
1462 flush_commit_list(s, pjl, 1);
1463 goto free_cnode;
1464 }
1465
1466
1467
1468
1469
1470 if (saved_bh == NULL) {
1471 goto free_cnode;
1472 }
1473
1474
1475
1476
1477
1478
1479 if ((!was_jwait) && !buffer_locked(saved_bh)) {
1480 reiserfs_warning(s, "journal-813",
1481 "BAD! buffer %llu %cdirty %cjwait, "
1482 "not in a newer transaction",
1483 (unsigned long long)saved_bh->
1484 b_blocknr, was_dirty ? ' ' : '!',
1485 was_jwait ? ' ' : '!');
1486 }
1487 if (was_dirty) {
1488
1489
1490
1491
1492 get_bh(saved_bh);
1493 set_bit(BLOCK_NEEDS_FLUSH, &cn->state);
1494 lock_buffer(saved_bh);
1495 BUG_ON(cn->blocknr != saved_bh->b_blocknr);
1496 if (buffer_dirty(saved_bh))
1497 submit_logged_buffer(saved_bh);
1498 else
1499 unlock_buffer(saved_bh);
1500 count++;
1501 } else {
1502 reiserfs_warning(s, "clm-2082",
1503 "Unable to flush buffer %llu in %s",
1504 (unsigned long long)saved_bh->
1505 b_blocknr, __func__);
1506 }
1507 free_cnode:
1508 cn = cn->next;
1509 if (saved_bh) {
1510
1511
1512
1513
1514 put_bh(saved_bh);
1515 if (atomic_read(&saved_bh->b_count) < 0) {
1516 reiserfs_warning(s, "journal-945",
1517 "saved_bh->b_count < 0");
1518 }
1519 }
1520 }
1521 if (count > 0) {
1522 cn = jl->j_realblock;
1523 while (cn) {
1524 if (test_bit(BLOCK_NEEDS_FLUSH, &cn->state)) {
1525 if (!cn->bh) {
1526 reiserfs_panic(s, "journal-1011",
1527 "cn->bh is NULL");
1528 }
1529
1530 depth = reiserfs_write_unlock_nested(s);
1531 __wait_on_buffer(cn->bh);
1532 reiserfs_write_lock_nested(s, depth);
1533
1534 if (!cn->bh) {
1535 reiserfs_panic(s, "journal-1012",
1536 "cn->bh is NULL");
1537 }
1538 if (unlikely(!buffer_uptodate(cn->bh))) {
1539 #ifdef CONFIG_REISERFS_CHECK
1540 reiserfs_warning(s, "journal-949",
1541 "buffer write failed");
1542 #endif
1543 err = -EIO;
1544 }
1545
1546
1547
1548
1549
1550 BUG_ON(!test_clear_buffer_journal_dirty
1551 (cn->bh));
1552
1553
1554 put_bh(cn->bh);
1555
1556 release_buffer_page(cn->bh);
1557 }
1558 cn = cn->next;
1559 }
1560 }
1561
1562 if (err)
1563 reiserfs_abort(s, -EIO,
1564 "Write error while pushing transaction to disk in %s",
1565 __func__);
1566 flush_older_and_return:
1567
1568
1569
1570
1571
1572
1573
1574 if (flushall) {
1575 flush_older_journal_lists(s, jl);
1576 }
1577
1578 err = journal->j_errno;
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588 if (!err && flushall) {
1589 err =
1590 update_journal_header_block(s,
1591 (jl->j_start + jl->j_len +
1592 2) % SB_ONDISK_JOURNAL_SIZE(s),
1593 jl->j_trans_id);
1594 if (err)
1595 reiserfs_abort(s, -EIO,
1596 "Write error while updating journal header in %s",
1597 __func__);
1598 }
1599 remove_all_from_journal_list(s, jl, 0);
1600 list_del_init(&jl->j_list);
1601 journal->j_num_lists--;
1602 del_from_work_list(s, jl);
1603
1604 if (journal->j_last_flush_id != 0 &&
1605 (jl->j_trans_id - journal->j_last_flush_id) != 1) {
1606 reiserfs_warning(s, "clm-2201", "last flush %lu, current %lu",
1607 journal->j_last_flush_id, jl->j_trans_id);
1608 }
1609 journal->j_last_flush_id = jl->j_trans_id;
1610
1611
1612
1613
1614
1615 jl->j_len = 0;
1616 atomic_set(&jl->j_nonzerolen, 0);
1617 jl->j_start = 0;
1618 jl->j_realblock = NULL;
1619 jl->j_commit_bh = NULL;
1620 jl->j_trans_id = 0;
1621 jl->j_state = 0;
1622 put_journal_list(s, jl);
1623 if (flushall)
1624 mutex_unlock(&journal->j_flush_mutex);
1625 return err;
1626 }
1627
1628 static int write_one_transaction(struct super_block *s,
1629 struct reiserfs_journal_list *jl,
1630 struct buffer_chunk *chunk)
1631 {
1632 struct reiserfs_journal_cnode *cn;
1633 int ret = 0;
1634
1635 jl->j_state |= LIST_TOUCHED;
1636 del_from_work_list(s, jl);
1637 if (jl->j_len == 0 || atomic_read(&jl->j_nonzerolen) == 0) {
1638 return 0;
1639 }
1640
1641 cn = jl->j_realblock;
1642 while (cn) {
1643
1644
1645
1646
1647 if (cn->blocknr == 0) {
1648 goto next;
1649 }
1650 if (cn->bh && can_dirty(cn) && buffer_dirty(cn->bh)) {
1651 struct buffer_head *tmp_bh;
1652
1653
1654
1655
1656
1657 tmp_bh = cn->bh;
1658 get_bh(tmp_bh);
1659 lock_buffer(tmp_bh);
1660 if (cn->bh && can_dirty(cn) && buffer_dirty(tmp_bh)) {
1661 if (!buffer_journal_dirty(tmp_bh) ||
1662 buffer_journal_prepared(tmp_bh))
1663 BUG();
1664 add_to_chunk(chunk, tmp_bh, NULL, write_chunk);
1665 ret++;
1666 } else {
1667
1668 unlock_buffer(tmp_bh);
1669 }
1670 put_bh(tmp_bh);
1671 }
1672 next:
1673 cn = cn->next;
1674 cond_resched();
1675 }
1676 return ret;
1677 }
1678
1679
1680 static void dirty_one_transaction(struct super_block *s,
1681 struct reiserfs_journal_list *jl)
1682 {
1683 struct reiserfs_journal_cnode *cn;
1684 struct reiserfs_journal_list *pjl;
1685
1686 jl->j_state |= LIST_DIRTY;
1687 cn = jl->j_realblock;
1688 while (cn) {
1689
1690
1691
1692
1693
1694 pjl = find_newer_jl_for_cn(cn);
1695 if (!pjl && cn->blocknr && cn->bh
1696 && buffer_journal_dirty(cn->bh)) {
1697 BUG_ON(!can_dirty(cn));
1698
1699
1700
1701
1702
1703 clear_buffer_journal_new(cn->bh);
1704 if (buffer_journal_prepared(cn->bh)) {
1705 set_buffer_journal_restore_dirty(cn->bh);
1706 } else {
1707 set_buffer_journal_test(cn->bh);
1708 mark_buffer_dirty(cn->bh);
1709 }
1710 }
1711 cn = cn->next;
1712 }
1713 }
1714
1715 static int kupdate_transactions(struct super_block *s,
1716 struct reiserfs_journal_list *jl,
1717 struct reiserfs_journal_list **next_jl,
1718 unsigned int *next_trans_id,
1719 int num_blocks, int num_trans)
1720 {
1721 int ret = 0;
1722 int written = 0;
1723 int transactions_flushed = 0;
1724 unsigned int orig_trans_id = jl->j_trans_id;
1725 struct buffer_chunk chunk;
1726 struct list_head *entry;
1727 struct reiserfs_journal *journal = SB_JOURNAL(s);
1728 chunk.nr = 0;
1729
1730 reiserfs_mutex_lock_safe(&journal->j_flush_mutex, s);
1731 if (!journal_list_still_alive(s, orig_trans_id)) {
1732 goto done;
1733 }
1734
1735
1736
1737
1738
1739 while ((num_trans && transactions_flushed < num_trans) ||
1740 (!num_trans && written < num_blocks)) {
1741
1742 if (jl->j_len == 0 || (jl->j_state & LIST_TOUCHED) ||
1743 atomic_read(&jl->j_commit_left)
1744 || !(jl->j_state & LIST_DIRTY)) {
1745 del_from_work_list(s, jl);
1746 break;
1747 }
1748 ret = write_one_transaction(s, jl, &chunk);
1749
1750 if (ret < 0)
1751 goto done;
1752 transactions_flushed++;
1753 written += ret;
1754 entry = jl->j_list.next;
1755
1756
1757 if (entry == &journal->j_journal_list) {
1758 break;
1759 }
1760 jl = JOURNAL_LIST_ENTRY(entry);
1761
1762
1763 if (jl->j_trans_id <= orig_trans_id)
1764 break;
1765 }
1766 if (chunk.nr) {
1767 write_chunk(&chunk);
1768 }
1769
1770 done:
1771 mutex_unlock(&journal->j_flush_mutex);
1772 return ret;
1773 }
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785 static int flush_used_journal_lists(struct super_block *s,
1786 struct reiserfs_journal_list *jl)
1787 {
1788 unsigned long len = 0;
1789 unsigned long cur_len;
1790 int i;
1791 int limit = 256;
1792 struct reiserfs_journal_list *tjl;
1793 struct reiserfs_journal_list *flush_jl;
1794 unsigned int trans_id;
1795 struct reiserfs_journal *journal = SB_JOURNAL(s);
1796
1797 flush_jl = tjl = jl;
1798
1799
1800 if (reiserfs_data_log(s))
1801 limit = 1024;
1802
1803 for (i = 0; i < 256 && len < limit; i++) {
1804 if (atomic_read(&tjl->j_commit_left) ||
1805 tjl->j_trans_id < jl->j_trans_id) {
1806 break;
1807 }
1808 cur_len = atomic_read(&tjl->j_nonzerolen);
1809 if (cur_len > 0) {
1810 tjl->j_state &= ~LIST_TOUCHED;
1811 }
1812 len += cur_len;
1813 flush_jl = tjl;
1814 if (tjl->j_list.next == &journal->j_journal_list)
1815 break;
1816 tjl = JOURNAL_LIST_ENTRY(tjl->j_list.next);
1817 }
1818 get_journal_list(jl);
1819 get_journal_list(flush_jl);
1820
1821
1822
1823
1824
1825
1826 if (flush_jl != jl)
1827 kupdate_transactions(s, jl, &tjl, &trans_id, len, i);
1828
1829 flush_journal_list(s, flush_jl, 1);
1830 put_journal_list(s, flush_jl);
1831 put_journal_list(s, jl);
1832 return 0;
1833 }
1834
1835
1836
1837
1838
1839 static void remove_journal_hash(struct super_block *sb,
1840 struct reiserfs_journal_cnode **table,
1841 struct reiserfs_journal_list *jl,
1842 unsigned long block, int remove_freed)
1843 {
1844 struct reiserfs_journal_cnode *cur;
1845 struct reiserfs_journal_cnode **head;
1846
1847 head = &(journal_hash(table, sb, block));
1848 if (!head) {
1849 return;
1850 }
1851 cur = *head;
1852 while (cur) {
1853 if (cur->blocknr == block && cur->sb == sb
1854 && (jl == NULL || jl == cur->jlist)
1855 && (!test_bit(BLOCK_FREED, &cur->state) || remove_freed)) {
1856 if (cur->hnext) {
1857 cur->hnext->hprev = cur->hprev;
1858 }
1859 if (cur->hprev) {
1860 cur->hprev->hnext = cur->hnext;
1861 } else {
1862 *head = cur->hnext;
1863 }
1864 cur->blocknr = 0;
1865 cur->sb = NULL;
1866 cur->state = 0;
1867
1868
1869
1870
1871 if (cur->bh && cur->jlist)
1872 atomic_dec(&cur->jlist->j_nonzerolen);
1873 cur->bh = NULL;
1874 cur->jlist = NULL;
1875 }
1876 cur = cur->hnext;
1877 }
1878 }
1879
1880 static void free_journal_ram(struct super_block *sb)
1881 {
1882 struct reiserfs_journal *journal = SB_JOURNAL(sb);
1883 kfree(journal->j_current_jl);
1884 journal->j_num_lists--;
1885
1886 vfree(journal->j_cnode_free_orig);
1887 free_list_bitmaps(sb, journal->j_list_bitmap);
1888 free_bitmap_nodes(sb);
1889 if (journal->j_header_bh) {
1890 brelse(journal->j_header_bh);
1891 }
1892
1893
1894
1895
1896 release_journal_dev(sb, journal);
1897 vfree(journal);
1898 }
1899
1900
1901
1902
1903
1904 static int do_journal_release(struct reiserfs_transaction_handle *th,
1905 struct super_block *sb, int error)
1906 {
1907 struct reiserfs_transaction_handle myth;
1908 struct reiserfs_journal *journal = SB_JOURNAL(sb);
1909
1910
1911
1912
1913
1914 if (!error && !sb_rdonly(sb)) {
1915
1916 BUG_ON(!th->t_trans_id);
1917 do_journal_end(th, FLUSH_ALL);
1918
1919
1920
1921
1922
1923 if (!journal_join(&myth, sb)) {
1924 reiserfs_prepare_for_journal(sb,
1925 SB_BUFFER_WITH_SB(sb),
1926 1);
1927 journal_mark_dirty(&myth, SB_BUFFER_WITH_SB(sb));
1928 do_journal_end(&myth, FLUSH_ALL);
1929 }
1930 }
1931
1932
1933 if (!error && reiserfs_is_journal_aborted(journal)) {
1934 memset(&myth, 0, sizeof(myth));
1935 if (!journal_join_abort(&myth, sb)) {
1936 reiserfs_prepare_for_journal(sb,
1937 SB_BUFFER_WITH_SB(sb),
1938 1);
1939 journal_mark_dirty(&myth, SB_BUFFER_WITH_SB(sb));
1940 do_journal_end(&myth, FLUSH_ALL);
1941 }
1942 }
1943
1944
1945
1946
1947
1948
1949 reiserfs_write_unlock(sb);
1950
1951
1952
1953
1954
1955
1956 reiserfs_cancel_old_flush(sb);
1957
1958 cancel_delayed_work_sync(&SB_JOURNAL(sb)->j_work);
1959
1960 free_journal_ram(sb);
1961
1962 reiserfs_write_lock(sb);
1963
1964 return 0;
1965 }
1966
1967
1968 int journal_release(struct reiserfs_transaction_handle *th,
1969 struct super_block *sb)
1970 {
1971 return do_journal_release(th, sb, 0);
1972 }
1973
1974
1975 int journal_release_error(struct reiserfs_transaction_handle *th,
1976 struct super_block *sb)
1977 {
1978 return do_journal_release(th, sb, 1);
1979 }
1980
1981
1982
1983
1984
1985 static int journal_compare_desc_commit(struct super_block *sb,
1986 struct reiserfs_journal_desc *desc,
1987 struct reiserfs_journal_commit *commit)
1988 {
1989 if (get_commit_trans_id(commit) != get_desc_trans_id(desc) ||
1990 get_commit_trans_len(commit) != get_desc_trans_len(desc) ||
1991 get_commit_trans_len(commit) > SB_JOURNAL(sb)->j_trans_max ||
1992 get_commit_trans_len(commit) <= 0) {
1993 return 1;
1994 }
1995 return 0;
1996 }
1997
1998
1999
2000
2001
2002
2003
2004 static int journal_transaction_is_valid(struct super_block *sb,
2005 struct buffer_head *d_bh,
2006 unsigned int *oldest_invalid_trans_id,
2007 unsigned long *newest_mount_id)
2008 {
2009 struct reiserfs_journal_desc *desc;
2010 struct reiserfs_journal_commit *commit;
2011 struct buffer_head *c_bh;
2012 unsigned long offset;
2013
2014 if (!d_bh)
2015 return 0;
2016
2017 desc = (struct reiserfs_journal_desc *)d_bh->b_data;
2018 if (get_desc_trans_len(desc) > 0
2019 && !memcmp(get_journal_desc_magic(d_bh), JOURNAL_DESC_MAGIC, 8)) {
2020 if (oldest_invalid_trans_id && *oldest_invalid_trans_id
2021 && get_desc_trans_id(desc) > *oldest_invalid_trans_id) {
2022 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2023 "journal-986: transaction "
2024 "is valid returning because trans_id %d is greater than "
2025 "oldest_invalid %lu",
2026 get_desc_trans_id(desc),
2027 *oldest_invalid_trans_id);
2028 return 0;
2029 }
2030 if (newest_mount_id
2031 && *newest_mount_id > get_desc_mount_id(desc)) {
2032 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2033 "journal-1087: transaction "
2034 "is valid returning because mount_id %d is less than "
2035 "newest_mount_id %lu",
2036 get_desc_mount_id(desc),
2037 *newest_mount_id);
2038 return -1;
2039 }
2040 if (get_desc_trans_len(desc) > SB_JOURNAL(sb)->j_trans_max) {
2041 reiserfs_warning(sb, "journal-2018",
2042 "Bad transaction length %d "
2043 "encountered, ignoring transaction",
2044 get_desc_trans_len(desc));
2045 return -1;
2046 }
2047 offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
2048
2049
2050
2051
2052
2053 c_bh =
2054 journal_bread(sb,
2055 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2056 ((offset + get_desc_trans_len(desc) +
2057 1) % SB_ONDISK_JOURNAL_SIZE(sb)));
2058 if (!c_bh)
2059 return 0;
2060 commit = (struct reiserfs_journal_commit *)c_bh->b_data;
2061 if (journal_compare_desc_commit(sb, desc, commit)) {
2062 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2063 "journal_transaction_is_valid, commit offset %ld had bad "
2064 "time %d or length %d",
2065 c_bh->b_blocknr -
2066 SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2067 get_commit_trans_id(commit),
2068 get_commit_trans_len(commit));
2069 brelse(c_bh);
2070 if (oldest_invalid_trans_id) {
2071 *oldest_invalid_trans_id =
2072 get_desc_trans_id(desc);
2073 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2074 "journal-1004: "
2075 "transaction_is_valid setting oldest invalid trans_id "
2076 "to %d",
2077 get_desc_trans_id(desc));
2078 }
2079 return -1;
2080 }
2081 brelse(c_bh);
2082 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2083 "journal-1006: found valid "
2084 "transaction start offset %llu, len %d id %d",
2085 d_bh->b_blocknr -
2086 SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2087 get_desc_trans_len(desc),
2088 get_desc_trans_id(desc));
2089 return 1;
2090 } else {
2091 return 0;
2092 }
2093 }
2094
2095 static void brelse_array(struct buffer_head **heads, int num)
2096 {
2097 int i;
2098 for (i = 0; i < num; i++) {
2099 brelse(heads[i]);
2100 }
2101 }
2102
2103
2104
2105
2106
2107
2108
2109 static int journal_read_transaction(struct super_block *sb,
2110 unsigned long cur_dblock,
2111 unsigned long oldest_start,
2112 unsigned int oldest_trans_id,
2113 unsigned long newest_mount_id)
2114 {
2115 struct reiserfs_journal *journal = SB_JOURNAL(sb);
2116 struct reiserfs_journal_desc *desc;
2117 struct reiserfs_journal_commit *commit;
2118 unsigned int trans_id = 0;
2119 struct buffer_head *c_bh;
2120 struct buffer_head *d_bh;
2121 struct buffer_head **log_blocks = NULL;
2122 struct buffer_head **real_blocks = NULL;
2123 unsigned int trans_offset;
2124 int i;
2125 int trans_half;
2126
2127 d_bh = journal_bread(sb, cur_dblock);
2128 if (!d_bh)
2129 return 1;
2130 desc = (struct reiserfs_journal_desc *)d_bh->b_data;
2131 trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
2132 reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1037: "
2133 "journal_read_transaction, offset %llu, len %d mount_id %d",
2134 d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2135 get_desc_trans_len(desc), get_desc_mount_id(desc));
2136 if (get_desc_trans_id(desc) < oldest_trans_id) {
2137 reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1039: "
2138 "journal_read_trans skipping because %lu is too old",
2139 cur_dblock -
2140 SB_ONDISK_JOURNAL_1st_BLOCK(sb));
2141 brelse(d_bh);
2142 return 1;
2143 }
2144 if (get_desc_mount_id(desc) != newest_mount_id) {
2145 reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1146: "
2146 "journal_read_trans skipping because %d is != "
2147 "newest_mount_id %lu", get_desc_mount_id(desc),
2148 newest_mount_id);
2149 brelse(d_bh);
2150 return 1;
2151 }
2152 c_bh = journal_bread(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2153 ((trans_offset + get_desc_trans_len(desc) + 1) %
2154 SB_ONDISK_JOURNAL_SIZE(sb)));
2155 if (!c_bh) {
2156 brelse(d_bh);
2157 return 1;
2158 }
2159 commit = (struct reiserfs_journal_commit *)c_bh->b_data;
2160 if (journal_compare_desc_commit(sb, desc, commit)) {
2161 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2162 "journal_read_transaction, "
2163 "commit offset %llu had bad time %d or length %d",
2164 c_bh->b_blocknr -
2165 SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2166 get_commit_trans_id(commit),
2167 get_commit_trans_len(commit));
2168 brelse(c_bh);
2169 brelse(d_bh);
2170 return 1;
2171 }
2172
2173 if (bdev_read_only(sb->s_bdev)) {
2174 reiserfs_warning(sb, "clm-2076",
2175 "device is readonly, unable to replay log");
2176 brelse(c_bh);
2177 brelse(d_bh);
2178 return -EROFS;
2179 }
2180
2181 trans_id = get_desc_trans_id(desc);
2182
2183
2184
2185
2186 log_blocks = kmalloc_array(get_desc_trans_len(desc),
2187 sizeof(struct buffer_head *),
2188 GFP_NOFS);
2189 real_blocks = kmalloc_array(get_desc_trans_len(desc),
2190 sizeof(struct buffer_head *),
2191 GFP_NOFS);
2192 if (!log_blocks || !real_blocks) {
2193 brelse(c_bh);
2194 brelse(d_bh);
2195 kfree(log_blocks);
2196 kfree(real_blocks);
2197 reiserfs_warning(sb, "journal-1169",
2198 "kmalloc failed, unable to mount FS");
2199 return -1;
2200 }
2201
2202 trans_half = journal_trans_half(sb->s_blocksize);
2203 for (i = 0; i < get_desc_trans_len(desc); i++) {
2204 log_blocks[i] =
2205 journal_getblk(sb,
2206 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2207 (trans_offset + 1 +
2208 i) % SB_ONDISK_JOURNAL_SIZE(sb));
2209 if (i < trans_half) {
2210 real_blocks[i] =
2211 sb_getblk(sb,
2212 le32_to_cpu(desc->j_realblock[i]));
2213 } else {
2214 real_blocks[i] =
2215 sb_getblk(sb,
2216 le32_to_cpu(commit->
2217 j_realblock[i - trans_half]));
2218 }
2219 if (real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(sb)) {
2220 reiserfs_warning(sb, "journal-1207",
2221 "REPLAY FAILURE fsck required! "
2222 "Block to replay is outside of "
2223 "filesystem");
2224 goto abort_replay;
2225 }
2226
2227 if (is_block_in_log_or_reserved_area
2228 (sb, real_blocks[i]->b_blocknr)) {
2229 reiserfs_warning(sb, "journal-1204",
2230 "REPLAY FAILURE fsck required! "
2231 "Trying to replay onto a log block");
2232 abort_replay:
2233 brelse_array(log_blocks, i);
2234 brelse_array(real_blocks, i);
2235 brelse(c_bh);
2236 brelse(d_bh);
2237 kfree(log_blocks);
2238 kfree(real_blocks);
2239 return -1;
2240 }
2241 }
2242
2243 ll_rw_block(REQ_OP_READ, get_desc_trans_len(desc), log_blocks);
2244 for (i = 0; i < get_desc_trans_len(desc); i++) {
2245
2246 wait_on_buffer(log_blocks[i]);
2247 if (!buffer_uptodate(log_blocks[i])) {
2248 reiserfs_warning(sb, "journal-1212",
2249 "REPLAY FAILURE fsck required! "
2250 "buffer write failed");
2251 brelse_array(log_blocks + i,
2252 get_desc_trans_len(desc) - i);
2253 brelse_array(real_blocks, get_desc_trans_len(desc));
2254 brelse(c_bh);
2255 brelse(d_bh);
2256 kfree(log_blocks);
2257 kfree(real_blocks);
2258 return -1;
2259 }
2260 memcpy(real_blocks[i]->b_data, log_blocks[i]->b_data,
2261 real_blocks[i]->b_size);
2262 set_buffer_uptodate(real_blocks[i]);
2263 brelse(log_blocks[i]);
2264 }
2265
2266 for (i = 0; i < get_desc_trans_len(desc); i++) {
2267 set_buffer_dirty(real_blocks[i]);
2268 write_dirty_buffer(real_blocks[i], 0);
2269 }
2270 for (i = 0; i < get_desc_trans_len(desc); i++) {
2271 wait_on_buffer(real_blocks[i]);
2272 if (!buffer_uptodate(real_blocks[i])) {
2273 reiserfs_warning(sb, "journal-1226",
2274 "REPLAY FAILURE, fsck required! "
2275 "buffer write failed");
2276 brelse_array(real_blocks + i,
2277 get_desc_trans_len(desc) - i);
2278 brelse(c_bh);
2279 brelse(d_bh);
2280 kfree(log_blocks);
2281 kfree(real_blocks);
2282 return -1;
2283 }
2284 brelse(real_blocks[i]);
2285 }
2286 cur_dblock =
2287 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2288 ((trans_offset + get_desc_trans_len(desc) +
2289 2) % SB_ONDISK_JOURNAL_SIZE(sb));
2290 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2291 "journal-1095: setting journal " "start to offset %ld",
2292 cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb));
2293
2294
2295
2296
2297
2298 journal->j_start = cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
2299 journal->j_last_flush_trans_id = trans_id;
2300 journal->j_trans_id = trans_id + 1;
2301
2302 if (journal->j_trans_id == 0)
2303 journal->j_trans_id = 10;
2304 brelse(c_bh);
2305 brelse(d_bh);
2306 kfree(log_blocks);
2307 kfree(real_blocks);
2308 return 0;
2309 }
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319 static struct buffer_head *reiserfs_breada(struct block_device *dev,
2320 b_blocknr_t block, int bufsize,
2321 b_blocknr_t max_block)
2322 {
2323 struct buffer_head *bhlist[BUFNR];
2324 unsigned int blocks = BUFNR;
2325 struct buffer_head *bh;
2326 int i, j;
2327
2328 bh = __getblk(dev, block, bufsize);
2329 if (buffer_uptodate(bh))
2330 return (bh);
2331
2332 if (block + BUFNR > max_block) {
2333 blocks = max_block - block;
2334 }
2335 bhlist[0] = bh;
2336 j = 1;
2337 for (i = 1; i < blocks; i++) {
2338 bh = __getblk(dev, block + i, bufsize);
2339 if (buffer_uptodate(bh)) {
2340 brelse(bh);
2341 break;
2342 } else
2343 bhlist[j++] = bh;
2344 }
2345 ll_rw_block(REQ_OP_READ, j, bhlist);
2346 for (i = 1; i < j; i++)
2347 brelse(bhlist[i]);
2348 bh = bhlist[0];
2349 wait_on_buffer(bh);
2350 if (buffer_uptodate(bh))
2351 return bh;
2352 brelse(bh);
2353 return NULL;
2354 }
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368 static int journal_read(struct super_block *sb)
2369 {
2370 struct reiserfs_journal *journal = SB_JOURNAL(sb);
2371 struct reiserfs_journal_desc *desc;
2372 unsigned int oldest_trans_id = 0;
2373 unsigned int oldest_invalid_trans_id = 0;
2374 time64_t start;
2375 unsigned long oldest_start = 0;
2376 unsigned long cur_dblock = 0;
2377 unsigned long newest_mount_id = 9;
2378 struct buffer_head *d_bh;
2379 struct reiserfs_journal_header *jh;
2380 int valid_journal_header = 0;
2381 int replay_count = 0;
2382 int continue_replay = 1;
2383 int ret;
2384
2385 cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb);
2386 reiserfs_info(sb, "checking transaction log (%pg)\n",
2387 journal->j_dev_bd);
2388 start = ktime_get_seconds();
2389
2390
2391
2392
2393
2394
2395 journal->j_header_bh = journal_bread(sb,
2396 SB_ONDISK_JOURNAL_1st_BLOCK(sb)
2397 + SB_ONDISK_JOURNAL_SIZE(sb));
2398 if (!journal->j_header_bh) {
2399 return 1;
2400 }
2401 jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data);
2402 if (le32_to_cpu(jh->j_first_unflushed_offset) <
2403 SB_ONDISK_JOURNAL_SIZE(sb)
2404 && le32_to_cpu(jh->j_last_flush_trans_id) > 0) {
2405 oldest_start =
2406 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2407 le32_to_cpu(jh->j_first_unflushed_offset);
2408 oldest_trans_id = le32_to_cpu(jh->j_last_flush_trans_id) + 1;
2409 newest_mount_id = le32_to_cpu(jh->j_mount_id);
2410 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2411 "journal-1153: found in "
2412 "header: first_unflushed_offset %d, last_flushed_trans_id "
2413 "%lu", le32_to_cpu(jh->j_first_unflushed_offset),
2414 le32_to_cpu(jh->j_last_flush_trans_id));
2415 valid_journal_header = 1;
2416
2417
2418
2419
2420
2421
2422 d_bh =
2423 journal_bread(sb,
2424 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2425 le32_to_cpu(jh->j_first_unflushed_offset));
2426 ret = journal_transaction_is_valid(sb, d_bh, NULL, NULL);
2427 if (!ret) {
2428 continue_replay = 0;
2429 }
2430 brelse(d_bh);
2431 goto start_log_replay;
2432 }
2433
2434
2435
2436
2437
2438
2439 while (continue_replay
2440 && cur_dblock <
2441 (SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2442 SB_ONDISK_JOURNAL_SIZE(sb))) {
2443
2444
2445
2446
2447 d_bh =
2448 reiserfs_breada(journal->j_dev_bd, cur_dblock,
2449 sb->s_blocksize,
2450 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2451 SB_ONDISK_JOURNAL_SIZE(sb));
2452 ret =
2453 journal_transaction_is_valid(sb, d_bh,
2454 &oldest_invalid_trans_id,
2455 &newest_mount_id);
2456 if (ret == 1) {
2457 desc = (struct reiserfs_journal_desc *)d_bh->b_data;
2458 if (oldest_start == 0) {
2459 oldest_trans_id = get_desc_trans_id(desc);
2460 oldest_start = d_bh->b_blocknr;
2461 newest_mount_id = get_desc_mount_id(desc);
2462 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2463 "journal-1179: Setting "
2464 "oldest_start to offset %llu, trans_id %lu",
2465 oldest_start -
2466 SB_ONDISK_JOURNAL_1st_BLOCK
2467 (sb), oldest_trans_id);
2468 } else if (oldest_trans_id > get_desc_trans_id(desc)) {
2469
2470 oldest_trans_id = get_desc_trans_id(desc);
2471 oldest_start = d_bh->b_blocknr;
2472 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2473 "journal-1180: Resetting "
2474 "oldest_start to offset %lu, trans_id %lu",
2475 oldest_start -
2476 SB_ONDISK_JOURNAL_1st_BLOCK
2477 (sb), oldest_trans_id);
2478 }
2479 if (newest_mount_id < get_desc_mount_id(desc)) {
2480 newest_mount_id = get_desc_mount_id(desc);
2481 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2482 "journal-1299: Setting "
2483 "newest_mount_id to %d",
2484 get_desc_mount_id(desc));
2485 }
2486 cur_dblock += get_desc_trans_len(desc) + 2;
2487 } else {
2488 cur_dblock++;
2489 }
2490 brelse(d_bh);
2491 }
2492
2493 start_log_replay:
2494 cur_dblock = oldest_start;
2495 if (oldest_trans_id) {
2496 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2497 "journal-1206: Starting replay "
2498 "from offset %llu, trans_id %lu",
2499 cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2500 oldest_trans_id);
2501
2502 }
2503 replay_count = 0;
2504 while (continue_replay && oldest_trans_id > 0) {
2505 ret =
2506 journal_read_transaction(sb, cur_dblock, oldest_start,
2507 oldest_trans_id, newest_mount_id);
2508 if (ret < 0) {
2509 return ret;
2510 } else if (ret != 0) {
2511 break;
2512 }
2513 cur_dblock =
2514 SB_ONDISK_JOURNAL_1st_BLOCK(sb) + journal->j_start;
2515 replay_count++;
2516 if (cur_dblock == oldest_start)
2517 break;
2518 }
2519
2520 if (oldest_trans_id == 0) {
2521 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
2522 "journal-1225: No valid " "transactions found");
2523 }
2524
2525
2526
2527
2528
2529
2530 if (valid_journal_header && replay_count == 0) {
2531 journal->j_start = le32_to_cpu(jh->j_first_unflushed_offset);
2532 journal->j_trans_id =
2533 le32_to_cpu(jh->j_last_flush_trans_id) + 1;
2534
2535 if (journal->j_trans_id == 0)
2536 journal->j_trans_id = 10;
2537 journal->j_last_flush_trans_id =
2538 le32_to_cpu(jh->j_last_flush_trans_id);
2539 journal->j_mount_id = le32_to_cpu(jh->j_mount_id) + 1;
2540 } else {
2541 journal->j_mount_id = newest_mount_id + 1;
2542 }
2543 reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
2544 "newest_mount_id to %lu", journal->j_mount_id);
2545 journal->j_first_unflushed_offset = journal->j_start;
2546 if (replay_count > 0) {
2547 reiserfs_info(sb,
2548 "replayed %d transactions in %lu seconds\n",
2549 replay_count, ktime_get_seconds() - start);
2550 }
2551
2552 reiserfs_write_lock(sb);
2553 if (!bdev_read_only(sb->s_bdev) &&
2554 _update_journal_header_block(sb, journal->j_start,
2555 journal->j_last_flush_trans_id)) {
2556 reiserfs_write_unlock(sb);
2557
2558
2559
2560
2561 return -1;
2562 }
2563 reiserfs_write_unlock(sb);
2564 return 0;
2565 }
2566
2567 static struct reiserfs_journal_list *alloc_journal_list(struct super_block *s)
2568 {
2569 struct reiserfs_journal_list *jl;
2570 jl = kzalloc(sizeof(struct reiserfs_journal_list),
2571 GFP_NOFS | __GFP_NOFAIL);
2572 INIT_LIST_HEAD(&jl->j_list);
2573 INIT_LIST_HEAD(&jl->j_working_list);
2574 INIT_LIST_HEAD(&jl->j_tail_bh_list);
2575 INIT_LIST_HEAD(&jl->j_bh_list);
2576 mutex_init(&jl->j_commit_mutex);
2577 SB_JOURNAL(s)->j_num_lists++;
2578 get_journal_list(jl);
2579 return jl;
2580 }
2581
2582 static void journal_list_init(struct super_block *sb)
2583 {
2584 SB_JOURNAL(sb)->j_current_jl = alloc_journal_list(sb);
2585 }
2586
2587 static void release_journal_dev(struct super_block *super,
2588 struct reiserfs_journal *journal)
2589 {
2590 if (journal->j_dev_bd != NULL) {
2591 blkdev_put(journal->j_dev_bd, journal->j_dev_mode);
2592 journal->j_dev_bd = NULL;
2593 }
2594 }
2595
2596 static int journal_init_dev(struct super_block *super,
2597 struct reiserfs_journal *journal,
2598 const char *jdev_name)
2599 {
2600 int result;
2601 dev_t jdev;
2602 fmode_t blkdev_mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
2603
2604 result = 0;
2605
2606 journal->j_dev_bd = NULL;
2607 jdev = SB_ONDISK_JOURNAL_DEVICE(super) ?
2608 new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;
2609
2610 if (bdev_read_only(super->s_bdev))
2611 blkdev_mode = FMODE_READ;
2612
2613
2614 if ((!jdev_name || !jdev_name[0])) {
2615 if (jdev == super->s_dev)
2616 blkdev_mode &= ~FMODE_EXCL;
2617 journal->j_dev_bd = blkdev_get_by_dev(jdev, blkdev_mode,
2618 journal);
2619 journal->j_dev_mode = blkdev_mode;
2620 if (IS_ERR(journal->j_dev_bd)) {
2621 result = PTR_ERR(journal->j_dev_bd);
2622 journal->j_dev_bd = NULL;
2623 reiserfs_warning(super, "sh-458",
2624 "cannot init journal device unknown-block(%u,%u): %i",
2625 MAJOR(jdev), MINOR(jdev), result);
2626 return result;
2627 } else if (jdev != super->s_dev)
2628 set_blocksize(journal->j_dev_bd, super->s_blocksize);
2629
2630 return 0;
2631 }
2632
2633 journal->j_dev_mode = blkdev_mode;
2634 journal->j_dev_bd = blkdev_get_by_path(jdev_name, blkdev_mode, journal);
2635 if (IS_ERR(journal->j_dev_bd)) {
2636 result = PTR_ERR(journal->j_dev_bd);
2637 journal->j_dev_bd = NULL;
2638 reiserfs_warning(super, "sh-457",
2639 "journal_init_dev: Cannot open '%s': %i",
2640 jdev_name, result);
2641 return result;
2642 }
2643
2644 set_blocksize(journal->j_dev_bd, super->s_blocksize);
2645 reiserfs_info(super,
2646 "journal_init_dev: journal device: %pg\n",
2647 journal->j_dev_bd);
2648 return 0;
2649 }
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663 #define REISERFS_STANDARD_BLKSIZE (4096)
2664
2665 static int check_advise_trans_params(struct super_block *sb,
2666 struct reiserfs_journal *journal)
2667 {
2668 if (journal->j_trans_max) {
2669
2670 int ratio = 1;
2671 if (sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
2672 ratio = REISERFS_STANDARD_BLKSIZE / sb->s_blocksize;
2673
2674 if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio ||
2675 journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio ||
2676 SB_ONDISK_JOURNAL_SIZE(sb) / journal->j_trans_max <
2677 JOURNAL_MIN_RATIO) {
2678 reiserfs_warning(sb, "sh-462",
2679 "bad transaction max size (%u). "
2680 "FSCK?", journal->j_trans_max);
2681 return 1;
2682 }
2683 if (journal->j_max_batch != (journal->j_trans_max) *
2684 JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT) {
2685 reiserfs_warning(sb, "sh-463",
2686 "bad transaction max batch (%u). "
2687 "FSCK?", journal->j_max_batch);
2688 return 1;
2689 }
2690 } else {
2691
2692
2693
2694
2695
2696
2697 if (sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
2698 reiserfs_warning(sb, "sh-464", "bad blocksize (%u)",
2699 sb->s_blocksize);
2700 return 1;
2701 }
2702 journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
2703 journal->j_max_batch = JOURNAL_MAX_BATCH_DEFAULT;
2704 journal->j_max_commit_age = JOURNAL_MAX_COMMIT_AGE;
2705 }
2706 return 0;
2707 }
2708
2709
2710 int journal_init(struct super_block *sb, const char *j_dev_name,
2711 int old_format, unsigned int commit_max_age)
2712 {
2713 int num_cnodes = SB_ONDISK_JOURNAL_SIZE(sb) * 2;
2714 struct buffer_head *bhjh;
2715 struct reiserfs_super_block *rs;
2716 struct reiserfs_journal_header *jh;
2717 struct reiserfs_journal *journal;
2718 struct reiserfs_journal_list *jl;
2719 int ret;
2720
2721 journal = SB_JOURNAL(sb) = vzalloc(sizeof(struct reiserfs_journal));
2722 if (!journal) {
2723 reiserfs_warning(sb, "journal-1256",
2724 "unable to get memory for journal structure");
2725 return 1;
2726 }
2727 INIT_LIST_HEAD(&journal->j_bitmap_nodes);
2728 INIT_LIST_HEAD(&journal->j_prealloc_list);
2729 INIT_LIST_HEAD(&journal->j_working_list);
2730 INIT_LIST_HEAD(&journal->j_journal_list);
2731 journal->j_persistent_trans = 0;
2732 if (reiserfs_allocate_list_bitmaps(sb, journal->j_list_bitmap,
2733 reiserfs_bmap_count(sb)))
2734 goto free_and_return;
2735
2736 allocate_bitmap_nodes(sb);
2737
2738
2739 SB_JOURNAL_1st_RESERVED_BLOCK(sb) = (old_format ?
2740 REISERFS_OLD_DISK_OFFSET_IN_BYTES
2741 / sb->s_blocksize +
2742 reiserfs_bmap_count(sb) +
2743 1 :
2744 REISERFS_DISK_OFFSET_IN_BYTES /
2745 sb->s_blocksize + 2);
2746
2747
2748
2749
2750
2751 if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
2752 (SB_JOURNAL_1st_RESERVED_BLOCK(sb) +
2753 SB_ONDISK_JOURNAL_SIZE(sb) > sb->s_blocksize * 8)) {
2754 reiserfs_warning(sb, "journal-1393",
2755 "journal does not fit for area addressed "
2756 "by first of bitmap blocks. It starts at "
2757 "%u and its size is %u. Block size %ld",
2758 SB_JOURNAL_1st_RESERVED_BLOCK(sb),
2759 SB_ONDISK_JOURNAL_SIZE(sb),
2760 sb->s_blocksize);
2761 goto free_and_return;
2762 }
2763
2764
2765
2766
2767
2768
2769 if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
2770 SB_ONDISK_JOURNAL_1st_BLOCK(sb) < SB_JOURNAL_1st_RESERVED_BLOCK(sb)) {
2771 reiserfs_warning(sb, "journal-1393",
2772 "journal 1st super block is invalid: 1st reserved block %d, but actual 1st block is %d",
2773 SB_JOURNAL_1st_RESERVED_BLOCK(sb),
2774 SB_ONDISK_JOURNAL_1st_BLOCK(sb));
2775 goto free_and_return;
2776 }
2777
2778 if (journal_init_dev(sb, journal, j_dev_name) != 0) {
2779 reiserfs_warning(sb, "sh-462",
2780 "unable to initialize journal device");
2781 goto free_and_return;
2782 }
2783
2784 rs = SB_DISK_SUPER_BLOCK(sb);
2785
2786
2787 bhjh = journal_bread(sb,
2788 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
2789 SB_ONDISK_JOURNAL_SIZE(sb));
2790 if (!bhjh) {
2791 reiserfs_warning(sb, "sh-459",
2792 "unable to read journal header");
2793 goto free_and_return;
2794 }
2795 jh = (struct reiserfs_journal_header *)(bhjh->b_data);
2796
2797
2798 if (is_reiserfs_jr(rs)
2799 && (le32_to_cpu(jh->jh_journal.jp_journal_magic) !=
2800 sb_jp_journal_magic(rs))) {
2801 reiserfs_warning(sb, "sh-460",
2802 "journal header magic %x (device %pg) does "
2803 "not match to magic found in super block %x",
2804 jh->jh_journal.jp_journal_magic,
2805 journal->j_dev_bd,
2806 sb_jp_journal_magic(rs));
2807 brelse(bhjh);
2808 goto free_and_return;
2809 }
2810
2811 journal->j_trans_max = le32_to_cpu(jh->jh_journal.jp_journal_trans_max);
2812 journal->j_max_batch = le32_to_cpu(jh->jh_journal.jp_journal_max_batch);
2813 journal->j_max_commit_age =
2814 le32_to_cpu(jh->jh_journal.jp_journal_max_commit_age);
2815 journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;
2816
2817 if (check_advise_trans_params(sb, journal) != 0)
2818 goto free_and_return;
2819 journal->j_default_max_commit_age = journal->j_max_commit_age;
2820
2821 if (commit_max_age != 0) {
2822 journal->j_max_commit_age = commit_max_age;
2823 journal->j_max_trans_age = commit_max_age;
2824 }
2825
2826 reiserfs_info(sb, "journal params: device %pg, size %u, "
2827 "journal first block %u, max trans len %u, max batch %u, "
2828 "max commit age %u, max trans age %u\n",
2829 journal->j_dev_bd,
2830 SB_ONDISK_JOURNAL_SIZE(sb),
2831 SB_ONDISK_JOURNAL_1st_BLOCK(sb),
2832 journal->j_trans_max,
2833 journal->j_max_batch,
2834 journal->j_max_commit_age, journal->j_max_trans_age);
2835
2836 brelse(bhjh);
2837
2838 journal->j_list_bitmap_index = 0;
2839 journal_list_init(sb);
2840
2841 memset(journal->j_list_hash_table, 0,
2842 JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
2843
2844 INIT_LIST_HEAD(&journal->j_dirty_buffers);
2845 spin_lock_init(&journal->j_dirty_buffers_lock);
2846
2847 journal->j_start = 0;
2848 journal->j_len = 0;
2849 journal->j_len_alloc = 0;
2850 atomic_set(&journal->j_wcount, 0);
2851 atomic_set(&journal->j_async_throttle, 0);
2852 journal->j_bcount = 0;
2853 journal->j_trans_start_time = 0;
2854 journal->j_last = NULL;
2855 journal->j_first = NULL;
2856 init_waitqueue_head(&journal->j_join_wait);
2857 mutex_init(&journal->j_mutex);
2858 mutex_init(&journal->j_flush_mutex);
2859
2860 journal->j_trans_id = 10;
2861 journal->j_mount_id = 10;
2862 journal->j_state = 0;
2863 atomic_set(&journal->j_jlock, 0);
2864 journal->j_cnode_free_list = allocate_cnodes(num_cnodes);
2865 journal->j_cnode_free_orig = journal->j_cnode_free_list;
2866 journal->j_cnode_free = journal->j_cnode_free_list ? num_cnodes : 0;
2867 journal->j_cnode_used = 0;
2868 journal->j_must_wait = 0;
2869
2870 if (journal->j_cnode_free == 0) {
2871 reiserfs_warning(sb, "journal-2004", "Journal cnode memory "
2872 "allocation failed (%ld bytes). Journal is "
2873 "too large for available memory. Usually "
2874 "this is due to a journal that is too large.",
2875 sizeof (struct reiserfs_journal_cnode) * num_cnodes);
2876 goto free_and_return;
2877 }
2878
2879 init_journal_hash(sb);
2880 jl = journal->j_current_jl;
2881
2882
2883
2884
2885
2886
2887 reiserfs_write_lock(sb);
2888 jl->j_list_bitmap = get_list_bitmap(sb, jl);
2889 reiserfs_write_unlock(sb);
2890 if (!jl->j_list_bitmap) {
2891 reiserfs_warning(sb, "journal-2005",
2892 "get_list_bitmap failed for journal list 0");
2893 goto free_and_return;
2894 }
2895
2896 ret = journal_read(sb);
2897 if (ret < 0) {
2898 reiserfs_warning(sb, "reiserfs-2006",
2899 "Replay Failure, unable to mount");
2900 goto free_and_return;
2901 }
2902
2903 INIT_DELAYED_WORK(&journal->j_work, flush_async_commits);
2904 journal->j_work_sb = sb;
2905 return 0;
2906 free_and_return:
2907 free_journal_ram(sb);
2908 return 1;
2909 }
2910
2911
2912
2913
2914
2915
2916 int journal_transaction_should_end(struct reiserfs_transaction_handle *th,
2917 int new_alloc)
2918 {
2919 struct reiserfs_journal *journal = SB_JOURNAL(th->t_super);
2920 time64_t now = ktime_get_seconds();
2921
2922 BUG_ON(!th->t_trans_id);
2923 if (th->t_refcount > 1)
2924 return 0;
2925 if (journal->j_must_wait > 0 ||
2926 (journal->j_len_alloc + new_alloc) >= journal->j_max_batch ||
2927 atomic_read(&journal->j_jlock) ||
2928 (now - journal->j_trans_start_time) > journal->j_max_trans_age ||
2929 journal->j_cnode_free < (journal->j_trans_max * 3)) {
2930 return 1;
2931 }
2932
2933 journal->j_len_alloc += new_alloc;
2934 th->t_blocks_allocated += new_alloc ;
2935 return 0;
2936 }
2937
2938
2939 void reiserfs_block_writes(struct reiserfs_transaction_handle *th)
2940 {
2941 struct reiserfs_journal *journal = SB_JOURNAL(th->t_super);
2942 BUG_ON(!th->t_trans_id);
2943 journal->j_must_wait = 1;
2944 set_bit(J_WRITERS_BLOCKED, &journal->j_state);
2945 return;
2946 }
2947
2948
2949 void reiserfs_allow_writes(struct super_block *s)
2950 {
2951 struct reiserfs_journal *journal = SB_JOURNAL(s);
2952 clear_bit(J_WRITERS_BLOCKED, &journal->j_state);
2953 wake_up(&journal->j_join_wait);
2954 }
2955
2956
2957 void reiserfs_wait_on_write_block(struct super_block *s)
2958 {
2959 struct reiserfs_journal *journal = SB_JOURNAL(s);
2960 wait_event(journal->j_join_wait,
2961 !test_bit(J_WRITERS_BLOCKED, &journal->j_state));
2962 }
2963
2964 static void queue_log_writer(struct super_block *s)
2965 {
2966 wait_queue_entry_t wait;
2967 struct reiserfs_journal *journal = SB_JOURNAL(s);
2968 set_bit(J_WRITERS_QUEUED, &journal->j_state);
2969
2970
2971
2972
2973
2974 init_waitqueue_entry(&wait, current);
2975 add_wait_queue(&journal->j_join_wait, &wait);
2976 set_current_state(TASK_UNINTERRUPTIBLE);
2977 if (test_bit(J_WRITERS_QUEUED, &journal->j_state)) {
2978 int depth = reiserfs_write_unlock_nested(s);
2979 schedule();
2980 reiserfs_write_lock_nested(s, depth);
2981 }
2982 __set_current_state(TASK_RUNNING);
2983 remove_wait_queue(&journal->j_join_wait, &wait);
2984 }
2985
2986 static void wake_queued_writers(struct super_block *s)
2987 {
2988 struct reiserfs_journal *journal = SB_JOURNAL(s);
2989 if (test_and_clear_bit(J_WRITERS_QUEUED, &journal->j_state))
2990 wake_up(&journal->j_join_wait);
2991 }
2992
2993 static void let_transaction_grow(struct super_block *sb, unsigned int trans_id)
2994 {
2995 struct reiserfs_journal *journal = SB_JOURNAL(sb);
2996 unsigned long bcount = journal->j_bcount;
2997 while (1) {
2998 int depth;
2999
3000 depth = reiserfs_write_unlock_nested(sb);
3001 schedule_timeout_uninterruptible(1);
3002 reiserfs_write_lock_nested(sb, depth);
3003
3004 journal->j_current_jl->j_state |= LIST_COMMIT_PENDING;
3005 while ((atomic_read(&journal->j_wcount) > 0 ||
3006 atomic_read(&journal->j_jlock)) &&
3007 journal->j_trans_id == trans_id) {
3008 queue_log_writer(sb);
3009 }
3010 if (journal->j_trans_id != trans_id)
3011 break;
3012 if (bcount == journal->j_bcount)
3013 break;
3014 bcount = journal->j_bcount;
3015 }
3016 }
3017
3018
3019
3020
3021
3022
3023
3024
3025 static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
3026 struct super_block *sb, unsigned long nblocks,
3027 int join)
3028 {
3029 time64_t now = ktime_get_seconds();
3030 unsigned int old_trans_id;
3031 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3032 struct reiserfs_transaction_handle myth;
3033 int sched_count = 0;
3034 int retval;
3035 int depth;
3036
3037 reiserfs_check_lock_depth(sb, "journal_begin");
3038 BUG_ON(nblocks > journal->j_trans_max);
3039
3040 PROC_INFO_INC(sb, journal.journal_being);
3041
3042 th->t_refcount = 1;
3043 th->t_super = sb;
3044
3045 relock:
3046 lock_journal(sb);
3047 if (join != JBEGIN_ABORT && reiserfs_is_journal_aborted(journal)) {
3048 unlock_journal(sb);
3049 retval = journal->j_errno;
3050 goto out_fail;
3051 }
3052 journal->j_bcount++;
3053
3054 if (test_bit(J_WRITERS_BLOCKED, &journal->j_state)) {
3055 unlock_journal(sb);
3056 depth = reiserfs_write_unlock_nested(sb);
3057 reiserfs_wait_on_write_block(sb);
3058 reiserfs_write_lock_nested(sb, depth);
3059 PROC_INFO_INC(sb, journal.journal_relock_writers);
3060 goto relock;
3061 }
3062 now = ktime_get_seconds();
3063
3064
3065
3066
3067
3068
3069
3070
3071 if ((!join && journal->j_must_wait > 0) ||
3072 (!join
3073 && (journal->j_len_alloc + nblocks + 2) >= journal->j_max_batch)
3074 || (!join && atomic_read(&journal->j_wcount) > 0
3075 && journal->j_trans_start_time > 0
3076 && (now - journal->j_trans_start_time) >
3077 journal->j_max_trans_age) || (!join
3078 && atomic_read(&journal->j_jlock))
3079 || (!join && journal->j_cnode_free < (journal->j_trans_max * 3))) {
3080
3081 old_trans_id = journal->j_trans_id;
3082
3083 unlock_journal(sb);
3084
3085 if (!join && (journal->j_len_alloc + nblocks + 2) >=
3086 journal->j_max_batch &&
3087 ((journal->j_len + nblocks + 2) * 100) <
3088 (journal->j_len_alloc * 75)) {
3089 if (atomic_read(&journal->j_wcount) > 10) {
3090 sched_count++;
3091 queue_log_writer(sb);
3092 goto relock;
3093 }
3094 }
3095
3096
3097
3098
3099 if (atomic_read(&journal->j_jlock)) {
3100 while (journal->j_trans_id == old_trans_id &&
3101 atomic_read(&journal->j_jlock)) {
3102 queue_log_writer(sb);
3103 }
3104 goto relock;
3105 }
3106 retval = journal_join(&myth, sb);
3107 if (retval)
3108 goto out_fail;
3109
3110
3111 if (old_trans_id != journal->j_trans_id) {
3112 retval = do_journal_end(&myth, 0);
3113 } else {
3114 retval = do_journal_end(&myth, COMMIT_NOW);
3115 }
3116
3117 if (retval)
3118 goto out_fail;
3119
3120 PROC_INFO_INC(sb, journal.journal_relock_wcount);
3121 goto relock;
3122 }
3123
3124 if (journal->j_trans_start_time == 0) {
3125 journal->j_trans_start_time = ktime_get_seconds();
3126 }
3127 atomic_inc(&journal->j_wcount);
3128 journal->j_len_alloc += nblocks;
3129 th->t_blocks_logged = 0;
3130 th->t_blocks_allocated = nblocks;
3131 th->t_trans_id = journal->j_trans_id;
3132 unlock_journal(sb);
3133 INIT_LIST_HEAD(&th->t_list);
3134 return 0;
3135
3136 out_fail:
3137 memset(th, 0, sizeof(*th));
3138
3139
3140
3141
3142
3143 th->t_super = sb;
3144 return retval;
3145 }
3146
3147 struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct
3148 super_block
3149 *s,
3150 int nblocks)
3151 {
3152 int ret;
3153 struct reiserfs_transaction_handle *th;
3154
3155
3156
3157
3158
3159 if (reiserfs_transaction_running(s)) {
3160 th = current->journal_info;
3161 th->t_refcount++;
3162 BUG_ON(th->t_refcount < 2);
3163
3164 return th;
3165 }
3166 th = kmalloc(sizeof(struct reiserfs_transaction_handle), GFP_NOFS);
3167 if (!th)
3168 return NULL;
3169 ret = journal_begin(th, s, nblocks);
3170 if (ret) {
3171 kfree(th);
3172 return NULL;
3173 }
3174
3175 SB_JOURNAL(s)->j_persistent_trans++;
3176 return th;
3177 }
3178
3179 int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *th)
3180 {
3181 struct super_block *s = th->t_super;
3182 int ret = 0;
3183 if (th->t_trans_id)
3184 ret = journal_end(th);
3185 else
3186 ret = -EIO;
3187 if (th->t_refcount == 0) {
3188 SB_JOURNAL(s)->j_persistent_trans--;
3189 kfree(th);
3190 }
3191 return ret;
3192 }
3193
3194 static int journal_join(struct reiserfs_transaction_handle *th,
3195 struct super_block *sb)
3196 {
3197 struct reiserfs_transaction_handle *cur_th = current->journal_info;
3198
3199
3200
3201
3202
3203 th->t_handle_save = cur_th;
3204 BUG_ON(cur_th && cur_th->t_refcount > 1);
3205 return do_journal_begin_r(th, sb, 1, JBEGIN_JOIN);
3206 }
3207
3208 int journal_join_abort(struct reiserfs_transaction_handle *th,
3209 struct super_block *sb)
3210 {
3211 struct reiserfs_transaction_handle *cur_th = current->journal_info;
3212
3213
3214
3215
3216
3217 th->t_handle_save = cur_th;
3218 BUG_ON(cur_th && cur_th->t_refcount > 1);
3219 return do_journal_begin_r(th, sb, 1, JBEGIN_ABORT);
3220 }
3221
3222 int journal_begin(struct reiserfs_transaction_handle *th,
3223 struct super_block *sb, unsigned long nblocks)
3224 {
3225 struct reiserfs_transaction_handle *cur_th = current->journal_info;
3226 int ret;
3227
3228 th->t_handle_save = NULL;
3229 if (cur_th) {
3230
3231 if (cur_th->t_super == sb) {
3232 BUG_ON(!cur_th->t_refcount);
3233 cur_th->t_refcount++;
3234 memcpy(th, cur_th, sizeof(*th));
3235 if (th->t_refcount <= 1)
3236 reiserfs_warning(sb, "reiserfs-2005",
3237 "BAD: refcount <= 1, but "
3238 "journal_info != 0");
3239 return 0;
3240 } else {
3241
3242
3243
3244
3245
3246 reiserfs_warning(sb, "clm-2100",
3247 "nesting info a different FS");
3248 th->t_handle_save = current->journal_info;
3249 current->journal_info = th;
3250 }
3251 } else {
3252 current->journal_info = th;
3253 }
3254 ret = do_journal_begin_r(th, sb, nblocks, JBEGIN_REG);
3255 BUG_ON(current->journal_info != th);
3256
3257
3258
3259
3260
3261 if (ret)
3262 current->journal_info = th->t_handle_save;
3263 else
3264 BUG_ON(!th->t_refcount);
3265
3266 return ret;
3267 }
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279 int journal_mark_dirty(struct reiserfs_transaction_handle *th,
3280 struct buffer_head *bh)
3281 {
3282 struct super_block *sb = th->t_super;
3283 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3284 struct reiserfs_journal_cnode *cn = NULL;
3285 int count_already_incd = 0;
3286 int prepared = 0;
3287 BUG_ON(!th->t_trans_id);
3288
3289 PROC_INFO_INC(sb, journal.mark_dirty);
3290 if (th->t_trans_id != journal->j_trans_id) {
3291 reiserfs_panic(th->t_super, "journal-1577",
3292 "handle trans id %ld != current trans id %ld",
3293 th->t_trans_id, journal->j_trans_id);
3294 }
3295
3296 prepared = test_clear_buffer_journal_prepared(bh);
3297 clear_buffer_journal_restore_dirty(bh);
3298
3299 if (buffer_journaled(bh)) {
3300 PROC_INFO_INC(sb, journal.mark_dirty_already);
3301 return 0;
3302 }
3303
3304
3305
3306
3307
3308
3309 if (!prepared || buffer_dirty(bh)) {
3310 reiserfs_warning(sb, "journal-1777",
3311 "buffer %llu bad state "
3312 "%cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT",
3313 (unsigned long long)bh->b_blocknr,
3314 prepared ? ' ' : '!',
3315 buffer_locked(bh) ? ' ' : '!',
3316 buffer_dirty(bh) ? ' ' : '!',
3317 buffer_journal_dirty(bh) ? ' ' : '!');
3318 }
3319
3320 if (atomic_read(&journal->j_wcount) <= 0) {
3321 reiserfs_warning(sb, "journal-1409",
3322 "returning because j_wcount was %d",
3323 atomic_read(&journal->j_wcount));
3324 return 1;
3325 }
3326
3327
3328
3329
3330
3331 if (journal->j_len >= journal->j_trans_max) {
3332 reiserfs_panic(th->t_super, "journal-1413",
3333 "j_len (%lu) is too big",
3334 journal->j_len);
3335 }
3336
3337 if (buffer_journal_dirty(bh)) {
3338 count_already_incd = 1;
3339 PROC_INFO_INC(sb, journal.mark_dirty_notjournal);
3340 clear_buffer_journal_dirty(bh);
3341 }
3342
3343 if (journal->j_len > journal->j_len_alloc) {
3344 journal->j_len_alloc = journal->j_len + JOURNAL_PER_BALANCE_CNT;
3345 }
3346
3347 set_buffer_journaled(bh);
3348
3349
3350 if (!cn) {
3351 cn = get_cnode(sb);
3352 if (!cn) {
3353 reiserfs_panic(sb, "journal-4", "get_cnode failed!");
3354 }
3355
3356 if (th->t_blocks_logged == th->t_blocks_allocated) {
3357 th->t_blocks_allocated += JOURNAL_PER_BALANCE_CNT;
3358 journal->j_len_alloc += JOURNAL_PER_BALANCE_CNT;
3359 }
3360 th->t_blocks_logged++;
3361 journal->j_len++;
3362
3363 cn->bh = bh;
3364 cn->blocknr = bh->b_blocknr;
3365 cn->sb = sb;
3366 cn->jlist = NULL;
3367 insert_journal_hash(journal->j_hash_table, cn);
3368 if (!count_already_incd) {
3369 get_bh(bh);
3370 }
3371 }
3372 cn->next = NULL;
3373 cn->prev = journal->j_last;
3374 cn->bh = bh;
3375 if (journal->j_last) {
3376 journal->j_last->next = cn;
3377 journal->j_last = cn;
3378 } else {
3379 journal->j_first = cn;
3380 journal->j_last = cn;
3381 }
3382 reiserfs_schedule_old_flush(sb);
3383 return 0;
3384 }
3385
3386 int journal_end(struct reiserfs_transaction_handle *th)
3387 {
3388 struct super_block *sb = th->t_super;
3389 if (!current->journal_info && th->t_refcount > 1)
3390 reiserfs_warning(sb, "REISER-NESTING",
3391 "th NULL, refcount %d", th->t_refcount);
3392
3393 if (!th->t_trans_id) {
3394 WARN_ON(1);
3395 return -EIO;
3396 }
3397
3398 th->t_refcount--;
3399 if (th->t_refcount > 0) {
3400 struct reiserfs_transaction_handle *cur_th =
3401 current->journal_info;
3402
3403
3404
3405
3406
3407 BUG_ON(cur_th->t_super != th->t_super);
3408
3409 if (th != cur_th) {
3410 memcpy(current->journal_info, th, sizeof(*th));
3411 th->t_trans_id = 0;
3412 }
3413 return 0;
3414 } else {
3415 return do_journal_end(th, 0);
3416 }
3417 }
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427 static int remove_from_transaction(struct super_block *sb,
3428 b_blocknr_t blocknr, int already_cleaned)
3429 {
3430 struct buffer_head *bh;
3431 struct reiserfs_journal_cnode *cn;
3432 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3433 int ret = 0;
3434
3435 cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
3436 if (!cn || !cn->bh) {
3437 return ret;
3438 }
3439 bh = cn->bh;
3440 if (cn->prev) {
3441 cn->prev->next = cn->next;
3442 }
3443 if (cn->next) {
3444 cn->next->prev = cn->prev;
3445 }
3446 if (cn == journal->j_first) {
3447 journal->j_first = cn->next;
3448 }
3449 if (cn == journal->j_last) {
3450 journal->j_last = cn->prev;
3451 }
3452 remove_journal_hash(sb, journal->j_hash_table, NULL,
3453 bh->b_blocknr, 0);
3454 clear_buffer_journaled(bh);
3455
3456 if (!already_cleaned) {
3457 clear_buffer_journal_dirty(bh);
3458 clear_buffer_dirty(bh);
3459 clear_buffer_journal_test(bh);
3460 put_bh(bh);
3461 if (atomic_read(&bh->b_count) < 0) {
3462 reiserfs_warning(sb, "journal-1752",
3463 "b_count < 0");
3464 }
3465 ret = 1;
3466 }
3467 journal->j_len--;
3468 journal->j_len_alloc--;
3469 free_cnode(sb, cn);
3470 return ret;
3471 }
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484 static int can_dirty(struct reiserfs_journal_cnode *cn)
3485 {
3486 struct super_block *sb = cn->sb;
3487 b_blocknr_t blocknr = cn->blocknr;
3488 struct reiserfs_journal_cnode *cur = cn->hprev;
3489 int can_dirty = 1;
3490
3491
3492
3493
3494
3495
3496 while (cur && can_dirty) {
3497 if (cur->jlist && cur->bh && cur->blocknr && cur->sb == sb &&
3498 cur->blocknr == blocknr) {
3499 can_dirty = 0;
3500 }
3501 cur = cur->hprev;
3502 }
3503
3504
3505
3506
3507 cur = cn->hnext;
3508 while (cur && can_dirty) {
3509 if (cur->jlist && cur->jlist->j_len > 0 &&
3510 atomic_read(&cur->jlist->j_commit_left) > 0 && cur->bh &&
3511 cur->blocknr && cur->sb == sb && cur->blocknr == blocknr) {
3512 can_dirty = 0;
3513 }
3514 cur = cur->hnext;
3515 }
3516 return can_dirty;
3517 }
3518
3519
3520
3521
3522
3523 int journal_end_sync(struct reiserfs_transaction_handle *th)
3524 {
3525 struct super_block *sb = th->t_super;
3526 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3527
3528 BUG_ON(!th->t_trans_id);
3529
3530 BUG_ON(th->t_refcount > 1);
3531 if (journal->j_len == 0) {
3532 reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
3533 1);
3534 journal_mark_dirty(th, SB_BUFFER_WITH_SB(sb));
3535 }
3536 return do_journal_end(th, COMMIT_NOW | WAIT);
3537 }
3538
3539
3540 static void flush_async_commits(struct work_struct *work)
3541 {
3542 struct reiserfs_journal *journal =
3543 container_of(work, struct reiserfs_journal, j_work.work);
3544 struct super_block *sb = journal->j_work_sb;
3545 struct reiserfs_journal_list *jl;
3546 struct list_head *entry;
3547
3548 reiserfs_write_lock(sb);
3549 if (!list_empty(&journal->j_journal_list)) {
3550
3551 entry = journal->j_journal_list.prev;
3552 jl = JOURNAL_LIST_ENTRY(entry);
3553 flush_commit_list(sb, jl, 1);
3554 }
3555 reiserfs_write_unlock(sb);
3556 }
3557
3558
3559
3560
3561
3562 void reiserfs_flush_old_commits(struct super_block *sb)
3563 {
3564 time64_t now;
3565 struct reiserfs_transaction_handle th;
3566 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3567
3568 now = ktime_get_seconds();
3569
3570
3571
3572
3573 if (list_empty(&journal->j_journal_list))
3574 return;
3575
3576
3577
3578
3579
3580 if (atomic_read(&journal->j_wcount) <= 0 &&
3581 journal->j_trans_start_time > 0 &&
3582 journal->j_len > 0 &&
3583 (now - journal->j_trans_start_time) > journal->j_max_trans_age) {
3584 if (!journal_join(&th, sb)) {
3585 reiserfs_prepare_for_journal(sb,
3586 SB_BUFFER_WITH_SB(sb),
3587 1);
3588 journal_mark_dirty(&th, SB_BUFFER_WITH_SB(sb));
3589
3590
3591
3592
3593
3594
3595 do_journal_end(&th, COMMIT_NOW | WAIT);
3596 }
3597 }
3598 }
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615 static int check_journal_end(struct reiserfs_transaction_handle *th, int flags)
3616 {
3617
3618 time64_t now;
3619 int flush = flags & FLUSH_ALL;
3620 int commit_now = flags & COMMIT_NOW;
3621 int wait_on_commit = flags & WAIT;
3622 struct reiserfs_journal_list *jl;
3623 struct super_block *sb = th->t_super;
3624 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3625
3626 BUG_ON(!th->t_trans_id);
3627
3628 if (th->t_trans_id != journal->j_trans_id) {
3629 reiserfs_panic(th->t_super, "journal-1577",
3630 "handle trans id %ld != current trans id %ld",
3631 th->t_trans_id, journal->j_trans_id);
3632 }
3633
3634 journal->j_len_alloc -= (th->t_blocks_allocated - th->t_blocks_logged);
3635
3636 if (atomic_read(&journal->j_wcount) > 0)
3637 atomic_dec(&journal->j_wcount);
3638
3639
3640
3641
3642
3643
3644
3645 BUG_ON(journal->j_len == 0);
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655 if (atomic_read(&journal->j_wcount) > 0) {
3656 if (flush || commit_now) {
3657 unsigned trans_id;
3658
3659 jl = journal->j_current_jl;
3660 trans_id = jl->j_trans_id;
3661 if (wait_on_commit)
3662 jl->j_state |= LIST_COMMIT_PENDING;
3663 atomic_set(&journal->j_jlock, 1);
3664 if (flush) {
3665 journal->j_next_full_flush = 1;
3666 }
3667 unlock_journal(sb);
3668
3669
3670
3671
3672
3673 while (journal->j_trans_id == trans_id) {
3674 if (atomic_read(&journal->j_jlock)) {
3675 queue_log_writer(sb);
3676 } else {
3677 lock_journal(sb);
3678 if (journal->j_trans_id == trans_id) {
3679 atomic_set(&journal->j_jlock,
3680 1);
3681 }
3682 unlock_journal(sb);
3683 }
3684 }
3685 BUG_ON(journal->j_trans_id == trans_id);
3686
3687 if (commit_now
3688 && journal_list_still_alive(sb, trans_id)
3689 && wait_on_commit) {
3690 flush_commit_list(sb, jl, 1);
3691 }
3692 return 0;
3693 }
3694 unlock_journal(sb);
3695 return 0;
3696 }
3697
3698
3699 now = ktime_get_seconds();
3700 if ((now - journal->j_trans_start_time) > journal->j_max_trans_age) {
3701 commit_now = 1;
3702 journal->j_next_async_flush = 1;
3703 }
3704
3705
3706 if (!(journal->j_must_wait > 0) && !(atomic_read(&journal->j_jlock))
3707 && !flush && !commit_now && (journal->j_len < journal->j_max_batch)
3708 && journal->j_len_alloc < journal->j_max_batch
3709 && journal->j_cnode_free > (journal->j_trans_max * 3)) {
3710 journal->j_bcount++;
3711 unlock_journal(sb);
3712 return 0;
3713 }
3714
3715 if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(sb)) {
3716 reiserfs_panic(sb, "journal-003",
3717 "j_start (%ld) is too high",
3718 journal->j_start);
3719 }
3720 return 1;
3721 }
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740 int journal_mark_freed(struct reiserfs_transaction_handle *th,
3741 struct super_block *sb, b_blocknr_t blocknr)
3742 {
3743 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3744 struct reiserfs_journal_cnode *cn = NULL;
3745 struct buffer_head *bh = NULL;
3746 struct reiserfs_list_bitmap *jb = NULL;
3747 int cleaned = 0;
3748 BUG_ON(!th->t_trans_id);
3749
3750 cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
3751 if (cn && cn->bh) {
3752 bh = cn->bh;
3753 get_bh(bh);
3754 }
3755
3756 if (bh && buffer_journal_new(bh)) {
3757 clear_buffer_journal_new(bh);
3758 clear_prepared_bits(bh);
3759 reiserfs_clean_and_file_buffer(bh);
3760 cleaned = remove_from_transaction(sb, blocknr, cleaned);
3761 } else {
3762
3763
3764
3765
3766 jb = journal->j_current_jl->j_list_bitmap;
3767 if (!jb) {
3768 reiserfs_panic(sb, "journal-1702",
3769 "journal_list_bitmap is NULL");
3770 }
3771 set_bit_in_list_bitmap(sb, blocknr, jb);
3772
3773
3774
3775 if (bh) {
3776 clear_prepared_bits(bh);
3777 reiserfs_clean_and_file_buffer(bh);
3778 }
3779 cleaned = remove_from_transaction(sb, blocknr, cleaned);
3780
3781
3782
3783
3784
3785 cn = get_journal_hash_dev(sb, journal->j_list_hash_table,
3786 blocknr);
3787 while (cn) {
3788 if (sb == cn->sb && blocknr == cn->blocknr) {
3789 set_bit(BLOCK_FREED, &cn->state);
3790 if (cn->bh) {
3791
3792
3793
3794
3795
3796 if (!cleaned) {
3797 clear_buffer_journal_dirty(cn->
3798 bh);
3799 clear_buffer_dirty(cn->bh);
3800 clear_buffer_journal_test(cn->
3801 bh);
3802 cleaned = 1;
3803 put_bh(cn->bh);
3804 if (atomic_read
3805 (&cn->bh->b_count) < 0) {
3806 reiserfs_warning(sb,
3807 "journal-2138",
3808 "cn->bh->b_count < 0");
3809 }
3810 }
3811
3812
3813
3814
3815 if (cn->jlist) {
3816 atomic_dec(&cn->jlist->
3817 j_nonzerolen);
3818 }
3819 cn->bh = NULL;
3820 }
3821 }
3822 cn = cn->hnext;
3823 }
3824 }
3825
3826 if (bh)
3827 release_buffer_page(bh);
3828 return 0;
3829 }
3830
3831 void reiserfs_update_inode_transaction(struct inode *inode)
3832 {
3833 struct reiserfs_journal *journal = SB_JOURNAL(inode->i_sb);
3834 REISERFS_I(inode)->i_jl = journal->j_current_jl;
3835 REISERFS_I(inode)->i_trans_id = journal->j_trans_id;
3836 }
3837
3838
3839
3840
3841
3842 static int __commit_trans_jl(struct inode *inode, unsigned long id,
3843 struct reiserfs_journal_list *jl)
3844 {
3845 struct reiserfs_transaction_handle th;
3846 struct super_block *sb = inode->i_sb;
3847 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3848 int ret = 0;
3849
3850
3851
3852
3853
3854 if (id == journal->j_trans_id) {
3855 jl = journal->j_current_jl;
3856
3857
3858
3859
3860 let_transaction_grow(sb, id);
3861 if (journal->j_trans_id != id) {
3862 goto flush_commit_only;
3863 }
3864
3865 ret = journal_begin(&th, sb, 1);
3866 if (ret)
3867 return ret;
3868
3869
3870 if (journal->j_trans_id != id) {
3871 reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
3872 1);
3873 journal_mark_dirty(&th, SB_BUFFER_WITH_SB(sb));
3874 ret = journal_end(&th);
3875 goto flush_commit_only;
3876 }
3877
3878 ret = journal_end_sync(&th);
3879 if (!ret)
3880 ret = 1;
3881
3882 } else {
3883
3884
3885
3886
3887
3888 flush_commit_only:
3889 if (journal_list_still_alive(inode->i_sb, id)) {
3890
3891
3892
3893
3894
3895 if (atomic_read(&jl->j_commit_left) > 1)
3896 ret = 1;
3897 flush_commit_list(sb, jl, 1);
3898 if (journal->j_errno)
3899 ret = journal->j_errno;
3900 }
3901 }
3902
3903 return ret;
3904 }
3905
3906 int reiserfs_commit_for_inode(struct inode *inode)
3907 {
3908 unsigned int id = REISERFS_I(inode)->i_trans_id;
3909 struct reiserfs_journal_list *jl = REISERFS_I(inode)->i_jl;
3910
3911
3912
3913
3914
3915 if (!id || !jl) {
3916 reiserfs_update_inode_transaction(inode);
3917 id = REISERFS_I(inode)->i_trans_id;
3918
3919 }
3920
3921 return __commit_trans_jl(inode, id, jl);
3922 }
3923
3924 void reiserfs_restore_prepared_buffer(struct super_block *sb,
3925 struct buffer_head *bh)
3926 {
3927 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3928 PROC_INFO_INC(sb, journal.restore_prepared);
3929 if (!bh) {
3930 return;
3931 }
3932 if (test_clear_buffer_journal_restore_dirty(bh) &&
3933 buffer_journal_dirty(bh)) {
3934 struct reiserfs_journal_cnode *cn;
3935 reiserfs_write_lock(sb);
3936 cn = get_journal_hash_dev(sb,
3937 journal->j_list_hash_table,
3938 bh->b_blocknr);
3939 if (cn && can_dirty(cn)) {
3940 set_buffer_journal_test(bh);
3941 mark_buffer_dirty(bh);
3942 }
3943 reiserfs_write_unlock(sb);
3944 }
3945 clear_buffer_journal_prepared(bh);
3946 }
3947
3948 extern struct tree_balance *cur_tb;
3949
3950
3951
3952
3953
3954
3955 int reiserfs_prepare_for_journal(struct super_block *sb,
3956 struct buffer_head *bh, int wait)
3957 {
3958 PROC_INFO_INC(sb, journal.prepare);
3959
3960 if (!trylock_buffer(bh)) {
3961 if (!wait)
3962 return 0;
3963 lock_buffer(bh);
3964 }
3965 set_buffer_journal_prepared(bh);
3966 if (test_clear_buffer_dirty(bh) && buffer_journal_dirty(bh)) {
3967 clear_buffer_journal_test(bh);
3968 set_buffer_journal_restore_dirty(bh);
3969 }
3970 unlock_buffer(bh);
3971 return 1;
3972 }
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984 static int do_journal_end(struct reiserfs_transaction_handle *th, int flags)
3985 {
3986 struct super_block *sb = th->t_super;
3987 struct reiserfs_journal *journal = SB_JOURNAL(sb);
3988 struct reiserfs_journal_cnode *cn, *next, *jl_cn;
3989 struct reiserfs_journal_cnode *last_cn = NULL;
3990 struct reiserfs_journal_desc *desc;
3991 struct reiserfs_journal_commit *commit;
3992 struct buffer_head *c_bh;
3993 struct buffer_head *d_bh;
3994 int cur_write_start = 0;
3995 int i;
3996 int flush;
3997 int wait_on_commit;
3998 struct reiserfs_journal_list *jl, *temp_jl;
3999 struct list_head *entry, *safe;
4000 unsigned long jindex;
4001 unsigned int commit_trans_id;
4002 int trans_half;
4003 int depth;
4004
4005 BUG_ON(th->t_refcount > 1);
4006 BUG_ON(!th->t_trans_id);
4007 BUG_ON(!th->t_super);
4008
4009
4010
4011
4012
4013 if (th->t_trans_id == ~0U)
4014 flags |= FLUSH_ALL | COMMIT_NOW | WAIT;
4015 flush = flags & FLUSH_ALL;
4016 wait_on_commit = flags & WAIT;
4017
4018 current->journal_info = th->t_handle_save;
4019 reiserfs_check_lock_depth(sb, "journal end");
4020 if (journal->j_len == 0) {
4021 reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
4022 1);
4023 journal_mark_dirty(th, SB_BUFFER_WITH_SB(sb));
4024 }
4025
4026 lock_journal(sb);
4027 if (journal->j_next_full_flush) {
4028 flags |= FLUSH_ALL;
4029 flush = 1;
4030 }
4031 if (journal->j_next_async_flush) {
4032 flags |= COMMIT_NOW | WAIT;
4033 wait_on_commit = 1;
4034 }
4035
4036
4037
4038
4039
4040
4041 if (!check_journal_end(th, flags)) {
4042 reiserfs_schedule_old_flush(sb);
4043 wake_queued_writers(sb);
4044 reiserfs_async_progress_wait(sb);
4045 goto out;
4046 }
4047
4048
4049 if (journal->j_next_full_flush) {
4050 flush = 1;
4051 }
4052
4053
4054
4055
4056
4057 if (journal->j_must_wait > 0) {
4058 flush = 1;
4059 }
4060 #ifdef REISERFS_PREALLOCATE
4061
4062
4063
4064
4065 current->journal_info = th;
4066 th->t_refcount++;
4067
4068
4069 reiserfs_discard_all_prealloc(th);
4070
4071 th->t_refcount--;
4072 current->journal_info = th->t_handle_save;
4073 #endif
4074
4075
4076 d_bh =
4077 journal_getblk(sb,
4078 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
4079 journal->j_start);
4080 set_buffer_uptodate(d_bh);
4081 desc = (struct reiserfs_journal_desc *)(d_bh)->b_data;
4082 memset(d_bh->b_data, 0, d_bh->b_size);
4083 memcpy(get_journal_desc_magic(d_bh), JOURNAL_DESC_MAGIC, 8);
4084 set_desc_trans_id(desc, journal->j_trans_id);
4085
4086
4087
4088
4089
4090 c_bh = journal_getblk(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
4091 ((journal->j_start + journal->j_len +
4092 1) % SB_ONDISK_JOURNAL_SIZE(sb)));
4093 commit = (struct reiserfs_journal_commit *)c_bh->b_data;
4094 memset(c_bh->b_data, 0, c_bh->b_size);
4095 set_commit_trans_id(commit, journal->j_trans_id);
4096 set_buffer_uptodate(c_bh);
4097
4098
4099 jl = journal->j_current_jl;
4100
4101
4102
4103
4104
4105
4106
4107 reiserfs_mutex_lock_safe(&jl->j_commit_mutex, sb);
4108
4109
4110 commit_trans_id = jl->j_trans_id;
4111
4112 atomic_set(&jl->j_older_commits_done, 0);
4113 jl->j_trans_id = journal->j_trans_id;
4114 jl->j_timestamp = journal->j_trans_start_time;
4115 jl->j_commit_bh = c_bh;
4116 jl->j_start = journal->j_start;
4117 jl->j_len = journal->j_len;
4118 atomic_set(&jl->j_nonzerolen, journal->j_len);
4119 atomic_set(&jl->j_commit_left, journal->j_len + 2);
4120 jl->j_realblock = NULL;
4121
4122
4123
4124
4125
4126
4127 trans_half = journal_trans_half(sb->s_blocksize);
4128 for (i = 0, cn = journal->j_first; cn; cn = cn->next, i++) {
4129 if (buffer_journaled(cn->bh)) {
4130 jl_cn = get_cnode(sb);
4131 if (!jl_cn) {
4132 reiserfs_panic(sb, "journal-1676",
4133 "get_cnode returned NULL");
4134 }
4135 if (i == 0) {
4136 jl->j_realblock = jl_cn;
4137 }
4138 jl_cn->prev = last_cn;
4139 jl_cn->next = NULL;
4140 if (last_cn) {
4141 last_cn->next = jl_cn;
4142 }
4143 last_cn = jl_cn;
4144
4145
4146
4147
4148 if (is_block_in_log_or_reserved_area
4149 (sb, cn->bh->b_blocknr)) {
4150 reiserfs_panic(sb, "journal-2332",
4151 "Trying to log block %lu, "
4152 "which is a log block",
4153 cn->bh->b_blocknr);
4154 }
4155 jl_cn->blocknr = cn->bh->b_blocknr;
4156 jl_cn->state = 0;
4157 jl_cn->sb = sb;
4158 jl_cn->bh = cn->bh;
4159 jl_cn->jlist = jl;
4160 insert_journal_hash(journal->j_list_hash_table, jl_cn);
4161 if (i < trans_half) {
4162 desc->j_realblock[i] =
4163 cpu_to_le32(cn->bh->b_blocknr);
4164 } else {
4165 commit->j_realblock[i - trans_half] =
4166 cpu_to_le32(cn->bh->b_blocknr);
4167 }
4168 } else {
4169 i--;
4170 }
4171 }
4172 set_desc_trans_len(desc, journal->j_len);
4173 set_desc_mount_id(desc, journal->j_mount_id);
4174 set_desc_trans_id(desc, journal->j_trans_id);
4175 set_commit_trans_len(commit, journal->j_len);
4176
4177
4178
4179
4180
4181 BUG_ON(journal->j_len == 0);
4182
4183
4184
4185
4186
4187
4188 mark_buffer_dirty(d_bh);
4189
4190
4191
4192
4193
4194 cur_write_start = journal->j_start;
4195 cn = journal->j_first;
4196 jindex = 1;
4197 while (cn) {
4198 clear_buffer_journal_new(cn->bh);
4199
4200 if (buffer_journaled(cn->bh)) {
4201 struct buffer_head *tmp_bh;
4202 char *addr;
4203 struct page *page;
4204 tmp_bh =
4205 journal_getblk(sb,
4206 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
4207 ((cur_write_start +
4208 jindex) %
4209 SB_ONDISK_JOURNAL_SIZE(sb)));
4210 set_buffer_uptodate(tmp_bh);
4211 page = cn->bh->b_page;
4212 addr = kmap(page);
4213 memcpy(tmp_bh->b_data,
4214 addr + offset_in_page(cn->bh->b_data),
4215 cn->bh->b_size);
4216 kunmap(page);
4217 mark_buffer_dirty(tmp_bh);
4218 jindex++;
4219 set_buffer_journal_dirty(cn->bh);
4220 clear_buffer_journaled(cn->bh);
4221 } else {
4222
4223
4224
4225
4226 reiserfs_warning(sb, "journal-2048",
4227 "BAD, buffer in journal hash, "
4228 "but not JDirty!");
4229 brelse(cn->bh);
4230 }
4231 next = cn->next;
4232 free_cnode(sb, cn);
4233 cn = next;
4234 reiserfs_cond_resched(sb);
4235 }
4236
4237
4238
4239
4240
4241
4242
4243 journal->j_current_jl = alloc_journal_list(sb);
4244
4245
4246 list_add_tail(&jl->j_list, &journal->j_journal_list);
4247 list_add_tail(&jl->j_working_list, &journal->j_working_list);
4248 journal->j_num_work_lists++;
4249
4250
4251 journal->j_start =
4252 (journal->j_start + journal->j_len +
4253 2) % SB_ONDISK_JOURNAL_SIZE(sb);
4254 atomic_set(&journal->j_wcount, 0);
4255 journal->j_bcount = 0;
4256 journal->j_last = NULL;
4257 journal->j_first = NULL;
4258 journal->j_len = 0;
4259 journal->j_trans_start_time = 0;
4260
4261 if (++journal->j_trans_id == 0)
4262 journal->j_trans_id = 10;
4263 journal->j_current_jl->j_trans_id = journal->j_trans_id;
4264 journal->j_must_wait = 0;
4265 journal->j_len_alloc = 0;
4266 journal->j_next_full_flush = 0;
4267 journal->j_next_async_flush = 0;
4268 init_journal_hash(sb);
4269
4270
4271
4272
4273
4274 smp_mb();
4275
4276
4277
4278
4279
4280
4281
4282
4283 if (!list_empty(&jl->j_tail_bh_list)) {
4284 depth = reiserfs_write_unlock_nested(sb);
4285 write_ordered_buffers(&journal->j_dirty_buffers_lock,
4286 journal, jl, &jl->j_tail_bh_list);
4287 reiserfs_write_lock_nested(sb, depth);
4288 }
4289 BUG_ON(!list_empty(&jl->j_tail_bh_list));
4290 mutex_unlock(&jl->j_commit_mutex);
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300 if (flush) {
4301 flush_commit_list(sb, jl, 1);
4302 flush_journal_list(sb, jl, 1);
4303 } else if (!(jl->j_state & LIST_COMMIT_PENDING)) {
4304
4305
4306
4307
4308 if (sb->s_flags & SB_ACTIVE)
4309 queue_delayed_work(REISERFS_SB(sb)->commit_wq,
4310 &journal->j_work, HZ / 10);
4311 }
4312
4313
4314
4315
4316
4317
4318 first_jl:
4319 list_for_each_safe(entry, safe, &journal->j_journal_list) {
4320 temp_jl = JOURNAL_LIST_ENTRY(entry);
4321 if (journal->j_start <= temp_jl->j_start) {
4322 if ((journal->j_start + journal->j_trans_max + 1) >=
4323 temp_jl->j_start) {
4324 flush_used_journal_lists(sb, temp_jl);
4325 goto first_jl;
4326 } else if ((journal->j_start +
4327 journal->j_trans_max + 1) <
4328 SB_ONDISK_JOURNAL_SIZE(sb)) {
4329
4330
4331
4332
4333
4334
4335 break;
4336 }
4337 } else if ((journal->j_start +
4338 journal->j_trans_max + 1) >
4339 SB_ONDISK_JOURNAL_SIZE(sb)) {
4340 if (((journal->j_start + journal->j_trans_max + 1) %
4341 SB_ONDISK_JOURNAL_SIZE(sb)) >=
4342 temp_jl->j_start) {
4343 flush_used_journal_lists(sb, temp_jl);
4344 goto first_jl;
4345 } else {
4346
4347
4348
4349
4350
4351
4352 break;
4353 }
4354 }
4355 }
4356
4357 journal->j_current_jl->j_list_bitmap =
4358 get_list_bitmap(sb, journal->j_current_jl);
4359
4360 if (!(journal->j_current_jl->j_list_bitmap)) {
4361 reiserfs_panic(sb, "journal-1996",
4362 "could not get a list bitmap");
4363 }
4364
4365 atomic_set(&journal->j_jlock, 0);
4366 unlock_journal(sb);
4367
4368 clear_bit(J_WRITERS_QUEUED, &journal->j_state);
4369 wake_up(&journal->j_join_wait);
4370
4371 if (!flush && wait_on_commit &&
4372 journal_list_still_alive(sb, commit_trans_id)) {
4373 flush_commit_list(sb, jl, 1);
4374 }
4375 out:
4376 reiserfs_check_lock_depth(sb, "journal end2");
4377
4378 memset(th, 0, sizeof(*th));
4379
4380
4381
4382
4383
4384 th->t_super = sb;
4385
4386 return journal->j_errno;
4387 }
4388
4389
4390 void reiserfs_abort_journal(struct super_block *sb, int errno)
4391 {
4392 struct reiserfs_journal *journal = SB_JOURNAL(sb);
4393 if (test_bit(J_ABORTED, &journal->j_state))
4394 return;
4395
4396 if (!journal->j_errno)
4397 journal->j_errno = errno;
4398
4399 sb->s_flags |= SB_RDONLY;
4400 set_bit(J_ABORTED, &journal->j_state);
4401
4402 #ifdef CONFIG_REISERFS_CHECK
4403 dump_stack();
4404 #endif
4405 }