Lines Matching refs:sdp

38  * @sdp: the filesystem
48 unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
55 first = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / ssize;
58 second = (sdp->sd_sb.sb_bsize -
86 * @sdp: the filesystem
92 static int gfs2_ail1_start_one(struct gfs2_sbd *sdp,
95 __releases(&sdp->sd_ail_lock)
96 __acquires(&sdp->sd_ail_lock)
106 gfs2_assert(sdp, bd->bd_tr == tr);
110 gfs2_io_error_bh(sdp, bh);
124 spin_unlock(&sdp->sd_ail_lock);
126 spin_lock(&sdp->sd_ail_lock);
138 * @sdp: The super block
145 void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct writeback_control *wbc)
147 struct list_head *head = &sdp->sd_ail1_list;
151 trace_gfs2_ail_flush(sdp, wbc, 1);
153 spin_lock(&sdp->sd_ail_lock);
158 if (gfs2_ail1_start_one(sdp, wbc, tr))
161 spin_unlock(&sdp->sd_ail_lock);
163 trace_gfs2_ail_flush(sdp, wbc, 0);
168 * @sdp: The superblock
171 static void gfs2_ail1_start(struct gfs2_sbd *sdp)
180 return gfs2_ail1_flush(sdp, &wbc);
185 * @sdp: the filesystem
190 static void gfs2_ail1_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
198 gfs2_assert(sdp, bd->bd_tr == tr);
202 gfs2_io_error_bh(sdp, bh);
210 * @sdp: The superblock
215 static int gfs2_ail1_empty(struct gfs2_sbd *sdp)
221 spin_lock(&sdp->sd_ail_lock);
222 list_for_each_entry_safe_reverse(tr, s, &sdp->sd_ail1_list, tr_list) {
223 gfs2_ail1_empty_one(sdp, tr);
225 list_move(&tr->tr_list, &sdp->sd_ail2_list);
229 ret = list_empty(&sdp->sd_ail1_list);
230 spin_unlock(&sdp->sd_ail_lock);
235 static void gfs2_ail1_wait(struct gfs2_sbd *sdp)
241 spin_lock(&sdp->sd_ail_lock);
242 list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) {
248 spin_unlock(&sdp->sd_ail_lock);
254 spin_unlock(&sdp->sd_ail_lock);
259 * @sdp: the filesystem
264 static void gfs2_ail2_empty_one(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
272 gfs2_assert(sdp, bd->bd_tr == tr);
277 static void ail2_empty(struct gfs2_sbd *sdp, unsigned int new_tail)
280 unsigned int old_tail = sdp->sd_log_tail;
284 spin_lock(&sdp->sd_ail_lock);
286 list_for_each_entry_safe(tr, safe, &sdp->sd_ail2_list, tr_list) {
293 gfs2_ail2_empty_one(sdp, tr);
295 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail1_list));
296 gfs2_assert_warn(sdp, list_empty(&tr->tr_ail2_list));
300 spin_unlock(&sdp->sd_ail_lock);
305 * @sdp: The GFS2 superblock
310 void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
313 atomic_add(blks, &sdp->sd_log_blks_free);
314 trace_gfs2_log_blocks(sdp, blks);
315 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
316 sdp->sd_jdesc->jd_blocks);
317 up_read(&sdp->sd_log_flush_lock);
322 * @sdp: The GFS2 superblock
340 int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
342 unsigned reserved_blks = 7 * (4096 / sdp->sd_vfs->s_blocksize);
348 if (gfs2_assert_warn(sdp, blks) ||
349 gfs2_assert_warn(sdp, blks <= sdp->sd_jdesc->jd_blocks))
352 free_blocks = atomic_read(&sdp->sd_log_blks_free);
355 prepare_to_wait_exclusive(&sdp->sd_log_waitq, &wait,
357 wake_up(&sdp->sd_logd_waitq);
359 if (atomic_read(&sdp->sd_log_blks_free) <= wanted)
361 free_blocks = atomic_read(&sdp->sd_log_blks_free);
363 finish_wait(&sdp->sd_log_waitq, &wait);
365 if (atomic_cmpxchg(&sdp->sd_log_blks_free, free_blocks,
368 trace_gfs2_log_blocks(sdp, -blks);
375 wake_up(&sdp->sd_log_waitq);
377 down_read(&sdp->sd_log_flush_lock);
378 if (unlikely(!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))) {
379 gfs2_log_release(sdp, blks);
387 * @sdp: The GFS2 superblock
397 static inline unsigned int log_distance(struct gfs2_sbd *sdp, unsigned int newer,
404 dist += sdp->sd_jdesc->jd_blocks;
412 * @sdp: The GFS2 superblock
434 static unsigned int calc_reserved(struct gfs2_sbd *sdp)
439 struct gfs2_trans *tr = sdp->sd_log_tr;
446 reserved += DIV_ROUND_UP(mbuf, buf_limit(sdp));
447 reserved += DIV_ROUND_UP(dbuf, databuf_limit(sdp));
450 if (sdp->sd_log_commited_revoke > 0)
451 reserved += gfs2_struct2blk(sdp, sdp->sd_log_commited_revoke,
459 static unsigned int current_tail(struct gfs2_sbd *sdp)
464 spin_lock(&sdp->sd_ail_lock);
466 if (list_empty(&sdp->sd_ail1_list)) {
467 tail = sdp->sd_log_head;
469 tr = list_entry(sdp->sd_ail1_list.prev, struct gfs2_trans,
474 spin_unlock(&sdp->sd_ail_lock);
479 static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail)
481 unsigned int dist = log_distance(sdp, new_tail, sdp->sd_log_tail);
483 ail2_empty(sdp, new_tail);
485 atomic_add(dist, &sdp->sd_log_blks_free);
486 trace_gfs2_log_blocks(sdp, dist);
487 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
488 sdp->sd_jdesc->jd_blocks);
490 sdp->sd_log_tail = new_tail;
494 static void log_flush_wait(struct gfs2_sbd *sdp)
498 if (atomic_read(&sdp->sd_log_in_flight)) {
500 prepare_to_wait(&sdp->sd_log_flush_wait, &wait,
502 if (atomic_read(&sdp->sd_log_in_flight))
504 } while(atomic_read(&sdp->sd_log_in_flight));
505 finish_wait(&sdp->sd_log_flush_wait, &wait);
523 static void gfs2_ordered_write(struct gfs2_sbd *sdp)
528 spin_lock(&sdp->sd_ordered_lock);
529 list_sort(NULL, &sdp->sd_log_le_ordered, &ip_cmp);
530 while (!list_empty(&sdp->sd_log_le_ordered)) {
531 ip = list_entry(sdp->sd_log_le_ordered.next, struct gfs2_inode, i_ordered);
535 spin_unlock(&sdp->sd_ordered_lock);
537 spin_lock(&sdp->sd_ordered_lock);
539 list_splice(&written, &sdp->sd_log_le_ordered);
540 spin_unlock(&sdp->sd_ordered_lock);
543 static void gfs2_ordered_wait(struct gfs2_sbd *sdp)
547 spin_lock(&sdp->sd_ordered_lock);
548 while (!list_empty(&sdp->sd_log_le_ordered)) {
549 ip = list_entry(sdp->sd_log_le_ordered.next, struct gfs2_inode, i_ordered);
554 spin_unlock(&sdp->sd_ordered_lock);
556 spin_lock(&sdp->sd_ordered_lock);
558 spin_unlock(&sdp->sd_ordered_lock);
563 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
565 spin_lock(&sdp->sd_ordered_lock);
568 spin_unlock(&sdp->sd_ordered_lock);
571 void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
581 sdp->sd_log_num_revoke++;
584 list_add(&bd->bd_list, &sdp->sd_log_le_revoke);
587 void gfs2_write_revokes(struct gfs2_sbd *sdp)
592 int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64);
594 gfs2_ail1_empty(sdp);
595 spin_lock(&sdp->sd_ail_lock);
596 list_for_each_entry(tr, &sdp->sd_ail1_list, tr_list) {
605 spin_unlock(&sdp->sd_ail_lock);
608 while (sdp->sd_log_num_revoke > max_revokes)
609 max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64);
610 max_revokes -= sdp->sd_log_num_revoke;
611 if (!sdp->sd_log_num_revoke) {
612 atomic_dec(&sdp->sd_log_blks_free);
615 if (!sdp->sd_log_blks_reserved)
616 atomic_dec(&sdp->sd_log_blks_free);
618 gfs2_log_lock(sdp);
619 spin_lock(&sdp->sd_ail_lock);
620 list_for_each_entry(tr, &sdp->sd_ail1_list, tr_list) {
626 gfs2_add_revoke(sdp, bd);
631 spin_unlock(&sdp->sd_ail_lock);
632 gfs2_log_unlock(sdp);
634 if (!sdp->sd_log_num_revoke) {
635 atomic_inc(&sdp->sd_log_blks_free);
636 if (!sdp->sd_log_blks_reserved)
637 atomic_inc(&sdp->sd_log_blks_free);
643 * @sdp: The GFS2 superblock
648 static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
658 tail = current_tail(sdp);
664 lh->lh_header.mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid);
665 lh->lh_sequence = cpu_to_be64(sdp->sd_log_sequence++);
668 lh->lh_blkno = cpu_to_be32(sdp->sd_log_flush_head);
672 if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
673 gfs2_ordered_wait(sdp);
674 log_flush_wait(sdp);
678 sdp->sd_log_idle = (tail == sdp->sd_log_flush_head);
679 gfs2_log_write_page(sdp, page);
680 gfs2_log_flush_bio(sdp, rw);
681 log_flush_wait(sdp);
683 if (sdp->sd_log_tail != tail)
684 log_pull_tail(sdp, tail);
689 * @sdp: the filesystem
694 void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl,
699 down_write(&sdp->sd_log_flush_lock);
703 up_write(&sdp->sd_log_flush_lock);
706 trace_gfs2_log_flush(sdp, 1);
708 sdp->sd_log_flush_head = sdp->sd_log_head;
709 sdp->sd_log_flush_wrapped = 0;
710 tr = sdp->sd_log_tr;
712 sdp->sd_log_tr = NULL;
715 tr->tr_first = sdp->sd_log_flush_head;
718 gfs2_assert_withdraw(sdp,
719 sdp->sd_log_num_revoke == sdp->sd_log_commited_revoke);
721 gfs2_ordered_write(sdp);
722 lops_before_commit(sdp, tr);
723 gfs2_log_flush_bio(sdp, WRITE);
725 if (sdp->sd_log_head != sdp->sd_log_flush_head) {
726 log_flush_wait(sdp);
727 log_write_header(sdp, 0);
728 } else if (sdp->sd_log_tail != current_tail(sdp) && !sdp->sd_log_idle){
729 atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */
730 trace_gfs2_log_blocks(sdp, -1);
731 log_write_header(sdp, 0);
733 lops_after_commit(sdp, tr);
735 gfs2_log_lock(sdp);
736 sdp->sd_log_head = sdp->sd_log_flush_head;
737 sdp->sd_log_blks_reserved = 0;
738 sdp->sd_log_commited_revoke = 0;
740 spin_lock(&sdp->sd_ail_lock);
742 list_add(&tr->tr_list, &sdp->sd_ail1_list);
745 spin_unlock(&sdp->sd_ail_lock);
746 gfs2_log_unlock(sdp);
748 if (atomic_read(&sdp->sd_log_freeze))
751 if (!sdp->sd_log_idle) {
753 gfs2_ail1_start(sdp);
754 gfs2_ail1_wait(sdp);
755 if (gfs2_ail1_empty(sdp))
758 atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */
759 trace_gfs2_log_blocks(sdp, -1);
760 sdp->sd_log_flush_wrapped = 0;
761 log_write_header(sdp, 0);
762 sdp->sd_log_head = sdp->sd_log_flush_head;
765 gfs2_log_shutdown(sdp);
769 atomic_set(&sdp->sd_log_freeze, 0);
770 wake_up(&sdp->sd_log_frozen_wait);
771 error = gfs2_glock_nq_init(sdp->sd_freeze_gl,
773 &sdp->sd_thaw_gh);
776 gfs2_assert_withdraw(sdp, 0);
779 gfs2_glock_dq_uninit(&sdp->sd_thaw_gh);
783 trace_gfs2_log_flush(sdp, 0);
784 up_write(&sdp->sd_log_flush_lock);
810 static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
816 gfs2_log_lock(sdp);
818 if (sdp->sd_log_tr) {
819 gfs2_merge_trans(sdp->sd_log_tr, tr);
821 gfs2_assert_withdraw(sdp, tr->tr_alloced);
822 sdp->sd_log_tr = tr;
826 sdp->sd_log_commited_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm;
827 reserved = calc_reserved(sdp);
828 maxres = sdp->sd_log_blks_reserved + tr->tr_reserved;
829 gfs2_assert_withdraw(sdp, maxres >= reserved);
831 atomic_add(unused, &sdp->sd_log_blks_free);
832 trace_gfs2_log_blocks(sdp, unused);
833 gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
834 sdp->sd_jdesc->jd_blocks);
835 sdp->sd_log_blks_reserved = reserved;
837 gfs2_log_unlock(sdp);
842 * @sdp: the filesystem
855 void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
857 log_refund(sdp, tr);
859 if (atomic_read(&sdp->sd_log_pinned) > atomic_read(&sdp->sd_log_thresh1) ||
860 ((sdp->sd_jdesc->jd_blocks - atomic_read(&sdp->sd_log_blks_free)) >
861 atomic_read(&sdp->sd_log_thresh2)))
862 wake_up(&sdp->sd_logd_waitq);
867 * @sdp: the filesystem
871 void gfs2_log_shutdown(struct gfs2_sbd *sdp)
873 gfs2_assert_withdraw(sdp, !sdp->sd_log_blks_reserved);
874 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
875 gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail1_list));
877 sdp->sd_log_flush_head = sdp->sd_log_head;
878 sdp->sd_log_flush_wrapped = 0;
880 log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT);
882 gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail);
883 gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list));
885 sdp->sd_log_head = sdp->sd_log_flush_head;
886 sdp->sd_log_tail = sdp->sd_log_head;
889 static inline int gfs2_jrnl_flush_reqd(struct gfs2_sbd *sdp)
891 return (atomic_read(&sdp->sd_log_pinned) >= atomic_read(&sdp->sd_log_thresh1) || atomic_read(&sdp->sd_log_freeze));
894 static inline int gfs2_ail_flush_reqd(struct gfs2_sbd *sdp)
896 unsigned int used_blocks = sdp->sd_jdesc->jd_blocks - atomic_read(&sdp->sd_log_blks_free);
897 return used_blocks >= atomic_read(&sdp->sd_log_thresh2);
902 * @sdp: Pointer to GFS2 superblock
910 struct gfs2_sbd *sdp = data;
916 if (gfs2_jrnl_flush_reqd(sdp) || t == 0) {
917 gfs2_ail1_empty(sdp);
918 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
921 if (gfs2_ail_flush_reqd(sdp)) {
922 gfs2_ail1_start(sdp);
923 gfs2_ail1_wait(sdp);
924 gfs2_ail1_empty(sdp);
925 gfs2_log_flush(sdp, NULL, NORMAL_FLUSH);
928 if (!gfs2_ail_flush_reqd(sdp))
929 wake_up(&sdp->sd_log_waitq);
931 t = gfs2_tune_get(sdp, gt_logd_secs) * HZ;
936 prepare_to_wait(&sdp->sd_logd_waitq, &wait,
938 if (!gfs2_ail_flush_reqd(sdp) &&
939 !gfs2_jrnl_flush_reqd(sdp) &&
942 } while(t && !gfs2_ail_flush_reqd(sdp) &&
943 !gfs2_jrnl_flush_reqd(sdp) &&
945 finish_wait(&sdp->sd_logd_waitq, &wait);