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