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