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