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