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