• Home
  • Raw
  • Download

Lines Matching full:sdp

35 static void gfs2_log_shutdown(struct gfs2_sbd *sdp);
39 * @sdp: the filesystem
48 unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct) in gfs2_struct2blk() argument
54 first = sdp->sd_ldptrs; in gfs2_struct2blk()
57 second = sdp->sd_inptrs; in gfs2_struct2blk()
84 * @sdp: the filesystem
90 static int gfs2_ail1_start_one(struct gfs2_sbd *sdp, in gfs2_ail1_start_one() argument
93 __releases(&sdp->sd_ail_lock) in gfs2_ail1_start_one()
94 __acquires(&sdp->sd_ail_lock) in gfs2_ail1_start_one()
105 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail1_start_one()
113 if (!cmpxchg(&sdp->sd_log_error, 0, -EIO)) { in gfs2_ail1_start_one()
114 gfs2_io_error_bh(sdp, bh); in gfs2_ail1_start_one()
115 gfs2_withdraw_delayed(sdp); in gfs2_ail1_start_one()
119 if (gfs2_withdrawn(sdp)) { in gfs2_ail1_start_one()
132 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_start_one()
134 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_start_one()
145 static void dump_ail_list(struct gfs2_sbd *sdp) in dump_ail_list() argument
151 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) { in dump_ail_list()
155 fs_err(sdp, "bd %p: blk:0x%llx bh=%p ", bd, in dump_ail_list()
158 fs_err(sdp, "\n"); in dump_ail_list()
161 fs_err(sdp, "0x%llx up2:%d dirt:%d lkd:%d req:%d " in dump_ail_list()
179 * @sdp: The super block
186 void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc) in gfs2_ail1_flush() argument
188 struct list_head *head = &sdp->sd_ail1_list; in gfs2_ail1_flush()
194 trace_gfs2_ail_flush(sdp, wbc, 1); in gfs2_ail1_flush()
196 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_flush()
200 fs_err(sdp, "Error: In %s for ten minutes! t=%d\n", in gfs2_ail1_flush()
202 dump_ail_list(sdp); in gfs2_ail1_flush()
208 ret = gfs2_ail1_start_one(sdp, wbc, tr); in gfs2_ail1_flush()
216 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_flush()
219 gfs2_lm(sdp, "gfs2_ail1_start_one (generic_writepages) " in gfs2_ail1_flush()
221 gfs2_withdraw(sdp); in gfs2_ail1_flush()
223 trace_gfs2_ail_flush(sdp, wbc, 0); in gfs2_ail1_flush()
228 * @sdp: The superblock
231 static void gfs2_ail1_start(struct gfs2_sbd *sdp) in gfs2_ail1_start() argument
240 return gfs2_ail1_flush(sdp, &wbc); in gfs2_ail1_start()
245 * @sdp: the filesystem
252 static int gfs2_ail1_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_ail1_empty_one() argument
262 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail1_empty_one()
272 if (!sdp->sd_log_error && buffer_busy(bh)) { in gfs2_ail1_empty_one()
277 !cmpxchg(&sdp->sd_log_error, 0, -EIO)) { in gfs2_ail1_empty_one()
278 gfs2_io_error_bh(sdp, bh); in gfs2_ail1_empty_one()
279 gfs2_withdraw_delayed(sdp); in gfs2_ail1_empty_one()
288 gfs2_add_revoke(sdp, bd); in gfs2_ail1_empty_one()
299 * @sdp: The superblock
305 static int gfs2_ail1_empty(struct gfs2_sbd *sdp, int max_revokes) in gfs2_ail1_empty() argument
311 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_empty()
312 list_for_each_entry_safe_reverse(tr, s, &sdp->sd_ail1_list, tr_list) { in gfs2_ail1_empty()
313 if (!gfs2_ail1_empty_one(sdp, tr, &max_revokes) && oldest_tr) in gfs2_ail1_empty()
314 list_move(&tr->tr_list, &sdp->sd_ail2_list); in gfs2_ail1_empty()
318 ret = list_empty(&sdp->sd_ail1_list); in gfs2_ail1_empty()
319 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_empty()
321 if (test_bit(SDF_WITHDRAWING, &sdp->sd_flags)) { in gfs2_ail1_empty()
322 gfs2_lm(sdp, "fatal: I/O error(s)\n"); in gfs2_ail1_empty()
323 gfs2_withdraw(sdp); in gfs2_ail1_empty()
329 static void gfs2_ail1_wait(struct gfs2_sbd *sdp) in gfs2_ail1_wait() argument
335 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
336 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) { in gfs2_ail1_wait()
342 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
348 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
355 static void gfs2_ail_empty_tr(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_ail_empty_tr() argument
363 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail_empty_tr()
368 static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail) in ail2_empty() argument
371 unsigned int old_tail = sdp->sd_log_tail; in ail2_empty()
375 spin_lock(&sdp->sd_ail_lock); in ail2_empty()
377 list_for_each_entry_safe(tr, safe, &sdp->sd_ail2_list, tr_list) { in ail2_empty()
384 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in ail2_empty()
386 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail1_list)); in ail2_empty()
387 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail2_list)); in ail2_empty()
388 gfs2_trans_free(sdp, tr); in ail2_empty()
391 spin_unlock(&sdp->sd_ail_lock); in ail2_empty()
396 * @sdp: The GFS2 superblock
401 void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) in gfs2_log_release() argument
404 atomic_add(blks, &sdp->sd_log_blks_free); in gfs2_log_release()
405 trace_gfs2_log_blocks(sdp, blks); in gfs2_log_release()
406 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= in gfs2_log_release()
407 sdp->sd_jdesc->jd_blocks); in gfs2_log_release()
408 up_read(&sdp->sd_log_flush_lock); in gfs2_log_release()
413 * @sdp: The GFS2 superblock
431 int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks) in gfs2_log_reserve() argument
434 unsigned reserved_blks = 7 * (4096 / sdp->sd_vfs->s_blocksize); in gfs2_log_reserve()
440 if (gfs2_assert_warn(sdp, blks) || in gfs2_log_reserve()
441 gfs2_assert_warn(sdp, blks <= sdp->sd_jdesc->jd_blocks)) in gfs2_log_reserve()
443 atomic_add(blks, &sdp->sd_log_blks_needed); in gfs2_log_reserve()
445 free_blocks = atomic_read(&sdp->sd_log_blks_free); in gfs2_log_reserve()
448 prepare_to_wait_exclusive(&sdp->sd_log_waitq, &wait, in gfs2_log_reserve()
450 wake_up(&sdp->sd_logd_waitq); in gfs2_log_reserve()
452 if (atomic_read(&sdp->sd_log_blks_free) <= wanted) in gfs2_log_reserve()
454 free_blocks = atomic_read(&sdp->sd_log_blks_free); in gfs2_log_reserve()
456 finish_wait(&sdp->sd_log_waitq, &wait); in gfs2_log_reserve()
458 atomic_inc(&sdp->sd_reserving_log); in gfs2_log_reserve()
459 if (atomic_cmpxchg(&sdp->sd_log_blks_free, free_blocks, in gfs2_log_reserve()
461 if (atomic_dec_and_test(&sdp->sd_reserving_log)) in gfs2_log_reserve()
462 wake_up(&sdp->sd_reserving_log_wait); in gfs2_log_reserve()
465 atomic_sub(blks, &sdp->sd_log_blks_needed); in gfs2_log_reserve()
466 trace_gfs2_log_blocks(sdp, -blks); in gfs2_log_reserve()
473 wake_up(&sdp->sd_log_waitq); in gfs2_log_reserve()
475 down_read(&sdp->sd_log_flush_lock); in gfs2_log_reserve()
476 if (unlikely(!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))) { in gfs2_log_reserve()
477 gfs2_log_release(sdp, blks); in gfs2_log_reserve()
480 if (atomic_dec_and_test(&sdp->sd_reserving_log)) in gfs2_log_reserve()
481 wake_up(&sdp->sd_reserving_log_wait); in gfs2_log_reserve()
487 * @sdp: The GFS2 superblock
497 static inline unsigned int log_distance(struct gfs2_sbd *sdp, unsigned int newer, in log_distance() argument
504 dist += sdp->sd_jdesc->jd_blocks; in log_distance()
512 * @sdp: The GFS2 superblock
534 static unsigned int calc_reserved(struct gfs2_sbd *sdp) in calc_reserved() argument
539 struct gfs2_trans *tr = sdp->sd_log_tr; in calc_reserved()
546 reserved += DIV_ROUND_UP(mbuf, buf_limit(sdp)); in calc_reserved()
547 reserved += DIV_ROUND_UP(dbuf, databuf_limit(sdp)); in calc_reserved()
550 if (sdp->sd_log_committed_revoke > 0) in calc_reserved()
551 reserved += gfs2_struct2blk(sdp, sdp->sd_log_committed_revoke); in calc_reserved()
558 static unsigned int current_tail(struct gfs2_sbd *sdp) in current_tail() argument
563 spin_lock(&sdp->sd_ail_lock); in current_tail()
565 if (list_empty(&sdp->sd_ail1_list)) { in current_tail()
566 tail = sdp->sd_log_head; in current_tail()
568 tr = list_last_entry(&sdp->sd_ail1_list, struct gfs2_trans, in current_tail()
573 spin_unlock(&sdp->sd_ail_lock); in current_tail()
578 static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail) in log_pull_tail() argument
580 unsigned int dist = log_distance(sdp, new_tail, sdp->sd_log_tail); in log_pull_tail()
582 ail2_empty(sdp, new_tail); in log_pull_tail()
584 atomic_add(dist, &sdp->sd_log_blks_free); in log_pull_tail()
585 trace_gfs2_log_blocks(sdp, dist); in log_pull_tail()
586 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= in log_pull_tail()
587 sdp->sd_jdesc->jd_blocks); in log_pull_tail()
589 sdp->sd_log_tail = new_tail; in log_pull_tail()
593 void log_flush_wait(struct gfs2_sbd *sdp) in log_flush_wait() argument
597 if (atomic_read(&sdp->sd_log_in_flight)) { in log_flush_wait()
599 prepare_to_wait(&sdp->sd_log_flush_wait, &wait, in log_flush_wait()
601 if (atomic_read(&sdp->sd_log_in_flight)) in log_flush_wait()
603 } while(atomic_read(&sdp->sd_log_in_flight)); in log_flush_wait()
604 finish_wait(&sdp->sd_log_flush_wait, &wait); in log_flush_wait()
628 static void gfs2_ordered_write(struct gfs2_sbd *sdp) in gfs2_ordered_write() argument
633 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
634 list_sort(NULL, &sdp->sd_log_ordered, &ip_cmp); in gfs2_ordered_write()
635 while (!list_empty(&sdp->sd_log_ordered)) { in gfs2_ordered_write()
636 ip = list_first_entry(&sdp->sd_log_ordered, struct gfs2_inode, i_ordered); in gfs2_ordered_write()
642 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
644 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
646 list_splice(&written, &sdp->sd_log_ordered); in gfs2_ordered_write()
647 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
650 static void gfs2_ordered_wait(struct gfs2_sbd *sdp) in gfs2_ordered_wait() argument
654 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
655 while (!list_empty(&sdp->sd_log_ordered)) { in gfs2_ordered_wait()
656 ip = list_first_entry(&sdp->sd_log_ordered, struct gfs2_inode, i_ordered); in gfs2_ordered_wait()
660 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
662 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
664 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
669 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in gfs2_ordered_del_inode() local
671 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_del_inode()
673 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_del_inode()
676 void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) in gfs2_add_revoke() argument
681 sdp->sd_log_num_revoke++; in gfs2_add_revoke()
689 list_add(&bd->bd_list, &sdp->sd_log_revokes); in gfs2_add_revoke()
702 * @sdp: The GFS2 superblock
712 void gfs2_write_revokes(struct gfs2_sbd *sdp) in gfs2_write_revokes() argument
715 int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64); in gfs2_write_revokes()
717 gfs2_log_lock(sdp); in gfs2_write_revokes()
718 while (sdp->sd_log_num_revoke > max_revokes) in gfs2_write_revokes()
719 max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64); in gfs2_write_revokes()
720 max_revokes -= sdp->sd_log_num_revoke; in gfs2_write_revokes()
721 if (!sdp->sd_log_num_revoke) { in gfs2_write_revokes()
722 atomic_dec(&sdp->sd_log_blks_free); in gfs2_write_revokes()
725 if (!sdp->sd_log_blks_reserved) { in gfs2_write_revokes()
726 atomic_dec(&sdp->sd_log_blks_free); in gfs2_write_revokes()
727 trace_gfs2_log_blocks(sdp, -2); in gfs2_write_revokes()
729 trace_gfs2_log_blocks(sdp, -1); in gfs2_write_revokes()
732 gfs2_ail1_empty(sdp, max_revokes); in gfs2_write_revokes()
733 gfs2_log_unlock(sdp); in gfs2_write_revokes()
735 if (!sdp->sd_log_num_revoke) { in gfs2_write_revokes()
736 atomic_inc(&sdp->sd_log_blks_free); in gfs2_write_revokes()
737 if (!sdp->sd_log_blks_reserved) { in gfs2_write_revokes()
738 atomic_inc(&sdp->sd_log_blks_free); in gfs2_write_revokes()
739 trace_gfs2_log_blocks(sdp, 2); in gfs2_write_revokes()
741 trace_gfs2_log_blocks(sdp, 1); in gfs2_write_revokes()
748 * @sdp: The GFS2 superblock
759 void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, in gfs2_write_log_header() argument
766 struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local; in gfs2_write_log_header()
768 struct super_block *sb = sdp->sd_vfs; in gfs2_write_log_header()
771 if (gfs2_withdrawn(sdp)) in gfs2_write_log_header()
782 lh->lh_header.mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); in gfs2_write_log_header()
797 if (gfs2_assert_withdraw(sdp, ret == 0)) in gfs2_write_log_header()
808 cpu_to_be64(GFS2_I(sdp->sd_sc_inode)->i_no_addr); in gfs2_write_log_header()
810 cpu_to_be64(GFS2_I(sdp->sd_qc_inode)->i_no_addr); in gfs2_write_log_header()
812 spin_lock(&sdp->sd_statfs_spin); in gfs2_write_log_header()
816 spin_unlock(&sdp->sd_statfs_spin); in gfs2_write_log_header()
825 gfs2_log_write(sdp, page, sb->s_blocksize, 0, dblock); in gfs2_write_log_header()
826 gfs2_log_submit_bio(&sdp->sd_log_bio, REQ_OP_WRITE | op_flags); in gfs2_write_log_header()
828 log_flush_wait(sdp); in gfs2_write_log_header()
833 * @sdp: The GFS2 superblock
839 static void log_write_header(struct gfs2_sbd *sdp, u32 flags) in log_write_header() argument
843 enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); in log_write_header()
845 gfs2_assert_withdraw(sdp, (state != SFS_FROZEN)); in log_write_header()
846 tail = current_tail(sdp); in log_write_header()
848 if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) { in log_write_header()
849 gfs2_ordered_wait(sdp); in log_write_header()
850 log_flush_wait(sdp); in log_write_header()
853 sdp->sd_log_idle = (tail == sdp->sd_log_flush_head); in log_write_header()
854 gfs2_write_log_header(sdp, sdp->sd_jdesc, sdp->sd_log_sequence++, tail, in log_write_header()
855 sdp->sd_log_flush_head, flags, op_flags); in log_write_header()
856 gfs2_log_incr_head(sdp); in log_write_header()
858 if (sdp->sd_log_tail != tail) in log_write_header()
859 log_pull_tail(sdp, tail); in log_write_header()
864 * @sdp: Pointer to GFS2 superblock
866 static void ail_drain(struct gfs2_sbd *sdp) in ail_drain() argument
870 spin_lock(&sdp->sd_ail_lock); in ail_drain()
878 while (!list_empty(&sdp->sd_ail1_list)) { in ail_drain()
879 tr = list_first_entry(&sdp->sd_ail1_list, struct gfs2_trans, in ail_drain()
881 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail1_list); in ail_drain()
882 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in ail_drain()
884 gfs2_trans_free(sdp, tr); in ail_drain()
886 while (!list_empty(&sdp->sd_ail2_list)) { in ail_drain()
887 tr = list_first_entry(&sdp->sd_ail2_list, struct gfs2_trans, in ail_drain()
889 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in ail_drain()
891 gfs2_trans_free(sdp, tr); in ail_drain()
893 spin_unlock(&sdp->sd_ail_lock); in ail_drain()
898 * @sdp: Pointer to GFS2 superblock
900 static void empty_ail1_list(struct gfs2_sbd *sdp) in empty_ail1_list() argument
906 fs_err(sdp, "Error: In %s for 10 minutes! t=%d\n", in empty_ail1_list()
908 dump_ail_list(sdp); in empty_ail1_list()
911 gfs2_ail1_start(sdp); in empty_ail1_list()
912 gfs2_ail1_wait(sdp); in empty_ail1_list()
913 if (gfs2_ail1_empty(sdp, 0)) in empty_ail1_list()
954 * @sdp: the filesystem
960 void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) in gfs2_log_flush() argument
963 enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); in gfs2_log_flush()
965 down_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
971 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
977 trace_gfs2_log_flush(sdp, 1, flags); in gfs2_log_flush()
980 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); in gfs2_log_flush()
982 sdp->sd_log_flush_head = sdp->sd_log_head; in gfs2_log_flush()
983 tr = sdp->sd_log_tr; in gfs2_log_flush()
985 sdp->sd_log_tr = NULL; in gfs2_log_flush()
986 tr->tr_first = sdp->sd_log_flush_head; in gfs2_log_flush()
988 if (gfs2_assert_withdraw_delayed(sdp, in gfs2_log_flush()
994 if (gfs2_assert_withdraw_delayed(sdp, !sdp->sd_log_num_revoke)) in gfs2_log_flush()
996 if (gfs2_assert_withdraw_delayed(sdp, in gfs2_log_flush()
997 sdp->sd_log_num_revoke == sdp->sd_log_committed_revoke)) in gfs2_log_flush()
1000 gfs2_ordered_write(sdp); in gfs2_log_flush()
1001 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
1003 lops_before_commit(sdp, tr); in gfs2_log_flush()
1004 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
1006 gfs2_log_submit_bio(&sdp->sd_log_bio, REQ_OP_WRITE); in gfs2_log_flush()
1007 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
1010 if (sdp->sd_log_head != sdp->sd_log_flush_head) { in gfs2_log_flush()
1011 log_flush_wait(sdp); in gfs2_log_flush()
1012 log_write_header(sdp, flags); in gfs2_log_flush()
1013 } else if (sdp->sd_log_tail != current_tail(sdp) && !sdp->sd_log_idle){ in gfs2_log_flush()
1014 atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */ in gfs2_log_flush()
1015 trace_gfs2_log_blocks(sdp, -1); in gfs2_log_flush()
1016 log_write_header(sdp, flags); in gfs2_log_flush()
1018 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
1020 lops_after_commit(sdp, tr); in gfs2_log_flush()
1022 gfs2_log_lock(sdp); in gfs2_log_flush()
1023 sdp->sd_log_head = sdp->sd_log_flush_head; in gfs2_log_flush()
1024 sdp->sd_log_blks_reserved = 0; in gfs2_log_flush()
1025 sdp->sd_log_committed_revoke = 0; in gfs2_log_flush()
1027 spin_lock(&sdp->sd_ail_lock); in gfs2_log_flush()
1029 list_add(&tr->tr_list, &sdp->sd_ail1_list); in gfs2_log_flush()
1032 spin_unlock(&sdp->sd_ail_lock); in gfs2_log_flush()
1033 gfs2_log_unlock(sdp); in gfs2_log_flush()
1036 if (!sdp->sd_log_idle) { in gfs2_log_flush()
1037 empty_ail1_list(sdp); in gfs2_log_flush()
1038 if (gfs2_withdrawn(sdp)) in gfs2_log_flush()
1040 atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */ in gfs2_log_flush()
1041 trace_gfs2_log_blocks(sdp, -1); in gfs2_log_flush()
1042 log_write_header(sdp, flags); in gfs2_log_flush()
1043 sdp->sd_log_head = sdp->sd_log_flush_head; in gfs2_log_flush()
1047 gfs2_log_shutdown(sdp); in gfs2_log_flush()
1049 atomic_set(&sdp->sd_freeze_state, SFS_FROZEN); in gfs2_log_flush()
1053 trace_gfs2_log_flush(sdp, 0, flags); in gfs2_log_flush()
1055 up_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
1056 gfs2_trans_free(sdp, tr); in gfs2_log_flush()
1057 if (gfs2_withdrawing(sdp)) in gfs2_log_flush()
1058 gfs2_withdraw(sdp); in gfs2_log_flush()
1069 spin_lock(&sdp->sd_ail_lock); in gfs2_log_flush()
1071 list_add(&tr->tr_list, &sdp->sd_ail1_list); in gfs2_log_flush()
1072 spin_unlock(&sdp->sd_ail_lock); in gfs2_log_flush()
1073 ail_drain(sdp); /* frees all transactions */ in gfs2_log_flush()
1084 static void gfs2_merge_trans(struct gfs2_sbd *sdp, struct gfs2_trans *new) in gfs2_merge_trans() argument
1086 struct gfs2_trans *old = sdp->sd_log_tr; in gfs2_merge_trans()
1100 spin_lock(&sdp->sd_ail_lock); in gfs2_merge_trans()
1103 spin_unlock(&sdp->sd_ail_lock); in gfs2_merge_trans()
1106 static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) in log_refund() argument
1112 gfs2_log_lock(sdp); in log_refund()
1114 if (sdp->sd_log_tr) { in log_refund()
1115 gfs2_merge_trans(sdp, tr); in log_refund()
1117 gfs2_assert_withdraw(sdp, test_bit(TR_ALLOCED, &tr->tr_flags)); in log_refund()
1118 sdp->sd_log_tr = tr; in log_refund()
1122 sdp->sd_log_committed_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm; in log_refund()
1123 reserved = calc_reserved(sdp); in log_refund()
1124 maxres = sdp->sd_log_blks_reserved + tr->tr_reserved; in log_refund()
1125 gfs2_assert_withdraw(sdp, maxres >= reserved); in log_refund()
1127 atomic_add(unused, &sdp->sd_log_blks_free); in log_refund()
1128 trace_gfs2_log_blocks(sdp, unused); in log_refund()
1129 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= in log_refund()
1130 sdp->sd_jdesc->jd_blocks); in log_refund()
1131 sdp->sd_log_blks_reserved = reserved; in log_refund()
1133 gfs2_log_unlock(sdp); in log_refund()
1138 * @sdp: the filesystem
1151 void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) in gfs2_log_commit() argument
1153 log_refund(sdp, tr); in gfs2_log_commit()
1155 if (atomic_read(&sdp->sd_log_pinned) > atomic_read(&sdp->sd_log_thresh1) || in gfs2_log_commit()
1156 ((sdp->sd_jdesc->jd_blocks - atomic_read(&sdp->sd_log_blks_free)) > in gfs2_log_commit()
1157 atomic_read(&sdp->sd_log_thresh2))) in gfs2_log_commit()
1158 wake_up(&sdp->sd_logd_waitq); in gfs2_log_commit()
1163 * @sdp: the filesystem
1167 static void gfs2_log_shutdown(struct gfs2_sbd *sdp) in gfs2_log_shutdown() argument
1169 gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved); in gfs2_log_shutdown()
1170 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); in gfs2_log_shutdown()
1171 gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list)); in gfs2_log_shutdown()
1173 sdp->sd_log_flush_head = sdp->sd_log_head; in gfs2_log_shutdown()
1175 log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT | GFS2_LFC_SHUTDOWN); in gfs2_log_shutdown()
1177 gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail); in gfs2_log_shutdown()
1178 gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list)); in gfs2_log_shutdown()
1180 sdp->sd_log_head = sdp->sd_log_flush_head; in gfs2_log_shutdown()
1181 sdp->sd_log_tail = sdp->sd_log_head; in gfs2_log_shutdown()
1184 static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp) in gfs2_jrnl_flush_reqd() argument
1186 return (atomic_read(&sdp->sd_log_pinned) + in gfs2_jrnl_flush_reqd()
1187 atomic_read(&sdp->sd_log_blks_needed) >= in gfs2_jrnl_flush_reqd()
1188 atomic_read(&sdp->sd_log_thresh1)); in gfs2_jrnl_flush_reqd()
1191 static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp) in gfs2_ail_flush_reqd() argument
1193 unsigned int used_blocks = sdp->sd_jdesc->jd_blocks - atomic_read(&sdp->sd_log_blks_free); in gfs2_ail_flush_reqd()
1195 if (test_and_clear_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags)) in gfs2_ail_flush_reqd()
1198 return used_blocks + atomic_read(&sdp->sd_log_blks_needed) >= in gfs2_ail_flush_reqd()
1199 atomic_read(&sdp->sd_log_thresh2); in gfs2_ail_flush_reqd()
1204 * @sdp: Pointer to GFS2 superblock
1212 struct gfs2_sbd *sdp = data; in gfs2_logd() local
1219 if (gfs2_withdrawn(sdp)) { in gfs2_logd()
1224 if (sdp->sd_log_error) { in gfs2_logd()
1225 gfs2_lm(sdp, in gfs2_logd()
1229 sdp->sd_fsname, sdp->sd_log_error); in gfs2_logd()
1230 gfs2_withdraw(sdp); in gfs2_logd()
1235 if (gfs2_jrnl_flush_reqd(sdp) || t == 0) { in gfs2_logd()
1236 gfs2_ail1_empty(sdp, 0); in gfs2_logd()
1237 gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | in gfs2_logd()
1242 if (gfs2_ail_flush_reqd(sdp)) { in gfs2_logd()
1243 gfs2_ail1_start(sdp); in gfs2_logd()
1244 gfs2_ail1_wait(sdp); in gfs2_logd()
1245 gfs2_ail1_empty(sdp, 0); in gfs2_logd()
1246 gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | in gfs2_logd()
1251 if (!gfs2_ail_flush_reqd(sdp) || did_flush) in gfs2_logd()
1252 wake_up(&sdp->sd_log_waitq); in gfs2_logd()
1254 t = gfs2_tune_get(sdp, gt_logd_secs) * HZ; in gfs2_logd()
1259 prepare_to_wait(&sdp->sd_logd_waitq, &wait, in gfs2_logd()
1261 if (!gfs2_ail_flush_reqd(sdp) && in gfs2_logd()
1262 !gfs2_jrnl_flush_reqd(sdp) && in gfs2_logd()
1265 } while(t && !gfs2_ail_flush_reqd(sdp) && in gfs2_logd()
1266 !gfs2_jrnl_flush_reqd(sdp) && in gfs2_logd()
1268 finish_wait(&sdp->sd_logd_waitq, &wait); in gfs2_logd()