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((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_FUA | XBF_FLUSH);
1866 bp->b_flags |= (XBF_ASYNC | XBF_SYNCIO | XBF_WRITE);
1867
1868 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) {
1869 bp->b_flags |= XBF_FUA;
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880 if (log->l_mp->m_logdev_targp != log->l_mp->m_ddev_targp)
1881 xfs_blkdev_issue_flush(log->l_mp->m_ddev_targp);
1882 else
1883 bp->b_flags |= XBF_FLUSH;
1884 }
1885
1886 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
1887 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize);
1888
1889 xlog_verify_iclog(log, iclog, count, true);
1890
1891
1892 XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart);
1893
1894
1895
1896
1897
1898 error = xlog_bdstrat(bp);
1899 if (error) {
1900 xfs_buf_ioerror_alert(bp, "xlog_sync");
1901 return error;
1902 }
1903 if (split) {
1904 bp = iclog->ic_log->l_xbuf;
1905 XFS_BUF_SET_ADDR(bp, 0);
1906 xfs_buf_associate_memory(bp,
1907 (char *)&iclog->ic_header + count, split);
1908 bp->b_fspriv = iclog;
1909 bp->b_flags &= ~(XBF_FUA | XBF_FLUSH);
1910 bp->b_flags |= (XBF_ASYNC | XBF_SYNCIO | XBF_WRITE);
1911 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
1912 bp->b_flags |= XBF_FUA;
1913
1914 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
1915 ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize);
1916
1917
1918 XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart);
1919 error = xlog_bdstrat(bp);
1920 if (error) {
1921 xfs_buf_ioerror_alert(bp, "xlog_sync (split)");
1922 return error;
1923 }
1924 }
1925 return 0;
1926}
1927
1928
1929
1930
1931STATIC void
1932xlog_dealloc_log(
1933 struct xlog *log)
1934{
1935 xlog_in_core_t *iclog, *next_iclog;
1936 int i;
1937
1938 xlog_cil_destroy(log);
1939
1940
1941
1942
1943
1944 iclog = log->l_iclog;
1945 for (i = 0; i < log->l_iclog_bufs; i++) {
1946 xfs_buf_lock(iclog->ic_bp);
1947 xfs_buf_unlock(iclog->ic_bp);
1948 iclog = iclog->ic_next;
1949 }
1950
1951
1952
1953
1954
1955
1956 xfs_buf_lock(log->l_xbuf);
1957 xfs_buf_unlock(log->l_xbuf);
1958 xfs_buf_set_empty(log->l_xbuf, BTOBB(log->l_iclog_size));
1959 xfs_buf_free(log->l_xbuf);
1960
1961 iclog = log->l_iclog;
1962 for (i = 0; i < log->l_iclog_bufs; i++) {
1963 xfs_buf_free(iclog->ic_bp);
1964 next_iclog = iclog->ic_next;
1965 kmem_free(iclog);
1966 iclog = next_iclog;
1967 }
1968 spinlock_destroy(&log->l_icloglock);
1969
1970 log->l_mp->m_log = NULL;
1971 kmem_free(log);
1972}
1973
1974
1975
1976
1977
1978static inline void
1979xlog_state_finish_copy(
1980 struct xlog *log,
1981 struct xlog_in_core *iclog,
1982 int record_cnt,
1983 int copy_bytes)
1984{
1985 spin_lock(&log->l_icloglock);
1986
1987 be32_add_cpu(&iclog->ic_header.h_num_logops, record_cnt);
1988 iclog->ic_offset += copy_bytes;
1989
1990 spin_unlock(&log->l_icloglock);
1991}
1992
1993
1994
1995
1996
1997
1998
1999
2000void
2001xlog_print_tic_res(
2002 struct xfs_mount *mp,
2003 struct xlog_ticket *ticket)
2004{
2005 uint i;
2006 uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
2007
2008
2009#define REG_TYPE_STR(type, str) [XLOG_REG_TYPE_##type] = str
2010 static char *res_type_str[XLOG_REG_TYPE_MAX + 1] = {
2011 REG_TYPE_STR(BFORMAT, "bformat"),
2012 REG_TYPE_STR(BCHUNK, "bchunk"),
2013 REG_TYPE_STR(EFI_FORMAT, "efi_format"),
2014 REG_TYPE_STR(EFD_FORMAT, "efd_format"),
2015 REG_TYPE_STR(IFORMAT, "iformat"),
2016 REG_TYPE_STR(ICORE, "icore"),
2017 REG_TYPE_STR(IEXT, "iext"),
2018 REG_TYPE_STR(IBROOT, "ibroot"),
2019 REG_TYPE_STR(ILOCAL, "ilocal"),
2020 REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
2021 REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
2022 REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
2023 REG_TYPE_STR(QFORMAT, "qformat"),
2024 REG_TYPE_STR(DQUOT, "dquot"),
2025 REG_TYPE_STR(QUOTAOFF, "quotaoff"),
2026 REG_TYPE_STR(LRHEADER, "LR header"),
2027 REG_TYPE_STR(UNMOUNT, "unmount"),
2028 REG_TYPE_STR(COMMIT, "commit"),
2029 REG_TYPE_STR(TRANSHDR, "trans header"),
2030 REG_TYPE_STR(ICREATE, "inode create")
2031 };
2032#undef REG_TYPE_STR
2033
2034 xfs_warn(mp, "xlog_write: reservation summary:");
2035 xfs_warn(mp, " unit res = %d bytes",
2036 ticket->t_unit_res);
2037 xfs_warn(mp, " current res = %d bytes",
2038 ticket->t_curr_res);
2039 xfs_warn(mp, " total reg = %u bytes (o/flow = %u bytes)",
2040 ticket->t_res_arr_sum, ticket->t_res_o_flow);
2041 xfs_warn(mp, " ophdrs = %u (ophdr space = %u bytes)",
2042 ticket->t_res_num_ophdrs, ophdr_spc);
2043 xfs_warn(mp, " ophdr + reg = %u bytes",
2044 ticket->t_res_arr_sum + ticket->t_res_o_flow + ophdr_spc);
2045 xfs_warn(mp, " num regions = %u",
2046 ticket->t_res_num);
2047
2048 for (i = 0; i < ticket->t_res_num; i++) {
2049 uint r_type = ticket->t_res_arr[i].r_type;
2050 xfs_warn(mp, "region[%u]: %s - %u bytes", i,
2051 ((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
2052 "bad-rtype" : res_type_str[r_type]),
2053 ticket->t_res_arr[i].r_len);
2054 }
2055
2056 xfs_alert_tag(mp, XFS_PTAG_LOGRES,
2057 "xlog_write: reservation ran out. Need to up reservation");
2058 xfs_force_shutdown(mp, SHUTDOWN_LOG_IO_ERROR);
2059}
2060
2061
2062
2063
2064
2065static int
2066xlog_write_calc_vec_length(
2067 struct xlog_ticket *ticket,
2068 struct xfs_log_vec *log_vector)
2069{
2070 struct xfs_log_vec *lv;
2071 int headers = 0;
2072 int len = 0;
2073 int i;
2074
2075
2076 if (ticket->t_flags & XLOG_TIC_INITED)
2077 headers++;
2078
2079 for (lv = log_vector; lv; lv = lv->lv_next) {
2080
2081 if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED)
2082 continue;
2083
2084 headers += lv->lv_niovecs;
2085
2086 for (i = 0; i < lv->lv_niovecs; i++) {
2087 struct xfs_log_iovec *vecp = &lv->lv_iovecp[i];
2088
2089 len += vecp->i_len;
2090 xlog_tic_add_region(ticket, vecp->i_len, vecp->i_type);
2091 }
2092 }
2093
2094 ticket->t_res_num_ophdrs += headers;
2095 len += headers * sizeof(struct xlog_op_header);
2096
2097 return len;
2098}
2099
2100
2101
2102
2103
2104static int
2105xlog_write_start_rec(
2106 struct xlog_op_header *ophdr,
2107 struct xlog_ticket *ticket)
2108{
2109 if (!(ticket->t_flags & XLOG_TIC_INITED))
2110 return 0;
2111
2112 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2113 ophdr->oh_clientid = ticket->t_clientid;
2114 ophdr->oh_len = 0;
2115 ophdr->oh_flags = XLOG_START_TRANS;
2116 ophdr->oh_res2 = 0;
2117
2118 ticket->t_flags &= ~XLOG_TIC_INITED;
2119
2120 return sizeof(struct xlog_op_header);
2121}
2122
2123static xlog_op_header_t *
2124xlog_write_setup_ophdr(
2125 struct xlog *log,
2126 struct xlog_op_header *ophdr,
2127 struct xlog_ticket *ticket,
2128 uint flags)
2129{
2130 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2131 ophdr->oh_clientid = ticket->t_clientid;
2132 ophdr->oh_res2 = 0;
2133
2134
2135 ophdr->oh_flags = flags;
2136
2137
2138
2139
2140
2141
2142 switch (ophdr->oh_clientid) {
2143 case XFS_TRANSACTION:
2144 case XFS_VOLUME:
2145 case XFS_LOG:
2146 break;
2147 default:
2148 xfs_warn(log->l_mp,
2149 "Bad XFS transaction clientid 0x%x in ticket 0x%p",
2150 ophdr->oh_clientid, ticket);
2151 return NULL;
2152 }
2153
2154 return ophdr;
2155}
2156
2157
2158
2159
2160
2161
2162
2163static int
2164xlog_write_setup_copy(
2165 struct xlog_ticket *ticket,
2166 struct xlog_op_header *ophdr,
2167 int space_available,
2168 int space_required,
2169 int *copy_off,
2170 int *copy_len,
2171 int *last_was_partial_copy,
2172 int *bytes_consumed)
2173{
2174 int still_to_copy;
2175
2176 still_to_copy = space_required - *bytes_consumed;
2177 *copy_off = *bytes_consumed;
2178
2179 if (still_to_copy <= space_available) {
2180
2181 *copy_len = still_to_copy;
2182 ophdr->oh_len = cpu_to_be32(*copy_len);
2183 if (*last_was_partial_copy)
2184 ophdr->oh_flags |= (XLOG_END_TRANS|XLOG_WAS_CONT_TRANS);
2185 *last_was_partial_copy = 0;
2186 *bytes_consumed = 0;
2187 return 0;
2188 }
2189
2190
2191 *copy_len = space_available;
2192 ophdr->oh_len = cpu_to_be32(*copy_len);
2193 ophdr->oh_flags |= XLOG_CONTINUE_TRANS;
2194 if (*last_was_partial_copy)
2195 ophdr->oh_flags |= XLOG_WAS_CONT_TRANS;
2196 *bytes_consumed += *copy_len;
2197 (*last_was_partial_copy)++;
2198
2199
2200 ticket->t_curr_res -= sizeof(struct xlog_op_header);
2201 ticket->t_res_num_ophdrs++;
2202
2203 return sizeof(struct xlog_op_header);
2204}
2205
2206static int
2207xlog_write_copy_finish(
2208 struct xlog *log,
2209 struct xlog_in_core *iclog,
2210 uint flags,
2211 int *record_cnt,
2212 int *data_cnt,
2213 int *partial_copy,
2214 int *partial_copy_len,
2215 int log_offset,
2216 struct xlog_in_core **commit_iclog)
2217{
2218 if (*partial_copy) {
2219
2220
2221
2222
2223 xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
2224 *record_cnt = 0;
2225 *data_cnt = 0;
2226 return xlog_state_release_iclog(log, iclog);
2227 }
2228
2229 *partial_copy = 0;
2230 *partial_copy_len = 0;
2231
2232 if (iclog->ic_size - log_offset <= sizeof(xlog_op_header_t)) {
2233
2234 xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
2235 *record_cnt = 0;
2236 *data_cnt = 0;
2237
2238 spin_lock(&log->l_icloglock);
2239 xlog_state_want_sync(log, iclog);
2240 spin_unlock(&log->l_icloglock);
2241
2242 if (!commit_iclog)
2243 return xlog_state_release_iclog(log, iclog);
2244 ASSERT(flags & XLOG_COMMIT_TRANS);
2245 *commit_iclog = iclog;
2246 }
2247
2248 return 0;
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
2284
2285
2286
2287
2288
2289
2290
2291int
2292xlog_write(
2293 struct xlog *log,
2294 struct xfs_log_vec *log_vector,
2295 struct xlog_ticket *ticket,
2296 xfs_lsn_t *start_lsn,
2297 struct xlog_in_core **commit_iclog,
2298 uint flags)
2299{
2300 struct xlog_in_core *iclog = NULL;
2301 struct xfs_log_iovec *vecp;
2302 struct xfs_log_vec *lv;
2303 int len;
2304 int index;
2305 int partial_copy = 0;
2306 int partial_copy_len = 0;
2307 int contwr = 0;
2308 int record_cnt = 0;
2309 int data_cnt = 0;
2310 int error;
2311
2312 *start_lsn = 0;
2313
2314 len = xlog_write_calc_vec_length(ticket, log_vector);
2315
2316
2317
2318
2319
2320
2321 if (ticket->t_flags & XLOG_TIC_INITED)
2322 ticket->t_curr_res -= sizeof(xlog_op_header_t);
2323
2324
2325
2326
2327
2328 if (flags & (XLOG_COMMIT_TRANS | XLOG_UNMOUNT_TRANS))
2329 ticket->t_curr_res -= sizeof(xlog_op_header_t);
2330
2331 if (ticket->t_curr_res < 0)
2332 xlog_print_tic_res(log->l_mp, ticket);
2333
2334 index = 0;
2335 lv = log_vector;
2336 vecp = lv->lv_iovecp;
2337 while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
2338 void *ptr;
2339 int log_offset;
2340
2341 error = xlog_state_get_iclog_space(log, len, &iclog, ticket,
2342 &contwr, &log_offset);
2343 if (error)
2344 return error;
2345
2346 ASSERT(log_offset <= iclog->ic_size - 1);
2347 ptr = iclog->ic_datap + log_offset;
2348
2349
2350 if (!*start_lsn)
2351 *start_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
2352
2353
2354
2355
2356
2357 while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
2358 struct xfs_log_iovec *reg;
2359 struct xlog_op_header *ophdr;
2360 int start_rec_copy;
2361 int copy_len;
2362 int copy_off;
2363 bool ordered = false;
2364
2365
2366 if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED) {
2367 ASSERT(lv->lv_niovecs == 0);
2368 ordered = true;
2369 goto next_lv;
2370 }
2371
2372 reg = &vecp[index];
2373 ASSERT(reg->i_len % sizeof(__int32_t) == 0);
2374 ASSERT((unsigned long)ptr % sizeof(__int32_t) == 0);
2375
2376 start_rec_copy = xlog_write_start_rec(ptr, ticket);
2377 if (start_rec_copy) {
2378 record_cnt++;
2379 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2380 start_rec_copy);
2381 }
2382
2383 ophdr = xlog_write_setup_ophdr(log, ptr, ticket, flags);
2384 if (!ophdr)
2385 return -EIO;
2386
2387 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2388 sizeof(struct xlog_op_header));
2389
2390 len += xlog_write_setup_copy(ticket, ophdr,
2391 iclog->ic_size-log_offset,
2392 reg->i_len,
2393 ©_off, ©_len,
2394 &partial_copy,
2395 &partial_copy_len);
2396 xlog_verify_dest_ptr(log, ptr);
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406 ASSERT(copy_len >= 0);
2407 if (copy_len > 0) {
2408 memcpy(ptr, reg->i_addr + copy_off, copy_len);
2409 xlog_write_adv_cnt(&ptr, &len, &log_offset,
2410 copy_len);
2411 }
2412 copy_len += start_rec_copy + sizeof(xlog_op_header_t);
2413 record_cnt++;
2414 data_cnt += contwr ? copy_len : 0;
2415
2416 error = xlog_write_copy_finish(log, iclog, flags,
2417 &record_cnt, &data_cnt,
2418 &partial_copy,
2419 &partial_copy_len,
2420 log_offset,
2421 commit_iclog);
2422 if (error)
2423 return error;
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437 if (partial_copy)
2438 break;
2439
2440 if (++index == lv->lv_niovecs) {
2441next_lv:
2442 lv = lv->lv_next;
2443 index = 0;
2444 if (lv)
2445 vecp = lv->lv_iovecp;
2446 }
2447 if (record_cnt == 0 && ordered == false) {
2448 if (!lv)
2449 return 0;
2450 break;
2451 }
2452 }
2453 }
2454
2455 ASSERT(len == 0);
2456
2457 xlog_state_finish_copy(log, iclog, record_cnt, data_cnt);
2458 if (!commit_iclog)
2459 return xlog_state_release_iclog(log, iclog);
2460
2461 ASSERT(flags & XLOG_COMMIT_TRANS);
2462 *commit_iclog = iclog;
2463 return 0;
2464}
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482STATIC void
2483xlog_state_clean_log(
2484 struct xlog *log)
2485{
2486 xlog_in_core_t *iclog;
2487 int changed = 0;
2488
2489 iclog = log->l_iclog;
2490 do {
2491 if (iclog->ic_state == XLOG_STATE_DIRTY) {
2492 iclog->ic_state = XLOG_STATE_ACTIVE;
2493 iclog->ic_offset = 0;
2494 ASSERT(iclog->ic_callback == NULL);
2495
2496
2497
2498
2499
2500
2501
2502
2503 if (!changed &&
2504 (be32_to_cpu(iclog->ic_header.h_num_logops) ==
2505 XLOG_COVER_OPS)) {
2506 changed = 1;
2507 } else {
2508
2509
2510
2511
2512
2513 changed = 2;
2514 }
2515 iclog->ic_header.h_num_logops = 0;
2516 memset(iclog->ic_header.h_cycle_data, 0,
2517 sizeof(iclog->ic_header.h_cycle_data));
2518 iclog->ic_header.h_lsn = 0;
2519 } else if (iclog->ic_state == XLOG_STATE_ACTIVE)
2520 ;
2521 else
2522 break;
2523 iclog = iclog->ic_next;
2524 } while (iclog != log->l_iclog);
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534 if (changed) {
2535 switch (log->l_covered_state) {
2536 case XLOG_STATE_COVER_IDLE:
2537 case XLOG_STATE_COVER_NEED:
2538 case XLOG_STATE_COVER_NEED2:
2539 log->l_covered_state = XLOG_STATE_COVER_NEED;
2540 break;
2541
2542 case XLOG_STATE_COVER_DONE:
2543 if (changed == 1)
2544 log->l_covered_state = XLOG_STATE_COVER_NEED2;
2545 else
2546 log->l_covered_state = XLOG_STATE_COVER_NEED;
2547 break;
2548
2549 case XLOG_STATE_COVER_DONE2:
2550 if (changed == 1)
2551 log->l_covered_state = XLOG_STATE_COVER_IDLE;
2552 else
2553 log->l_covered_state = XLOG_STATE_COVER_NEED;
2554 break;
2555
2556 default:
2557 ASSERT(0);
2558 }
2559 }
2560}
2561
2562STATIC xfs_lsn_t
2563xlog_get_lowest_lsn(
2564 struct xlog *log)
2565{
2566 xlog_in_core_t *lsn_log;
2567 xfs_lsn_t lowest_lsn, lsn;
2568
2569 lsn_log = log->l_iclog;
2570 lowest_lsn = 0;
2571 do {
2572 if (!(lsn_log->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_DIRTY))) {
2573 lsn = be64_to_cpu(lsn_log->ic_header.h_lsn);
2574 if ((lsn && !lowest_lsn) ||
2575 (XFS_LSN_CMP(lsn, lowest_lsn) < 0)) {
2576 lowest_lsn = lsn;
2577 }
2578 }
2579 lsn_log = lsn_log->ic_next;
2580 } while (lsn_log != log->l_iclog);
2581 return lowest_lsn;
2582}
2583
2584
2585STATIC void
2586xlog_state_do_callback(
2587 struct xlog *log,
2588 int aborted,
2589 struct xlog_in_core *ciclog)
2590{
2591 xlog_in_core_t *iclog;
2592 xlog_in_core_t *first_iclog;
2593
2594 xfs_log_callback_t *cb, *cb_next;
2595 int flushcnt = 0;
2596 xfs_lsn_t lowest_lsn;
2597 int ioerrors;
2598 int loopdidcallbacks;
2599 int funcdidcallbacks;
2600 int repeats;
2601
2602 int wake = 0;
2603
2604 spin_lock(&log->l_icloglock);
2605 first_iclog = iclog = log->l_iclog;
2606 ioerrors = 0;
2607 funcdidcallbacks = 0;
2608 repeats = 0;
2609
2610 do {
2611
2612
2613
2614
2615
2616
2617
2618
2619 first_iclog = log->l_iclog;
2620 iclog = log->l_iclog;
2621 loopdidcallbacks = 0;
2622 repeats++;
2623
2624 do {
2625
2626
2627 if (iclog->ic_state &
2628 (XLOG_STATE_ACTIVE|XLOG_STATE_DIRTY)) {
2629 iclog = iclog->ic_next;
2630 continue;
2631 }
2632
2633
2634
2635
2636
2637
2638
2639
2640 if (!(iclog->ic_state & XLOG_STATE_IOERROR)) {
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651 if (!(iclog->ic_state &
2652 (XLOG_STATE_DONE_SYNC |
2653 XLOG_STATE_DO_CALLBACK))) {
2654 if (ciclog && (ciclog->ic_state ==
2655 XLOG_STATE_DONE_SYNC)) {
2656 ciclog->ic_state = XLOG_STATE_DO_CALLBACK;
2657 }
2658 break;
2659 }
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674 lowest_lsn = xlog_get_lowest_lsn(log);
2675 if (lowest_lsn &&
2676 XFS_LSN_CMP(lowest_lsn,
2677 be64_to_cpu(iclog->ic_header.h_lsn)) < 0) {
2678 iclog = iclog->ic_next;
2679 continue;
2680
2681 }
2682
2683 iclog->ic_state = XLOG_STATE_CALLBACK;
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703 ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn),
2704 be64_to_cpu(iclog->ic_header.h_lsn)) <= 0);
2705 if (iclog->ic_callback)
2706 atomic64_set(&log->l_last_sync_lsn,
2707 be64_to_cpu(iclog->ic_header.h_lsn));
2708
2709 } else
2710 ioerrors++;
2711
2712 spin_unlock(&log->l_icloglock);
2713
2714
2715
2716
2717
2718
2719
2720
2721 spin_lock(&iclog->ic_callback_lock);
2722 cb = iclog->ic_callback;
2723 while (cb) {
2724 iclog->ic_callback_tail = &(iclog->ic_callback);
2725 iclog->ic_callback = NULL;
2726 spin_unlock(&iclog->ic_callback_lock);
2727
2728
2729 for (; cb; cb = cb_next) {
2730 cb_next = cb->cb_next;
2731 cb->cb_func(cb->cb_arg, aborted);
2732 }
2733 spin_lock(&iclog->ic_callback_lock);
2734 cb = iclog->ic_callback;
2735 }
2736
2737 loopdidcallbacks++;
2738 funcdidcallbacks++;
2739
2740 spin_lock(&log->l_icloglock);
2741 ASSERT(iclog->ic_callback == NULL);
2742 spin_unlock(&iclog->ic_callback_lock);
2743 if (!(iclog->ic_state & XLOG_STATE_IOERROR))
2744 iclog->ic_state = XLOG_STATE_DIRTY;
2745
2746
2747
2748
2749
2750 xlog_state_clean_log(log);
2751
2752
2753 wake_up_all(&iclog->ic_force_wait);
2754
2755 iclog = iclog->ic_next;
2756 } while (first_iclog != iclog);
2757
2758 if (repeats > 5000) {
2759 flushcnt += repeats;
2760 repeats = 0;
2761 xfs_warn(log->l_mp,
2762 "%s: possible infinite loop (%d iterations)",
2763 __func__, flushcnt);
2764 }
2765 } while (!ioerrors && loopdidcallbacks);
2766
2767#ifdef DEBUG
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780 if (funcdidcallbacks) {
2781 first_iclog = iclog = log->l_iclog;
2782 do {
2783 ASSERT(iclog->ic_state != XLOG_STATE_DO_CALLBACK);
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793 if (iclog->ic_state == XLOG_STATE_WANT_SYNC ||
2794 iclog->ic_state & XLOG_STATE_SYNCING ||
2795 iclog->ic_state == XLOG_STATE_DONE_SYNC ||
2796 iclog->ic_state == XLOG_STATE_IOERROR )
2797 break;
2798 iclog = iclog->ic_next;
2799 } while (first_iclog != iclog);
2800 }
2801#endif
2802
2803 if (log->l_iclog->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_IOERROR))
2804 wake = 1;
2805 spin_unlock(&log->l_icloglock);
2806
2807 if (wake)
2808 wake_up_all(&log->l_flush_wait);
2809}
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825STATIC void
2826xlog_state_done_syncing(
2827 xlog_in_core_t *iclog,
2828 int aborted)
2829{
2830 struct xlog *log = iclog->ic_log;
2831
2832 spin_lock(&log->l_icloglock);
2833
2834 ASSERT(iclog->ic_state == XLOG_STATE_SYNCING ||
2835 iclog->ic_state == XLOG_STATE_IOERROR);
2836 ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
2837 ASSERT(iclog->ic_bwritecnt == 1 || iclog->ic_bwritecnt == 2);
2838
2839
2840
2841
2842
2843
2844
2845
2846 if (iclog->ic_state != XLOG_STATE_IOERROR) {
2847 if (--iclog->ic_bwritecnt == 1) {
2848 spin_unlock(&log->l_icloglock);
2849 return;
2850 }
2851 iclog->ic_state = XLOG_STATE_DONE_SYNC;
2852 }
2853
2854
2855
2856
2857
2858
2859 wake_up_all(&iclog->ic_write_wait);
2860 spin_unlock(&log->l_icloglock);
2861 xlog_state_do_callback(log, aborted, iclog);
2862}
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883STATIC int
2884xlog_state_get_iclog_space(
2885 struct xlog *log,
2886 int len,
2887 struct xlog_in_core **iclogp,
2888 struct xlog_ticket *ticket,
2889 int *continued_write,
2890 int *logoffsetp)
2891{
2892 int log_offset;
2893 xlog_rec_header_t *head;
2894 xlog_in_core_t *iclog;
2895 int error;
2896
2897restart:
2898 spin_lock(&log->l_icloglock);
2899 if (XLOG_FORCED_SHUTDOWN(log)) {
2900 spin_unlock(&log->l_icloglock);
2901 return -EIO;
2902 }
2903
2904 iclog = log->l_iclog;
2905 if (iclog->ic_state != XLOG_STATE_ACTIVE) {
2906 XFS_STATS_INC(log->l_mp, xs_log_noiclogs);
2907
2908
2909 xlog_wait(&log->l_flush_wait, &log->l_icloglock);
2910 goto restart;
2911 }
2912
2913 head = &iclog->ic_header;
2914
2915 atomic_inc(&iclog->ic_refcnt);
2916 log_offset = iclog->ic_offset;
2917
2918
2919
2920
2921
2922
2923 if (log_offset == 0) {
2924 ticket->t_curr_res -= log->l_iclog_hsize;
2925 xlog_tic_add_region(ticket,
2926 log->l_iclog_hsize,
2927 XLOG_REG_TYPE_LRHEADER);
2928 head->h_cycle = cpu_to_be32(log->l_curr_cycle);
2929 head->h_lsn = cpu_to_be64(
2930 xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
2931 ASSERT(log->l_curr_block >= 0);
2932 }
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943 if (iclog->ic_size - iclog->ic_offset < 2*sizeof(xlog_op_header_t)) {
2944 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
2945
2946
2947
2948
2949
2950
2951
2952
2953 if (!atomic_add_unless(&iclog->ic_refcnt, -1, 1)) {
2954
2955 spin_unlock(&log->l_icloglock);
2956 error = xlog_state_release_iclog(log, iclog);
2957 if (error)
2958 return error;
2959 } else {
2960 spin_unlock(&log->l_icloglock);
2961 }
2962 goto restart;
2963 }
2964
2965
2966
2967
2968
2969
2970
2971 if (len <= iclog->ic_size - iclog->ic_offset) {
2972 *continued_write = 0;
2973 iclog->ic_offset += len;
2974 } else {
2975 *continued_write = 1;
2976 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
2977 }
2978 *iclogp = iclog;
2979
2980 ASSERT(iclog->ic_offset <= iclog->ic_size);
2981 spin_unlock(&log->l_icloglock);
2982
2983 *logoffsetp = log_offset;
2984 return 0;
2985}
2986
2987
2988
2989
2990
2991
2992
2993
2994STATIC void
2995xlog_regrant_reserve_log_space(
2996 struct xlog *log,
2997 struct xlog_ticket *ticket)
2998{
2999 trace_xfs_log_regrant_reserve_enter(log, ticket);
3000
3001 if (ticket->t_cnt > 0)
3002 ticket->t_cnt--;
3003
3004 xlog_grant_sub_space(log, &log->l_reserve_head.grant,
3005 ticket->t_curr_res);
3006 xlog_grant_sub_space(log, &log->l_write_head.grant,
3007 ticket->t_curr_res);
3008 ticket->t_curr_res = ticket->t_unit_res;
3009 xlog_tic_reset_res(ticket);
3010
3011 trace_xfs_log_regrant_reserve_sub(log, ticket);
3012
3013
3014 if (ticket->t_cnt > 0)
3015 return;
3016
3017 xlog_grant_add_space(log, &log->l_reserve_head.grant,
3018 ticket->t_unit_res);
3019
3020 trace_xfs_log_regrant_reserve_exit(log, ticket);
3021
3022 ticket->t_curr_res = ticket->t_unit_res;
3023 xlog_tic_reset_res(ticket);
3024}
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041STATIC void
3042xlog_ungrant_log_space(
3043 struct xlog *log,
3044 struct xlog_ticket *ticket)
3045{
3046 int bytes;
3047
3048 if (ticket->t_cnt > 0)
3049 ticket->t_cnt--;
3050
3051 trace_xfs_log_ungrant_enter(log, ticket);
3052 trace_xfs_log_ungrant_sub(log, ticket);
3053
3054
3055
3056
3057
3058 bytes = ticket->t_curr_res;
3059 if (ticket->t_cnt > 0) {
3060 ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV);
3061 bytes += ticket->t_unit_res*ticket->t_cnt;
3062 }
3063
3064 xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
3065 xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
3066
3067 trace_xfs_log_ungrant_exit(log, ticket);
3068
3069 xfs_log_space_wake(log->l_mp);
3070}
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081STATIC int
3082xlog_state_release_iclog(
3083 struct xlog *log,
3084 struct xlog_in_core *iclog)
3085{
3086 int sync = 0;
3087
3088 if (iclog->ic_state & XLOG_STATE_IOERROR)
3089 return -EIO;
3090
3091 ASSERT(atomic_read(&iclog->ic_refcnt) > 0);
3092 if (!atomic_dec_and_lock(&iclog->ic_refcnt, &log->l_icloglock))
3093 return 0;
3094
3095 if (iclog->ic_state & XLOG_STATE_IOERROR) {
3096 spin_unlock(&log->l_icloglock);
3097 return -EIO;
3098 }
3099 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE ||
3100 iclog->ic_state == XLOG_STATE_WANT_SYNC);
3101
3102 if (iclog->ic_state == XLOG_STATE_WANT_SYNC) {
3103
3104 xfs_lsn_t tail_lsn = xlog_assign_tail_lsn(log->l_mp);
3105 sync++;
3106 iclog->ic_state = XLOG_STATE_SYNCING;
3107 iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn);
3108 xlog_verify_tail_lsn(log, iclog, tail_lsn);
3109
3110 }
3111 spin_unlock(&log->l_icloglock);
3112
3113
3114
3115
3116
3117
3118
3119
3120 if (sync)
3121 return xlog_sync(log, iclog);
3122 return 0;
3123}
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133STATIC void
3134xlog_state_switch_iclogs(
3135 struct xlog *log,
3136 struct xlog_in_core *iclog,
3137 int eventual_size)
3138{
3139 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
3140 if (!eventual_size)
3141 eventual_size = iclog->ic_offset;
3142 iclog->ic_state = XLOG_STATE_WANT_SYNC;
3143 iclog->ic_header.h_prev_block = cpu_to_be32(log->l_prev_block);
3144 log->l_prev_block = log->l_curr_block;
3145 log->l_prev_cycle = log->l_curr_cycle;
3146
3147
3148 log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize);
3149
3150
3151 if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
3152 log->l_mp->m_sb.sb_logsunit > 1) {
3153 __uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit);
3154 log->l_curr_block = roundup(log->l_curr_block, sunit_bb);
3155 }
3156
3157 if (log->l_curr_block >= log->l_logBBsize) {
3158
3159
3160
3161
3162
3163
3164
3165 log->l_curr_block -= log->l_logBBsize;
3166 ASSERT(log->l_curr_block >= 0);
3167 smp_wmb();
3168 log->l_curr_cycle++;
3169 if (log->l_curr_cycle == XLOG_HEADER_MAGIC_NUM)
3170 log->l_curr_cycle++;
3171 }
3172 ASSERT(iclog == log->l_iclog);
3173 log->l_iclog = iclog->ic_next;
3174}
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203int
3204_xfs_log_force(
3205 struct xfs_mount *mp,
3206 uint flags,
3207 int *log_flushed)
3208{
3209 struct xlog *log = mp->m_log;
3210 struct xlog_in_core *iclog;
3211 xfs_lsn_t lsn;
3212
3213 XFS_STATS_INC(mp, xs_log_force);
3214
3215 xlog_cil_force(log);
3216
3217 spin_lock(&log->l_icloglock);
3218
3219 iclog = log->l_iclog;
3220 if (iclog->ic_state & XLOG_STATE_IOERROR) {
3221 spin_unlock(&log->l_icloglock);
3222 return -EIO;
3223 }
3224
3225
3226
3227
3228 if (iclog->ic_state == XLOG_STATE_ACTIVE ||
3229 iclog->ic_state == XLOG_STATE_DIRTY) {
3230
3231
3232
3233
3234
3235
3236
3237 if (iclog->ic_state == XLOG_STATE_DIRTY ||
3238 (atomic_read(&iclog->ic_refcnt) == 0
3239 && iclog->ic_offset == 0)) {
3240 iclog = iclog->ic_prev;
3241 if (iclog->ic_state == XLOG_STATE_ACTIVE ||
3242 iclog->ic_state == XLOG_STATE_DIRTY)
3243 goto no_sleep;
3244 else
3245 goto maybe_sleep;
3246 } else {
3247 if (atomic_read(&iclog->ic_refcnt) == 0) {
3248
3249
3250
3251
3252
3253
3254 atomic_inc(&iclog->ic_refcnt);
3255 lsn = be64_to_cpu(iclog->ic_header.h_lsn);
3256 xlog_state_switch_iclogs(log, iclog, 0);
3257 spin_unlock(&log->l_icloglock);
3258
3259 if (xlog_state_release_iclog(log, iclog))
3260 return -EIO;
3261
3262 if (log_flushed)
3263 *log_flushed = 1;
3264 spin_lock(&log->l_icloglock);
3265 if (be64_to_cpu(iclog->ic_header.h_lsn) == lsn &&
3266 iclog->ic_state != XLOG_STATE_DIRTY)
3267 goto maybe_sleep;
3268 else
3269 goto no_sleep;
3270 } else {
3271
3272
3273
3274
3275
3276 xlog_state_switch_iclogs(log, iclog, 0);
3277 goto maybe_sleep;
3278 }
3279 }
3280 }
3281
3282
3283
3284
3285
3286maybe_sleep:
3287 if (flags & XFS_LOG_SYNC) {
3288
3289
3290
3291
3292
3293
3294 if (iclog->ic_state & XLOG_STATE_IOERROR) {
3295 spin_unlock(&log->l_icloglock);
3296 return -EIO;
3297 }
3298 XFS_STATS_INC(mp, xs_log_force_sleep);
3299 xlog_wait(&iclog->ic_force_wait, &log->l_icloglock);
3300
3301
3302
3303
3304
3305 if (iclog->ic_state & XLOG_STATE_IOERROR)
3306 return -EIO;
3307 if (log_flushed)
3308 *log_flushed = 1;
3309 } else {
3310
3311no_sleep:
3312 spin_unlock(&log->l_icloglock);
3313 }
3314 return 0;
3315}
3316
3317
3318
3319
3320
3321
3322void
3323xfs_log_force(
3324 xfs_mount_t *mp,
3325 uint flags)
3326{
3327 int error;
3328
3329 trace_xfs_log_force(mp, 0, _RET_IP_);
3330 error = _xfs_log_force(mp, flags, NULL);
3331 if (error)
3332 xfs_warn(mp, "%s: error %d returned.", __func__, error);
3333}
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350int
3351_xfs_log_force_lsn(
3352 struct xfs_mount *mp,
3353 xfs_lsn_t lsn,
3354 uint flags,
3355 int *log_flushed)
3356{
3357 struct xlog *log = mp->m_log;
3358 struct xlog_in_core *iclog;
3359 int already_slept = 0;
3360
3361 ASSERT(lsn != 0);
3362
3363 XFS_STATS_INC(mp, xs_log_force);
3364
3365 lsn = xlog_cil_force_lsn(log, lsn);
3366 if (lsn == NULLCOMMITLSN)
3367 return 0;
3368
3369try_again:
3370 spin_lock(&log->l_icloglock);
3371 iclog = log->l_iclog;
3372 if (iclog->ic_state & XLOG_STATE_IOERROR) {
3373 spin_unlock(&log->l_icloglock);
3374 return -EIO;
3375 }
3376
3377 do {
3378 if (be64_to_cpu(iclog->ic_header.h_lsn) != lsn) {
3379 iclog = iclog->ic_next;
3380 continue;
3381 }
3382
3383 if (iclog->ic_state == XLOG_STATE_DIRTY) {
3384 spin_unlock(&log->l_icloglock);
3385 return 0;
3386 }
3387
3388 if (iclog->ic_state == XLOG_STATE_ACTIVE) {
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407 if (!already_slept &&
3408 (iclog->ic_prev->ic_state &
3409 (XLOG_STATE_WANT_SYNC | XLOG_STATE_SYNCING))) {
3410 ASSERT(!(iclog->ic_state & XLOG_STATE_IOERROR));
3411
3412 XFS_STATS_INC(mp, xs_log_force_sleep);
3413
3414 xlog_wait(&iclog->ic_prev->ic_write_wait,
3415 &log->l_icloglock);
3416 if (log_flushed)
3417 *log_flushed = 1;
3418 already_slept = 1;
3419 goto try_again;
3420 }
3421 atomic_inc(&iclog->ic_refcnt);
3422 xlog_state_switch_iclogs(log, iclog, 0);
3423 spin_unlock(&log->l_icloglock);
3424 if (xlog_state_release_iclog(log, iclog))
3425 return -EIO;
3426 if (log_flushed)
3427 *log_flushed = 1;
3428 spin_lock(&log->l_icloglock);
3429 }
3430
3431 if ((flags & XFS_LOG_SYNC) &&
3432 !(iclog->ic_state &
3433 (XLOG_STATE_ACTIVE | XLOG_STATE_DIRTY))) {
3434
3435
3436
3437
3438 if (iclog->ic_state & XLOG_STATE_IOERROR) {
3439 spin_unlock(&log->l_icloglock);
3440 return -EIO;
3441 }
3442 XFS_STATS_INC(mp, xs_log_force_sleep);
3443 xlog_wait(&iclog->ic_force_wait, &log->l_icloglock);
3444
3445
3446
3447
3448
3449 if (iclog->ic_state & XLOG_STATE_IOERROR)
3450 return -EIO;
3451
3452 if (log_flushed)
3453 *log_flushed = 1;
3454 } else {
3455 spin_unlock(&log->l_icloglock);
3456 }
3457
3458 return 0;
3459 } while (iclog != log->l_iclog);
3460
3461 spin_unlock(&log->l_icloglock);
3462 return 0;
3463}
3464
3465
3466
3467
3468
3469
3470void
3471xfs_log_force_lsn(
3472 xfs_mount_t *mp,
3473 xfs_lsn_t lsn,
3474 uint flags)
3475{
3476 int error;
3477
3478 trace_xfs_log_force(mp, lsn, _RET_IP_);
3479 error = _xfs_log_force_lsn(mp, lsn, flags, NULL);
3480 if (error)
3481 xfs_warn(mp, "%s: error %d returned.", __func__, error);
3482}
3483
3484
3485
3486
3487
3488STATIC void
3489xlog_state_want_sync(
3490 struct xlog *log,
3491 struct xlog_in_core *iclog)
3492{
3493 assert_spin_locked(&log->l_icloglock);
3494
3495 if (iclog->ic_state == XLOG_STATE_ACTIVE) {
3496 xlog_state_switch_iclogs(log, iclog, 0);
3497 } else {
3498 ASSERT(iclog->ic_state &
3499 (XLOG_STATE_WANT_SYNC|XLOG_STATE_IOERROR));
3500 }
3501}
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514void
3515xfs_log_ticket_put(
3516 xlog_ticket_t *ticket)
3517{
3518 ASSERT(atomic_read(&ticket->t_ref) > 0);
3519 if (atomic_dec_and_test(&ticket->t_ref))
3520 kmem_zone_free(xfs_log_ticket_zone, ticket);
3521}
3522
3523xlog_ticket_t *
3524xfs_log_ticket_get(
3525 xlog_ticket_t *ticket)
3526{
3527 ASSERT(atomic_read(&ticket->t_ref) > 0);
3528 atomic_inc(&ticket->t_ref);
3529 return ticket;
3530}
3531
3532
3533
3534
3535
3536int
3537xfs_log_calc_unit_res(
3538 struct xfs_mount *mp,
3539 int unit_bytes)
3540{
3541 struct xlog *log = mp->m_log;
3542 int iclog_space;
3543 uint num_headers;
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577 unit_bytes += sizeof(xlog_op_header_t);
3578 unit_bytes += sizeof(xfs_trans_header_t);
3579
3580
3581 unit_bytes += sizeof(xlog_op_header_t);
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600 iclog_space = log->l_iclog_size - log->l_iclog_hsize;
3601 num_headers = howmany(unit_bytes, iclog_space);
3602
3603
3604 unit_bytes += sizeof(xlog_op_header_t) * num_headers;
3605
3606
3607 while (!num_headers ||
3608 howmany(unit_bytes, iclog_space) > num_headers) {
3609 unit_bytes += sizeof(xlog_op_header_t);
3610 num_headers++;
3611 }
3612 unit_bytes += log->l_iclog_hsize * num_headers;
3613
3614
3615 unit_bytes += log->l_iclog_hsize;
3616
3617
3618 if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) {
3619
3620 unit_bytes += 2 * mp->m_sb.sb_logsunit;
3621 } else {
3622
3623 unit_bytes += 2 * BBSIZE;
3624 }
3625
3626 return unit_bytes;
3627}
3628
3629
3630
3631
3632struct xlog_ticket *
3633xlog_ticket_alloc(
3634 struct xlog *log,
3635 int unit_bytes,
3636 int cnt,
3637 char client,
3638 bool permanent,
3639 xfs_km_flags_t alloc_flags)
3640{
3641 struct xlog_ticket *tic;
3642 int unit_res;
3643
3644 tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
3645 if (!tic)
3646 return NULL;
3647
3648 unit_res = xfs_log_calc_unit_res(log->l_mp, unit_bytes);
3649
3650 atomic_set(&tic->t_ref, 1);
3651 tic->t_task = current;
3652 INIT_LIST_HEAD(&tic->t_queue);
3653 tic->t_unit_res = unit_res;
3654 tic->t_curr_res = unit_res;
3655 tic->t_cnt = cnt;
3656 tic->t_ocnt = cnt;
3657 tic->t_tid = prandom_u32();
3658 tic->t_clientid = client;
3659 tic->t_flags = XLOG_TIC_INITED;
3660 if (permanent)
3661 tic->t_flags |= XLOG_TIC_PERM_RESERV;
3662
3663 xlog_tic_reset_res(tic);
3664
3665 return tic;
3666}
3667
3668
3669
3670
3671
3672
3673
3674
3675#if defined(DEBUG)
3676
3677
3678
3679
3680
3681void
3682xlog_verify_dest_ptr(
3683 struct xlog *log,
3684 void *ptr)
3685{
3686 int i;
3687 int good_ptr = 0;
3688
3689 for (i = 0; i < log->l_iclog_bufs; i++) {
3690 if (ptr >= log->l_iclog_bak[i] &&
3691 ptr <= log->l_iclog_bak[i] + log->l_iclog_size)
3692 good_ptr++;
3693 }
3694
3695 if (!good_ptr)
3696 xfs_emerg(log->l_mp, "%s: invalid ptr", __func__);
3697}
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710STATIC void
3711xlog_verify_grant_tail(
3712 struct xlog *log)
3713{
3714 int tail_cycle, tail_blocks;
3715 int cycle, space;
3716
3717 xlog_crack_grant_head(&log->l_write_head.grant, &cycle, &space);
3718 xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks);
3719 if (tail_cycle != cycle) {
3720 if (cycle - 1 != tail_cycle &&
3721 !(log->l_flags & XLOG_TAIL_WARN)) {
3722 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3723 "%s: cycle - 1 != tail_cycle", __func__);
3724 log->l_flags |= XLOG_TAIL_WARN;
3725 }
3726
3727 if (space > BBTOB(tail_blocks) &&
3728 !(log->l_flags & XLOG_TAIL_WARN)) {
3729 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3730 "%s: space > BBTOB(tail_blocks)", __func__);
3731 log->l_flags |= XLOG_TAIL_WARN;
3732 }
3733 }
3734}
3735
3736
3737STATIC void
3738xlog_verify_tail_lsn(
3739 struct xlog *log,
3740 struct xlog_in_core *iclog,
3741 xfs_lsn_t tail_lsn)
3742{
3743 int blocks;
3744
3745 if (CYCLE_LSN(tail_lsn) == log->l_prev_cycle) {
3746 blocks =
3747 log->l_logBBsize - (log->l_prev_block - BLOCK_LSN(tail_lsn));
3748 if (blocks < BTOBB(iclog->ic_offset)+BTOBB(log->l_iclog_hsize))
3749 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3750 } else {
3751 ASSERT(CYCLE_LSN(tail_lsn)+1 == log->l_prev_cycle);
3752
3753 if (BLOCK_LSN(tail_lsn) == log->l_prev_block)
3754 xfs_emerg(log->l_mp, "%s: tail wrapped", __func__);
3755
3756 blocks = BLOCK_LSN(tail_lsn) - log->l_prev_block;
3757 if (blocks < BTOBB(iclog->ic_offset) + 1)
3758 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3759 }
3760}
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777STATIC void
3778xlog_verify_iclog(
3779 struct xlog *log,
3780 struct xlog_in_core *iclog,
3781 int count,
3782 bool syncing)
3783{
3784 xlog_op_header_t *ophead;
3785 xlog_in_core_t *icptr;
3786 xlog_in_core_2_t *xhdr;
3787 void *base_ptr, *ptr, *p;
3788 ptrdiff_t field_offset;
3789 __uint8_t clientid;
3790 int len, i, j, k, op_len;
3791 int idx;
3792
3793
3794 spin_lock(&log->l_icloglock);
3795 icptr = log->l_iclog;
3796 for (i = 0; i < log->l_iclog_bufs; i++, icptr = icptr->ic_next)
3797 ASSERT(icptr);
3798
3799 if (icptr != log->l_iclog)
3800 xfs_emerg(log->l_mp, "%s: corrupt iclog ring", __func__);
3801 spin_unlock(&log->l_icloglock);
3802
3803
3804 if (iclog->ic_header.h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3805 xfs_emerg(log->l_mp, "%s: invalid magic num", __func__);
3806
3807 base_ptr = ptr = &iclog->ic_header;
3808 p = &iclog->ic_header;
3809 for (ptr += BBSIZE; ptr < base_ptr + count; ptr += BBSIZE) {
3810 if (*(__be32 *)ptr == cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3811 xfs_emerg(log->l_mp, "%s: unexpected magic num",
3812 __func__);
3813 }
3814
3815
3816 len = be32_to_cpu(iclog->ic_header.h_num_logops);
3817 base_ptr = ptr = iclog->ic_datap;
3818 ophead = ptr;
3819 xhdr = iclog->ic_data;
3820 for (i = 0; i < len; i++) {
3821 ophead = ptr;
3822
3823
3824 p = &ophead->oh_clientid;
3825 field_offset = p - base_ptr;
3826 if (!syncing || (field_offset & 0x1ff)) {
3827 clientid = ophead->oh_clientid;
3828 } else {
3829 idx = BTOBBT((char *)&ophead->oh_clientid - iclog->ic_datap);
3830 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3831 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3832 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3833 clientid = xlog_get_client_id(
3834 xhdr[j].hic_xheader.xh_cycle_data[k]);
3835 } else {
3836 clientid = xlog_get_client_id(
3837 iclog->ic_header.h_cycle_data[idx]);
3838 }
3839 }
3840 if (clientid != XFS_TRANSACTION && clientid != XFS_LOG)
3841 xfs_warn(log->l_mp,
3842 "%s: invalid clientid %d op 0x%p offset 0x%lx",
3843 __func__, clientid, ophead,
3844 (unsigned long)field_offset);
3845
3846
3847 p = &ophead->oh_len;
3848 field_offset = p - base_ptr;
3849 if (!syncing || (field_offset & 0x1ff)) {
3850 op_len = be32_to_cpu(ophead->oh_len);
3851 } else {
3852 idx = BTOBBT((uintptr_t)&ophead->oh_len -
3853 (uintptr_t)iclog->ic_datap);
3854 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3855 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3856 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3857 op_len = be32_to_cpu(xhdr[j].hic_xheader.xh_cycle_data[k]);
3858 } else {
3859 op_len = be32_to_cpu(iclog->ic_header.h_cycle_data[idx]);
3860 }
3861 }
3862 ptr += sizeof(xlog_op_header_t) + op_len;
3863 }
3864}
3865#endif
3866
3867
3868
3869
3870STATIC int
3871xlog_state_ioerror(
3872 struct xlog *log)
3873{
3874 xlog_in_core_t *iclog, *ic;
3875
3876 iclog = log->l_iclog;
3877 if (! (iclog->ic_state & XLOG_STATE_IOERROR)) {
3878
3879
3880
3881
3882 ic = iclog;
3883 do {
3884 ic->ic_state = XLOG_STATE_IOERROR;
3885 ic = ic->ic_next;
3886 } while (ic != iclog);
3887 return 0;
3888 }
3889
3890
3891
3892 return 1;
3893}
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911int
3912xfs_log_force_umount(
3913 struct xfs_mount *mp,
3914 int logerror)
3915{
3916 struct xlog *log;
3917 int retval;
3918
3919 log = mp->m_log;
3920
3921
3922
3923
3924
3925 if (!log ||
3926 log->l_flags & XLOG_ACTIVE_RECOVERY) {
3927 mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN;
3928 if (mp->m_sb_bp)
3929 mp->m_sb_bp->b_flags |= XBF_DONE;
3930 return 0;
3931 }
3932
3933
3934
3935
3936
3937 if (logerror && log->l_iclog->ic_state & XLOG_STATE_IOERROR) {
3938 ASSERT(XLOG_FORCED_SHUTDOWN(log));
3939 return 1;
3940 }
3941
3942
3943
3944
3945
3946
3947
3948
3949 if (!logerror)
3950 _xfs_log_force(mp, XFS_LOG_SYNC, NULL);
3951
3952
3953
3954
3955
3956 spin_lock(&log->l_icloglock);
3957 mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN;
3958 if (mp->m_sb_bp)
3959 mp->m_sb_bp->b_flags |= XBF_DONE;
3960
3961
3962
3963
3964
3965 log->l_flags |= XLOG_IO_ERROR;
3966 retval = xlog_state_ioerror(log);
3967 spin_unlock(&log->l_icloglock);
3968
3969
3970
3971
3972
3973
3974
3975
3976 xlog_grant_head_wake_all(&log->l_reserve_head);
3977 xlog_grant_head_wake_all(&log->l_write_head);
3978
3979
3980
3981
3982
3983
3984
3985 wake_up_all(&log->l_cilp->xc_commit_wait);
3986 xlog_state_do_callback(log, XFS_LI_ABORTED, NULL);
3987
3988#ifdef XFSERRORDEBUG
3989 {
3990 xlog_in_core_t *iclog;
3991
3992 spin_lock(&log->l_icloglock);
3993 iclog = log->l_iclog;
3994 do {
3995 ASSERT(iclog->ic_callback == 0);
3996 iclog = iclog->ic_next;
3997 } while (iclog != log->l_iclog);
3998 spin_unlock(&log->l_icloglock);
3999 }
4000#endif
4001
4002 return retval;
4003}
4004
4005STATIC int
4006xlog_iclogs_empty(
4007 struct xlog *log)
4008{
4009 xlog_in_core_t *iclog;
4010
4011 iclog = log->l_iclog;
4012 do {
4013
4014
4015
4016 if (iclog->ic_header.h_num_logops)
4017 return 0;
4018 iclog = iclog->ic_next;
4019 } while (iclog != log->l_iclog);
4020 return 1;
4021}
4022
4023
4024
4025
4026
4027bool
4028xfs_log_check_lsn(
4029 struct xfs_mount *mp,
4030 xfs_lsn_t lsn)
4031{
4032 struct xlog *log = mp->m_log;
4033 bool valid;
4034
4035
4036
4037
4038
4039
4040 if (mp->m_flags & XFS_MOUNT_NORECOVERY)
4041 return true;
4042
4043
4044
4045
4046
4047 if (lsn == NULLCOMMITLSN)
4048 return true;
4049
4050 valid = xlog_valid_lsn(mp->m_log, lsn);
4051
4052
4053 if (!valid) {
4054 spin_lock(&log->l_icloglock);
4055 xfs_warn(mp,
4056"Corruption warning: Metadata has LSN (%d:%d) ahead of current LSN (%d:%d). "
4057"Please unmount and run xfs_repair (>= v4.3) to resolve.",
4058 CYCLE_LSN(lsn), BLOCK_LSN(lsn),
4059 log->l_curr_cycle, log->l_curr_block);
4060 spin_unlock(&log->l_icloglock);
4061 }
4062
4063 return valid;
4064}
4065