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
55 first = sdp->sd_ldptrs; in gfs2_struct2blk()
59 second = sdp->sd_inptrs; in gfs2_struct2blk()
85 * @sdp: The superblock
91 static int gfs2_ail1_start_one(struct gfs2_sbd *sdp, in gfs2_ail1_start_one() argument
94 __releases(&sdp->sd_ail_lock) in gfs2_ail1_start_one()
95 __acquires(&sdp->sd_ail_lock) in gfs2_ail1_start_one()
106 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail1_start_one()
114 if (!cmpxchg(&sdp->sd_log_error, 0, -EIO)) { in gfs2_ail1_start_one()
115 gfs2_io_error_bh(sdp, bh); in gfs2_ail1_start_one()
116 gfs2_withdraw_delayed(sdp); in gfs2_ail1_start_one()
120 if (gfs2_withdrawing_or_withdrawn(sdp)) { in gfs2_ail1_start_one()
133 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_start_one()
140 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_start_one()
152 static void dump_ail_list(struct gfs2_sbd *sdp) in dump_ail_list() argument
158 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) { in dump_ail_list()
162 fs_err(sdp, "bd %p: blk:0x%llx bh=%p ", bd, in dump_ail_list()
165 fs_err(sdp, "\n"); in dump_ail_list()
168 fs_err(sdp, "0x%llx up2:%d dirt:%d lkd:%d req:%d " in dump_ail_list()
186 * @sdp: The super block
193 void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc) in gfs2_ail1_flush() argument
195 struct list_head *head = &sdp->sd_ail1_list; in gfs2_ail1_flush()
201 trace_gfs2_ail_flush(sdp, wbc, 1); in gfs2_ail1_flush()
203 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_flush()
207 fs_err(sdp, "Error: In %s for ten minutes! t=%d\n", in gfs2_ail1_flush()
209 dump_ail_list(sdp); in gfs2_ail1_flush()
215 ret = gfs2_ail1_start_one(sdp, wbc, tr, &plug); in gfs2_ail1_flush()
223 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_flush()
226 gfs2_lm(sdp, "gfs2_ail1_start_one returned: %d\n", ret); in gfs2_ail1_flush()
227 gfs2_withdraw(sdp); in gfs2_ail1_flush()
229 trace_gfs2_ail_flush(sdp, wbc, 0); in gfs2_ail1_flush()
234 * @sdp: The superblock
237 static void gfs2_ail1_start(struct gfs2_sbd *sdp) in gfs2_ail1_start() argument
246 return gfs2_ail1_flush(sdp, &wbc); in gfs2_ail1_start()
249 static void gfs2_log_update_flush_tail(struct gfs2_sbd *sdp) in gfs2_log_update_flush_tail() argument
251 unsigned int new_flush_tail = sdp->sd_log_head; in gfs2_log_update_flush_tail()
254 if (!list_empty(&sdp->sd_ail1_list)) { in gfs2_log_update_flush_tail()
255 tr = list_last_entry(&sdp->sd_ail1_list, in gfs2_log_update_flush_tail()
259 sdp->sd_log_flush_tail = new_flush_tail; in gfs2_log_update_flush_tail()
262 static void gfs2_log_update_head(struct gfs2_sbd *sdp) in gfs2_log_update_head() argument
264 unsigned int new_head = sdp->sd_log_flush_head; in gfs2_log_update_head()
266 if (sdp->sd_log_flush_tail == sdp->sd_log_head) in gfs2_log_update_head()
267 sdp->sd_log_flush_tail = new_head; in gfs2_log_update_head()
268 sdp->sd_log_head = new_head; in gfs2_log_update_head()
275 static void gfs2_ail_empty_tr(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_ail_empty_tr() argument
283 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail_empty_tr()
290 * @sdp: the filesystem
297 static int gfs2_ail1_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_ail1_empty_one() argument
307 gfs2_assert(sdp, bd->bd_tr == tr); in gfs2_ail1_empty_one()
317 if (!sdp->sd_log_error && buffer_busy(bh)) { in gfs2_ail1_empty_one()
322 !cmpxchg(&sdp->sd_log_error, 0, -EIO)) { in gfs2_ail1_empty_one()
323 gfs2_io_error_bh(sdp, bh); in gfs2_ail1_empty_one()
324 gfs2_withdraw_delayed(sdp); in gfs2_ail1_empty_one()
333 gfs2_add_revoke(sdp, bd); in gfs2_ail1_empty_one()
344 * @sdp: The superblock
351 static bool gfs2_ail1_empty(struct gfs2_sbd *sdp, int max_revokes) in gfs2_ail1_empty() argument
357 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_empty()
358 list_for_each_entry_safe_reverse(tr, s, &sdp->sd_ail1_list, tr_list) { in gfs2_ail1_empty()
359 if (!gfs2_ail1_empty_one(sdp, tr, &max_revokes) && oldest_tr) in gfs2_ail1_empty()
360 list_move(&tr->tr_list, &sdp->sd_ail2_list); in gfs2_ail1_empty()
364 gfs2_log_update_flush_tail(sdp); in gfs2_ail1_empty()
365 empty = list_empty(&sdp->sd_ail1_list); in gfs2_ail1_empty()
366 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_empty()
371 static void gfs2_ail1_wait(struct gfs2_sbd *sdp) in gfs2_ail1_wait() argument
377 spin_lock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
378 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) { in gfs2_ail1_wait()
384 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
390 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail1_wait()
393 static void __ail2_empty(struct gfs2_sbd *sdp, struct gfs2_trans *tr) in __ail2_empty() argument
395 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in __ail2_empty()
397 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail1_list)); in __ail2_empty()
398 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail2_list)); in __ail2_empty()
399 gfs2_trans_free(sdp, tr); in __ail2_empty()
402 static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail) in ail2_empty() argument
404 struct list_head *ail2_list = &sdp->sd_ail2_list; in ail2_empty()
405 unsigned int old_tail = sdp->sd_log_tail; in ail2_empty()
408 spin_lock(&sdp->sd_ail_lock); in ail2_empty()
412 __ail2_empty(sdp, tr); in ail2_empty()
417 __ail2_empty(sdp, tr); in ail2_empty()
420 spin_unlock(&sdp->sd_ail_lock); in ail2_empty()
425 * @sdp: The GFS2 superblock
428 bool gfs2_log_is_empty(struct gfs2_sbd *sdp) { in gfs2_log_is_empty() argument
429 return atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks; in gfs2_log_is_empty()
432 static bool __gfs2_log_try_reserve_revokes(struct gfs2_sbd *sdp, unsigned int revokes) in __gfs2_log_try_reserve_revokes() argument
436 available = atomic_read(&sdp->sd_log_revokes_available); in __gfs2_log_try_reserve_revokes()
438 if (atomic_try_cmpxchg(&sdp->sd_log_revokes_available, in __gfs2_log_try_reserve_revokes()
447 * @sdp: The GFS2 superblock
450 * sdp->sd_log_flush_lock must be held.
452 void gfs2_log_release_revokes(struct gfs2_sbd *sdp, unsigned int revokes) in gfs2_log_release_revokes() argument
455 atomic_add(revokes, &sdp->sd_log_revokes_available); in gfs2_log_release_revokes()
460 * @sdp: The GFS2 superblock
465 void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) in gfs2_log_release() argument
467 atomic_add(blks, &sdp->sd_log_blks_free); in gfs2_log_release()
468 trace_gfs2_log_blocks(sdp, blks); in gfs2_log_release()
469 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= in gfs2_log_release()
470 sdp->sd_jdesc->jd_blocks); in gfs2_log_release()
471 if (atomic_read(&sdp->sd_log_blks_needed)) in gfs2_log_release()
472 wake_up(&sdp->sd_log_waitq); in gfs2_log_release()
477 * @sdp: The GFS2 superblock
484 static bool __gfs2_log_try_reserve(struct gfs2_sbd *sdp, unsigned int blks, in __gfs2_log_try_reserve() argument
490 free_blocks = atomic_read(&sdp->sd_log_blks_free); in __gfs2_log_try_reserve()
492 if (atomic_try_cmpxchg(&sdp->sd_log_blks_free, &free_blocks, in __gfs2_log_try_reserve()
494 trace_gfs2_log_blocks(sdp, -blks); in __gfs2_log_try_reserve()
503 * @sdp: The GFS2 superblock
520 static void __gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks, in __gfs2_log_reserve() argument
526 atomic_add(blks, &sdp->sd_log_blks_needed); in __gfs2_log_reserve()
528 if (current != sdp->sd_logd_process) in __gfs2_log_reserve()
529 wake_up(&sdp->sd_logd_waitq); in __gfs2_log_reserve()
530 io_wait_event(sdp->sd_log_waitq, in __gfs2_log_reserve()
531 (free_blocks = atomic_read(&sdp->sd_log_blks_free), in __gfs2_log_reserve()
534 if (atomic_try_cmpxchg(&sdp->sd_log_blks_free, in __gfs2_log_reserve()
542 trace_gfs2_log_blocks(sdp, -blks); in __gfs2_log_reserve()
543 if (atomic_sub_return(blks, &sdp->sd_log_blks_needed)) in __gfs2_log_reserve()
544 wake_up(&sdp->sd_log_waitq); in __gfs2_log_reserve()
549 * @sdp: The GFS2 superblock
553 * This is similar to gfs2_log_reserve, but sdp->sd_log_flush_lock must be
557 bool gfs2_log_try_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_log_try_reserve() argument
565 if (revokes && !__gfs2_log_try_reserve_revokes(sdp, revokes)) { in gfs2_log_try_reserve()
566 revoke_blks = DIV_ROUND_UP(revokes, sdp->sd_inptrs); in gfs2_log_try_reserve()
567 *extra_revokes = revoke_blks * sdp->sd_inptrs - revokes; in gfs2_log_try_reserve()
572 if (__gfs2_log_try_reserve(sdp, blks, GFS2_LOG_FLUSH_MIN_BLOCKS)) in gfs2_log_try_reserve()
575 gfs2_log_release_revokes(sdp, revokes); in gfs2_log_try_reserve()
581 * @sdp: The GFS2 superblock
585 * sdp->sd_log_flush_lock must not be held.
588 void gfs2_log_reserve(struct gfs2_sbd *sdp, struct gfs2_trans *tr, in gfs2_log_reserve() argument
597 revoke_blks = DIV_ROUND_UP(revokes, sdp->sd_inptrs); in gfs2_log_reserve()
598 *extra_revokes = revoke_blks * sdp->sd_inptrs - revokes; in gfs2_log_reserve()
601 __gfs2_log_reserve(sdp, blks, GFS2_LOG_FLUSH_MIN_BLOCKS); in gfs2_log_reserve()
606 * @sdp: The GFS2 superblock
616 static inline unsigned int log_distance(struct gfs2_sbd *sdp, unsigned int newer, in log_distance() argument
623 dist += sdp->sd_jdesc->jd_blocks; in log_distance()
630 * @sdp: The GFS2 superblock
649 static unsigned int calc_reserved(struct gfs2_sbd *sdp) in calc_reserved() argument
653 struct gfs2_trans *tr = sdp->sd_log_tr; in calc_reserved()
657 reserved += blocks + DIV_ROUND_UP(blocks, buf_limit(sdp)); in calc_reserved()
659 reserved += blocks + DIV_ROUND_UP(blocks, databuf_limit(sdp)); in calc_reserved()
664 static void log_pull_tail(struct gfs2_sbd *sdp) in log_pull_tail() argument
666 unsigned int new_tail = sdp->sd_log_flush_tail; in log_pull_tail()
669 if (new_tail == sdp->sd_log_tail) in log_pull_tail()
671 dist = log_distance(sdp, new_tail, sdp->sd_log_tail); in log_pull_tail()
672 ail2_empty(sdp, new_tail); in log_pull_tail()
673 gfs2_log_release(sdp, dist); in log_pull_tail()
674 sdp->sd_log_tail = new_tail; in log_pull_tail()
678 void log_flush_wait(struct gfs2_sbd *sdp) in log_flush_wait() argument
682 if (atomic_read(&sdp->sd_log_in_flight)) { in log_flush_wait()
684 prepare_to_wait(&sdp->sd_log_flush_wait, &wait, in log_flush_wait()
686 if (atomic_read(&sdp->sd_log_in_flight)) in log_flush_wait()
688 } while(atomic_read(&sdp->sd_log_in_flight)); in log_flush_wait()
689 finish_wait(&sdp->sd_log_flush_wait, &wait); in log_flush_wait()
713 static void gfs2_ordered_write(struct gfs2_sbd *sdp) in gfs2_ordered_write() argument
718 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
719 list_sort(NULL, &sdp->sd_log_ordered, &ip_cmp); in gfs2_ordered_write()
720 while (!list_empty(&sdp->sd_log_ordered)) { in gfs2_ordered_write()
721 ip = list_first_entry(&sdp->sd_log_ordered, struct gfs2_inode, i_ordered); in gfs2_ordered_write()
727 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
729 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
731 list_splice(&written, &sdp->sd_log_ordered); in gfs2_ordered_write()
732 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_write()
735 static void gfs2_ordered_wait(struct gfs2_sbd *sdp) in gfs2_ordered_wait() argument
739 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
740 while (!list_empty(&sdp->sd_log_ordered)) { in gfs2_ordered_wait()
741 ip = list_first_entry(&sdp->sd_log_ordered, struct gfs2_inode, i_ordered); in gfs2_ordered_wait()
745 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
747 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
749 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_wait()
754 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in gfs2_ordered_del_inode() local
756 spin_lock(&sdp->sd_ordered_lock); in gfs2_ordered_del_inode()
758 spin_unlock(&sdp->sd_ordered_lock); in gfs2_ordered_del_inode()
761 void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) in gfs2_add_revoke() argument
766 sdp->sd_log_num_revoke++; in gfs2_add_revoke()
774 list_add(&bd->bd_list, &sdp->sd_log_revokes); in gfs2_add_revoke()
787 * @sdp: The GFS2 superblock
797 void gfs2_flush_revokes(struct gfs2_sbd *sdp) in gfs2_flush_revokes() argument
800 unsigned int max_revokes = atomic_read(&sdp->sd_log_revokes_available); in gfs2_flush_revokes()
802 gfs2_log_lock(sdp); in gfs2_flush_revokes()
803 gfs2_ail1_empty(sdp, max_revokes); in gfs2_flush_revokes()
804 gfs2_log_unlock(sdp); in gfs2_flush_revokes()
806 if (gfs2_withdrawing(sdp)) in gfs2_flush_revokes()
807 gfs2_withdraw(sdp); in gfs2_flush_revokes()
812 * @sdp: The GFS2 superblock
823 void gfs2_write_log_header(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd, in gfs2_write_log_header() argument
830 struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local; in gfs2_write_log_header()
832 struct super_block *sb = sdp->sd_vfs; in gfs2_write_log_header()
835 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_write_log_header()
846 lh->lh_header.mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); in gfs2_write_log_header()
865 if (gfs2_assert_withdraw(sdp, ret == 0)) in gfs2_write_log_header()
876 cpu_to_be64(GFS2_I(sdp->sd_sc_inode)->i_no_addr); in gfs2_write_log_header()
878 cpu_to_be64(GFS2_I(sdp->sd_qc_inode)->i_no_addr); in gfs2_write_log_header()
880 spin_lock(&sdp->sd_statfs_spin); in gfs2_write_log_header()
884 spin_unlock(&sdp->sd_statfs_spin); in gfs2_write_log_header()
893 gfs2_log_write(sdp, jd, page, sb->s_blocksize, 0, dblock); in gfs2_write_log_header()
899 * @sdp: The GFS2 superblock
905 static void log_write_header(struct gfs2_sbd *sdp, u32 flags) in log_write_header() argument
908 struct super_block *sb = sdp->sd_vfs; in log_write_header()
910 gfs2_assert_withdraw(sdp, sb->s_writers.frozen != SB_FREEZE_COMPLETE); in log_write_header()
912 if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) { in log_write_header()
913 gfs2_ordered_wait(sdp); in log_write_header()
914 log_flush_wait(sdp); in log_write_header()
917 sdp->sd_log_idle = (sdp->sd_log_flush_tail == sdp->sd_log_flush_head); in log_write_header()
918 gfs2_write_log_header(sdp, sdp->sd_jdesc, sdp->sd_log_sequence++, in log_write_header()
919 sdp->sd_log_flush_tail, sdp->sd_log_flush_head, in log_write_header()
921 gfs2_log_incr_head(sdp); in log_write_header()
922 log_flush_wait(sdp); in log_write_header()
923 log_pull_tail(sdp); in log_write_header()
924 gfs2_log_update_head(sdp); in log_write_header()
929 * @sdp: Pointer to GFS2 superblock
931 void gfs2_ail_drain(struct gfs2_sbd *sdp) in gfs2_ail_drain() argument
935 spin_lock(&sdp->sd_ail_lock); in gfs2_ail_drain()
943 while (!list_empty(&sdp->sd_ail1_list)) { in gfs2_ail_drain()
944 tr = list_first_entry(&sdp->sd_ail1_list, struct gfs2_trans, in gfs2_ail_drain()
946 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail1_list); in gfs2_ail_drain()
947 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in gfs2_ail_drain()
949 gfs2_trans_free(sdp, tr); in gfs2_ail_drain()
951 while (!list_empty(&sdp->sd_ail2_list)) { in gfs2_ail_drain()
952 tr = list_first_entry(&sdp->sd_ail2_list, struct gfs2_trans, in gfs2_ail_drain()
954 gfs2_ail_empty_tr(sdp, tr, &tr->tr_ail2_list); in gfs2_ail_drain()
956 gfs2_trans_free(sdp, tr); in gfs2_ail_drain()
958 gfs2_drain_revokes(sdp); in gfs2_ail_drain()
959 spin_unlock(&sdp->sd_ail_lock); in gfs2_ail_drain()
964 * @sdp: Pointer to GFS2 superblock
966 static void empty_ail1_list(struct gfs2_sbd *sdp) in empty_ail1_list() argument
973 fs_err(sdp, "Error: In %s for 10 minutes! t=%d\n", in empty_ail1_list()
975 dump_ail_list(sdp); in empty_ail1_list()
978 gfs2_ail1_start(sdp); in empty_ail1_list()
979 gfs2_ail1_wait(sdp); in empty_ail1_list()
980 empty = gfs2_ail1_empty(sdp, 0); in empty_ail1_list()
982 if (gfs2_withdrawing_or_withdrawn(sdp)) in empty_ail1_list()
986 if (gfs2_withdrawing(sdp)) in empty_ail1_list()
987 gfs2_withdraw(sdp); in empty_ail1_list()
1026 * @sdp: The filesystem
1032 void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl, u32 flags) in gfs2_log_flush() argument
1036 bool frozen = test_bit(SDF_FROZEN, &sdp->sd_flags); in gfs2_log_flush()
1040 down_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
1041 trace_gfs2_log_flush(sdp, 1, flags); in gfs2_log_flush()
1048 if (gfs2_withdrawing_or_withdrawn(sdp) || in gfs2_log_flush()
1049 !test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) in gfs2_log_flush()
1056 first_log_head = sdp->sd_log_head; in gfs2_log_flush()
1057 sdp->sd_log_flush_head = first_log_head; in gfs2_log_flush()
1059 tr = sdp->sd_log_tr; in gfs2_log_flush()
1060 if (tr || sdp->sd_log_num_revoke) { in gfs2_log_flush()
1062 gfs2_log_release(sdp, reserved_blocks); in gfs2_log_flush()
1063 reserved_blocks = sdp->sd_log_blks_reserved; in gfs2_log_flush()
1064 reserved_revokes = sdp->sd_log_num_revoke; in gfs2_log_flush()
1066 sdp->sd_log_tr = NULL; in gfs2_log_flush()
1069 if (gfs2_assert_withdraw_delayed(sdp, in gfs2_log_flush()
1078 if (current == sdp->sd_logd_process) in gfs2_log_flush()
1081 if (!__gfs2_log_try_reserve(sdp, reserved_blocks, taboo_blocks)) { in gfs2_log_flush()
1082 up_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
1083 __gfs2_log_reserve(sdp, reserved_blocks, taboo_blocks); in gfs2_log_flush()
1084 down_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
1087 BUG_ON(sdp->sd_log_num_revoke); in gfs2_log_flush()
1091 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); in gfs2_log_flush()
1094 if (gfs2_assert_withdraw_delayed(sdp, !reserved_revokes)) in gfs2_log_flush()
1097 gfs2_ordered_write(sdp); in gfs2_log_flush()
1098 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_log_flush()
1100 lops_before_commit(sdp, tr); in gfs2_log_flush()
1101 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_log_flush()
1103 if (sdp->sd_jdesc) in gfs2_log_flush()
1104 gfs2_log_submit_bio(&sdp->sd_jdesc->jd_log_bio, REQ_OP_WRITE); in gfs2_log_flush()
1105 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_log_flush()
1108 if (sdp->sd_log_head != sdp->sd_log_flush_head) { in gfs2_log_flush()
1109 log_write_header(sdp, flags); in gfs2_log_flush()
1110 } else if (sdp->sd_log_tail != sdp->sd_log_flush_tail && !sdp->sd_log_idle) { in gfs2_log_flush()
1111 log_write_header(sdp, flags); in gfs2_log_flush()
1113 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_log_flush()
1115 lops_after_commit(sdp, tr); in gfs2_log_flush()
1117 gfs2_log_lock(sdp); in gfs2_log_flush()
1118 sdp->sd_log_blks_reserved = 0; in gfs2_log_flush()
1120 spin_lock(&sdp->sd_ail_lock); in gfs2_log_flush()
1122 list_add(&tr->tr_list, &sdp->sd_ail1_list); in gfs2_log_flush()
1125 spin_unlock(&sdp->sd_ail_lock); in gfs2_log_flush()
1126 gfs2_log_unlock(sdp); in gfs2_log_flush()
1129 if (!sdp->sd_log_idle) { in gfs2_log_flush()
1130 empty_ail1_list(sdp); in gfs2_log_flush()
1131 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_log_flush()
1133 log_write_header(sdp, flags); in gfs2_log_flush()
1137 gfs2_log_shutdown(sdp); in gfs2_log_flush()
1141 used_blocks = log_distance(sdp, sdp->sd_log_flush_head, first_log_head); in gfs2_log_flush()
1142 reserved_revokes += atomic_read(&sdp->sd_log_revokes_available); in gfs2_log_flush()
1143 atomic_set(&sdp->sd_log_revokes_available, sdp->sd_ldptrs); in gfs2_log_flush()
1144 gfs2_assert_withdraw(sdp, reserved_revokes % sdp->sd_inptrs == sdp->sd_ldptrs); in gfs2_log_flush()
1145 if (reserved_revokes > sdp->sd_ldptrs) in gfs2_log_flush()
1146 reserved_blocks += (reserved_revokes - sdp->sd_ldptrs) / sdp->sd_inptrs; in gfs2_log_flush()
1149 gfs2_assert_withdraw_delayed(sdp, used_blocks < reserved_blocks); in gfs2_log_flush()
1150 gfs2_log_release(sdp, reserved_blocks - used_blocks); in gfs2_log_flush()
1152 up_write(&sdp->sd_log_flush_lock); in gfs2_log_flush()
1153 gfs2_trans_free(sdp, tr); in gfs2_log_flush()
1154 if (gfs2_withdrawing(sdp)) in gfs2_log_flush()
1155 gfs2_withdraw(sdp); in gfs2_log_flush()
1156 trace_gfs2_log_flush(sdp, 0, flags); in gfs2_log_flush()
1167 spin_lock(&sdp->sd_ail_lock); in gfs2_log_flush()
1169 list_add(&tr->tr_list, &sdp->sd_ail1_list); in gfs2_log_flush()
1170 spin_unlock(&sdp->sd_ail_lock); in gfs2_log_flush()
1177 * @sdp: the filesystem
1181 static void gfs2_merge_trans(struct gfs2_sbd *sdp, struct gfs2_trans *new) in gfs2_merge_trans() argument
1183 struct gfs2_trans *old = sdp->sd_log_tr; in gfs2_merge_trans()
1197 spin_lock(&sdp->sd_ail_lock); in gfs2_merge_trans()
1200 spin_unlock(&sdp->sd_ail_lock); in gfs2_merge_trans()
1203 static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) in log_refund() argument
1209 gfs2_log_lock(sdp); in log_refund()
1211 if (sdp->sd_log_tr) { in log_refund()
1212 gfs2_merge_trans(sdp, tr); in log_refund()
1214 gfs2_assert_withdraw(sdp, !test_bit(TR_ONSTACK, &tr->tr_flags)); in log_refund()
1215 sdp->sd_log_tr = tr; in log_refund()
1219 reserved = calc_reserved(sdp); in log_refund()
1220 maxres = sdp->sd_log_blks_reserved + tr->tr_reserved; in log_refund()
1221 gfs2_assert_withdraw(sdp, maxres >= reserved); in log_refund()
1224 gfs2_log_release(sdp, unused); in log_refund()
1225 sdp->sd_log_blks_reserved = reserved; in log_refund()
1227 gfs2_log_unlock(sdp); in log_refund()
1230 static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp) in gfs2_jrnl_flush_reqd() argument
1232 return atomic_read(&sdp->sd_log_pinned) + in gfs2_jrnl_flush_reqd()
1233 atomic_read(&sdp->sd_log_blks_needed) >= in gfs2_jrnl_flush_reqd()
1234 atomic_read(&sdp->sd_log_thresh1); in gfs2_jrnl_flush_reqd()
1237 static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp) in gfs2_ail_flush_reqd() argument
1239 return sdp->sd_jdesc->jd_blocks - in gfs2_ail_flush_reqd()
1240 atomic_read(&sdp->sd_log_blks_free) + in gfs2_ail_flush_reqd()
1241 atomic_read(&sdp->sd_log_blks_needed) >= in gfs2_ail_flush_reqd()
1242 atomic_read(&sdp->sd_log_thresh2); in gfs2_ail_flush_reqd()
1247 * @sdp: the filesystem
1260 void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr) in gfs2_log_commit() argument
1262 log_refund(sdp, tr); in gfs2_log_commit()
1264 if (gfs2_ail_flush_reqd(sdp) || gfs2_jrnl_flush_reqd(sdp)) in gfs2_log_commit()
1265 wake_up(&sdp->sd_logd_waitq); in gfs2_log_commit()
1270 * @sdp: the filesystem
1274 static void gfs2_log_shutdown(struct gfs2_sbd *sdp) in gfs2_log_shutdown() argument
1276 gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved); in gfs2_log_shutdown()
1277 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); in gfs2_log_shutdown()
1278 gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list)); in gfs2_log_shutdown()
1280 log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT | GFS2_LFC_SHUTDOWN); in gfs2_log_shutdown()
1281 log_pull_tail(sdp); in gfs2_log_shutdown()
1283 gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail); in gfs2_log_shutdown()
1284 gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list)); in gfs2_log_shutdown()
1297 struct gfs2_sbd *sdp = data; in gfs2_logd() local
1302 if (gfs2_withdrawing_or_withdrawn(sdp)) in gfs2_logd()
1306 if (sdp->sd_log_error) { in gfs2_logd()
1307 gfs2_lm(sdp, in gfs2_logd()
1311 sdp->sd_fsname, sdp->sd_log_error); in gfs2_logd()
1312 gfs2_withdraw(sdp); in gfs2_logd()
1316 if (gfs2_jrnl_flush_reqd(sdp) || t == 0) { in gfs2_logd()
1317 gfs2_ail1_empty(sdp, 0); in gfs2_logd()
1318 gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | in gfs2_logd()
1322 if (test_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags) || in gfs2_logd()
1323 gfs2_ail_flush_reqd(sdp)) { in gfs2_logd()
1324 clear_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags); in gfs2_logd()
1325 gfs2_ail1_start(sdp); in gfs2_logd()
1326 gfs2_ail1_wait(sdp); in gfs2_logd()
1327 gfs2_ail1_empty(sdp, 0); in gfs2_logd()
1328 gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | in gfs2_logd()
1332 t = gfs2_tune_get(sdp, gt_logd_secs) * HZ; in gfs2_logd()
1334 t = wait_event_freezable_timeout(sdp->sd_logd_waitq, in gfs2_logd()
1335 test_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags) || in gfs2_logd()
1336 gfs2_ail_flush_reqd(sdp) || in gfs2_logd()
1337 gfs2_jrnl_flush_reqd(sdp) || in gfs2_logd()
1338 sdp->sd_log_error || in gfs2_logd()
1339 gfs2_withdrawing_or_withdrawn(sdp) || in gfs2_logd()
1344 if (gfs2_withdrawing(sdp)) in gfs2_logd()
1345 gfs2_withdraw(sdp); in gfs2_logd()