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