1
2
3
4
5
6#include "xfs.h"
7#include "xfs_fs.h"
8#include "xfs_shared.h"
9#include "xfs_format.h"
10#include "xfs_log_format.h"
11#include "xfs_trans_resv.h"
12#include "xfs_mount.h"
13#include "xfs_errortag.h"
14#include "xfs_error.h"
15#include "xfs_trans.h"
16#include "xfs_trans_priv.h"
17#include "xfs_log.h"
18#include "xfs_log_priv.h"
19#include "xfs_trace.h"
20#include "xfs_sysfs.h"
21#include "xfs_sb.h"
22#include "xfs_health.h"
23
24kmem_zone_t *xfs_log_ticket_zone;
25
26
27STATIC struct xlog *
28xlog_alloc_log(
29 struct xfs_mount *mp,
30 struct xfs_buftarg *log_target,
31 xfs_daddr_t blk_offset,
32 int num_bblks);
33STATIC int
34xlog_space_left(
35 struct xlog *log,
36 atomic64_t *head);
37STATIC void
38xlog_dealloc_log(
39 struct xlog *log);
40
41
42STATIC void xlog_state_done_syncing(
43 struct xlog_in_core *iclog);
44STATIC void xlog_state_do_callback(
45 struct xlog *log);
46STATIC int
47xlog_state_get_iclog_space(
48 struct xlog *log,
49 int len,
50 struct xlog_in_core **iclog,
51 struct xlog_ticket *ticket,
52 int *continued_write,
53 int *logoffsetp);
54STATIC void
55xlog_grant_push_ail(
56 struct xlog *log,
57 int need_bytes);
58STATIC void
59xlog_sync(
60 struct xlog *log,
61 struct xlog_in_core *iclog);
62#if defined(DEBUG)
63STATIC void
64xlog_verify_dest_ptr(
65 struct xlog *log,
66 void *ptr);
67STATIC void
68xlog_verify_grant_tail(
69 struct xlog *log);
70STATIC void
71xlog_verify_iclog(
72 struct xlog *log,
73 struct xlog_in_core *iclog,
74 int count);
75STATIC void
76xlog_verify_tail_lsn(
77 struct xlog *log,
78 struct xlog_in_core *iclog);
79#else
80#define xlog_verify_dest_ptr(a,b)
81#define xlog_verify_grant_tail(a)
82#define xlog_verify_iclog(a,b,c)
83#define xlog_verify_tail_lsn(a,b)
84#endif
85
86STATIC int
87xlog_iclogs_empty(
88 struct xlog *log);
89
90static int
91xfs_log_cover(struct xfs_mount *);
92
93static void
94xlog_grant_sub_space(
95 struct xlog *log,
96 atomic64_t *head,
97 int bytes)
98{
99 int64_t head_val = atomic64_read(head);
100 int64_t new, old;
101
102 do {
103 int cycle, space;
104
105 xlog_crack_grant_head_val(head_val, &cycle, &space);
106
107 space -= bytes;
108 if (space < 0) {
109 space += log->l_logsize;
110 cycle--;
111 }
112
113 old = head_val;
114 new = xlog_assign_grant_head_val(cycle, space);
115 head_val = atomic64_cmpxchg(head, old, new);
116 } while (head_val != old);
117}
118
119static void
120xlog_grant_add_space(
121 struct xlog *log,
122 atomic64_t *head,
123 int bytes)
124{
125 int64_t head_val = atomic64_read(head);
126 int64_t new, old;
127
128 do {
129 int tmp;
130 int cycle, space;
131
132 xlog_crack_grant_head_val(head_val, &cycle, &space);
133
134 tmp = log->l_logsize - space;
135 if (tmp > bytes)
136 space += bytes;
137 else {
138 space = bytes - tmp;
139 cycle++;
140 }
141
142 old = head_val;
143 new = xlog_assign_grant_head_val(cycle, space);
144 head_val = atomic64_cmpxchg(head, old, new);
145 } while (head_val != old);
146}
147
148STATIC void
149xlog_grant_head_init(
150 struct xlog_grant_head *head)
151{
152 xlog_assign_grant_head(&head->grant, 1, 0);
153 INIT_LIST_HEAD(&head->waiters);
154 spin_lock_init(&head->lock);
155}
156
157STATIC void
158xlog_grant_head_wake_all(
159 struct xlog_grant_head *head)
160{
161 struct xlog_ticket *tic;
162
163 spin_lock(&head->lock);
164 list_for_each_entry(tic, &head->waiters, t_queue)
165 wake_up_process(tic->t_task);
166 spin_unlock(&head->lock);
167}
168
169static inline int
170xlog_ticket_reservation(
171 struct xlog *log,
172 struct xlog_grant_head *head,
173 struct xlog_ticket *tic)
174{
175 if (head == &log->l_write_head) {
176 ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
177 return tic->t_unit_res;
178 } else {
179 if (tic->t_flags & XLOG_TIC_PERM_RESERV)
180 return tic->t_unit_res * tic->t_cnt;
181 else
182 return tic->t_unit_res;
183 }
184}
185
186STATIC bool
187xlog_grant_head_wake(
188 struct xlog *log,
189 struct xlog_grant_head *head,
190 int *free_bytes)
191{
192 struct xlog_ticket *tic;
193 int need_bytes;
194 bool woken_task = false;
195
196 list_for_each_entry(tic, &head->waiters, t_queue) {
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 need_bytes = xlog_ticket_reservation(log, head, tic);
220 if (*free_bytes < need_bytes) {
221 if (!woken_task)
222 xlog_grant_push_ail(log, need_bytes);
223 return false;
224 }
225
226 *free_bytes -= need_bytes;
227 trace_xfs_log_grant_wake_up(log, tic);
228 wake_up_process(tic->t_task);
229 woken_task = true;
230 }
231
232 return true;
233}
234
235STATIC int
236xlog_grant_head_wait(
237 struct xlog *log,
238 struct xlog_grant_head *head,
239 struct xlog_ticket *tic,
240 int need_bytes) __releases(&head->lock)
241 __acquires(&head->lock)
242{
243 list_add_tail(&tic->t_queue, &head->waiters);
244
245 do {
246 if (xlog_is_shutdown(log))
247 goto shutdown;
248 xlog_grant_push_ail(log, need_bytes);
249
250 __set_current_state(TASK_UNINTERRUPTIBLE);
251 spin_unlock(&head->lock);
252
253 XFS_STATS_INC(log->l_mp, xs_sleep_logspace);
254
255 trace_xfs_log_grant_sleep(log, tic);
256 schedule();
257 trace_xfs_log_grant_wake(log, tic);
258
259 spin_lock(&head->lock);
260 if (xlog_is_shutdown(log))
261 goto shutdown;
262 } while (xlog_space_left(log, &head->grant) < need_bytes);
263
264 list_del_init(&tic->t_queue);
265 return 0;
266shutdown:
267 list_del_init(&tic->t_queue);
268 return -EIO;
269}
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288STATIC int
289xlog_grant_head_check(
290 struct xlog *log,
291 struct xlog_grant_head *head,
292 struct xlog_ticket *tic,
293 int *need_bytes)
294{
295 int free_bytes;
296 int error = 0;
297
298 ASSERT(!xlog_in_recovery(log));
299
300
301
302
303
304
305
306 *need_bytes = xlog_ticket_reservation(log, head, tic);
307 free_bytes = xlog_space_left(log, &head->grant);
308 if (!list_empty_careful(&head->waiters)) {
309 spin_lock(&head->lock);
310 if (!xlog_grant_head_wake(log, head, &free_bytes) ||
311 free_bytes < *need_bytes) {
312 error = xlog_grant_head_wait(log, head, tic,
313 *need_bytes);
314 }
315 spin_unlock(&head->lock);
316 } else if (free_bytes < *need_bytes) {
317 spin_lock(&head->lock);
318 error = xlog_grant_head_wait(log, head, tic, *need_bytes);
319 spin_unlock(&head->lock);
320 }
321
322 return error;
323}
324
325static void
326xlog_tic_reset_res(xlog_ticket_t *tic)
327{
328 tic->t_res_num = 0;
329 tic->t_res_arr_sum = 0;
330 tic->t_res_num_ophdrs = 0;
331}
332
333static void
334xlog_tic_add_region(xlog_ticket_t *tic, uint len, uint type)
335{
336 if (tic->t_res_num == XLOG_TIC_LEN_MAX) {
337
338 tic->t_res_o_flow += tic->t_res_arr_sum;
339 tic->t_res_num = 0;
340 tic->t_res_arr_sum = 0;
341 }
342
343 tic->t_res_arr[tic->t_res_num].r_len = len;
344 tic->t_res_arr[tic->t_res_num].r_type = type;
345 tic->t_res_arr_sum += len;
346 tic->t_res_num++;
347}
348
349bool
350xfs_log_writable(
351 struct xfs_mount *mp)
352{
353
354
355
356
357
358
359 if (xfs_has_norecovery(mp))
360 return false;
361 if (xfs_readonly_buftarg(mp->m_ddev_targp))
362 return false;
363 if (xfs_readonly_buftarg(mp->m_log->l_targ))
364 return false;
365 if (xlog_is_shutdown(mp->m_log))
366 return false;
367 return true;
368}
369
370
371
372
373int
374xfs_log_regrant(
375 struct xfs_mount *mp,
376 struct xlog_ticket *tic)
377{
378 struct xlog *log = mp->m_log;
379 int need_bytes;
380 int error = 0;
381
382 if (xlog_is_shutdown(log))
383 return -EIO;
384
385 XFS_STATS_INC(mp, xs_try_logspace);
386
387
388
389
390
391
392
393 tic->t_tid++;
394
395 xlog_grant_push_ail(log, tic->t_unit_res);
396
397 tic->t_curr_res = tic->t_unit_res;
398 xlog_tic_reset_res(tic);
399
400 if (tic->t_cnt > 0)
401 return 0;
402
403 trace_xfs_log_regrant(log, tic);
404
405 error = xlog_grant_head_check(log, &log->l_write_head, tic,
406 &need_bytes);
407 if (error)
408 goto out_error;
409
410 xlog_grant_add_space(log, &log->l_write_head.grant, need_bytes);
411 trace_xfs_log_regrant_exit(log, tic);
412 xlog_verify_grant_tail(log);
413 return 0;
414
415out_error:
416
417
418
419
420
421 tic->t_curr_res = 0;
422 tic->t_cnt = 0;
423 return error;
424}
425
426
427
428
429
430
431
432
433
434int
435xfs_log_reserve(
436 struct xfs_mount *mp,
437 int unit_bytes,
438 int cnt,
439 struct xlog_ticket **ticp,
440 uint8_t client,
441 bool permanent)
442{
443 struct xlog *log = mp->m_log;
444 struct xlog_ticket *tic;
445 int need_bytes;
446 int error = 0;
447
448 ASSERT(client == XFS_TRANSACTION || client == XFS_LOG);
449
450 if (xlog_is_shutdown(log))
451 return -EIO;
452
453 XFS_STATS_INC(mp, xs_try_logspace);
454
455 ASSERT(*ticp == NULL);
456 tic = xlog_ticket_alloc(log, unit_bytes, cnt, client, permanent);
457 *ticp = tic;
458
459 xlog_grant_push_ail(log, tic->t_cnt ? tic->t_unit_res * tic->t_cnt
460 : tic->t_unit_res);
461
462 trace_xfs_log_reserve(log, tic);
463
464 error = xlog_grant_head_check(log, &log->l_reserve_head, tic,
465 &need_bytes);
466 if (error)
467 goto out_error;
468
469 xlog_grant_add_space(log, &log->l_reserve_head.grant, need_bytes);
470 xlog_grant_add_space(log, &log->l_write_head.grant, need_bytes);
471 trace_xfs_log_reserve_exit(log, tic);
472 xlog_verify_grant_tail(log);
473 return 0;
474
475out_error:
476
477
478
479
480
481 tic->t_curr_res = 0;
482 tic->t_cnt = 0;
483 return error;
484}
485
486
487
488
489
490
491
492
493
494
495
496
497static void
498xlog_state_shutdown_callbacks(
499 struct xlog *log)
500{
501 struct xlog_in_core *iclog;
502 LIST_HEAD(cb_list);
503
504 spin_lock(&log->l_icloglock);
505 iclog = log->l_iclog;
506 do {
507 if (atomic_read(&iclog->ic_refcnt)) {
508
509 continue;
510 }
511 list_splice_init(&iclog->ic_callbacks, &cb_list);
512 wake_up_all(&iclog->ic_write_wait);
513 wake_up_all(&iclog->ic_force_wait);
514 } while ((iclog = iclog->ic_next) != log->l_iclog);
515
516 wake_up_all(&log->l_flush_wait);
517 spin_unlock(&log->l_icloglock);
518
519 xlog_cil_process_committed(&cb_list);
520}
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549int
550xlog_state_release_iclog(
551 struct xlog *log,
552 struct xlog_in_core *iclog,
553 xfs_lsn_t old_tail_lsn)
554{
555 xfs_lsn_t tail_lsn;
556 bool last_ref;
557
558 lockdep_assert_held(&log->l_icloglock);
559
560 trace_xlog_iclog_release(iclog, _RET_IP_);
561
562
563
564
565
566
567 if (old_tail_lsn || iclog->ic_state == XLOG_STATE_WANT_SYNC) {
568 tail_lsn = xlog_assign_tail_lsn(log->l_mp);
569
570 if (old_tail_lsn && tail_lsn != old_tail_lsn)
571 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH;
572
573 if ((iclog->ic_flags & XLOG_ICL_NEED_FUA) &&
574 !iclog->ic_header.h_tail_lsn)
575 iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn);
576 }
577
578 last_ref = atomic_dec_and_test(&iclog->ic_refcnt);
579
580 if (xlog_is_shutdown(log)) {
581
582
583
584
585
586 if (last_ref) {
587 spin_unlock(&log->l_icloglock);
588 xlog_state_shutdown_callbacks(log);
589 spin_lock(&log->l_icloglock);
590 }
591 return -EIO;
592 }
593
594 if (!last_ref)
595 return 0;
596
597 if (iclog->ic_state != XLOG_STATE_WANT_SYNC) {
598 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
599 return 0;
600 }
601
602 iclog->ic_state = XLOG_STATE_SYNCING;
603 if (!iclog->ic_header.h_tail_lsn)
604 iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn);
605 xlog_verify_tail_lsn(log, iclog);
606 trace_xlog_iclog_syncing(iclog, _RET_IP_);
607
608 spin_unlock(&log->l_icloglock);
609 xlog_sync(log, iclog);
610 spin_lock(&log->l_icloglock);
611 return 0;
612}
613
614
615
616
617
618
619
620
621
622
623
624int
625xfs_log_mount(
626 xfs_mount_t *mp,
627 xfs_buftarg_t *log_target,
628 xfs_daddr_t blk_offset,
629 int num_bblks)
630{
631 struct xlog *log;
632 bool fatal = xfs_has_crc(mp);
633 int error = 0;
634 int min_logfsbs;
635
636 if (!xfs_has_norecovery(mp)) {
637 xfs_notice(mp, "Mounting V%d Filesystem",
638 XFS_SB_VERSION_NUM(&mp->m_sb));
639 } else {
640 xfs_notice(mp,
641"Mounting V%d filesystem in no-recovery mode. Filesystem will be inconsistent.",
642 XFS_SB_VERSION_NUM(&mp->m_sb));
643 ASSERT(xfs_is_readonly(mp));
644 }
645
646 log = xlog_alloc_log(mp, log_target, blk_offset, num_bblks);
647 if (IS_ERR(log)) {
648 error = PTR_ERR(log);
649 goto out;
650 }
651 mp->m_log = log;
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667 min_logfsbs = xfs_log_calc_minimum_size(mp);
668
669 if (mp->m_sb.sb_logblocks < min_logfsbs) {
670 xfs_warn(mp,
671 "Log size %d blocks too small, minimum size is %d blocks",
672 mp->m_sb.sb_logblocks, min_logfsbs);
673 error = -EINVAL;
674 } else if (mp->m_sb.sb_logblocks > XFS_MAX_LOG_BLOCKS) {
675 xfs_warn(mp,
676 "Log size %d blocks too large, maximum size is %lld blocks",
677 mp->m_sb.sb_logblocks, XFS_MAX_LOG_BLOCKS);
678 error = -EINVAL;
679 } else if (XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks) > XFS_MAX_LOG_BYTES) {
680 xfs_warn(mp,
681 "log size %lld bytes too large, maximum size is %lld bytes",
682 XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks),
683 XFS_MAX_LOG_BYTES);
684 error = -EINVAL;
685 } else if (mp->m_sb.sb_logsunit > 1 &&
686 mp->m_sb.sb_logsunit % mp->m_sb.sb_blocksize) {
687 xfs_warn(mp,
688 "log stripe unit %u bytes must be a multiple of block size",
689 mp->m_sb.sb_logsunit);
690 error = -EINVAL;
691 fatal = true;
692 }
693 if (error) {
694
695
696
697
698 if (fatal) {
699 xfs_crit(mp, "AAIEEE! Log failed size checks. Abort!");
700 ASSERT(0);
701 goto out_free_log;
702 }
703 xfs_crit(mp, "Log size out of supported range.");
704 xfs_crit(mp,
705"Continuing onwards, but if log hangs are experienced then please report this message in the bug report.");
706 }
707
708
709
710
711 error = xfs_trans_ail_init(mp);
712 if (error) {
713 xfs_warn(mp, "AIL initialisation failed: error %d", error);
714 goto out_free_log;
715 }
716 log->l_ailp = mp->m_ail;
717
718
719
720
721
722 if (!xfs_has_norecovery(mp)) {
723
724
725
726
727 bool readonly = test_and_clear_bit(XFS_OPSTATE_READONLY,
728 &mp->m_opstate);
729 error = xlog_recover(log);
730 if (readonly)
731 set_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
732 if (error) {
733 xfs_warn(mp, "log mount/recovery failed: error %d",
734 error);
735 xlog_recover_cancel(log);
736 goto out_destroy_ail;
737 }
738 }
739
740 error = xfs_sysfs_init(&log->l_kobj, &xfs_log_ktype, &mp->m_kobj,
741 "log");
742 if (error)
743 goto out_destroy_ail;
744
745
746 clear_bit(XLOG_ACTIVE_RECOVERY, &log->l_opstate);
747
748
749
750
751
752
753 xlog_cil_init_post_recovery(log);
754
755 return 0;
756
757out_destroy_ail:
758 xfs_trans_ail_destroy(mp);
759out_free_log:
760 xlog_dealloc_log(log);
761out:
762 return error;
763}
764
765
766
767
768
769
770
771
772
773
774
775int
776xfs_log_mount_finish(
777 struct xfs_mount *mp)
778{
779 struct xlog *log = mp->m_log;
780 bool readonly;
781 int error = 0;
782
783 if (xfs_has_norecovery(mp)) {
784 ASSERT(xfs_is_readonly(mp));
785 return 0;
786 }
787
788
789
790
791
792 readonly = test_and_clear_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814 mp->m_super->s_flags |= SB_ACTIVE;
815 if (xlog_recovery_needed(log))
816 error = xlog_recover_finish(log);
817 if (!error)
818 xfs_log_work_queue(mp);
819 mp->m_super->s_flags &= ~SB_ACTIVE;
820 evict_inodes(mp->m_super);
821
822
823
824
825
826
827
828
829
830
831 if (xlog_recovery_needed(log)) {
832 if (!error) {
833 xfs_log_force(mp, XFS_LOG_SYNC);
834 xfs_ail_push_all_sync(mp->m_ail);
835 }
836 xfs_notice(mp, "Ending recovery (logdev: %s)",
837 mp->m_logname ? mp->m_logname : "internal");
838 } else {
839 xfs_info(mp, "Ending clean mount");
840 }
841 xfs_buftarg_drain(mp->m_ddev_targp);
842
843 clear_bit(XLOG_RECOVERY_NEEDED, &log->l_opstate);
844 if (readonly)
845 set_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
846
847
848 ASSERT(!error || xlog_is_shutdown(log));
849
850 return error;
851}
852
853
854
855
856
857void
858xfs_log_mount_cancel(
859 struct xfs_mount *mp)
860{
861 xlog_recover_cancel(mp->m_log);
862 xfs_log_unmount(mp);
863}
864
865
866
867
868
869static inline int
870xlog_force_iclog(
871 struct xlog_in_core *iclog)
872{
873 atomic_inc(&iclog->ic_refcnt);
874 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
875 if (iclog->ic_state == XLOG_STATE_ACTIVE)
876 xlog_state_switch_iclogs(iclog->ic_log, iclog, 0);
877 return xlog_state_release_iclog(iclog->ic_log, iclog, 0);
878}
879
880
881
882
883
884
885
886int
887xlog_wait_on_iclog(
888 struct xlog_in_core *iclog)
889 __releases(iclog->ic_log->l_icloglock)
890{
891 struct xlog *log = iclog->ic_log;
892
893 trace_xlog_iclog_wait_on(iclog, _RET_IP_);
894 if (!xlog_is_shutdown(log) &&
895 iclog->ic_state != XLOG_STATE_ACTIVE &&
896 iclog->ic_state != XLOG_STATE_DIRTY) {
897 XFS_STATS_INC(log->l_mp, xs_log_force_sleep);
898 xlog_wait(&iclog->ic_force_wait, &log->l_icloglock);
899 } else {
900 spin_unlock(&log->l_icloglock);
901 }
902
903 if (xlog_is_shutdown(log))
904 return -EIO;
905 return 0;
906}
907
908
909
910
911
912
913static int
914xlog_write_unmount_record(
915 struct xlog *log,
916 struct xlog_ticket *ticket)
917{
918 struct xfs_unmount_log_format ulf = {
919 .magic = XLOG_UNMOUNT_TYPE,
920 };
921 struct xfs_log_iovec reg = {
922 .i_addr = &ulf,
923 .i_len = sizeof(ulf),
924 .i_type = XLOG_REG_TYPE_UNMOUNT,
925 };
926 struct xfs_log_vec vec = {
927 .lv_niovecs = 1,
928 .lv_iovecp = ®,
929 };
930
931
932 ticket->t_curr_res -= sizeof(ulf);
933
934 return xlog_write(log, NULL, &vec, ticket, XLOG_UNMOUNT_TRANS);
935}
936
937
938
939
940
941static void
942xlog_unmount_write(
943 struct xlog *log)
944{
945 struct xfs_mount *mp = log->l_mp;
946 struct xlog_in_core *iclog;
947 struct xlog_ticket *tic = NULL;
948 int error;
949
950 error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0);
951 if (error)
952 goto out_err;
953
954 error = xlog_write_unmount_record(log, tic);
955
956
957
958
959out_err:
960 if (error)
961 xfs_alert(mp, "%s: unmount record failed", __func__);
962
963 spin_lock(&log->l_icloglock);
964 iclog = log->l_iclog;
965 error = xlog_force_iclog(iclog);
966 xlog_wait_on_iclog(iclog);
967
968 if (tic) {
969 trace_xfs_log_umount_write(log, tic);
970 xfs_log_ticket_ungrant(log, tic);
971 }
972}
973
974static void
975xfs_log_unmount_verify_iclog(
976 struct xlog *log)
977{
978 struct xlog_in_core *iclog = log->l_iclog;
979
980 do {
981 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
982 ASSERT(iclog->ic_offset == 0);
983 } while ((iclog = iclog->ic_next) != log->l_iclog);
984}
985
986
987
988
989
990
991
992
993static void
994xfs_log_unmount_write(
995 struct xfs_mount *mp)
996{
997 struct xlog *log = mp->m_log;
998
999 if (!xfs_log_writable(mp))
1000 return;
1001
1002 xfs_log_force(mp, XFS_LOG_SYNC);
1003
1004 if (xlog_is_shutdown(log))
1005 return;
1006
1007
1008
1009
1010
1011
1012
1013 if (XFS_TEST_ERROR(xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS), mp,
1014 XFS_ERRTAG_FORCE_SUMMARY_RECALC)) {
1015 xfs_alert(mp, "%s: will fix summary counters at next mount",
1016 __func__);
1017 return;
1018 }
1019
1020 xfs_log_unmount_verify_iclog(log);
1021 xlog_unmount_write(log);
1022}
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032int
1033xfs_log_quiesce(
1034 struct xfs_mount *mp)
1035{
1036
1037
1038
1039
1040
1041 if (xfs_clear_incompat_log_features(mp)) {
1042 int error;
1043
1044 error = xfs_sync_sb(mp, false);
1045 if (error)
1046 xfs_warn(mp,
1047 "Failed to clear log incompat features on quiesce");
1048 }
1049
1050 cancel_delayed_work_sync(&mp->m_log->l_work);
1051 xfs_log_force(mp, XFS_LOG_SYNC);
1052
1053
1054
1055
1056
1057
1058
1059
1060 xfs_ail_push_all_sync(mp->m_ail);
1061 xfs_buftarg_wait(mp->m_ddev_targp);
1062 xfs_buf_lock(mp->m_sb_bp);
1063 xfs_buf_unlock(mp->m_sb_bp);
1064
1065 return xfs_log_cover(mp);
1066}
1067
1068void
1069xfs_log_clean(
1070 struct xfs_mount *mp)
1071{
1072 xfs_log_quiesce(mp);
1073 xfs_log_unmount_write(mp);
1074}
1075
1076
1077
1078
1079
1080
1081
1082
1083void
1084xfs_log_unmount(
1085 struct xfs_mount *mp)
1086{
1087 xfs_log_clean(mp);
1088
1089 xfs_buftarg_drain(mp->m_ddev_targp);
1090
1091 xfs_trans_ail_destroy(mp);
1092
1093 xfs_sysfs_del(&mp->m_log->l_kobj);
1094
1095 xlog_dealloc_log(mp->m_log);
1096}
1097
1098void
1099xfs_log_item_init(
1100 struct xfs_mount *mp,
1101 struct xfs_log_item *item,
1102 int type,
1103 const struct xfs_item_ops *ops)
1104{
1105 item->li_mountp = mp;
1106 item->li_ailp = mp->m_ail;
1107 item->li_type = type;
1108 item->li_ops = ops;
1109 item->li_lv = NULL;
1110
1111 INIT_LIST_HEAD(&item->li_ail);
1112 INIT_LIST_HEAD(&item->li_cil);
1113 INIT_LIST_HEAD(&item->li_bio_list);
1114 INIT_LIST_HEAD(&item->li_trans);
1115}
1116
1117
1118
1119
1120void
1121xfs_log_space_wake(
1122 struct xfs_mount *mp)
1123{
1124 struct xlog *log = mp->m_log;
1125 int free_bytes;
1126
1127 if (xlog_is_shutdown(log))
1128 return;
1129
1130 if (!list_empty_careful(&log->l_write_head.waiters)) {
1131 ASSERT(!xlog_in_recovery(log));
1132
1133 spin_lock(&log->l_write_head.lock);
1134 free_bytes = xlog_space_left(log, &log->l_write_head.grant);
1135 xlog_grant_head_wake(log, &log->l_write_head, &free_bytes);
1136 spin_unlock(&log->l_write_head.lock);
1137 }
1138
1139 if (!list_empty_careful(&log->l_reserve_head.waiters)) {
1140 ASSERT(!xlog_in_recovery(log));
1141
1142 spin_lock(&log->l_reserve_head.lock);
1143 free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
1144 xlog_grant_head_wake(log, &log->l_reserve_head, &free_bytes);
1145 spin_unlock(&log->l_reserve_head.lock);
1146 }
1147}
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166static bool
1167xfs_log_need_covered(
1168 struct xfs_mount *mp)
1169{
1170 struct xlog *log = mp->m_log;
1171 bool needed = false;
1172
1173 if (!xlog_cil_empty(log))
1174 return false;
1175
1176 spin_lock(&log->l_icloglock);
1177 switch (log->l_covered_state) {
1178 case XLOG_STATE_COVER_DONE:
1179 case XLOG_STATE_COVER_DONE2:
1180 case XLOG_STATE_COVER_IDLE:
1181 break;
1182 case XLOG_STATE_COVER_NEED:
1183 case XLOG_STATE_COVER_NEED2:
1184 if (xfs_ail_min_lsn(log->l_ailp))
1185 break;
1186 if (!xlog_iclogs_empty(log))
1187 break;
1188
1189 needed = true;
1190 if (log->l_covered_state == XLOG_STATE_COVER_NEED)
1191 log->l_covered_state = XLOG_STATE_COVER_DONE;
1192 else
1193 log->l_covered_state = XLOG_STATE_COVER_DONE2;
1194 break;
1195 default:
1196 needed = true;
1197 break;
1198 }
1199 spin_unlock(&log->l_icloglock);
1200 return needed;
1201}
1202
1203
1204
1205
1206
1207
1208
1209static int
1210xfs_log_cover(
1211 struct xfs_mount *mp)
1212{
1213 int error = 0;
1214 bool need_covered;
1215
1216 ASSERT((xlog_cil_empty(mp->m_log) && xlog_iclogs_empty(mp->m_log) &&
1217 !xfs_ail_min_lsn(mp->m_log->l_ailp)) ||
1218 xlog_is_shutdown(mp->m_log));
1219
1220 if (!xfs_log_writable(mp))
1221 return 0;
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234 need_covered = xfs_log_need_covered(mp);
1235 if (!need_covered && !xfs_has_lazysbcount(mp))
1236 return 0;
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247 do {
1248 error = xfs_sync_sb(mp, true);
1249 if (error)
1250 break;
1251 xfs_ail_push_all_sync(mp->m_ail);
1252 } while (xfs_log_need_covered(mp));
1253
1254 return error;
1255}
1256
1257
1258
1259
1260xfs_lsn_t
1261xlog_assign_tail_lsn_locked(
1262 struct xfs_mount *mp)
1263{
1264 struct xlog *log = mp->m_log;
1265 struct xfs_log_item *lip;
1266 xfs_lsn_t tail_lsn;
1267
1268 assert_spin_locked(&mp->m_ail->ail_lock);
1269
1270
1271
1272
1273
1274
1275 lip = xfs_ail_min(mp->m_ail);
1276 if (lip)
1277 tail_lsn = lip->li_lsn;
1278 else
1279 tail_lsn = atomic64_read(&log->l_last_sync_lsn);
1280 trace_xfs_log_assign_tail_lsn(log, tail_lsn);
1281 atomic64_set(&log->l_tail_lsn, tail_lsn);
1282 return tail_lsn;
1283}
1284
1285xfs_lsn_t
1286xlog_assign_tail_lsn(
1287 struct xfs_mount *mp)
1288{
1289 xfs_lsn_t tail_lsn;
1290
1291 spin_lock(&mp->m_ail->ail_lock);
1292 tail_lsn = xlog_assign_tail_lsn_locked(mp);
1293 spin_unlock(&mp->m_ail->ail_lock);
1294
1295 return tail_lsn;
1296}
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315STATIC int
1316xlog_space_left(
1317 struct xlog *log,
1318 atomic64_t *head)
1319{
1320 int tail_bytes;
1321 int tail_cycle;
1322 int head_cycle;
1323 int head_bytes;
1324
1325 xlog_crack_grant_head(head, &head_cycle, &head_bytes);
1326 xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_bytes);
1327 tail_bytes = BBTOB(tail_bytes);
1328 if (tail_cycle == head_cycle && head_bytes >= tail_bytes)
1329 return log->l_logsize - (head_bytes - tail_bytes);
1330 if (tail_cycle + 1 < head_cycle)
1331 return 0;
1332
1333
1334 if (xlog_is_shutdown(log))
1335 return log->l_logsize;
1336
1337 if (tail_cycle < head_cycle) {
1338 ASSERT(tail_cycle == (head_cycle - 1));
1339 return tail_bytes - head_bytes;
1340 }
1341
1342
1343
1344
1345
1346 xfs_alert(log->l_mp, "xlog_space_left: head behind tail");
1347 xfs_alert(log->l_mp, " tail_cycle = %d, tail_bytes = %d",
1348 tail_cycle, tail_bytes);
1349 xfs_alert(log->l_mp, " GH cycle = %d, GH bytes = %d",
1350 head_cycle, head_bytes);
1351 ASSERT(0);
1352 return log->l_logsize;
1353}
1354
1355
1356static void
1357xlog_ioend_work(
1358 struct work_struct *work)
1359{
1360 struct xlog_in_core *iclog =
1361 container_of(work, struct xlog_in_core, ic_end_io_work);
1362 struct xlog *log = iclog->ic_log;
1363 int error;
1364
1365 error = blk_status_to_errno(iclog->ic_bio.bi_status);
1366#ifdef DEBUG
1367
1368 if (iclog->ic_fail_crc)
1369 error = -EIO;
1370#endif
1371
1372
1373
1374
1375 if (XFS_TEST_ERROR(error, log->l_mp, XFS_ERRTAG_IODONE_IOERR)) {
1376 xfs_alert(log->l_mp, "log I/O error %d", error);
1377 xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR);
1378 }
1379
1380 xlog_state_done_syncing(iclog);
1381 bio_uninit(&iclog->ic_bio);
1382
1383
1384
1385
1386
1387
1388
1389 up(&iclog->ic_sema);
1390}
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400STATIC void
1401xlog_get_iclog_buffer_size(
1402 struct xfs_mount *mp,
1403 struct xlog *log)
1404{
1405 if (mp->m_logbufs <= 0)
1406 mp->m_logbufs = XLOG_MAX_ICLOGS;
1407 if (mp->m_logbsize <= 0)
1408 mp->m_logbsize = XLOG_BIG_RECORD_BSIZE;
1409
1410 log->l_iclog_bufs = mp->m_logbufs;
1411 log->l_iclog_size = mp->m_logbsize;
1412
1413
1414
1415
1416 log->l_iclog_heads =
1417 DIV_ROUND_UP(mp->m_logbsize, XLOG_HEADER_CYCLE_SIZE);
1418 log->l_iclog_hsize = log->l_iclog_heads << BBSHIFT;
1419}
1420
1421void
1422xfs_log_work_queue(
1423 struct xfs_mount *mp)
1424{
1425 queue_delayed_work(mp->m_sync_workqueue, &mp->m_log->l_work,
1426 msecs_to_jiffies(xfs_syncd_centisecs * 10));
1427}
1428
1429
1430
1431
1432
1433
1434
1435static inline void
1436xlog_clear_incompat(
1437 struct xlog *log)
1438{
1439 struct xfs_mount *mp = log->l_mp;
1440
1441 if (!xfs_sb_has_incompat_log_feature(&mp->m_sb,
1442 XFS_SB_FEAT_INCOMPAT_LOG_ALL))
1443 return;
1444
1445 if (log->l_covered_state != XLOG_STATE_COVER_DONE2)
1446 return;
1447
1448 if (!down_write_trylock(&log->l_incompat_users))
1449 return;
1450
1451 xfs_clear_incompat_log_features(mp);
1452 up_write(&log->l_incompat_users);
1453}
1454
1455
1456
1457
1458
1459
1460static void
1461xfs_log_worker(
1462 struct work_struct *work)
1463{
1464 struct xlog *log = container_of(to_delayed_work(work),
1465 struct xlog, l_work);
1466 struct xfs_mount *mp = log->l_mp;
1467
1468
1469 if (xfs_fs_writable(mp, SB_FREEZE_WRITE) && xfs_log_need_covered(mp)) {
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481 xlog_clear_incompat(log);
1482 xfs_sync_sb(mp, true);
1483 } else
1484 xfs_log_force(mp, 0);
1485
1486
1487 xfs_ail_push_all(mp->m_ail);
1488
1489
1490 xfs_log_work_queue(mp);
1491}
1492
1493
1494
1495
1496
1497
1498STATIC struct xlog *
1499xlog_alloc_log(
1500 struct xfs_mount *mp,
1501 struct xfs_buftarg *log_target,
1502 xfs_daddr_t blk_offset,
1503 int num_bblks)
1504{
1505 struct xlog *log;
1506 xlog_rec_header_t *head;
1507 xlog_in_core_t **iclogp;
1508 xlog_in_core_t *iclog, *prev_iclog=NULL;
1509 int i;
1510 int error = -ENOMEM;
1511 uint log2_size = 0;
1512
1513 log = kmem_zalloc(sizeof(struct xlog), KM_MAYFAIL);
1514 if (!log) {
1515 xfs_warn(mp, "Log allocation failed: No memory!");
1516 goto out;
1517 }
1518
1519 log->l_mp = mp;
1520 log->l_targ = log_target;
1521 log->l_logsize = BBTOB(num_bblks);
1522 log->l_logBBstart = blk_offset;
1523 log->l_logBBsize = num_bblks;
1524 log->l_covered_state = XLOG_STATE_COVER_IDLE;
1525 set_bit(XLOG_ACTIVE_RECOVERY, &log->l_opstate);
1526 INIT_DELAYED_WORK(&log->l_work, xfs_log_worker);
1527
1528 log->l_prev_block = -1;
1529
1530 xlog_assign_atomic_lsn(&log->l_tail_lsn, 1, 0);
1531 xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0);
1532 log->l_curr_cycle = 1;
1533
1534 if (xfs_has_logv2(mp) && mp->m_sb.sb_logsunit > 1)
1535 log->l_iclog_roundoff = mp->m_sb.sb_logsunit;
1536 else
1537 log->l_iclog_roundoff = BBSIZE;
1538
1539 xlog_grant_head_init(&log->l_reserve_head);
1540 xlog_grant_head_init(&log->l_write_head);
1541
1542 error = -EFSCORRUPTED;
1543 if (xfs_has_sector(mp)) {
1544 log2_size = mp->m_sb.sb_logsectlog;
1545 if (log2_size < BBSHIFT) {
1546 xfs_warn(mp, "Log sector size too small (0x%x < 0x%x)",
1547 log2_size, BBSHIFT);
1548 goto out_free_log;
1549 }
1550
1551 log2_size -= BBSHIFT;
1552 if (log2_size > mp->m_sectbb_log) {
1553 xfs_warn(mp, "Log sector size too large (0x%x > 0x%x)",
1554 log2_size, mp->m_sectbb_log);
1555 goto out_free_log;
1556 }
1557
1558
1559 if (log2_size && log->l_logBBstart > 0 &&
1560 !xfs_has_logv2(mp)) {
1561 xfs_warn(mp,
1562 "log sector size (0x%x) invalid for configuration.",
1563 log2_size);
1564 goto out_free_log;
1565 }
1566 }
1567 log->l_sectBBsize = 1 << log2_size;
1568
1569 init_rwsem(&log->l_incompat_users);
1570
1571 xlog_get_iclog_buffer_size(mp, log);
1572
1573 spin_lock_init(&log->l_icloglock);
1574 init_waitqueue_head(&log->l_flush_wait);
1575
1576 iclogp = &log->l_iclog;
1577
1578
1579
1580
1581
1582
1583
1584 ASSERT(log->l_iclog_size >= 4096);
1585 for (i = 0; i < log->l_iclog_bufs; i++) {
1586 size_t bvec_size = howmany(log->l_iclog_size, PAGE_SIZE) *
1587 sizeof(struct bio_vec);
1588
1589 iclog = kmem_zalloc(sizeof(*iclog) + bvec_size, KM_MAYFAIL);
1590 if (!iclog)
1591 goto out_free_iclog;
1592
1593 *iclogp = iclog;
1594 iclog->ic_prev = prev_iclog;
1595 prev_iclog = iclog;
1596
1597 iclog->ic_data = kvzalloc(log->l_iclog_size,
1598 GFP_KERNEL | __GFP_RETRY_MAYFAIL);
1599 if (!iclog->ic_data)
1600 goto out_free_iclog;
1601#ifdef DEBUG
1602 log->l_iclog_bak[i] = &iclog->ic_header;
1603#endif
1604 head = &iclog->ic_header;
1605 memset(head, 0, sizeof(xlog_rec_header_t));
1606 head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM);
1607 head->h_version = cpu_to_be32(
1608 xfs_has_logv2(log->l_mp) ? 2 : 1);
1609 head->h_size = cpu_to_be32(log->l_iclog_size);
1610
1611 head->h_fmt = cpu_to_be32(XLOG_FMT);
1612 memcpy(&head->h_fs_uuid, &mp->m_sb.sb_uuid, sizeof(uuid_t));
1613
1614 iclog->ic_size = log->l_iclog_size - log->l_iclog_hsize;
1615 iclog->ic_state = XLOG_STATE_ACTIVE;
1616 iclog->ic_log = log;
1617 atomic_set(&iclog->ic_refcnt, 0);
1618 INIT_LIST_HEAD(&iclog->ic_callbacks);
1619 iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize;
1620
1621 init_waitqueue_head(&iclog->ic_force_wait);
1622 init_waitqueue_head(&iclog->ic_write_wait);
1623 INIT_WORK(&iclog->ic_end_io_work, xlog_ioend_work);
1624 sema_init(&iclog->ic_sema, 1);
1625
1626 iclogp = &iclog->ic_next;
1627 }
1628 *iclogp = log->l_iclog;
1629 log->l_iclog->ic_prev = prev_iclog;
1630
1631 log->l_ioend_workqueue = alloc_workqueue("xfs-log/%s",
1632 XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM |
1633 WQ_HIGHPRI),
1634 0, mp->m_super->s_id);
1635 if (!log->l_ioend_workqueue)
1636 goto out_free_iclog;
1637
1638 error = xlog_cil_init(log);
1639 if (error)
1640 goto out_destroy_workqueue;
1641 return log;
1642
1643out_destroy_workqueue:
1644 destroy_workqueue(log->l_ioend_workqueue);
1645out_free_iclog:
1646 for (iclog = log->l_iclog; iclog; iclog = prev_iclog) {
1647 prev_iclog = iclog->ic_next;
1648 kmem_free(iclog->ic_data);
1649 kmem_free(iclog);
1650 if (prev_iclog == log->l_iclog)
1651 break;
1652 }
1653out_free_log:
1654 kmem_free(log);
1655out:
1656 return ERR_PTR(error);
1657}
1658
1659
1660
1661
1662
1663
1664
1665
1666xfs_lsn_t
1667xlog_grant_push_threshold(
1668 struct xlog *log,
1669 int need_bytes)
1670{
1671 xfs_lsn_t threshold_lsn = 0;
1672 xfs_lsn_t last_sync_lsn;
1673 int free_blocks;
1674 int free_bytes;
1675 int threshold_block;
1676 int threshold_cycle;
1677 int free_threshold;
1678
1679 ASSERT(BTOBB(need_bytes) < log->l_logBBsize);
1680
1681 free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
1682 free_blocks = BTOBBT(free_bytes);
1683
1684
1685
1686
1687
1688
1689 free_threshold = BTOBB(need_bytes);
1690 free_threshold = max(free_threshold, (log->l_logBBsize >> 2));
1691 free_threshold = max(free_threshold, 256);
1692 if (free_blocks >= free_threshold)
1693 return NULLCOMMITLSN;
1694
1695 xlog_crack_atomic_lsn(&log->l_tail_lsn, &threshold_cycle,
1696 &threshold_block);
1697 threshold_block += free_threshold;
1698 if (threshold_block >= log->l_logBBsize) {
1699 threshold_block -= log->l_logBBsize;
1700 threshold_cycle += 1;
1701 }
1702 threshold_lsn = xlog_assign_lsn(threshold_cycle,
1703 threshold_block);
1704
1705
1706
1707
1708
1709 last_sync_lsn = atomic64_read(&log->l_last_sync_lsn);
1710 if (XFS_LSN_CMP(threshold_lsn, last_sync_lsn) > 0)
1711 threshold_lsn = last_sync_lsn;
1712
1713 return threshold_lsn;
1714}
1715
1716
1717
1718
1719
1720
1721
1722
1723STATIC void
1724xlog_grant_push_ail(
1725 struct xlog *log,
1726 int need_bytes)
1727{
1728 xfs_lsn_t threshold_lsn;
1729
1730 threshold_lsn = xlog_grant_push_threshold(log, need_bytes);
1731 if (threshold_lsn == NULLCOMMITLSN || xlog_is_shutdown(log))
1732 return;
1733
1734
1735
1736
1737
1738
1739 xfs_ail_push(log->l_ailp, threshold_lsn);
1740}
1741
1742
1743
1744
1745STATIC void
1746xlog_pack_data(
1747 struct xlog *log,
1748 struct xlog_in_core *iclog,
1749 int roundoff)
1750{
1751 int i, j, k;
1752 int size = iclog->ic_offset + roundoff;
1753 __be32 cycle_lsn;
1754 char *dp;
1755
1756 cycle_lsn = CYCLE_LSN_DISK(iclog->ic_header.h_lsn);
1757
1758 dp = iclog->ic_datap;
1759 for (i = 0; i < BTOBB(size); i++) {
1760 if (i >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE))
1761 break;
1762 iclog->ic_header.h_cycle_data[i] = *(__be32 *)dp;
1763 *(__be32 *)dp = cycle_lsn;
1764 dp += BBSIZE;
1765 }
1766
1767 if (xfs_has_logv2(log->l_mp)) {
1768 xlog_in_core_2_t *xhdr = iclog->ic_data;
1769
1770 for ( ; i < BTOBB(size); i++) {
1771 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
1772 k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
1773 xhdr[j].hic_xheader.xh_cycle_data[k] = *(__be32 *)dp;
1774 *(__be32 *)dp = cycle_lsn;
1775 dp += BBSIZE;
1776 }
1777
1778 for (i = 1; i < log->l_iclog_heads; i++)
1779 xhdr[i].hic_xheader.xh_cycle = cycle_lsn;
1780 }
1781}
1782
1783
1784
1785
1786
1787
1788
1789__le32
1790xlog_cksum(
1791 struct xlog *log,
1792 struct xlog_rec_header *rhead,
1793 char *dp,
1794 int size)
1795{
1796 uint32_t crc;
1797
1798
1799 crc = xfs_start_cksum_update((char *)rhead,
1800 sizeof(struct xlog_rec_header),
1801 offsetof(struct xlog_rec_header, h_crc));
1802
1803
1804 if (xfs_has_logv2(log->l_mp)) {
1805 union xlog_in_core2 *xhdr = (union xlog_in_core2 *)rhead;
1806 int i;
1807 int xheads;
1808
1809 xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE);
1810
1811 for (i = 1; i < xheads; i++) {
1812 crc = crc32c(crc, &xhdr[i].hic_xheader,
1813 sizeof(struct xlog_rec_ext_header));
1814 }
1815 }
1816
1817
1818 crc = crc32c(crc, dp, size);
1819
1820 return xfs_end_cksum(crc);
1821}
1822
1823static void
1824xlog_bio_end_io(
1825 struct bio *bio)
1826{
1827 struct xlog_in_core *iclog = bio->bi_private;
1828
1829 queue_work(iclog->ic_log->l_ioend_workqueue,
1830 &iclog->ic_end_io_work);
1831}
1832
1833static int
1834xlog_map_iclog_data(
1835 struct bio *bio,
1836 void *data,
1837 size_t count)
1838{
1839 do {
1840 struct page *page = kmem_to_page(data);
1841 unsigned int off = offset_in_page(data);
1842 size_t len = min_t(size_t, count, PAGE_SIZE - off);
1843
1844 if (bio_add_page(bio, page, len, off) != len)
1845 return -EIO;
1846
1847 data += len;
1848 count -= len;
1849 } while (count);
1850
1851 return 0;
1852}
1853
1854STATIC void
1855xlog_write_iclog(
1856 struct xlog *log,
1857 struct xlog_in_core *iclog,
1858 uint64_t bno,
1859 unsigned int count)
1860{
1861 ASSERT(bno < log->l_logBBsize);
1862 trace_xlog_iclog_write(iclog, _RET_IP_);
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872 down(&iclog->ic_sema);
1873 if (xlog_is_shutdown(log)) {
1874
1875
1876
1877
1878
1879
1880
1881 xlog_state_done_syncing(iclog);
1882 up(&iclog->ic_sema);
1883 return;
1884 }
1885
1886 bio_init(&iclog->ic_bio, iclog->ic_bvec, howmany(count, PAGE_SIZE));
1887 bio_set_dev(&iclog->ic_bio, log->l_targ->bt_bdev);
1888 iclog->ic_bio.bi_iter.bi_sector = log->l_logBBstart + bno;
1889 iclog->ic_bio.bi_end_io = xlog_bio_end_io;
1890 iclog->ic_bio.bi_private = iclog;
1891
1892
1893
1894
1895
1896
1897
1898 iclog->ic_bio.bi_opf = REQ_OP_WRITE | REQ_META | REQ_SYNC | REQ_IDLE;
1899 if (iclog->ic_flags & XLOG_ICL_NEED_FLUSH) {
1900 iclog->ic_bio.bi_opf |= REQ_PREFLUSH;
1901
1902
1903
1904
1905
1906
1907 if (log->l_targ != log->l_mp->m_ddev_targp)
1908 blkdev_issue_flush(log->l_mp->m_ddev_targp->bt_bdev);
1909 }
1910 if (iclog->ic_flags & XLOG_ICL_NEED_FUA)
1911 iclog->ic_bio.bi_opf |= REQ_FUA;
1912
1913 iclog->ic_flags &= ~(XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA);
1914
1915 if (xlog_map_iclog_data(&iclog->ic_bio, iclog->ic_data, count)) {
1916 xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR);
1917 return;
1918 }
1919 if (is_vmalloc_addr(iclog->ic_data))
1920 flush_kernel_vmap_range(iclog->ic_data, count);
1921
1922
1923
1924
1925
1926 if (bno + BTOBB(count) > log->l_logBBsize) {
1927 struct bio *split;
1928
1929 split = bio_split(&iclog->ic_bio, log->l_logBBsize - bno,
1930 GFP_NOIO, &fs_bio_set);
1931 bio_chain(split, &iclog->ic_bio);
1932 submit_bio(split);
1933
1934
1935 iclog->ic_bio.bi_iter.bi_sector = log->l_logBBstart;
1936 }
1937
1938 submit_bio(&iclog->ic_bio);
1939}
1940
1941
1942
1943
1944
1945
1946static void
1947xlog_split_iclog(
1948 struct xlog *log,
1949 void *data,
1950 uint64_t bno,
1951 unsigned int count)
1952{
1953 unsigned int split_offset = BBTOB(log->l_logBBsize - bno);
1954 unsigned int i;
1955
1956 for (i = split_offset; i < count; i += BBSIZE) {
1957 uint32_t cycle = get_unaligned_be32(data + i);
1958
1959 if (++cycle == XLOG_HEADER_MAGIC_NUM)
1960 cycle++;
1961 put_unaligned_be32(cycle, data + i);
1962 }
1963}
1964
1965static int
1966xlog_calc_iclog_size(
1967 struct xlog *log,
1968 struct xlog_in_core *iclog,
1969 uint32_t *roundoff)
1970{
1971 uint32_t count_init, count;
1972
1973
1974 count_init = log->l_iclog_hsize + iclog->ic_offset;
1975 count = roundup(count_init, log->l_iclog_roundoff);
1976
1977 *roundoff = count - count_init;
1978
1979 ASSERT(count >= count_init);
1980 ASSERT(*roundoff < log->l_iclog_roundoff);
1981 return count;
1982}
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007STATIC void
2008xlog_sync(
2009 struct xlog *log,
2010 struct xlog_in_core *iclog)
2011{
2012 unsigned int count;
2013 unsigned int roundoff;
2014 uint64_t bno;
2015 unsigned int size;
2016
2017 ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
2018 trace_xlog_iclog_sync(iclog, _RET_IP_);
2019
2020 count = xlog_calc_iclog_size(log, iclog, &roundoff);
2021
2022
2023 xlog_grant_add_space(log, &log->l_reserve_head.grant, roundoff);
2024 xlog_grant_add_space(log, &log->l_write_head.grant, roundoff);
2025
2026
2027 xlog_pack_data(log, iclog, roundoff);
2028
2029
2030 size = iclog->ic_offset;
2031 if (xfs_has_logv2(log->l_mp))
2032 size += roundoff;
2033 iclog->ic_header.h_len = cpu_to_be32(size);
2034
2035 XFS_STATS_INC(log->l_mp, xs_log_writes);
2036 XFS_STATS_ADD(log->l_mp, xs_log_blocks, BTOBB(count));
2037
2038 bno = BLOCK_LSN(be64_to_cpu(iclog->ic_header.h_lsn));
2039
2040
2041 if (bno + BTOBB(count) > log->l_logBBsize)
2042 xlog_split_iclog(log, &iclog->ic_header, bno, count);
2043
2044
2045 iclog->ic_header.h_crc = xlog_cksum(log, &iclog->ic_header,
2046 iclog->ic_datap, size);
2047
2048
2049
2050
2051
2052
2053
2054#ifdef DEBUG
2055 if (XFS_TEST_ERROR(false, log->l_mp, XFS_ERRTAG_LOG_BAD_CRC)) {
2056 iclog->ic_header.h_crc &= cpu_to_le32(0xAAAAAAAA);
2057 iclog->ic_fail_crc = true;
2058 xfs_warn(log->l_mp,
2059 "Intentionally corrupted log record at LSN 0x%llx. Shutdown imminent.",
2060 be64_to_cpu(iclog->ic_header.h_lsn));
2061 }
2062#endif
2063 xlog_verify_iclog(log, iclog, count);
2064 xlog_write_iclog(log, iclog, bno, count);
2065}
2066
2067
2068
2069
2070STATIC void
2071xlog_dealloc_log(
2072 struct xlog *log)
2073{
2074 xlog_in_core_t *iclog, *next_iclog;
2075 int i;
2076
2077 xlog_cil_destroy(log);
2078
2079
2080
2081
2082
2083 iclog = log->l_iclog;
2084 for (i = 0; i < log->l_iclog_bufs; i++) {
2085 down(&iclog->ic_sema);
2086 up(&iclog->ic_sema);
2087 iclog = iclog->ic_next;
2088 }
2089
2090 iclog = log->l_iclog;
2091 for (i = 0; i < log->l_iclog_bufs; i++) {
2092 next_iclog = iclog->ic_next;
2093 kmem_free(iclog->ic_data);
2094 kmem_free(iclog);
2095 iclog = next_iclog;
2096 }
2097
2098 log->l_mp->m_log = NULL;
2099 destroy_workqueue(log->l_ioend_workqueue);
2100 kmem_free(log);
2101}
2102
2103
2104
2105
2106static inline void
2107xlog_state_finish_copy(
2108 struct xlog *log,
2109 struct xlog_in_core *iclog,
2110 int record_cnt,
2111 int copy_bytes)
2112{
2113 lockdep_assert_held(&log->l_icloglock);
2114
2115 be32_add_cpu(&iclog->ic_header.h_num_logops, record_cnt);
2116 iclog->ic_offset += copy_bytes;
2117}
2118
2119
2120
2121
2122
2123void
2124xlog_print_tic_res(
2125 struct xfs_mount *mp,
2126 struct xlog_ticket *ticket)
2127{
2128 uint i;
2129 uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
2130
2131
2132#define REG_TYPE_STR(type, str) [XLOG_REG_TYPE_##type] = str
2133 static char *res_type_str[] = {
2134 REG_TYPE_STR(BFORMAT, "bformat"),
2135 REG_TYPE_STR(BCHUNK, "bchunk"),
2136 REG_TYPE_STR(EFI_FORMAT, "efi_format"),
2137 REG_TYPE_STR(EFD_FORMAT, "efd_format"),
2138 REG_TYPE_STR(IFORMAT, "iformat"),
2139 REG_TYPE_STR(ICORE, "icore"),
2140 REG_TYPE_STR(IEXT, "iext"),
2141 REG_TYPE_STR(IBROOT, "ibroot"),
2142 REG_TYPE_STR(ILOCAL, "ilocal"),
2143 REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
2144 REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
2145 REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
2146 REG_TYPE_STR(QFORMAT, "qformat"),
2147 REG_TYPE_STR(DQUOT, "dquot"),
2148 REG_TYPE_STR(QUOTAOFF, "quotaoff"),
2149 REG_TYPE_STR(LRHEADER, "LR header"),
2150 REG_TYPE_STR(UNMOUNT, "unmount"),
2151 REG_TYPE_STR(COMMIT, "commit"),
2152 REG_TYPE_STR(TRANSHDR, "trans header"),
2153 REG_TYPE_STR(ICREATE, "inode create"),
2154 REG_TYPE_STR(RUI_FORMAT, "rui_format"),
2155 REG_TYPE_STR(RUD_FORMAT, "rud_format"),
2156 REG_TYPE_STR(CUI_FORMAT, "cui_format"),
2157 REG_TYPE_STR(CUD_FORMAT, "cud_format"),
2158 REG_TYPE_STR(BUI_FORMAT, "bui_format"),
2159 REG_TYPE_STR(BUD_FORMAT, "bud_format"),
2160 };
2161 BUILD_BUG_ON(ARRAY_SIZE(res_type_str) != XLOG_REG_TYPE_MAX + 1);
2162#undef REG_TYPE_STR
2163
2164 xfs_warn(mp, "ticket reservation summary:");
2165 xfs_warn(mp, " unit res = %d bytes",
2166 ticket->t_unit_res);
2167 xfs_warn(mp, " current res = %d bytes",
2168 ticket->t_curr_res);
2169 xfs_warn(mp, " total reg = %u bytes (o/flow = %u bytes)",
2170 ticket->t_res_arr_sum, ticket->t_res_o_flow);
2171 xfs_warn(mp, " ophdrs = %u (ophdr space = %u bytes)",
2172 ticket->t_res_num_ophdrs, ophdr_spc);
2173 xfs_warn(mp, " ophdr + reg = %u bytes",
2174 ticket->t_res_arr_sum + ticket->t_res_o_flow + ophdr_spc);
2175 xfs_warn(mp, " num regions = %u",
2176 ticket->t_res_num);
2177
2178 for (i = 0; i < ticket->t_res_num; i++) {
2179 uint r_type = ticket->t_res_arr[i].r_type;
2180 xfs_warn(mp, "region[%u]: %s - %u bytes", i,
2181 ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
2182 "bad-rtype" : res_type_str[r_type]),
2183 ticket->t_res_arr[i].r_len);
2184 }
2185}
2186
2187
2188
2189
2190void
2191xlog_print_trans(
2192 struct xfs_trans *tp)
2193{
2194 struct xfs_mount *mp = tp->t_mountp;
2195 struct xfs_log_item *lip;
2196
2197
2198 xfs_warn(mp, "transaction summary:");
2199 xfs_warn(mp, " log res = %d", tp->t_log_res);
2200 xfs_warn(mp, " log count = %d", tp->t_log_count);
2201 xfs_warn(mp, " flags = 0x%x", tp->t_flags);
2202
2203 xlog_print_tic_res(mp, tp->t_ticket);
2204
2205
2206 list_for_each_entry(lip, &tp->t_items, li_trans) {
2207 struct xfs_log_vec *lv = lip->li_lv;
2208 struct xfs_log_iovec *vec;
2209 int i;
2210
2211 xfs_warn(mp, "log item: ");
2212 xfs_warn(mp, " type = 0x%x", lip->li_type);
2213 xfs_warn(mp, " flags = 0x%lx", lip->li_flags);
2214 if (!lv)
2215 continue;
2216 xfs_warn(mp, " niovecs = %d", lv->lv_niovecs);
2217 xfs_warn(mp, " size = %d", lv->lv_size);
2218 xfs_warn(mp, " bytes = %d", lv->lv_bytes);
2219 xfs_warn(mp, " buf len = %d", lv->lv_buf_len);
2220
2221
2222 vec = lv->lv_iovecp;
2223 for (i = 0; i < lv->lv_niovecs; i++) {
2224 int dumplen = min(vec->i_len, 32);
2225
2226 xfs_warn(mp, " iovec[%d]", i);
2227 xfs_warn(mp, " type = 0x%x", vec->i_type);
2228 xfs_warn(mp, " len = %d", vec->i_len);
2229 xfs_warn(mp, " first %d bytes of iovec[%d]:", dumplen, i);
2230 xfs_hex_dump(vec->i_addr, dumplen);
2231
2232 vec++;
2233 }
2234 }
2235}
2236
2237
2238
2239
2240
2241
2242static int
2243xlog_write_calc_vec_length(
2244 struct xlog_ticket *ticket,
2245 struct xfs_log_vec *log_vector,
2246 uint optype)
2247{
2248 struct xfs_log_vec *lv;
2249 int headers = 0;
2250 int len = 0;
2251 int i;
2252
2253 if (optype & XLOG_START_TRANS)
2254 headers++;
2255
2256 for (lv = log_vector; lv; lv = lv->lv_next) {
2257
2258 if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED)
2259 continue;
2260
2261 headers += lv->lv_niovecs;
2262
2263 for (i = 0; i < lv->lv_niovecs; i++) {
2264 struct xfs_log_iovec *vecp = &lv->lv_iovecp[i];
2265
2266 len += vecp->i_len;
2267 xlog_tic_add_region(ticket, vecp->i_len, vecp->i_type);
2268 }
2269 }
2270
2271 ticket->t_res_num_ophdrs += headers;
2272 len += headers * sizeof(struct xlog_op_header);
2273
2274 return len;
2275}
2276
2277static void
2278xlog_write_start_rec(
2279 struct xlog_op_header *ophdr,
2280 struct xlog_ticket *ticket)
2281{
2282 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2283 ophdr->oh_clientid = ticket->t_clientid;
2284 ophdr->oh_len = 0;
2285 ophdr->oh_flags = XLOG_START_TRANS;
2286 ophdr->oh_res2 = 0;
2287}
2288
2289static xlog_op_header_t *
2290xlog_write_setup_ophdr(
2291 struct xlog *log,
2292 struct xlog_op_header *ophdr,
2293 struct xlog_ticket *ticket,
2294 uint flags)
2295{
2296 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2297 ophdr->oh_clientid = ticket->t_clientid;
2298 ophdr->oh_res2 = 0;
2299
2300
2301 ophdr->oh_flags = flags;
2302
2303
2304
2305
2306
2307
2308 switch (ophdr->oh_clientid) {
2309 case XFS_TRANSACTION:
2310 case XFS_VOLUME:
2311 case XFS_LOG:
2312 break;
2313 default:
2314 xfs_warn(log->l_mp,
2315 "Bad XFS transaction clientid 0x%x in ticket "PTR_FMT,
2316 ophdr->oh_clientid, ticket);
2317 return NULL;
2318 }
2319
2320 return ophdr;
2321}
2322
2323
2324
2325
2326
2327
2328
2329static int
2330xlog_write_setup_copy(
2331 struct xlog_ticket *ticket,
2332 struct xlog_op_header *ophdr,
2333 int space_available,
2334 int space_required,
2335 int *copy_off,
2336 int *copy_len,
2337 int *last_was_partial_copy,
2338 int *bytes_consumed)
2339{
2340 int still_to_copy;
2341
2342 still_to_copy = space_required - *bytes_consumed;
2343 *copy_off = *bytes_consumed;
2344
2345 if (still_to_copy <= space_available) {
2346
2347 *copy_len = still_to_copy;
2348 ophdr->oh_len = cpu_to_be32(*copy_len);
2349 if (*last_was_partial_copy)
2350 ophdr->oh_flags |= (XLOG_END_TRANS|XLOG_WAS_CONT_TRANS);
2351 *last_was_partial_copy = 0;
2352 *bytes_consumed = 0;
2353 return 0;
2354 }
2355
2356
2357 *copy_len = space_available;
2358 ophdr->oh_len = cpu_to_be32(*copy_len);
2359 ophdr->oh_flags |= XLOG_CONTINUE_TRANS;
2360 if (*last_was_partial_copy)
2361 ophdr->oh_flags |= XLOG_WAS_CONT_TRANS;
2362 *bytes_consumed += *copy_len;
2363 (*last_was_partial_copy)++;
2364
2365
2366 ticket->t_curr_res -= sizeof(struct xlog_op_header);
2367 ticket->t_res_num_ophdrs++;
2368
2369 return sizeof(struct xlog_op_header);
2370}
2371
2372static int
2373xlog_write_copy_finish(
2374 struct xlog *log,
2375 struct xlog_in_core *iclog,
2376 uint flags,
2377 int *record_cnt,
2378 int *data_cnt,
2379 int *partial_copy,
2380 int *partial_copy_len,
2381 int log_offset)
2382{
2383 int error;
2384
2385 if (*partial_copy) {
2386
2387
2388
2389
2390 spin_lock(&log->l_icloglock);
2391 xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
2392 *record_cnt = 0;
2393 *data_cnt = 0;
2394 goto release_iclog;
2395 }
2396
2397 *partial_copy = 0;
2398 *partial_copy_len = 0;
2399
2400 if (iclog->ic_size - log_offset > sizeof(xlog_op_header_t))
2401 return 0;
2402
2403
2404 spin_lock(&log->l_icloglock);
2405 xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
2406 *record_cnt = 0;
2407 *data_cnt = 0;
2408
2409 if (iclog->ic_state == XLOG_STATE_ACTIVE)
2410 xlog_state_switch_iclogs(log, iclog, 0);
2411 else
2412 ASSERT(iclog->ic_state == XLOG_STATE_WANT_SYNC ||
2413 xlog_is_shutdown(log));
2414release_iclog:
2415 error = xlog_state_release_iclog(log, iclog, 0);
2416 spin_unlock(&log->l_icloglock);
2417 return error;
2418}
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460int
2461xlog_write(
2462 struct xlog *log,
2463 struct xfs_cil_ctx *ctx,
2464 struct xfs_log_vec *log_vector,
2465 struct xlog_ticket *ticket,
2466 uint optype)
2467{
2468 struct xlog_in_core *iclog = NULL;
2469 struct xfs_log_vec *lv = log_vector;
2470 struct xfs_log_iovec *vecp = lv->lv_iovecp;
2471 int index = 0;
2472 int len;
2473 int partial_copy = 0;
2474 int partial_copy_len = 0;
2475 int contwr = 0;
2476 int record_cnt = 0;
2477 int data_cnt = 0;
2478 int error = 0;
2479
2480
2481
2482
2483
2484
2485
2486 ticket->t_curr_res -= sizeof(struct xlog_op_header);
2487 if (ticket->t_curr_res < 0) {
2488 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
2489 "ctx ticket reservation ran out. Need to up reservation");
2490 xlog_print_tic_res(log->l_mp, ticket);
2491 xfs_force_shutdown(log->l_mp, SHUTDOWN_LOG_IO_ERROR);
2492 }
2493
2494 len = xlog_write_calc_vec_length(ticket, log_vector, optype);
2495 while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
2496 void *ptr;
2497 int log_offset;
2498
2499 error = xlog_state_get_iclog_space(log, len, &iclog, ticket,
2500 &contwr, &log_offset);
2501 if (error)
2502 return error;
2503
2504 ASSERT(log_offset <= iclog->ic_size - 1);
2505 ptr = iclog->ic_datap + log_offset;
2506
2507
2508
2509
2510
2511
2512 if (ctx) {
2513 xlog_cil_set_ctx_write_state(ctx, iclog);
2514 ctx = NULL;
2515 }
2516
2517
2518
2519
2520
2521 while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
2522 struct xfs_log_iovec *reg;
2523 struct xlog_op_header *ophdr;
2524 int copy_len;
2525 int copy_off;
2526 bool ordered = false;
2527 bool wrote_start_rec = false;
2528
2529
2530 if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED) {
2531 ASSERT(lv->lv_niovecs == 0);
2532 ordered = true;
2533 goto next_lv;
2534 }
2535
2536 reg = &vecp[index];
2537 ASSERT(reg->i_len % sizeof(int32_t) == 0);
2538 ASSERT((unsigned long)ptr % sizeof(int32_t) == 0);
2539
2540
2541
2542
2543
2544
2545 if (optype & XLOG_START_TRANS) {
2546 xlog_write_start_rec(ptr, ticket);
2547 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2548 sizeof(struct xlog_op_header));
2549 optype &= ~XLOG_START_TRANS;
2550 wrote_start_rec = true;
2551 }
2552
2553 ophdr = xlog_write_setup_ophdr(log, ptr, ticket, optype);
2554 if (!ophdr)
2555 return -EIO;
2556
2557 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2558 sizeof(struct xlog_op_header));
2559
2560 len += xlog_write_setup_copy(ticket, ophdr,
2561 iclog->ic_size-log_offset,
2562 reg->i_len,
2563 ©_off, ©_len,
2564 &partial_copy,
2565 &partial_copy_len);
2566 xlog_verify_dest_ptr(log, ptr);
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576 ASSERT(copy_len >= 0);
2577 if (copy_len > 0) {
2578 memcpy(ptr, reg->i_addr + copy_off, copy_len);
2579 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2580 copy_len);
2581 }
2582 copy_len += sizeof(struct xlog_op_header);
2583 record_cnt++;
2584 if (wrote_start_rec) {
2585 copy_len += sizeof(struct xlog_op_header);
2586 record_cnt++;
2587 }
2588 data_cnt += contwr ? copy_len : 0;
2589
2590 error = xlog_write_copy_finish(log, iclog, optype,
2591 &record_cnt, &data_cnt,
2592 &partial_copy,
2593 &partial_copy_len,
2594 log_offset);
2595 if (error)
2596 return error;
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610 if (partial_copy)
2611 break;
2612
2613 if (++index == lv->lv_niovecs) {
2614next_lv:
2615 lv = lv->lv_next;
2616 index = 0;
2617 if (lv)
2618 vecp = lv->lv_iovecp;
2619 }
2620 if (record_cnt == 0 && !ordered) {
2621 if (!lv)
2622 return 0;
2623 break;
2624 }
2625 }
2626 }
2627
2628 ASSERT(len == 0);
2629
2630 spin_lock(&log->l_icloglock);
2631 xlog_state_finish_copy(log, iclog, record_cnt, data_cnt);
2632 error = xlog_state_release_iclog(log, iclog, 0);
2633 spin_unlock(&log->l_icloglock);
2634
2635 return error;
2636}
2637
2638static void
2639xlog_state_activate_iclog(
2640 struct xlog_in_core *iclog,
2641 int *iclogs_changed)
2642{
2643 ASSERT(list_empty_careful(&iclog->ic_callbacks));
2644 trace_xlog_iclog_activate(iclog, _RET_IP_);
2645
2646
2647
2648
2649
2650
2651
2652 if (*iclogs_changed == 0 &&
2653 iclog->ic_header.h_num_logops == cpu_to_be32(XLOG_COVER_OPS)) {
2654 *iclogs_changed = 1;
2655 } else {
2656
2657
2658
2659
2660 *iclogs_changed = 2;
2661 }
2662
2663 iclog->ic_state = XLOG_STATE_ACTIVE;
2664 iclog->ic_offset = 0;
2665 iclog->ic_header.h_num_logops = 0;
2666 memset(iclog->ic_header.h_cycle_data, 0,
2667 sizeof(iclog->ic_header.h_cycle_data));
2668 iclog->ic_header.h_lsn = 0;
2669 iclog->ic_header.h_tail_lsn = 0;
2670}
2671
2672
2673
2674
2675
2676static void
2677xlog_state_activate_iclogs(
2678 struct xlog *log,
2679 int *iclogs_changed)
2680{
2681 struct xlog_in_core *iclog = log->l_iclog;
2682
2683 do {
2684 if (iclog->ic_state == XLOG_STATE_DIRTY)
2685 xlog_state_activate_iclog(iclog, iclogs_changed);
2686
2687
2688
2689
2690 else if (iclog->ic_state != XLOG_STATE_ACTIVE)
2691 break;
2692 } while ((iclog = iclog->ic_next) != log->l_iclog);
2693}
2694
2695static int
2696xlog_covered_state(
2697 int prev_state,
2698 int iclogs_changed)
2699{
2700
2701
2702
2703
2704
2705
2706 switch (prev_state) {
2707 case XLOG_STATE_COVER_IDLE:
2708 if (iclogs_changed == 1)
2709 return XLOG_STATE_COVER_IDLE;
2710 fallthrough;
2711 case XLOG_STATE_COVER_NEED:
2712 case XLOG_STATE_COVER_NEED2:
2713 break;
2714 case XLOG_STATE_COVER_DONE:
2715 if (iclogs_changed == 1)
2716 return XLOG_STATE_COVER_NEED2;
2717 break;
2718 case XLOG_STATE_COVER_DONE2:
2719 if (iclogs_changed == 1)
2720 return XLOG_STATE_COVER_IDLE;
2721 break;
2722 default:
2723 ASSERT(0);
2724 }
2725
2726 return XLOG_STATE_COVER_NEED;
2727}
2728
2729STATIC void
2730xlog_state_clean_iclog(
2731 struct xlog *log,
2732 struct xlog_in_core *dirty_iclog)
2733{
2734 int iclogs_changed = 0;
2735
2736 trace_xlog_iclog_clean(dirty_iclog, _RET_IP_);
2737
2738 dirty_iclog->ic_state = XLOG_STATE_DIRTY;
2739
2740 xlog_state_activate_iclogs(log, &iclogs_changed);
2741 wake_up_all(&dirty_iclog->ic_force_wait);
2742
2743 if (iclogs_changed) {
2744 log->l_covered_state = xlog_covered_state(log->l_covered_state,
2745 iclogs_changed);
2746 }
2747}
2748
2749STATIC xfs_lsn_t
2750xlog_get_lowest_lsn(
2751 struct xlog *log)
2752{
2753 struct xlog_in_core *iclog = log->l_iclog;
2754 xfs_lsn_t lowest_lsn = 0, lsn;
2755
2756 do {
2757 if (iclog->ic_state == XLOG_STATE_ACTIVE ||
2758 iclog->ic_state == XLOG_STATE_DIRTY)
2759 continue;
2760
2761 lsn = be64_to_cpu(iclog->ic_header.h_lsn);
2762 if ((lsn && !lowest_lsn) || XFS_LSN_CMP(lsn, lowest_lsn) < 0)
2763 lowest_lsn = lsn;
2764 } while ((iclog = iclog->ic_next) != log->l_iclog);
2765
2766 return lowest_lsn;
2767}
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791static void
2792xlog_state_set_callback(
2793 struct xlog *log,
2794 struct xlog_in_core *iclog,
2795 xfs_lsn_t header_lsn)
2796{
2797 trace_xlog_iclog_callback(iclog, _RET_IP_);
2798 iclog->ic_state = XLOG_STATE_CALLBACK;
2799
2800 ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn),
2801 header_lsn) <= 0);
2802
2803 if (list_empty_careful(&iclog->ic_callbacks))
2804 return;
2805
2806 atomic64_set(&log->l_last_sync_lsn, header_lsn);
2807 xlog_grant_push_ail(log, 0);
2808}
2809
2810
2811
2812
2813
2814
2815static bool
2816xlog_state_iodone_process_iclog(
2817 struct xlog *log,
2818 struct xlog_in_core *iclog)
2819{
2820 xfs_lsn_t lowest_lsn;
2821 xfs_lsn_t header_lsn;
2822
2823 switch (iclog->ic_state) {
2824 case XLOG_STATE_ACTIVE:
2825 case XLOG_STATE_DIRTY:
2826
2827
2828
2829 return false;
2830 case XLOG_STATE_DONE_SYNC:
2831
2832
2833
2834
2835
2836
2837 header_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
2838 lowest_lsn = xlog_get_lowest_lsn(log);
2839 if (lowest_lsn && XFS_LSN_CMP(lowest_lsn, header_lsn) < 0)
2840 return false;
2841 xlog_state_set_callback(log, iclog, header_lsn);
2842 return false;
2843 default:
2844
2845
2846
2847
2848
2849 return true;
2850 }
2851}
2852
2853
2854
2855
2856
2857
2858
2859
2860static bool
2861xlog_state_do_iclog_callbacks(
2862 struct xlog *log)
2863 __releases(&log->l_icloglock)
2864 __acquires(&log->l_icloglock)
2865{
2866 struct xlog_in_core *first_iclog = log->l_iclog;
2867 struct xlog_in_core *iclog = first_iclog;
2868 bool ran_callback = false;
2869
2870 do {
2871 LIST_HEAD(cb_list);
2872
2873 if (xlog_state_iodone_process_iclog(log, iclog))
2874 break;
2875 if (iclog->ic_state != XLOG_STATE_CALLBACK) {
2876 iclog = iclog->ic_next;
2877 continue;
2878 }
2879 list_splice_init(&iclog->ic_callbacks, &cb_list);
2880 spin_unlock(&log->l_icloglock);
2881
2882 trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
2883 xlog_cil_process_committed(&cb_list);
2884 trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
2885 ran_callback = true;
2886
2887 spin_lock(&log->l_icloglock);
2888 xlog_state_clean_iclog(log, iclog);
2889 iclog = iclog->ic_next;
2890 } while (iclog != first_iclog);
2891
2892 return ran_callback;
2893}
2894
2895
2896
2897
2898
2899
2900STATIC void
2901xlog_state_do_callback(
2902 struct xlog *log)
2903{
2904 int flushcnt = 0;
2905 int repeats = 0;
2906
2907 spin_lock(&log->l_icloglock);
2908 while (xlog_state_do_iclog_callbacks(log)) {
2909 if (xlog_is_shutdown(log))
2910 break;
2911
2912 if (++repeats > 5000) {
2913 flushcnt += repeats;
2914 repeats = 0;
2915 xfs_warn(log->l_mp,
2916 "%s: possible infinite loop (%d iterations)",
2917 __func__, flushcnt);
2918 }
2919 }
2920
2921 if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE)
2922 wake_up_all(&log->l_flush_wait);
2923
2924 spin_unlock(&log->l_icloglock);
2925}
2926
2927
2928
2929
2930
2931
2932
2933
2934STATIC void
2935xlog_state_done_syncing(
2936 struct xlog_in_core *iclog)
2937{
2938 struct xlog *log = iclog->ic_log;
2939
2940 spin_lock(&log->l_icloglock);
2941 ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
2942 trace_xlog_iclog_sync_done(iclog, _RET_IP_);
2943
2944
2945
2946
2947
2948
2949 if (!xlog_is_shutdown(log)) {
2950 ASSERT(iclog->ic_state == XLOG_STATE_SYNCING);
2951 iclog->ic_state = XLOG_STATE_DONE_SYNC;
2952 }
2953
2954
2955
2956
2957
2958
2959 wake_up_all(&iclog->ic_write_wait);
2960 spin_unlock(&log->l_icloglock);
2961 xlog_state_do_callback(log);
2962}
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982STATIC int
2983xlog_state_get_iclog_space(
2984 struct xlog *log,
2985 int len,
2986 struct xlog_in_core **iclogp,
2987 struct xlog_ticket *ticket,
2988 int *continued_write,
2989 int *logoffsetp)
2990{
2991 int log_offset;
2992 xlog_rec_header_t *head;
2993 xlog_in_core_t *iclog;
2994
2995restart:
2996 spin_lock(&log->l_icloglock);
2997 if (xlog_is_shutdown(log)) {
2998 spin_unlock(&log->l_icloglock);
2999 return -EIO;
3000 }
3001
3002 iclog = log->l_iclog;
3003 if (iclog->ic_state != XLOG_STATE_ACTIVE) {
3004 XFS_STATS_INC(log->l_mp, xs_log_noiclogs);
3005
3006
3007 xlog_wait(&log->l_flush_wait, &log->l_icloglock);
3008 goto restart;
3009 }
3010
3011 head = &iclog->ic_header;
3012
3013 atomic_inc(&iclog->ic_refcnt);
3014 log_offset = iclog->ic_offset;
3015
3016 trace_xlog_iclog_get_space(iclog, _RET_IP_);
3017
3018
3019
3020
3021
3022
3023 if (log_offset == 0) {
3024 ticket->t_curr_res -= log->l_iclog_hsize;
3025 xlog_tic_add_region(ticket,
3026 log->l_iclog_hsize,
3027 XLOG_REG_TYPE_LRHEADER);
3028 head->h_cycle = cpu_to_be32(log->l_curr_cycle);
3029 head->h_lsn = cpu_to_be64(
3030 xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
3031 ASSERT(log->l_curr_block >= 0);
3032 }
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043 if (iclog->ic_size - iclog->ic_offset < 2*sizeof(xlog_op_header_t)) {
3044 int error = 0;
3045
3046 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
3047
3048
3049
3050
3051
3052
3053
3054
3055 if (!atomic_add_unless(&iclog->ic_refcnt, -1, 1))
3056 error = xlog_state_release_iclog(log, iclog, 0);
3057 spin_unlock(&log->l_icloglock);
3058 if (error)
3059 return error;
3060 goto restart;
3061 }
3062
3063
3064
3065
3066
3067
3068
3069 if (len <= iclog->ic_size - iclog->ic_offset) {
3070 *continued_write = 0;
3071 iclog->ic_offset += len;
3072 } else {
3073 *continued_write = 1;
3074 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
3075 }
3076 *iclogp = iclog;
3077
3078 ASSERT(iclog->ic_offset <= iclog->ic_size);
3079 spin_unlock(&log->l_icloglock);
3080
3081 *logoffsetp = log_offset;
3082 return 0;
3083}
3084
3085
3086
3087
3088
3089
3090
3091
3092void
3093xfs_log_ticket_regrant(
3094 struct xlog *log,
3095 struct xlog_ticket *ticket)
3096{
3097 trace_xfs_log_ticket_regrant(log, ticket);
3098
3099 if (ticket->t_cnt > 0)
3100 ticket->t_cnt--;
3101
3102 xlog_grant_sub_space(log, &log->l_reserve_head.grant,
3103 ticket->t_curr_res);
3104 xlog_grant_sub_space(log, &log->l_write_head.grant,
3105 ticket->t_curr_res);
3106 ticket->t_curr_res = ticket->t_unit_res;
3107 xlog_tic_reset_res(ticket);
3108
3109 trace_xfs_log_ticket_regrant_sub(log, ticket);
3110
3111
3112 if (!ticket->t_cnt) {
3113 xlog_grant_add_space(log, &log->l_reserve_head.grant,
3114 ticket->t_unit_res);
3115 trace_xfs_log_ticket_regrant_exit(log, ticket);
3116
3117 ticket->t_curr_res = ticket->t_unit_res;
3118 xlog_tic_reset_res(ticket);
3119 }
3120
3121 xfs_log_ticket_put(ticket);
3122}
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138void
3139xfs_log_ticket_ungrant(
3140 struct xlog *log,
3141 struct xlog_ticket *ticket)
3142{
3143 int bytes;
3144
3145 trace_xfs_log_ticket_ungrant(log, ticket);
3146
3147 if (ticket->t_cnt > 0)
3148 ticket->t_cnt--;
3149
3150 trace_xfs_log_ticket_ungrant_sub(log, ticket);
3151
3152
3153
3154
3155
3156 bytes = ticket->t_curr_res;
3157 if (ticket->t_cnt > 0) {
3158 ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV);
3159 bytes += ticket->t_unit_res*ticket->t_cnt;
3160 }
3161
3162 xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
3163 xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
3164
3165 trace_xfs_log_ticket_ungrant_exit(log, ticket);
3166
3167 xfs_log_space_wake(log->l_mp);
3168 xfs_log_ticket_put(ticket);
3169}
3170
3171
3172
3173
3174
3175void
3176xlog_state_switch_iclogs(
3177 struct xlog *log,
3178 struct xlog_in_core *iclog,
3179 int eventual_size)
3180{
3181 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
3182 assert_spin_locked(&log->l_icloglock);
3183 trace_xlog_iclog_switch(iclog, _RET_IP_);
3184
3185 if (!eventual_size)
3186 eventual_size = iclog->ic_offset;
3187 iclog->ic_state = XLOG_STATE_WANT_SYNC;
3188 iclog->ic_header.h_prev_block = cpu_to_be32(log->l_prev_block);
3189 log->l_prev_block = log->l_curr_block;
3190 log->l_prev_cycle = log->l_curr_cycle;
3191
3192
3193 log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize);
3194
3195
3196 if (log->l_iclog_roundoff > BBSIZE) {
3197 uint32_t sunit_bb = BTOBB(log->l_iclog_roundoff);
3198 log->l_curr_block = roundup(log->l_curr_block, sunit_bb);
3199 }
3200
3201 if (log->l_curr_block >= log->l_logBBsize) {
3202
3203
3204
3205
3206
3207
3208
3209 log->l_curr_block -= log->l_logBBsize;
3210 ASSERT(log->l_curr_block >= 0);
3211 smp_wmb();
3212 log->l_curr_cycle++;
3213 if (log->l_curr_cycle == XLOG_HEADER_MAGIC_NUM)
3214 log->l_curr_cycle++;
3215 }
3216 ASSERT(iclog == log->l_iclog);
3217 log->l_iclog = iclog->ic_next;
3218}
3219
3220
3221
3222
3223
3224
3225
3226
3227static int
3228xlog_force_and_check_iclog(
3229 struct xlog_in_core *iclog,
3230 bool *completed)
3231{
3232 xfs_lsn_t lsn = be64_to_cpu(iclog->ic_header.h_lsn);
3233 int error;
3234
3235 *completed = false;
3236 error = xlog_force_iclog(iclog);
3237 if (error)
3238 return error;
3239
3240
3241
3242
3243
3244 if (be64_to_cpu(iclog->ic_header.h_lsn) != lsn)
3245 *completed = true;
3246 return 0;
3247}
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276int
3277xfs_log_force(
3278 struct xfs_mount *mp,
3279 uint flags)
3280{
3281 struct xlog *log = mp->m_log;
3282 struct xlog_in_core *iclog;
3283
3284 XFS_STATS_INC(mp, xs_log_force);
3285 trace_xfs_log_force(mp, 0, _RET_IP_);
3286
3287 xlog_cil_force(log);
3288
3289 spin_lock(&log->l_icloglock);
3290 if (xlog_is_shutdown(log))
3291 goto out_error;
3292
3293 iclog = log->l_iclog;
3294 trace_xlog_iclog_force(iclog, _RET_IP_);
3295
3296 if (iclog->ic_state == XLOG_STATE_DIRTY ||
3297 (iclog->ic_state == XLOG_STATE_ACTIVE &&
3298 atomic_read(&iclog->ic_refcnt) == 0 && iclog->ic_offset == 0)) {
3299
3300
3301
3302
3303
3304
3305
3306
3307 iclog = iclog->ic_prev;
3308 } else if (iclog->ic_state == XLOG_STATE_ACTIVE) {
3309 if (atomic_read(&iclog->ic_refcnt) == 0) {
3310
3311 bool completed;
3312
3313 if (xlog_force_and_check_iclog(iclog, &completed))
3314 goto out_error;
3315
3316 if (completed)
3317 goto out_unlock;
3318 } else {
3319
3320
3321
3322
3323
3324 xlog_state_switch_iclogs(log, iclog, 0);
3325 }
3326 }
3327
3328
3329
3330
3331
3332
3333
3334 if (iclog->ic_state == XLOG_STATE_WANT_SYNC)
3335 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
3336
3337 if (flags & XFS_LOG_SYNC)
3338 return xlog_wait_on_iclog(iclog);
3339out_unlock:
3340 spin_unlock(&log->l_icloglock);
3341 return 0;
3342out_error:
3343 spin_unlock(&log->l_icloglock);
3344 return -EIO;
3345}
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361static int
3362xlog_force_lsn(
3363 struct xlog *log,
3364 xfs_lsn_t lsn,
3365 uint flags,
3366 int *log_flushed,
3367 bool already_slept)
3368{
3369 struct xlog_in_core *iclog;
3370 bool completed;
3371
3372 spin_lock(&log->l_icloglock);
3373 if (xlog_is_shutdown(log))
3374 goto out_error;
3375
3376 iclog = log->l_iclog;
3377 while (be64_to_cpu(iclog->ic_header.h_lsn) != lsn) {
3378 trace_xlog_iclog_force_lsn(iclog, _RET_IP_);
3379 iclog = iclog->ic_next;
3380 if (iclog == log->l_iclog)
3381 goto out_unlock;
3382 }
3383
3384 switch (iclog->ic_state) {
3385 case XLOG_STATE_ACTIVE:
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401 if (!already_slept &&
3402 (iclog->ic_prev->ic_state == XLOG_STATE_WANT_SYNC ||
3403 iclog->ic_prev->ic_state == XLOG_STATE_SYNCING)) {
3404 xlog_wait(&iclog->ic_prev->ic_write_wait,
3405 &log->l_icloglock);
3406 return -EAGAIN;
3407 }
3408 if (xlog_force_and_check_iclog(iclog, &completed))
3409 goto out_error;
3410 if (log_flushed)
3411 *log_flushed = 1;
3412 if (completed)
3413 goto out_unlock;
3414 break;
3415 case XLOG_STATE_WANT_SYNC:
3416
3417
3418
3419
3420
3421
3422
3423 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
3424 break;
3425 default:
3426
3427
3428
3429
3430
3431
3432 break;
3433 }
3434
3435 if (flags & XFS_LOG_SYNC)
3436 return xlog_wait_on_iclog(iclog);
3437out_unlock:
3438 spin_unlock(&log->l_icloglock);
3439 return 0;
3440out_error:
3441 spin_unlock(&log->l_icloglock);
3442 return -EIO;
3443}
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454int
3455xfs_log_force_seq(
3456 struct xfs_mount *mp,
3457 xfs_csn_t seq,
3458 uint flags,
3459 int *log_flushed)
3460{
3461 struct xlog *log = mp->m_log;
3462 xfs_lsn_t lsn;
3463 int ret;
3464 ASSERT(seq != 0);
3465
3466 XFS_STATS_INC(mp, xs_log_force);
3467 trace_xfs_log_force(mp, seq, _RET_IP_);
3468
3469 lsn = xlog_cil_force_seq(log, seq);
3470 if (lsn == NULLCOMMITLSN)
3471 return 0;
3472
3473 ret = xlog_force_lsn(log, lsn, flags, log_flushed, false);
3474 if (ret == -EAGAIN) {
3475 XFS_STATS_INC(mp, xs_log_force_sleep);
3476 ret = xlog_force_lsn(log, lsn, flags, log_flushed, true);
3477 }
3478 return ret;
3479}
3480
3481
3482
3483
3484void
3485xfs_log_ticket_put(
3486 xlog_ticket_t *ticket)
3487{
3488 ASSERT(atomic_read(&ticket->t_ref) > 0);
3489 if (atomic_dec_and_test(&ticket->t_ref))
3490 kmem_cache_free(xfs_log_ticket_zone, ticket);
3491}
3492
3493xlog_ticket_t *
3494xfs_log_ticket_get(
3495 xlog_ticket_t *ticket)
3496{
3497 ASSERT(atomic_read(&ticket->t_ref) > 0);
3498 atomic_inc(&ticket->t_ref);
3499 return ticket;
3500}
3501
3502
3503
3504
3505
3506static int
3507xlog_calc_unit_res(
3508 struct xlog *log,
3509 int unit_bytes)
3510{
3511 int iclog_space;
3512 uint num_headers;
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546 unit_bytes += sizeof(xlog_op_header_t);
3547 unit_bytes += sizeof(xfs_trans_header_t);
3548
3549
3550 unit_bytes += sizeof(xlog_op_header_t);
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569 iclog_space = log->l_iclog_size - log->l_iclog_hsize;
3570 num_headers = howmany(unit_bytes, iclog_space);
3571
3572
3573 unit_bytes += sizeof(xlog_op_header_t) * num_headers;
3574
3575
3576 while (!num_headers ||
3577 howmany(unit_bytes, iclog_space) > num_headers) {
3578 unit_bytes += sizeof(xlog_op_header_t);
3579 num_headers++;
3580 }
3581 unit_bytes += log->l_iclog_hsize * num_headers;
3582
3583
3584 unit_bytes += log->l_iclog_hsize;
3585
3586
3587 unit_bytes += 2 * log->l_iclog_roundoff;
3588
3589 return unit_bytes;
3590}
3591
3592int
3593xfs_log_calc_unit_res(
3594 struct xfs_mount *mp,
3595 int unit_bytes)
3596{
3597 return xlog_calc_unit_res(mp->m_log, unit_bytes);
3598}
3599
3600
3601
3602
3603struct xlog_ticket *
3604xlog_ticket_alloc(
3605 struct xlog *log,
3606 int unit_bytes,
3607 int cnt,
3608 char client,
3609 bool permanent)
3610{
3611 struct xlog_ticket *tic;
3612 int unit_res;
3613
3614 tic = kmem_cache_zalloc(xfs_log_ticket_zone, GFP_NOFS | __GFP_NOFAIL);
3615
3616 unit_res = xlog_calc_unit_res(log, unit_bytes);
3617
3618 atomic_set(&tic->t_ref, 1);
3619 tic->t_task = current;
3620 INIT_LIST_HEAD(&tic->t_queue);
3621 tic->t_unit_res = unit_res;
3622 tic->t_curr_res = unit_res;
3623 tic->t_cnt = cnt;
3624 tic->t_ocnt = cnt;
3625 tic->t_tid = prandom_u32();
3626 tic->t_clientid = client;
3627 if (permanent)
3628 tic->t_flags |= XLOG_TIC_PERM_RESERV;
3629
3630 xlog_tic_reset_res(tic);
3631
3632 return tic;
3633}
3634
3635#if defined(DEBUG)
3636
3637
3638
3639
3640
3641STATIC void
3642xlog_verify_dest_ptr(
3643 struct xlog *log,
3644 void *ptr)
3645{
3646 int i;
3647 int good_ptr = 0;
3648
3649 for (i = 0; i < log->l_iclog_bufs; i++) {
3650 if (ptr >= log->l_iclog_bak[i] &&
3651 ptr <= log->l_iclog_bak[i] + log->l_iclog_size)
3652 good_ptr++;
3653 }
3654
3655 if (!good_ptr)
3656 xfs_emerg(log->l_mp, "%s: invalid ptr", __func__);
3657}
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670STATIC void
3671xlog_verify_grant_tail(
3672 struct xlog *log)
3673{
3674 int tail_cycle, tail_blocks;
3675 int cycle, space;
3676
3677 xlog_crack_grant_head(&log->l_write_head.grant, &cycle, &space);
3678 xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks);
3679 if (tail_cycle != cycle) {
3680 if (cycle - 1 != tail_cycle &&
3681 !test_and_set_bit(XLOG_TAIL_WARN, &log->l_opstate)) {
3682 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3683 "%s: cycle - 1 != tail_cycle", __func__);
3684 }
3685
3686 if (space > BBTOB(tail_blocks) &&
3687 !test_and_set_bit(XLOG_TAIL_WARN, &log->l_opstate)) {
3688 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3689 "%s: space > BBTOB(tail_blocks)", __func__);
3690 }
3691 }
3692}
3693
3694
3695STATIC void
3696xlog_verify_tail_lsn(
3697 struct xlog *log,
3698 struct xlog_in_core *iclog)
3699{
3700 xfs_lsn_t tail_lsn = be64_to_cpu(iclog->ic_header.h_tail_lsn);
3701 int blocks;
3702
3703 if (CYCLE_LSN(tail_lsn) == log->l_prev_cycle) {
3704 blocks =
3705 log->l_logBBsize - (log->l_prev_block - BLOCK_LSN(tail_lsn));
3706 if (blocks < BTOBB(iclog->ic_offset)+BTOBB(log->l_iclog_hsize))
3707 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3708 } else {
3709 ASSERT(CYCLE_LSN(tail_lsn)+1 == log->l_prev_cycle);
3710
3711 if (BLOCK_LSN(tail_lsn) == log->l_prev_block)
3712 xfs_emerg(log->l_mp, "%s: tail wrapped", __func__);
3713
3714 blocks = BLOCK_LSN(tail_lsn) - log->l_prev_block;
3715 if (blocks < BTOBB(iclog->ic_offset) + 1)
3716 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3717 }
3718}
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735STATIC void
3736xlog_verify_iclog(
3737 struct xlog *log,
3738 struct xlog_in_core *iclog,
3739 int count)
3740{
3741 xlog_op_header_t *ophead;
3742 xlog_in_core_t *icptr;
3743 xlog_in_core_2_t *xhdr;
3744 void *base_ptr, *ptr, *p;
3745 ptrdiff_t field_offset;
3746 uint8_t clientid;
3747 int len, i, j, k, op_len;
3748 int idx;
3749
3750
3751 spin_lock(&log->l_icloglock);
3752 icptr = log->l_iclog;
3753 for (i = 0; i < log->l_iclog_bufs; i++, icptr = icptr->ic_next)
3754 ASSERT(icptr);
3755
3756 if (icptr != log->l_iclog)
3757 xfs_emerg(log->l_mp, "%s: corrupt iclog ring", __func__);
3758 spin_unlock(&log->l_icloglock);
3759
3760
3761 if (iclog->ic_header.h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3762 xfs_emerg(log->l_mp, "%s: invalid magic num", __func__);
3763
3764 base_ptr = ptr = &iclog->ic_header;
3765 p = &iclog->ic_header;
3766 for (ptr += BBSIZE; ptr < base_ptr + count; ptr += BBSIZE) {
3767 if (*(__be32 *)ptr == cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3768 xfs_emerg(log->l_mp, "%s: unexpected magic num",
3769 __func__);
3770 }
3771
3772
3773 len = be32_to_cpu(iclog->ic_header.h_num_logops);
3774 base_ptr = ptr = iclog->ic_datap;
3775 ophead = ptr;
3776 xhdr = iclog->ic_data;
3777 for (i = 0; i < len; i++) {
3778 ophead = ptr;
3779
3780
3781 p = &ophead->oh_clientid;
3782 field_offset = p - base_ptr;
3783 if (field_offset & 0x1ff) {
3784 clientid = ophead->oh_clientid;
3785 } else {
3786 idx = BTOBBT((char *)&ophead->oh_clientid - iclog->ic_datap);
3787 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3788 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3789 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3790 clientid = xlog_get_client_id(
3791 xhdr[j].hic_xheader.xh_cycle_data[k]);
3792 } else {
3793 clientid = xlog_get_client_id(
3794 iclog->ic_header.h_cycle_data[idx]);
3795 }
3796 }
3797 if (clientid != XFS_TRANSACTION && clientid != XFS_LOG)
3798 xfs_warn(log->l_mp,
3799 "%s: invalid clientid %d op "PTR_FMT" offset 0x%lx",
3800 __func__, clientid, ophead,
3801 (unsigned long)field_offset);
3802
3803
3804 p = &ophead->oh_len;
3805 field_offset = p - base_ptr;
3806 if (field_offset & 0x1ff) {
3807 op_len = be32_to_cpu(ophead->oh_len);
3808 } else {
3809 idx = BTOBBT((uintptr_t)&ophead->oh_len -
3810 (uintptr_t)iclog->ic_datap);
3811 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3812 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3813 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3814 op_len = be32_to_cpu(xhdr[j].hic_xheader.xh_cycle_data[k]);
3815 } else {
3816 op_len = be32_to_cpu(iclog->ic_header.h_cycle_data[idx]);
3817 }
3818 }
3819 ptr += sizeof(xlog_op_header_t) + op_len;
3820 }
3821}
3822#endif
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840bool
3841xlog_force_shutdown(
3842 struct xlog *log,
3843 int shutdown_flags)
3844{
3845 bool log_error = (shutdown_flags & SHUTDOWN_LOG_IO_ERROR);
3846
3847
3848
3849
3850
3851 if (!log || xlog_in_recovery(log))
3852 return false;
3853
3854 ASSERT(!xlog_is_shutdown(log));
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865 if (!log_error)
3866 xfs_log_force(log->l_mp, XFS_LOG_SYNC);
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879 spin_lock(&log->l_icloglock);
3880 if (test_and_set_bit(XLOG_IO_ERROR, &log->l_opstate)) {
3881 spin_unlock(&log->l_icloglock);
3882 ASSERT(0);
3883 return false;
3884 }
3885 spin_unlock(&log->l_icloglock);
3886
3887
3888
3889
3890
3891
3892
3893
3894 xlog_grant_head_wake_all(&log->l_reserve_head);
3895 xlog_grant_head_wake_all(&log->l_write_head);
3896
3897
3898
3899
3900
3901
3902
3903 spin_lock(&log->l_cilp->xc_push_lock);
3904 wake_up_all(&log->l_cilp->xc_start_wait);
3905 wake_up_all(&log->l_cilp->xc_commit_wait);
3906 spin_unlock(&log->l_cilp->xc_push_lock);
3907 xlog_state_shutdown_callbacks(log);
3908
3909 return log_error;
3910}
3911
3912STATIC int
3913xlog_iclogs_empty(
3914 struct xlog *log)
3915{
3916 xlog_in_core_t *iclog;
3917
3918 iclog = log->l_iclog;
3919 do {
3920
3921
3922
3923 if (iclog->ic_header.h_num_logops)
3924 return 0;
3925 iclog = iclog->ic_next;
3926 } while (iclog != log->l_iclog);
3927 return 1;
3928}
3929
3930
3931
3932
3933
3934bool
3935xfs_log_check_lsn(
3936 struct xfs_mount *mp,
3937 xfs_lsn_t lsn)
3938{
3939 struct xlog *log = mp->m_log;
3940 bool valid;
3941
3942
3943
3944
3945
3946
3947 if (xfs_has_norecovery(mp))
3948 return true;
3949
3950
3951
3952
3953
3954 if (lsn == NULLCOMMITLSN)
3955 return true;
3956
3957 valid = xlog_valid_lsn(mp->m_log, lsn);
3958
3959
3960 if (!valid) {
3961 spin_lock(&log->l_icloglock);
3962 xfs_warn(mp,
3963"Corruption warning: Metadata has LSN (%d:%d) ahead of current LSN (%d:%d). "
3964"Please unmount and run xfs_repair (>= v4.3) to resolve.",
3965 CYCLE_LSN(lsn), BLOCK_LSN(lsn),
3966 log->l_curr_cycle, log->l_curr_block);
3967 spin_unlock(&log->l_icloglock);
3968 }
3969
3970 return valid;
3971}
3972
3973
3974
3975
3976
3977
3978void
3979xlog_use_incompat_feat(
3980 struct xlog *log)
3981{
3982 down_read(&log->l_incompat_users);
3983}
3984
3985
3986void
3987xlog_drop_incompat_feat(
3988 struct xlog *log)
3989{
3990 up_read(&log->l_incompat_users);
3991}
3992