0001
0002
0003
0004
0005
0006 #include "xfs.h"
0007 #include "xfs_fs.h"
0008 #include "xfs_shared.h"
0009 #include "xfs_format.h"
0010 #include "xfs_log_format.h"
0011 #include "xfs_trans_resv.h"
0012 #include "xfs_mount.h"
0013 #include "xfs_errortag.h"
0014 #include "xfs_error.h"
0015 #include "xfs_trans.h"
0016 #include "xfs_trans_priv.h"
0017 #include "xfs_log.h"
0018 #include "xfs_log_priv.h"
0019 #include "xfs_trace.h"
0020 #include "xfs_sysfs.h"
0021 #include "xfs_sb.h"
0022 #include "xfs_health.h"
0023
0024 struct kmem_cache *xfs_log_ticket_cache;
0025
0026
0027 STATIC struct xlog *
0028 xlog_alloc_log(
0029 struct xfs_mount *mp,
0030 struct xfs_buftarg *log_target,
0031 xfs_daddr_t blk_offset,
0032 int num_bblks);
0033 STATIC int
0034 xlog_space_left(
0035 struct xlog *log,
0036 atomic64_t *head);
0037 STATIC void
0038 xlog_dealloc_log(
0039 struct xlog *log);
0040
0041
0042 STATIC void xlog_state_done_syncing(
0043 struct xlog_in_core *iclog);
0044 STATIC void xlog_state_do_callback(
0045 struct xlog *log);
0046 STATIC int
0047 xlog_state_get_iclog_space(
0048 struct xlog *log,
0049 int len,
0050 struct xlog_in_core **iclog,
0051 struct xlog_ticket *ticket,
0052 int *logoffsetp);
0053 STATIC void
0054 xlog_grant_push_ail(
0055 struct xlog *log,
0056 int need_bytes);
0057 STATIC void
0058 xlog_sync(
0059 struct xlog *log,
0060 struct xlog_in_core *iclog,
0061 struct xlog_ticket *ticket);
0062 #if defined(DEBUG)
0063 STATIC void
0064 xlog_verify_grant_tail(
0065 struct xlog *log);
0066 STATIC void
0067 xlog_verify_iclog(
0068 struct xlog *log,
0069 struct xlog_in_core *iclog,
0070 int count);
0071 STATIC void
0072 xlog_verify_tail_lsn(
0073 struct xlog *log,
0074 struct xlog_in_core *iclog);
0075 #else
0076 #define xlog_verify_grant_tail(a)
0077 #define xlog_verify_iclog(a,b,c)
0078 #define xlog_verify_tail_lsn(a,b)
0079 #endif
0080
0081 STATIC int
0082 xlog_iclogs_empty(
0083 struct xlog *log);
0084
0085 static int
0086 xfs_log_cover(struct xfs_mount *);
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 void *
0106 xlog_prepare_iovec(
0107 struct xfs_log_vec *lv,
0108 struct xfs_log_iovec **vecp,
0109 uint type)
0110 {
0111 struct xfs_log_iovec *vec = *vecp;
0112 struct xlog_op_header *oph;
0113 uint32_t len;
0114 void *buf;
0115
0116 if (vec) {
0117 ASSERT(vec - lv->lv_iovecp < lv->lv_niovecs);
0118 vec++;
0119 } else {
0120 vec = &lv->lv_iovecp[0];
0121 }
0122
0123 len = lv->lv_buf_len + sizeof(struct xlog_op_header);
0124 if (!IS_ALIGNED(len, sizeof(uint64_t))) {
0125 lv->lv_buf_len = round_up(len, sizeof(uint64_t)) -
0126 sizeof(struct xlog_op_header);
0127 }
0128
0129 vec->i_type = type;
0130 vec->i_addr = lv->lv_buf + lv->lv_buf_len;
0131
0132 oph = vec->i_addr;
0133 oph->oh_clientid = XFS_TRANSACTION;
0134 oph->oh_res2 = 0;
0135 oph->oh_flags = 0;
0136
0137 buf = vec->i_addr + sizeof(struct xlog_op_header);
0138 ASSERT(IS_ALIGNED((unsigned long)buf, sizeof(uint64_t)));
0139
0140 *vecp = vec;
0141 return buf;
0142 }
0143
0144 static void
0145 xlog_grant_sub_space(
0146 struct xlog *log,
0147 atomic64_t *head,
0148 int bytes)
0149 {
0150 int64_t head_val = atomic64_read(head);
0151 int64_t new, old;
0152
0153 do {
0154 int cycle, space;
0155
0156 xlog_crack_grant_head_val(head_val, &cycle, &space);
0157
0158 space -= bytes;
0159 if (space < 0) {
0160 space += log->l_logsize;
0161 cycle--;
0162 }
0163
0164 old = head_val;
0165 new = xlog_assign_grant_head_val(cycle, space);
0166 head_val = atomic64_cmpxchg(head, old, new);
0167 } while (head_val != old);
0168 }
0169
0170 static void
0171 xlog_grant_add_space(
0172 struct xlog *log,
0173 atomic64_t *head,
0174 int bytes)
0175 {
0176 int64_t head_val = atomic64_read(head);
0177 int64_t new, old;
0178
0179 do {
0180 int tmp;
0181 int cycle, space;
0182
0183 xlog_crack_grant_head_val(head_val, &cycle, &space);
0184
0185 tmp = log->l_logsize - space;
0186 if (tmp > bytes)
0187 space += bytes;
0188 else {
0189 space = bytes - tmp;
0190 cycle++;
0191 }
0192
0193 old = head_val;
0194 new = xlog_assign_grant_head_val(cycle, space);
0195 head_val = atomic64_cmpxchg(head, old, new);
0196 } while (head_val != old);
0197 }
0198
0199 STATIC void
0200 xlog_grant_head_init(
0201 struct xlog_grant_head *head)
0202 {
0203 xlog_assign_grant_head(&head->grant, 1, 0);
0204 INIT_LIST_HEAD(&head->waiters);
0205 spin_lock_init(&head->lock);
0206 }
0207
0208 STATIC void
0209 xlog_grant_head_wake_all(
0210 struct xlog_grant_head *head)
0211 {
0212 struct xlog_ticket *tic;
0213
0214 spin_lock(&head->lock);
0215 list_for_each_entry(tic, &head->waiters, t_queue)
0216 wake_up_process(tic->t_task);
0217 spin_unlock(&head->lock);
0218 }
0219
0220 static inline int
0221 xlog_ticket_reservation(
0222 struct xlog *log,
0223 struct xlog_grant_head *head,
0224 struct xlog_ticket *tic)
0225 {
0226 if (head == &log->l_write_head) {
0227 ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
0228 return tic->t_unit_res;
0229 } else {
0230 if (tic->t_flags & XLOG_TIC_PERM_RESERV)
0231 return tic->t_unit_res * tic->t_cnt;
0232 else
0233 return tic->t_unit_res;
0234 }
0235 }
0236
0237 STATIC bool
0238 xlog_grant_head_wake(
0239 struct xlog *log,
0240 struct xlog_grant_head *head,
0241 int *free_bytes)
0242 {
0243 struct xlog_ticket *tic;
0244 int need_bytes;
0245 bool woken_task = false;
0246
0247 list_for_each_entry(tic, &head->waiters, t_queue) {
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270 need_bytes = xlog_ticket_reservation(log, head, tic);
0271 if (*free_bytes < need_bytes) {
0272 if (!woken_task)
0273 xlog_grant_push_ail(log, need_bytes);
0274 return false;
0275 }
0276
0277 *free_bytes -= need_bytes;
0278 trace_xfs_log_grant_wake_up(log, tic);
0279 wake_up_process(tic->t_task);
0280 woken_task = true;
0281 }
0282
0283 return true;
0284 }
0285
0286 STATIC int
0287 xlog_grant_head_wait(
0288 struct xlog *log,
0289 struct xlog_grant_head *head,
0290 struct xlog_ticket *tic,
0291 int need_bytes) __releases(&head->lock)
0292 __acquires(&head->lock)
0293 {
0294 list_add_tail(&tic->t_queue, &head->waiters);
0295
0296 do {
0297 if (xlog_is_shutdown(log))
0298 goto shutdown;
0299 xlog_grant_push_ail(log, need_bytes);
0300
0301 __set_current_state(TASK_UNINTERRUPTIBLE);
0302 spin_unlock(&head->lock);
0303
0304 XFS_STATS_INC(log->l_mp, xs_sleep_logspace);
0305
0306 trace_xfs_log_grant_sleep(log, tic);
0307 schedule();
0308 trace_xfs_log_grant_wake(log, tic);
0309
0310 spin_lock(&head->lock);
0311 if (xlog_is_shutdown(log))
0312 goto shutdown;
0313 } while (xlog_space_left(log, &head->grant) < need_bytes);
0314
0315 list_del_init(&tic->t_queue);
0316 return 0;
0317 shutdown:
0318 list_del_init(&tic->t_queue);
0319 return -EIO;
0320 }
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 STATIC int
0340 xlog_grant_head_check(
0341 struct xlog *log,
0342 struct xlog_grant_head *head,
0343 struct xlog_ticket *tic,
0344 int *need_bytes)
0345 {
0346 int free_bytes;
0347 int error = 0;
0348
0349 ASSERT(!xlog_in_recovery(log));
0350
0351
0352
0353
0354
0355
0356
0357 *need_bytes = xlog_ticket_reservation(log, head, tic);
0358 free_bytes = xlog_space_left(log, &head->grant);
0359 if (!list_empty_careful(&head->waiters)) {
0360 spin_lock(&head->lock);
0361 if (!xlog_grant_head_wake(log, head, &free_bytes) ||
0362 free_bytes < *need_bytes) {
0363 error = xlog_grant_head_wait(log, head, tic,
0364 *need_bytes);
0365 }
0366 spin_unlock(&head->lock);
0367 } else if (free_bytes < *need_bytes) {
0368 spin_lock(&head->lock);
0369 error = xlog_grant_head_wait(log, head, tic, *need_bytes);
0370 spin_unlock(&head->lock);
0371 }
0372
0373 return error;
0374 }
0375
0376 bool
0377 xfs_log_writable(
0378 struct xfs_mount *mp)
0379 {
0380
0381
0382
0383
0384
0385
0386 if (xfs_has_norecovery(mp))
0387 return false;
0388 if (xfs_readonly_buftarg(mp->m_ddev_targp))
0389 return false;
0390 if (xfs_readonly_buftarg(mp->m_log->l_targ))
0391 return false;
0392 if (xlog_is_shutdown(mp->m_log))
0393 return false;
0394 return true;
0395 }
0396
0397
0398
0399
0400 int
0401 xfs_log_regrant(
0402 struct xfs_mount *mp,
0403 struct xlog_ticket *tic)
0404 {
0405 struct xlog *log = mp->m_log;
0406 int need_bytes;
0407 int error = 0;
0408
0409 if (xlog_is_shutdown(log))
0410 return -EIO;
0411
0412 XFS_STATS_INC(mp, xs_try_logspace);
0413
0414
0415
0416
0417
0418
0419
0420 tic->t_tid++;
0421
0422 xlog_grant_push_ail(log, tic->t_unit_res);
0423
0424 tic->t_curr_res = tic->t_unit_res;
0425 if (tic->t_cnt > 0)
0426 return 0;
0427
0428 trace_xfs_log_regrant(log, tic);
0429
0430 error = xlog_grant_head_check(log, &log->l_write_head, tic,
0431 &need_bytes);
0432 if (error)
0433 goto out_error;
0434
0435 xlog_grant_add_space(log, &log->l_write_head.grant, need_bytes);
0436 trace_xfs_log_regrant_exit(log, tic);
0437 xlog_verify_grant_tail(log);
0438 return 0;
0439
0440 out_error:
0441
0442
0443
0444
0445
0446 tic->t_curr_res = 0;
0447 tic->t_cnt = 0;
0448 return error;
0449 }
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459 int
0460 xfs_log_reserve(
0461 struct xfs_mount *mp,
0462 int unit_bytes,
0463 int cnt,
0464 struct xlog_ticket **ticp,
0465 bool permanent)
0466 {
0467 struct xlog *log = mp->m_log;
0468 struct xlog_ticket *tic;
0469 int need_bytes;
0470 int error = 0;
0471
0472 if (xlog_is_shutdown(log))
0473 return -EIO;
0474
0475 XFS_STATS_INC(mp, xs_try_logspace);
0476
0477 ASSERT(*ticp == NULL);
0478 tic = xlog_ticket_alloc(log, unit_bytes, cnt, permanent);
0479 *ticp = tic;
0480
0481 xlog_grant_push_ail(log, tic->t_cnt ? tic->t_unit_res * tic->t_cnt
0482 : tic->t_unit_res);
0483
0484 trace_xfs_log_reserve(log, tic);
0485
0486 error = xlog_grant_head_check(log, &log->l_reserve_head, tic,
0487 &need_bytes);
0488 if (error)
0489 goto out_error;
0490
0491 xlog_grant_add_space(log, &log->l_reserve_head.grant, need_bytes);
0492 xlog_grant_add_space(log, &log->l_write_head.grant, need_bytes);
0493 trace_xfs_log_reserve_exit(log, tic);
0494 xlog_verify_grant_tail(log);
0495 return 0;
0496
0497 out_error:
0498
0499
0500
0501
0502
0503 tic->t_curr_res = 0;
0504 tic->t_cnt = 0;
0505 return error;
0506 }
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522 static void
0523 xlog_state_shutdown_callbacks(
0524 struct xlog *log)
0525 {
0526 struct xlog_in_core *iclog;
0527 LIST_HEAD(cb_list);
0528
0529 iclog = log->l_iclog;
0530 do {
0531 if (atomic_read(&iclog->ic_refcnt)) {
0532
0533 continue;
0534 }
0535 list_splice_init(&iclog->ic_callbacks, &cb_list);
0536 spin_unlock(&log->l_icloglock);
0537
0538 xlog_cil_process_committed(&cb_list);
0539
0540 spin_lock(&log->l_icloglock);
0541 wake_up_all(&iclog->ic_write_wait);
0542 wake_up_all(&iclog->ic_force_wait);
0543 } while ((iclog = iclog->ic_next) != log->l_iclog);
0544
0545 wake_up_all(&log->l_flush_wait);
0546 }
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568 int
0569 xlog_state_release_iclog(
0570 struct xlog *log,
0571 struct xlog_in_core *iclog,
0572 struct xlog_ticket *ticket)
0573 {
0574 xfs_lsn_t tail_lsn;
0575 bool last_ref;
0576
0577 lockdep_assert_held(&log->l_icloglock);
0578
0579 trace_xlog_iclog_release(iclog, _RET_IP_);
0580
0581
0582
0583
0584
0585
0586 if ((iclog->ic_state == XLOG_STATE_WANT_SYNC ||
0587 (iclog->ic_flags & XLOG_ICL_NEED_FUA)) &&
0588 !iclog->ic_header.h_tail_lsn) {
0589 tail_lsn = xlog_assign_tail_lsn(log->l_mp);
0590 iclog->ic_header.h_tail_lsn = cpu_to_be64(tail_lsn);
0591 }
0592
0593 last_ref = atomic_dec_and_test(&iclog->ic_refcnt);
0594
0595 if (xlog_is_shutdown(log)) {
0596
0597
0598
0599
0600
0601 if (last_ref)
0602 xlog_state_shutdown_callbacks(log);
0603 return -EIO;
0604 }
0605
0606 if (!last_ref)
0607 return 0;
0608
0609 if (iclog->ic_state != XLOG_STATE_WANT_SYNC) {
0610 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
0611 return 0;
0612 }
0613
0614 iclog->ic_state = XLOG_STATE_SYNCING;
0615 xlog_verify_tail_lsn(log, iclog);
0616 trace_xlog_iclog_syncing(iclog, _RET_IP_);
0617
0618 spin_unlock(&log->l_icloglock);
0619 xlog_sync(log, iclog, ticket);
0620 spin_lock(&log->l_icloglock);
0621 return 0;
0622 }
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634 int
0635 xfs_log_mount(
0636 xfs_mount_t *mp,
0637 xfs_buftarg_t *log_target,
0638 xfs_daddr_t blk_offset,
0639 int num_bblks)
0640 {
0641 struct xlog *log;
0642 bool fatal = xfs_has_crc(mp);
0643 int error = 0;
0644 int min_logfsbs;
0645
0646 if (!xfs_has_norecovery(mp)) {
0647 xfs_notice(mp, "Mounting V%d Filesystem",
0648 XFS_SB_VERSION_NUM(&mp->m_sb));
0649 } else {
0650 xfs_notice(mp,
0651 "Mounting V%d filesystem in no-recovery mode. Filesystem will be inconsistent.",
0652 XFS_SB_VERSION_NUM(&mp->m_sb));
0653 ASSERT(xfs_is_readonly(mp));
0654 }
0655
0656 log = xlog_alloc_log(mp, log_target, blk_offset, num_bblks);
0657 if (IS_ERR(log)) {
0658 error = PTR_ERR(log);
0659 goto out;
0660 }
0661 mp->m_log = log;
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677 min_logfsbs = xfs_log_calc_minimum_size(mp);
0678
0679 if (mp->m_sb.sb_logblocks < min_logfsbs) {
0680 xfs_warn(mp,
0681 "Log size %d blocks too small, minimum size is %d blocks",
0682 mp->m_sb.sb_logblocks, min_logfsbs);
0683 error = -EINVAL;
0684 } else if (mp->m_sb.sb_logblocks > XFS_MAX_LOG_BLOCKS) {
0685 xfs_warn(mp,
0686 "Log size %d blocks too large, maximum size is %lld blocks",
0687 mp->m_sb.sb_logblocks, XFS_MAX_LOG_BLOCKS);
0688 error = -EINVAL;
0689 } else if (XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks) > XFS_MAX_LOG_BYTES) {
0690 xfs_warn(mp,
0691 "log size %lld bytes too large, maximum size is %lld bytes",
0692 XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks),
0693 XFS_MAX_LOG_BYTES);
0694 error = -EINVAL;
0695 } else if (mp->m_sb.sb_logsunit > 1 &&
0696 mp->m_sb.sb_logsunit % mp->m_sb.sb_blocksize) {
0697 xfs_warn(mp,
0698 "log stripe unit %u bytes must be a multiple of block size",
0699 mp->m_sb.sb_logsunit);
0700 error = -EINVAL;
0701 fatal = true;
0702 }
0703 if (error) {
0704
0705
0706
0707
0708 if (fatal) {
0709 xfs_crit(mp, "AAIEEE! Log failed size checks. Abort!");
0710 ASSERT(0);
0711 goto out_free_log;
0712 }
0713 xfs_crit(mp, "Log size out of supported range.");
0714 xfs_crit(mp,
0715 "Continuing onwards, but if log hangs are experienced then please report this message in the bug report.");
0716 }
0717
0718
0719
0720
0721 error = xfs_trans_ail_init(mp);
0722 if (error) {
0723 xfs_warn(mp, "AIL initialisation failed: error %d", error);
0724 goto out_free_log;
0725 }
0726 log->l_ailp = mp->m_ail;
0727
0728
0729
0730
0731
0732 if (!xfs_has_norecovery(mp)) {
0733
0734
0735
0736
0737 bool readonly = test_and_clear_bit(XFS_OPSTATE_READONLY,
0738 &mp->m_opstate);
0739 error = xlog_recover(log);
0740 if (readonly)
0741 set_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
0742 if (error) {
0743 xfs_warn(mp, "log mount/recovery failed: error %d",
0744 error);
0745 xlog_recover_cancel(log);
0746 goto out_destroy_ail;
0747 }
0748 }
0749
0750 error = xfs_sysfs_init(&log->l_kobj, &xfs_log_ktype, &mp->m_kobj,
0751 "log");
0752 if (error)
0753 goto out_destroy_ail;
0754
0755
0756 clear_bit(XLOG_ACTIVE_RECOVERY, &log->l_opstate);
0757
0758
0759
0760
0761
0762
0763 xlog_cil_init_post_recovery(log);
0764
0765 return 0;
0766
0767 out_destroy_ail:
0768 xfs_trans_ail_destroy(mp);
0769 out_free_log:
0770 xlog_dealloc_log(log);
0771 out:
0772 return error;
0773 }
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785 int
0786 xfs_log_mount_finish(
0787 struct xfs_mount *mp)
0788 {
0789 struct xlog *log = mp->m_log;
0790 bool readonly;
0791 int error = 0;
0792
0793 if (xfs_has_norecovery(mp)) {
0794 ASSERT(xfs_is_readonly(mp));
0795 return 0;
0796 }
0797
0798
0799
0800
0801
0802 readonly = test_and_clear_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824 mp->m_super->s_flags |= SB_ACTIVE;
0825 xfs_log_work_queue(mp);
0826 if (xlog_recovery_needed(log))
0827 error = xlog_recover_finish(log);
0828 mp->m_super->s_flags &= ~SB_ACTIVE;
0829 evict_inodes(mp->m_super);
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840 if (xlog_recovery_needed(log)) {
0841 if (!error) {
0842 xfs_log_force(mp, XFS_LOG_SYNC);
0843 xfs_ail_push_all_sync(mp->m_ail);
0844 }
0845 xfs_notice(mp, "Ending recovery (logdev: %s)",
0846 mp->m_logname ? mp->m_logname : "internal");
0847 } else {
0848 xfs_info(mp, "Ending clean mount");
0849 }
0850 xfs_buftarg_drain(mp->m_ddev_targp);
0851
0852 clear_bit(XLOG_RECOVERY_NEEDED, &log->l_opstate);
0853 if (readonly)
0854 set_bit(XFS_OPSTATE_READONLY, &mp->m_opstate);
0855
0856
0857 ASSERT(!error || xlog_is_shutdown(log));
0858
0859 return error;
0860 }
0861
0862
0863
0864
0865
0866 void
0867 xfs_log_mount_cancel(
0868 struct xfs_mount *mp)
0869 {
0870 xlog_recover_cancel(mp->m_log);
0871 xfs_log_unmount(mp);
0872 }
0873
0874
0875
0876
0877
0878 static inline int
0879 xlog_force_iclog(
0880 struct xlog_in_core *iclog)
0881 {
0882 atomic_inc(&iclog->ic_refcnt);
0883 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
0884 if (iclog->ic_state == XLOG_STATE_ACTIVE)
0885 xlog_state_switch_iclogs(iclog->ic_log, iclog, 0);
0886 return xlog_state_release_iclog(iclog->ic_log, iclog, NULL);
0887 }
0888
0889
0890
0891
0892
0893
0894
0895 int
0896 xlog_wait_on_iclog(
0897 struct xlog_in_core *iclog)
0898 __releases(iclog->ic_log->l_icloglock)
0899 {
0900 struct xlog *log = iclog->ic_log;
0901
0902 trace_xlog_iclog_wait_on(iclog, _RET_IP_);
0903 if (!xlog_is_shutdown(log) &&
0904 iclog->ic_state != XLOG_STATE_ACTIVE &&
0905 iclog->ic_state != XLOG_STATE_DIRTY) {
0906 XFS_STATS_INC(log->l_mp, xs_log_force_sleep);
0907 xlog_wait(&iclog->ic_force_wait, &log->l_icloglock);
0908 } else {
0909 spin_unlock(&log->l_icloglock);
0910 }
0911
0912 if (xlog_is_shutdown(log))
0913 return -EIO;
0914 return 0;
0915 }
0916
0917
0918
0919
0920
0921
0922 static int
0923 xlog_write_unmount_record(
0924 struct xlog *log,
0925 struct xlog_ticket *ticket)
0926 {
0927 struct {
0928 struct xlog_op_header ophdr;
0929 struct xfs_unmount_log_format ulf;
0930 } unmount_rec = {
0931 .ophdr = {
0932 .oh_clientid = XFS_LOG,
0933 .oh_tid = cpu_to_be32(ticket->t_tid),
0934 .oh_flags = XLOG_UNMOUNT_TRANS,
0935 },
0936 .ulf = {
0937 .magic = XLOG_UNMOUNT_TYPE,
0938 },
0939 };
0940 struct xfs_log_iovec reg = {
0941 .i_addr = &unmount_rec,
0942 .i_len = sizeof(unmount_rec),
0943 .i_type = XLOG_REG_TYPE_UNMOUNT,
0944 };
0945 struct xfs_log_vec vec = {
0946 .lv_niovecs = 1,
0947 .lv_iovecp = ®,
0948 };
0949 LIST_HEAD(lv_chain);
0950 list_add(&vec.lv_list, &lv_chain);
0951
0952 BUILD_BUG_ON((sizeof(struct xlog_op_header) +
0953 sizeof(struct xfs_unmount_log_format)) !=
0954 sizeof(unmount_rec));
0955
0956
0957 ticket->t_curr_res -= sizeof(unmount_rec);
0958
0959 return xlog_write(log, NULL, &lv_chain, ticket, reg.i_len);
0960 }
0961
0962
0963
0964
0965
0966 static void
0967 xlog_unmount_write(
0968 struct xlog *log)
0969 {
0970 struct xfs_mount *mp = log->l_mp;
0971 struct xlog_in_core *iclog;
0972 struct xlog_ticket *tic = NULL;
0973 int error;
0974
0975 error = xfs_log_reserve(mp, 600, 1, &tic, 0);
0976 if (error)
0977 goto out_err;
0978
0979 error = xlog_write_unmount_record(log, tic);
0980
0981
0982
0983
0984 out_err:
0985 if (error)
0986 xfs_alert(mp, "%s: unmount record failed", __func__);
0987
0988 spin_lock(&log->l_icloglock);
0989 iclog = log->l_iclog;
0990 error = xlog_force_iclog(iclog);
0991 xlog_wait_on_iclog(iclog);
0992
0993 if (tic) {
0994 trace_xfs_log_umount_write(log, tic);
0995 xfs_log_ticket_ungrant(log, tic);
0996 }
0997 }
0998
0999 static void
1000 xfs_log_unmount_verify_iclog(
1001 struct xlog *log)
1002 {
1003 struct xlog_in_core *iclog = log->l_iclog;
1004
1005 do {
1006 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
1007 ASSERT(iclog->ic_offset == 0);
1008 } while ((iclog = iclog->ic_next) != log->l_iclog);
1009 }
1010
1011
1012
1013
1014
1015
1016
1017
1018 static void
1019 xfs_log_unmount_write(
1020 struct xfs_mount *mp)
1021 {
1022 struct xlog *log = mp->m_log;
1023
1024 if (!xfs_log_writable(mp))
1025 return;
1026
1027 xfs_log_force(mp, XFS_LOG_SYNC);
1028
1029 if (xlog_is_shutdown(log))
1030 return;
1031
1032
1033
1034
1035
1036
1037
1038 if (XFS_TEST_ERROR(xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS), mp,
1039 XFS_ERRTAG_FORCE_SUMMARY_RECALC)) {
1040 xfs_alert(mp, "%s: will fix summary counters at next mount",
1041 __func__);
1042 return;
1043 }
1044
1045 xfs_log_unmount_verify_iclog(log);
1046 xlog_unmount_write(log);
1047 }
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057 int
1058 xfs_log_quiesce(
1059 struct xfs_mount *mp)
1060 {
1061
1062
1063
1064
1065
1066 if (xfs_clear_incompat_log_features(mp)) {
1067 int error;
1068
1069 error = xfs_sync_sb(mp, false);
1070 if (error)
1071 xfs_warn(mp,
1072 "Failed to clear log incompat features on quiesce");
1073 }
1074
1075 cancel_delayed_work_sync(&mp->m_log->l_work);
1076 xfs_log_force(mp, XFS_LOG_SYNC);
1077
1078
1079
1080
1081
1082
1083
1084
1085 xfs_ail_push_all_sync(mp->m_ail);
1086 xfs_buftarg_wait(mp->m_ddev_targp);
1087 xfs_buf_lock(mp->m_sb_bp);
1088 xfs_buf_unlock(mp->m_sb_bp);
1089
1090 return xfs_log_cover(mp);
1091 }
1092
1093 void
1094 xfs_log_clean(
1095 struct xfs_mount *mp)
1096 {
1097 xfs_log_quiesce(mp);
1098 xfs_log_unmount_write(mp);
1099 }
1100
1101
1102
1103
1104
1105
1106
1107
1108 void
1109 xfs_log_unmount(
1110 struct xfs_mount *mp)
1111 {
1112 xfs_log_clean(mp);
1113
1114 xfs_buftarg_drain(mp->m_ddev_targp);
1115
1116 xfs_trans_ail_destroy(mp);
1117
1118 xfs_sysfs_del(&mp->m_log->l_kobj);
1119
1120 xlog_dealloc_log(mp->m_log);
1121 }
1122
1123 void
1124 xfs_log_item_init(
1125 struct xfs_mount *mp,
1126 struct xfs_log_item *item,
1127 int type,
1128 const struct xfs_item_ops *ops)
1129 {
1130 item->li_log = mp->m_log;
1131 item->li_ailp = mp->m_ail;
1132 item->li_type = type;
1133 item->li_ops = ops;
1134 item->li_lv = NULL;
1135
1136 INIT_LIST_HEAD(&item->li_ail);
1137 INIT_LIST_HEAD(&item->li_cil);
1138 INIT_LIST_HEAD(&item->li_bio_list);
1139 INIT_LIST_HEAD(&item->li_trans);
1140 }
1141
1142
1143
1144
1145 void
1146 xfs_log_space_wake(
1147 struct xfs_mount *mp)
1148 {
1149 struct xlog *log = mp->m_log;
1150 int free_bytes;
1151
1152 if (xlog_is_shutdown(log))
1153 return;
1154
1155 if (!list_empty_careful(&log->l_write_head.waiters)) {
1156 ASSERT(!xlog_in_recovery(log));
1157
1158 spin_lock(&log->l_write_head.lock);
1159 free_bytes = xlog_space_left(log, &log->l_write_head.grant);
1160 xlog_grant_head_wake(log, &log->l_write_head, &free_bytes);
1161 spin_unlock(&log->l_write_head.lock);
1162 }
1163
1164 if (!list_empty_careful(&log->l_reserve_head.waiters)) {
1165 ASSERT(!xlog_in_recovery(log));
1166
1167 spin_lock(&log->l_reserve_head.lock);
1168 free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
1169 xlog_grant_head_wake(log, &log->l_reserve_head, &free_bytes);
1170 spin_unlock(&log->l_reserve_head.lock);
1171 }
1172 }
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191 static bool
1192 xfs_log_need_covered(
1193 struct xfs_mount *mp)
1194 {
1195 struct xlog *log = mp->m_log;
1196 bool needed = false;
1197
1198 if (!xlog_cil_empty(log))
1199 return false;
1200
1201 spin_lock(&log->l_icloglock);
1202 switch (log->l_covered_state) {
1203 case XLOG_STATE_COVER_DONE:
1204 case XLOG_STATE_COVER_DONE2:
1205 case XLOG_STATE_COVER_IDLE:
1206 break;
1207 case XLOG_STATE_COVER_NEED:
1208 case XLOG_STATE_COVER_NEED2:
1209 if (xfs_ail_min_lsn(log->l_ailp))
1210 break;
1211 if (!xlog_iclogs_empty(log))
1212 break;
1213
1214 needed = true;
1215 if (log->l_covered_state == XLOG_STATE_COVER_NEED)
1216 log->l_covered_state = XLOG_STATE_COVER_DONE;
1217 else
1218 log->l_covered_state = XLOG_STATE_COVER_DONE2;
1219 break;
1220 default:
1221 needed = true;
1222 break;
1223 }
1224 spin_unlock(&log->l_icloglock);
1225 return needed;
1226 }
1227
1228
1229
1230
1231
1232
1233
1234 static int
1235 xfs_log_cover(
1236 struct xfs_mount *mp)
1237 {
1238 int error = 0;
1239 bool need_covered;
1240
1241 ASSERT((xlog_cil_empty(mp->m_log) && xlog_iclogs_empty(mp->m_log) &&
1242 !xfs_ail_min_lsn(mp->m_log->l_ailp)) ||
1243 xlog_is_shutdown(mp->m_log));
1244
1245 if (!xfs_log_writable(mp))
1246 return 0;
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259 need_covered = xfs_log_need_covered(mp);
1260 if (!need_covered && !xfs_has_lazysbcount(mp))
1261 return 0;
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272 do {
1273 error = xfs_sync_sb(mp, true);
1274 if (error)
1275 break;
1276 xfs_ail_push_all_sync(mp->m_ail);
1277 } while (xfs_log_need_covered(mp));
1278
1279 return error;
1280 }
1281
1282
1283
1284
1285 xfs_lsn_t
1286 xlog_assign_tail_lsn_locked(
1287 struct xfs_mount *mp)
1288 {
1289 struct xlog *log = mp->m_log;
1290 struct xfs_log_item *lip;
1291 xfs_lsn_t tail_lsn;
1292
1293 assert_spin_locked(&mp->m_ail->ail_lock);
1294
1295
1296
1297
1298
1299
1300 lip = xfs_ail_min(mp->m_ail);
1301 if (lip)
1302 tail_lsn = lip->li_lsn;
1303 else
1304 tail_lsn = atomic64_read(&log->l_last_sync_lsn);
1305 trace_xfs_log_assign_tail_lsn(log, tail_lsn);
1306 atomic64_set(&log->l_tail_lsn, tail_lsn);
1307 return tail_lsn;
1308 }
1309
1310 xfs_lsn_t
1311 xlog_assign_tail_lsn(
1312 struct xfs_mount *mp)
1313 {
1314 xfs_lsn_t tail_lsn;
1315
1316 spin_lock(&mp->m_ail->ail_lock);
1317 tail_lsn = xlog_assign_tail_lsn_locked(mp);
1318 spin_unlock(&mp->m_ail->ail_lock);
1319
1320 return tail_lsn;
1321 }
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340 STATIC int
1341 xlog_space_left(
1342 struct xlog *log,
1343 atomic64_t *head)
1344 {
1345 int tail_bytes;
1346 int tail_cycle;
1347 int head_cycle;
1348 int head_bytes;
1349
1350 xlog_crack_grant_head(head, &head_cycle, &head_bytes);
1351 xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_bytes);
1352 tail_bytes = BBTOB(tail_bytes);
1353 if (tail_cycle == head_cycle && head_bytes >= tail_bytes)
1354 return log->l_logsize - (head_bytes - tail_bytes);
1355 if (tail_cycle + 1 < head_cycle)
1356 return 0;
1357
1358
1359 if (xlog_is_shutdown(log))
1360 return log->l_logsize;
1361
1362 if (tail_cycle < head_cycle) {
1363 ASSERT(tail_cycle == (head_cycle - 1));
1364 return tail_bytes - head_bytes;
1365 }
1366
1367
1368
1369
1370
1371 xfs_alert(log->l_mp, "xlog_space_left: head behind tail");
1372 xfs_alert(log->l_mp, " tail_cycle = %d, tail_bytes = %d",
1373 tail_cycle, tail_bytes);
1374 xfs_alert(log->l_mp, " GH cycle = %d, GH bytes = %d",
1375 head_cycle, head_bytes);
1376 ASSERT(0);
1377 return log->l_logsize;
1378 }
1379
1380
1381 static void
1382 xlog_ioend_work(
1383 struct work_struct *work)
1384 {
1385 struct xlog_in_core *iclog =
1386 container_of(work, struct xlog_in_core, ic_end_io_work);
1387 struct xlog *log = iclog->ic_log;
1388 int error;
1389
1390 error = blk_status_to_errno(iclog->ic_bio.bi_status);
1391 #ifdef DEBUG
1392
1393 if (iclog->ic_fail_crc)
1394 error = -EIO;
1395 #endif
1396
1397
1398
1399
1400 if (XFS_TEST_ERROR(error, log->l_mp, XFS_ERRTAG_IODONE_IOERR)) {
1401 xfs_alert(log->l_mp, "log I/O error %d", error);
1402 xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
1403 }
1404
1405 xlog_state_done_syncing(iclog);
1406 bio_uninit(&iclog->ic_bio);
1407
1408
1409
1410
1411
1412
1413
1414 up(&iclog->ic_sema);
1415 }
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425 STATIC void
1426 xlog_get_iclog_buffer_size(
1427 struct xfs_mount *mp,
1428 struct xlog *log)
1429 {
1430 if (mp->m_logbufs <= 0)
1431 mp->m_logbufs = XLOG_MAX_ICLOGS;
1432 if (mp->m_logbsize <= 0)
1433 mp->m_logbsize = XLOG_BIG_RECORD_BSIZE;
1434
1435 log->l_iclog_bufs = mp->m_logbufs;
1436 log->l_iclog_size = mp->m_logbsize;
1437
1438
1439
1440
1441 log->l_iclog_heads =
1442 DIV_ROUND_UP(mp->m_logbsize, XLOG_HEADER_CYCLE_SIZE);
1443 log->l_iclog_hsize = log->l_iclog_heads << BBSHIFT;
1444 }
1445
1446 void
1447 xfs_log_work_queue(
1448 struct xfs_mount *mp)
1449 {
1450 queue_delayed_work(mp->m_sync_workqueue, &mp->m_log->l_work,
1451 msecs_to_jiffies(xfs_syncd_centisecs * 10));
1452 }
1453
1454
1455
1456
1457
1458
1459
1460 static inline void
1461 xlog_clear_incompat(
1462 struct xlog *log)
1463 {
1464 struct xfs_mount *mp = log->l_mp;
1465
1466 if (!xfs_sb_has_incompat_log_feature(&mp->m_sb,
1467 XFS_SB_FEAT_INCOMPAT_LOG_ALL))
1468 return;
1469
1470 if (log->l_covered_state != XLOG_STATE_COVER_DONE2)
1471 return;
1472
1473 if (!down_write_trylock(&log->l_incompat_users))
1474 return;
1475
1476 xfs_clear_incompat_log_features(mp);
1477 up_write(&log->l_incompat_users);
1478 }
1479
1480
1481
1482
1483
1484
1485 static void
1486 xfs_log_worker(
1487 struct work_struct *work)
1488 {
1489 struct xlog *log = container_of(to_delayed_work(work),
1490 struct xlog, l_work);
1491 struct xfs_mount *mp = log->l_mp;
1492
1493
1494 if (xfs_fs_writable(mp, SB_FREEZE_WRITE) && xfs_log_need_covered(mp)) {
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506 xlog_clear_incompat(log);
1507 xfs_sync_sb(mp, true);
1508 } else
1509 xfs_log_force(mp, 0);
1510
1511
1512 xfs_ail_push_all(mp->m_ail);
1513
1514
1515 xfs_log_work_queue(mp);
1516 }
1517
1518
1519
1520
1521
1522
1523 STATIC struct xlog *
1524 xlog_alloc_log(
1525 struct xfs_mount *mp,
1526 struct xfs_buftarg *log_target,
1527 xfs_daddr_t blk_offset,
1528 int num_bblks)
1529 {
1530 struct xlog *log;
1531 xlog_rec_header_t *head;
1532 xlog_in_core_t **iclogp;
1533 xlog_in_core_t *iclog, *prev_iclog=NULL;
1534 int i;
1535 int error = -ENOMEM;
1536 uint log2_size = 0;
1537
1538 log = kmem_zalloc(sizeof(struct xlog), KM_MAYFAIL);
1539 if (!log) {
1540 xfs_warn(mp, "Log allocation failed: No memory!");
1541 goto out;
1542 }
1543
1544 log->l_mp = mp;
1545 log->l_targ = log_target;
1546 log->l_logsize = BBTOB(num_bblks);
1547 log->l_logBBstart = blk_offset;
1548 log->l_logBBsize = num_bblks;
1549 log->l_covered_state = XLOG_STATE_COVER_IDLE;
1550 set_bit(XLOG_ACTIVE_RECOVERY, &log->l_opstate);
1551 INIT_DELAYED_WORK(&log->l_work, xfs_log_worker);
1552
1553 log->l_prev_block = -1;
1554
1555 xlog_assign_atomic_lsn(&log->l_tail_lsn, 1, 0);
1556 xlog_assign_atomic_lsn(&log->l_last_sync_lsn, 1, 0);
1557 log->l_curr_cycle = 1;
1558
1559 if (xfs_has_logv2(mp) && mp->m_sb.sb_logsunit > 1)
1560 log->l_iclog_roundoff = mp->m_sb.sb_logsunit;
1561 else
1562 log->l_iclog_roundoff = BBSIZE;
1563
1564 xlog_grant_head_init(&log->l_reserve_head);
1565 xlog_grant_head_init(&log->l_write_head);
1566
1567 error = -EFSCORRUPTED;
1568 if (xfs_has_sector(mp)) {
1569 log2_size = mp->m_sb.sb_logsectlog;
1570 if (log2_size < BBSHIFT) {
1571 xfs_warn(mp, "Log sector size too small (0x%x < 0x%x)",
1572 log2_size, BBSHIFT);
1573 goto out_free_log;
1574 }
1575
1576 log2_size -= BBSHIFT;
1577 if (log2_size > mp->m_sectbb_log) {
1578 xfs_warn(mp, "Log sector size too large (0x%x > 0x%x)",
1579 log2_size, mp->m_sectbb_log);
1580 goto out_free_log;
1581 }
1582
1583
1584 if (log2_size && log->l_logBBstart > 0 &&
1585 !xfs_has_logv2(mp)) {
1586 xfs_warn(mp,
1587 "log sector size (0x%x) invalid for configuration.",
1588 log2_size);
1589 goto out_free_log;
1590 }
1591 }
1592 log->l_sectBBsize = 1 << log2_size;
1593
1594 init_rwsem(&log->l_incompat_users);
1595
1596 xlog_get_iclog_buffer_size(mp, log);
1597
1598 spin_lock_init(&log->l_icloglock);
1599 init_waitqueue_head(&log->l_flush_wait);
1600
1601 iclogp = &log->l_iclog;
1602
1603
1604
1605
1606
1607
1608
1609 ASSERT(log->l_iclog_size >= 4096);
1610 for (i = 0; i < log->l_iclog_bufs; i++) {
1611 size_t bvec_size = howmany(log->l_iclog_size, PAGE_SIZE) *
1612 sizeof(struct bio_vec);
1613
1614 iclog = kmem_zalloc(sizeof(*iclog) + bvec_size, KM_MAYFAIL);
1615 if (!iclog)
1616 goto out_free_iclog;
1617
1618 *iclogp = iclog;
1619 iclog->ic_prev = prev_iclog;
1620 prev_iclog = iclog;
1621
1622 iclog->ic_data = kvzalloc(log->l_iclog_size,
1623 GFP_KERNEL | __GFP_RETRY_MAYFAIL);
1624 if (!iclog->ic_data)
1625 goto out_free_iclog;
1626 head = &iclog->ic_header;
1627 memset(head, 0, sizeof(xlog_rec_header_t));
1628 head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM);
1629 head->h_version = cpu_to_be32(
1630 xfs_has_logv2(log->l_mp) ? 2 : 1);
1631 head->h_size = cpu_to_be32(log->l_iclog_size);
1632
1633 head->h_fmt = cpu_to_be32(XLOG_FMT);
1634 memcpy(&head->h_fs_uuid, &mp->m_sb.sb_uuid, sizeof(uuid_t));
1635
1636 iclog->ic_size = log->l_iclog_size - log->l_iclog_hsize;
1637 iclog->ic_state = XLOG_STATE_ACTIVE;
1638 iclog->ic_log = log;
1639 atomic_set(&iclog->ic_refcnt, 0);
1640 INIT_LIST_HEAD(&iclog->ic_callbacks);
1641 iclog->ic_datap = (void *)iclog->ic_data + log->l_iclog_hsize;
1642
1643 init_waitqueue_head(&iclog->ic_force_wait);
1644 init_waitqueue_head(&iclog->ic_write_wait);
1645 INIT_WORK(&iclog->ic_end_io_work, xlog_ioend_work);
1646 sema_init(&iclog->ic_sema, 1);
1647
1648 iclogp = &iclog->ic_next;
1649 }
1650 *iclogp = log->l_iclog;
1651 log->l_iclog->ic_prev = prev_iclog;
1652
1653 log->l_ioend_workqueue = alloc_workqueue("xfs-log/%s",
1654 XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM |
1655 WQ_HIGHPRI),
1656 0, mp->m_super->s_id);
1657 if (!log->l_ioend_workqueue)
1658 goto out_free_iclog;
1659
1660 error = xlog_cil_init(log);
1661 if (error)
1662 goto out_destroy_workqueue;
1663 return log;
1664
1665 out_destroy_workqueue:
1666 destroy_workqueue(log->l_ioend_workqueue);
1667 out_free_iclog:
1668 for (iclog = log->l_iclog; iclog; iclog = prev_iclog) {
1669 prev_iclog = iclog->ic_next;
1670 kmem_free(iclog->ic_data);
1671 kmem_free(iclog);
1672 if (prev_iclog == log->l_iclog)
1673 break;
1674 }
1675 out_free_log:
1676 kmem_free(log);
1677 out:
1678 return ERR_PTR(error);
1679 }
1680
1681
1682
1683
1684
1685
1686
1687
1688 xfs_lsn_t
1689 xlog_grant_push_threshold(
1690 struct xlog *log,
1691 int need_bytes)
1692 {
1693 xfs_lsn_t threshold_lsn = 0;
1694 xfs_lsn_t last_sync_lsn;
1695 int free_blocks;
1696 int free_bytes;
1697 int threshold_block;
1698 int threshold_cycle;
1699 int free_threshold;
1700
1701 ASSERT(BTOBB(need_bytes) < log->l_logBBsize);
1702
1703 free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
1704 free_blocks = BTOBBT(free_bytes);
1705
1706
1707
1708
1709
1710
1711 free_threshold = BTOBB(need_bytes);
1712 free_threshold = max(free_threshold, (log->l_logBBsize >> 2));
1713 free_threshold = max(free_threshold, 256);
1714 if (free_blocks >= free_threshold)
1715 return NULLCOMMITLSN;
1716
1717 xlog_crack_atomic_lsn(&log->l_tail_lsn, &threshold_cycle,
1718 &threshold_block);
1719 threshold_block += free_threshold;
1720 if (threshold_block >= log->l_logBBsize) {
1721 threshold_block -= log->l_logBBsize;
1722 threshold_cycle += 1;
1723 }
1724 threshold_lsn = xlog_assign_lsn(threshold_cycle,
1725 threshold_block);
1726
1727
1728
1729
1730
1731 last_sync_lsn = atomic64_read(&log->l_last_sync_lsn);
1732 if (XFS_LSN_CMP(threshold_lsn, last_sync_lsn) > 0)
1733 threshold_lsn = last_sync_lsn;
1734
1735 return threshold_lsn;
1736 }
1737
1738
1739
1740
1741
1742
1743
1744
1745 STATIC void
1746 xlog_grant_push_ail(
1747 struct xlog *log,
1748 int need_bytes)
1749 {
1750 xfs_lsn_t threshold_lsn;
1751
1752 threshold_lsn = xlog_grant_push_threshold(log, need_bytes);
1753 if (threshold_lsn == NULLCOMMITLSN || xlog_is_shutdown(log))
1754 return;
1755
1756
1757
1758
1759
1760
1761 xfs_ail_push(log->l_ailp, threshold_lsn);
1762 }
1763
1764
1765
1766
1767 STATIC void
1768 xlog_pack_data(
1769 struct xlog *log,
1770 struct xlog_in_core *iclog,
1771 int roundoff)
1772 {
1773 int i, j, k;
1774 int size = iclog->ic_offset + roundoff;
1775 __be32 cycle_lsn;
1776 char *dp;
1777
1778 cycle_lsn = CYCLE_LSN_DISK(iclog->ic_header.h_lsn);
1779
1780 dp = iclog->ic_datap;
1781 for (i = 0; i < BTOBB(size); i++) {
1782 if (i >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE))
1783 break;
1784 iclog->ic_header.h_cycle_data[i] = *(__be32 *)dp;
1785 *(__be32 *)dp = cycle_lsn;
1786 dp += BBSIZE;
1787 }
1788
1789 if (xfs_has_logv2(log->l_mp)) {
1790 xlog_in_core_2_t *xhdr = iclog->ic_data;
1791
1792 for ( ; i < BTOBB(size); i++) {
1793 j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
1794 k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
1795 xhdr[j].hic_xheader.xh_cycle_data[k] = *(__be32 *)dp;
1796 *(__be32 *)dp = cycle_lsn;
1797 dp += BBSIZE;
1798 }
1799
1800 for (i = 1; i < log->l_iclog_heads; i++)
1801 xhdr[i].hic_xheader.xh_cycle = cycle_lsn;
1802 }
1803 }
1804
1805
1806
1807
1808
1809
1810
1811 __le32
1812 xlog_cksum(
1813 struct xlog *log,
1814 struct xlog_rec_header *rhead,
1815 char *dp,
1816 int size)
1817 {
1818 uint32_t crc;
1819
1820
1821 crc = xfs_start_cksum_update((char *)rhead,
1822 sizeof(struct xlog_rec_header),
1823 offsetof(struct xlog_rec_header, h_crc));
1824
1825
1826 if (xfs_has_logv2(log->l_mp)) {
1827 union xlog_in_core2 *xhdr = (union xlog_in_core2 *)rhead;
1828 int i;
1829 int xheads;
1830
1831 xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE);
1832
1833 for (i = 1; i < xheads; i++) {
1834 crc = crc32c(crc, &xhdr[i].hic_xheader,
1835 sizeof(struct xlog_rec_ext_header));
1836 }
1837 }
1838
1839
1840 crc = crc32c(crc, dp, size);
1841
1842 return xfs_end_cksum(crc);
1843 }
1844
1845 static void
1846 xlog_bio_end_io(
1847 struct bio *bio)
1848 {
1849 struct xlog_in_core *iclog = bio->bi_private;
1850
1851 queue_work(iclog->ic_log->l_ioend_workqueue,
1852 &iclog->ic_end_io_work);
1853 }
1854
1855 static int
1856 xlog_map_iclog_data(
1857 struct bio *bio,
1858 void *data,
1859 size_t count)
1860 {
1861 do {
1862 struct page *page = kmem_to_page(data);
1863 unsigned int off = offset_in_page(data);
1864 size_t len = min_t(size_t, count, PAGE_SIZE - off);
1865
1866 if (bio_add_page(bio, page, len, off) != len)
1867 return -EIO;
1868
1869 data += len;
1870 count -= len;
1871 } while (count);
1872
1873 return 0;
1874 }
1875
1876 STATIC void
1877 xlog_write_iclog(
1878 struct xlog *log,
1879 struct xlog_in_core *iclog,
1880 uint64_t bno,
1881 unsigned int count)
1882 {
1883 ASSERT(bno < log->l_logBBsize);
1884 trace_xlog_iclog_write(iclog, _RET_IP_);
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894 down(&iclog->ic_sema);
1895 if (xlog_is_shutdown(log)) {
1896
1897
1898
1899
1900
1901
1902
1903 xlog_state_done_syncing(iclog);
1904 up(&iclog->ic_sema);
1905 return;
1906 }
1907
1908
1909
1910
1911
1912
1913
1914 bio_init(&iclog->ic_bio, log->l_targ->bt_bdev, iclog->ic_bvec,
1915 howmany(count, PAGE_SIZE),
1916 REQ_OP_WRITE | REQ_META | REQ_SYNC | REQ_IDLE);
1917 iclog->ic_bio.bi_iter.bi_sector = log->l_logBBstart + bno;
1918 iclog->ic_bio.bi_end_io = xlog_bio_end_io;
1919 iclog->ic_bio.bi_private = iclog;
1920
1921 if (iclog->ic_flags & XLOG_ICL_NEED_FLUSH) {
1922 iclog->ic_bio.bi_opf |= REQ_PREFLUSH;
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934 if (log->l_targ != log->l_mp->m_ddev_targp &&
1935 blkdev_issue_flush(log->l_mp->m_ddev_targp->bt_bdev)) {
1936 xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
1937 return;
1938 }
1939 }
1940 if (iclog->ic_flags & XLOG_ICL_NEED_FUA)
1941 iclog->ic_bio.bi_opf |= REQ_FUA;
1942
1943 iclog->ic_flags &= ~(XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA);
1944
1945 if (xlog_map_iclog_data(&iclog->ic_bio, iclog->ic_data, count)) {
1946 xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
1947 return;
1948 }
1949 if (is_vmalloc_addr(iclog->ic_data))
1950 flush_kernel_vmap_range(iclog->ic_data, count);
1951
1952
1953
1954
1955
1956 if (bno + BTOBB(count) > log->l_logBBsize) {
1957 struct bio *split;
1958
1959 split = bio_split(&iclog->ic_bio, log->l_logBBsize - bno,
1960 GFP_NOIO, &fs_bio_set);
1961 bio_chain(split, &iclog->ic_bio);
1962 submit_bio(split);
1963
1964
1965 iclog->ic_bio.bi_iter.bi_sector = log->l_logBBstart;
1966 }
1967
1968 submit_bio(&iclog->ic_bio);
1969 }
1970
1971
1972
1973
1974
1975
1976 static void
1977 xlog_split_iclog(
1978 struct xlog *log,
1979 void *data,
1980 uint64_t bno,
1981 unsigned int count)
1982 {
1983 unsigned int split_offset = BBTOB(log->l_logBBsize - bno);
1984 unsigned int i;
1985
1986 for (i = split_offset; i < count; i += BBSIZE) {
1987 uint32_t cycle = get_unaligned_be32(data + i);
1988
1989 if (++cycle == XLOG_HEADER_MAGIC_NUM)
1990 cycle++;
1991 put_unaligned_be32(cycle, data + i);
1992 }
1993 }
1994
1995 static int
1996 xlog_calc_iclog_size(
1997 struct xlog *log,
1998 struct xlog_in_core *iclog,
1999 uint32_t *roundoff)
2000 {
2001 uint32_t count_init, count;
2002
2003
2004 count_init = log->l_iclog_hsize + iclog->ic_offset;
2005 count = roundup(count_init, log->l_iclog_roundoff);
2006
2007 *roundoff = count - count_init;
2008
2009 ASSERT(count >= count_init);
2010 ASSERT(*roundoff < log->l_iclog_roundoff);
2011 return count;
2012 }
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037 STATIC void
2038 xlog_sync(
2039 struct xlog *log,
2040 struct xlog_in_core *iclog,
2041 struct xlog_ticket *ticket)
2042 {
2043 unsigned int count;
2044 unsigned int roundoff;
2045 uint64_t bno;
2046 unsigned int size;
2047
2048 ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
2049 trace_xlog_iclog_sync(iclog, _RET_IP_);
2050
2051 count = xlog_calc_iclog_size(log, iclog, &roundoff);
2052
2053
2054
2055
2056
2057
2058 if (ticket) {
2059 ticket->t_curr_res -= roundoff;
2060 } else {
2061 xlog_grant_add_space(log, &log->l_reserve_head.grant, roundoff);
2062 xlog_grant_add_space(log, &log->l_write_head.grant, roundoff);
2063 }
2064
2065
2066 xlog_pack_data(log, iclog, roundoff);
2067
2068
2069 size = iclog->ic_offset;
2070 if (xfs_has_logv2(log->l_mp))
2071 size += roundoff;
2072 iclog->ic_header.h_len = cpu_to_be32(size);
2073
2074 XFS_STATS_INC(log->l_mp, xs_log_writes);
2075 XFS_STATS_ADD(log->l_mp, xs_log_blocks, BTOBB(count));
2076
2077 bno = BLOCK_LSN(be64_to_cpu(iclog->ic_header.h_lsn));
2078
2079
2080 if (bno + BTOBB(count) > log->l_logBBsize)
2081 xlog_split_iclog(log, &iclog->ic_header, bno, count);
2082
2083
2084 iclog->ic_header.h_crc = xlog_cksum(log, &iclog->ic_header,
2085 iclog->ic_datap, size);
2086
2087
2088
2089
2090
2091
2092
2093 #ifdef DEBUG
2094 if (XFS_TEST_ERROR(false, log->l_mp, XFS_ERRTAG_LOG_BAD_CRC)) {
2095 iclog->ic_header.h_crc &= cpu_to_le32(0xAAAAAAAA);
2096 iclog->ic_fail_crc = true;
2097 xfs_warn(log->l_mp,
2098 "Intentionally corrupted log record at LSN 0x%llx. Shutdown imminent.",
2099 be64_to_cpu(iclog->ic_header.h_lsn));
2100 }
2101 #endif
2102 xlog_verify_iclog(log, iclog, count);
2103 xlog_write_iclog(log, iclog, bno, count);
2104 }
2105
2106
2107
2108
2109 STATIC void
2110 xlog_dealloc_log(
2111 struct xlog *log)
2112 {
2113 xlog_in_core_t *iclog, *next_iclog;
2114 int i;
2115
2116
2117
2118
2119
2120 iclog = log->l_iclog;
2121 for (i = 0; i < log->l_iclog_bufs; i++) {
2122 down(&iclog->ic_sema);
2123 up(&iclog->ic_sema);
2124 iclog = iclog->ic_next;
2125 }
2126
2127
2128
2129
2130
2131
2132 xlog_cil_destroy(log);
2133
2134 iclog = log->l_iclog;
2135 for (i = 0; i < log->l_iclog_bufs; i++) {
2136 next_iclog = iclog->ic_next;
2137 kmem_free(iclog->ic_data);
2138 kmem_free(iclog);
2139 iclog = next_iclog;
2140 }
2141
2142 log->l_mp->m_log = NULL;
2143 destroy_workqueue(log->l_ioend_workqueue);
2144 kmem_free(log);
2145 }
2146
2147
2148
2149
2150 static inline void
2151 xlog_state_finish_copy(
2152 struct xlog *log,
2153 struct xlog_in_core *iclog,
2154 int record_cnt,
2155 int copy_bytes)
2156 {
2157 lockdep_assert_held(&log->l_icloglock);
2158
2159 be32_add_cpu(&iclog->ic_header.h_num_logops, record_cnt);
2160 iclog->ic_offset += copy_bytes;
2161 }
2162
2163
2164
2165
2166
2167 void
2168 xlog_print_tic_res(
2169 struct xfs_mount *mp,
2170 struct xlog_ticket *ticket)
2171 {
2172 xfs_warn(mp, "ticket reservation summary:");
2173 xfs_warn(mp, " unit res = %d bytes", ticket->t_unit_res);
2174 xfs_warn(mp, " current res = %d bytes", ticket->t_curr_res);
2175 xfs_warn(mp, " original count = %d", ticket->t_ocnt);
2176 xfs_warn(mp, " remaining count = %d", ticket->t_cnt);
2177 }
2178
2179
2180
2181
2182 void
2183 xlog_print_trans(
2184 struct xfs_trans *tp)
2185 {
2186 struct xfs_mount *mp = tp->t_mountp;
2187 struct xfs_log_item *lip;
2188
2189
2190 xfs_warn(mp, "transaction summary:");
2191 xfs_warn(mp, " log res = %d", tp->t_log_res);
2192 xfs_warn(mp, " log count = %d", tp->t_log_count);
2193 xfs_warn(mp, " flags = 0x%x", tp->t_flags);
2194
2195 xlog_print_tic_res(mp, tp->t_ticket);
2196
2197
2198 list_for_each_entry(lip, &tp->t_items, li_trans) {
2199 struct xfs_log_vec *lv = lip->li_lv;
2200 struct xfs_log_iovec *vec;
2201 int i;
2202
2203 xfs_warn(mp, "log item: ");
2204 xfs_warn(mp, " type = 0x%x", lip->li_type);
2205 xfs_warn(mp, " flags = 0x%lx", lip->li_flags);
2206 if (!lv)
2207 continue;
2208 xfs_warn(mp, " niovecs = %d", lv->lv_niovecs);
2209 xfs_warn(mp, " size = %d", lv->lv_size);
2210 xfs_warn(mp, " bytes = %d", lv->lv_bytes);
2211 xfs_warn(mp, " buf len = %d", lv->lv_buf_len);
2212
2213
2214 vec = lv->lv_iovecp;
2215 for (i = 0; i < lv->lv_niovecs; i++) {
2216 int dumplen = min(vec->i_len, 32);
2217
2218 xfs_warn(mp, " iovec[%d]", i);
2219 xfs_warn(mp, " type = 0x%x", vec->i_type);
2220 xfs_warn(mp, " len = %d", vec->i_len);
2221 xfs_warn(mp, " first %d bytes of iovec[%d]:", dumplen, i);
2222 xfs_hex_dump(vec->i_addr, dumplen);
2223
2224 vec++;
2225 }
2226 }
2227 }
2228
2229 static inline void
2230 xlog_write_iovec(
2231 struct xlog_in_core *iclog,
2232 uint32_t *log_offset,
2233 void *data,
2234 uint32_t write_len,
2235 int *bytes_left,
2236 uint32_t *record_cnt,
2237 uint32_t *data_cnt)
2238 {
2239 ASSERT(*log_offset < iclog->ic_log->l_iclog_size);
2240 ASSERT(*log_offset % sizeof(int32_t) == 0);
2241 ASSERT(write_len % sizeof(int32_t) == 0);
2242
2243 memcpy(iclog->ic_datap + *log_offset, data, write_len);
2244 *log_offset += write_len;
2245 *bytes_left -= write_len;
2246 (*record_cnt)++;
2247 *data_cnt += write_len;
2248 }
2249
2250
2251
2252
2253
2254 static void
2255 xlog_write_full(
2256 struct xfs_log_vec *lv,
2257 struct xlog_ticket *ticket,
2258 struct xlog_in_core *iclog,
2259 uint32_t *log_offset,
2260 uint32_t *len,
2261 uint32_t *record_cnt,
2262 uint32_t *data_cnt)
2263 {
2264 int index;
2265
2266 ASSERT(*log_offset + *len <= iclog->ic_size ||
2267 iclog->ic_state == XLOG_STATE_WANT_SYNC);
2268
2269
2270
2271
2272
2273 for (index = 0; index < lv->lv_niovecs; index++) {
2274 struct xfs_log_iovec *reg = &lv->lv_iovecp[index];
2275 struct xlog_op_header *ophdr = reg->i_addr;
2276
2277 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2278 xlog_write_iovec(iclog, log_offset, reg->i_addr,
2279 reg->i_len, len, record_cnt, data_cnt);
2280 }
2281 }
2282
2283 static int
2284 xlog_write_get_more_iclog_space(
2285 struct xlog_ticket *ticket,
2286 struct xlog_in_core **iclogp,
2287 uint32_t *log_offset,
2288 uint32_t len,
2289 uint32_t *record_cnt,
2290 uint32_t *data_cnt)
2291 {
2292 struct xlog_in_core *iclog = *iclogp;
2293 struct xlog *log = iclog->ic_log;
2294 int error;
2295
2296 spin_lock(&log->l_icloglock);
2297 ASSERT(iclog->ic_state == XLOG_STATE_WANT_SYNC);
2298 xlog_state_finish_copy(log, iclog, *record_cnt, *data_cnt);
2299 error = xlog_state_release_iclog(log, iclog, ticket);
2300 spin_unlock(&log->l_icloglock);
2301 if (error)
2302 return error;
2303
2304 error = xlog_state_get_iclog_space(log, len, &iclog, ticket,
2305 log_offset);
2306 if (error)
2307 return error;
2308 *record_cnt = 0;
2309 *data_cnt = 0;
2310 *iclogp = iclog;
2311 return 0;
2312 }
2313
2314
2315
2316
2317
2318
2319
2320 static int
2321 xlog_write_partial(
2322 struct xfs_log_vec *lv,
2323 struct xlog_ticket *ticket,
2324 struct xlog_in_core **iclogp,
2325 uint32_t *log_offset,
2326 uint32_t *len,
2327 uint32_t *record_cnt,
2328 uint32_t *data_cnt)
2329 {
2330 struct xlog_in_core *iclog = *iclogp;
2331 struct xlog_op_header *ophdr;
2332 int index = 0;
2333 uint32_t rlen;
2334 int error;
2335
2336
2337 for (index = 0; index < lv->lv_niovecs; index++) {
2338 struct xfs_log_iovec *reg = &lv->lv_iovecp[index];
2339 uint32_t reg_offset = 0;
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352 if (iclog->ic_size - *log_offset <=
2353 sizeof(struct xlog_op_header)) {
2354 error = xlog_write_get_more_iclog_space(ticket,
2355 &iclog, log_offset, *len, record_cnt,
2356 data_cnt);
2357 if (error)
2358 return error;
2359 }
2360
2361 ophdr = reg->i_addr;
2362 rlen = min_t(uint32_t, reg->i_len, iclog->ic_size - *log_offset);
2363
2364 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2365 ophdr->oh_len = cpu_to_be32(rlen - sizeof(struct xlog_op_header));
2366 if (rlen != reg->i_len)
2367 ophdr->oh_flags |= XLOG_CONTINUE_TRANS;
2368
2369 xlog_write_iovec(iclog, log_offset, reg->i_addr,
2370 rlen, len, record_cnt, data_cnt);
2371
2372
2373 if (rlen == reg->i_len)
2374 continue;
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396 do {
2397
2398
2399
2400
2401
2402
2403
2404
2405 error = xlog_write_get_more_iclog_space(ticket,
2406 &iclog, log_offset,
2407 *len + sizeof(struct xlog_op_header),
2408 record_cnt, data_cnt);
2409 if (error)
2410 return error;
2411
2412 ophdr = iclog->ic_datap + *log_offset;
2413 ophdr->oh_tid = cpu_to_be32(ticket->t_tid);
2414 ophdr->oh_clientid = XFS_TRANSACTION;
2415 ophdr->oh_res2 = 0;
2416 ophdr->oh_flags = XLOG_WAS_CONT_TRANS;
2417
2418 ticket->t_curr_res -= sizeof(struct xlog_op_header);
2419 *log_offset += sizeof(struct xlog_op_header);
2420 *data_cnt += sizeof(struct xlog_op_header);
2421
2422
2423
2424
2425
2426 reg_offset += rlen;
2427 rlen = reg->i_len - reg_offset;
2428 if (rlen <= iclog->ic_size - *log_offset)
2429 ophdr->oh_flags |= XLOG_END_TRANS;
2430 else
2431 ophdr->oh_flags |= XLOG_CONTINUE_TRANS;
2432
2433 rlen = min_t(uint32_t, rlen, iclog->ic_size - *log_offset);
2434 ophdr->oh_len = cpu_to_be32(rlen);
2435
2436 xlog_write_iovec(iclog, log_offset,
2437 reg->i_addr + reg_offset,
2438 rlen, len, record_cnt, data_cnt);
2439
2440 } while (ophdr->oh_flags & XLOG_CONTINUE_TRANS);
2441 }
2442
2443
2444
2445
2446
2447 *iclogp = iclog;
2448 return 0;
2449 }
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491 int
2492 xlog_write(
2493 struct xlog *log,
2494 struct xfs_cil_ctx *ctx,
2495 struct list_head *lv_chain,
2496 struct xlog_ticket *ticket,
2497 uint32_t len)
2498
2499 {
2500 struct xlog_in_core *iclog = NULL;
2501 struct xfs_log_vec *lv;
2502 uint32_t record_cnt = 0;
2503 uint32_t data_cnt = 0;
2504 int error = 0;
2505 int log_offset;
2506
2507 if (ticket->t_curr_res < 0) {
2508 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
2509 "ctx ticket reservation ran out. Need to up reservation");
2510 xlog_print_tic_res(log->l_mp, ticket);
2511 xlog_force_shutdown(log, SHUTDOWN_LOG_IO_ERROR);
2512 }
2513
2514 error = xlog_state_get_iclog_space(log, len, &iclog, ticket,
2515 &log_offset);
2516 if (error)
2517 return error;
2518
2519 ASSERT(log_offset <= iclog->ic_size - 1);
2520
2521
2522
2523
2524
2525
2526 if (ctx)
2527 xlog_cil_set_ctx_write_state(ctx, iclog);
2528
2529 list_for_each_entry(lv, lv_chain, lv_list) {
2530
2531
2532
2533
2534 if (lv->lv_niovecs &&
2535 lv->lv_bytes > iclog->ic_size - log_offset) {
2536 error = xlog_write_partial(lv, ticket, &iclog,
2537 &log_offset, &len, &record_cnt,
2538 &data_cnt);
2539 if (error) {
2540
2541
2542
2543
2544 return error;
2545 }
2546 } else {
2547 xlog_write_full(lv, ticket, iclog, &log_offset,
2548 &len, &record_cnt, &data_cnt);
2549 }
2550 }
2551 ASSERT(len == 0);
2552
2553
2554
2555
2556
2557
2558
2559 spin_lock(&log->l_icloglock);
2560 xlog_state_finish_copy(log, iclog, record_cnt, 0);
2561 error = xlog_state_release_iclog(log, iclog, ticket);
2562 spin_unlock(&log->l_icloglock);
2563
2564 return error;
2565 }
2566
2567 static void
2568 xlog_state_activate_iclog(
2569 struct xlog_in_core *iclog,
2570 int *iclogs_changed)
2571 {
2572 ASSERT(list_empty_careful(&iclog->ic_callbacks));
2573 trace_xlog_iclog_activate(iclog, _RET_IP_);
2574
2575
2576
2577
2578
2579
2580
2581 if (*iclogs_changed == 0 &&
2582 iclog->ic_header.h_num_logops == cpu_to_be32(XLOG_COVER_OPS)) {
2583 *iclogs_changed = 1;
2584 } else {
2585
2586
2587
2588
2589 *iclogs_changed = 2;
2590 }
2591
2592 iclog->ic_state = XLOG_STATE_ACTIVE;
2593 iclog->ic_offset = 0;
2594 iclog->ic_header.h_num_logops = 0;
2595 memset(iclog->ic_header.h_cycle_data, 0,
2596 sizeof(iclog->ic_header.h_cycle_data));
2597 iclog->ic_header.h_lsn = 0;
2598 iclog->ic_header.h_tail_lsn = 0;
2599 }
2600
2601
2602
2603
2604
2605 static void
2606 xlog_state_activate_iclogs(
2607 struct xlog *log,
2608 int *iclogs_changed)
2609 {
2610 struct xlog_in_core *iclog = log->l_iclog;
2611
2612 do {
2613 if (iclog->ic_state == XLOG_STATE_DIRTY)
2614 xlog_state_activate_iclog(iclog, iclogs_changed);
2615
2616
2617
2618
2619 else if (iclog->ic_state != XLOG_STATE_ACTIVE)
2620 break;
2621 } while ((iclog = iclog->ic_next) != log->l_iclog);
2622 }
2623
2624 static int
2625 xlog_covered_state(
2626 int prev_state,
2627 int iclogs_changed)
2628 {
2629
2630
2631
2632
2633
2634
2635 switch (prev_state) {
2636 case XLOG_STATE_COVER_IDLE:
2637 if (iclogs_changed == 1)
2638 return XLOG_STATE_COVER_IDLE;
2639 fallthrough;
2640 case XLOG_STATE_COVER_NEED:
2641 case XLOG_STATE_COVER_NEED2:
2642 break;
2643 case XLOG_STATE_COVER_DONE:
2644 if (iclogs_changed == 1)
2645 return XLOG_STATE_COVER_NEED2;
2646 break;
2647 case XLOG_STATE_COVER_DONE2:
2648 if (iclogs_changed == 1)
2649 return XLOG_STATE_COVER_IDLE;
2650 break;
2651 default:
2652 ASSERT(0);
2653 }
2654
2655 return XLOG_STATE_COVER_NEED;
2656 }
2657
2658 STATIC void
2659 xlog_state_clean_iclog(
2660 struct xlog *log,
2661 struct xlog_in_core *dirty_iclog)
2662 {
2663 int iclogs_changed = 0;
2664
2665 trace_xlog_iclog_clean(dirty_iclog, _RET_IP_);
2666
2667 dirty_iclog->ic_state = XLOG_STATE_DIRTY;
2668
2669 xlog_state_activate_iclogs(log, &iclogs_changed);
2670 wake_up_all(&dirty_iclog->ic_force_wait);
2671
2672 if (iclogs_changed) {
2673 log->l_covered_state = xlog_covered_state(log->l_covered_state,
2674 iclogs_changed);
2675 }
2676 }
2677
2678 STATIC xfs_lsn_t
2679 xlog_get_lowest_lsn(
2680 struct xlog *log)
2681 {
2682 struct xlog_in_core *iclog = log->l_iclog;
2683 xfs_lsn_t lowest_lsn = 0, lsn;
2684
2685 do {
2686 if (iclog->ic_state == XLOG_STATE_ACTIVE ||
2687 iclog->ic_state == XLOG_STATE_DIRTY)
2688 continue;
2689
2690 lsn = be64_to_cpu(iclog->ic_header.h_lsn);
2691 if ((lsn && !lowest_lsn) || XFS_LSN_CMP(lsn, lowest_lsn) < 0)
2692 lowest_lsn = lsn;
2693 } while ((iclog = iclog->ic_next) != log->l_iclog);
2694
2695 return lowest_lsn;
2696 }
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720 static void
2721 xlog_state_set_callback(
2722 struct xlog *log,
2723 struct xlog_in_core *iclog,
2724 xfs_lsn_t header_lsn)
2725 {
2726 trace_xlog_iclog_callback(iclog, _RET_IP_);
2727 iclog->ic_state = XLOG_STATE_CALLBACK;
2728
2729 ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn),
2730 header_lsn) <= 0);
2731
2732 if (list_empty_careful(&iclog->ic_callbacks))
2733 return;
2734
2735 atomic64_set(&log->l_last_sync_lsn, header_lsn);
2736 xlog_grant_push_ail(log, 0);
2737 }
2738
2739
2740
2741
2742
2743
2744 static bool
2745 xlog_state_iodone_process_iclog(
2746 struct xlog *log,
2747 struct xlog_in_core *iclog)
2748 {
2749 xfs_lsn_t lowest_lsn;
2750 xfs_lsn_t header_lsn;
2751
2752 switch (iclog->ic_state) {
2753 case XLOG_STATE_ACTIVE:
2754 case XLOG_STATE_DIRTY:
2755
2756
2757
2758 return false;
2759 case XLOG_STATE_DONE_SYNC:
2760
2761
2762
2763
2764
2765
2766 header_lsn = be64_to_cpu(iclog->ic_header.h_lsn);
2767 lowest_lsn = xlog_get_lowest_lsn(log);
2768 if (lowest_lsn && XFS_LSN_CMP(lowest_lsn, header_lsn) < 0)
2769 return false;
2770 xlog_state_set_callback(log, iclog, header_lsn);
2771 return false;
2772 default:
2773
2774
2775
2776
2777
2778 return true;
2779 }
2780 }
2781
2782
2783
2784
2785
2786
2787
2788
2789 static bool
2790 xlog_state_do_iclog_callbacks(
2791 struct xlog *log)
2792 __releases(&log->l_icloglock)
2793 __acquires(&log->l_icloglock)
2794 {
2795 struct xlog_in_core *first_iclog = log->l_iclog;
2796 struct xlog_in_core *iclog = first_iclog;
2797 bool ran_callback = false;
2798
2799 do {
2800 LIST_HEAD(cb_list);
2801
2802 if (xlog_state_iodone_process_iclog(log, iclog))
2803 break;
2804 if (iclog->ic_state != XLOG_STATE_CALLBACK) {
2805 iclog = iclog->ic_next;
2806 continue;
2807 }
2808 list_splice_init(&iclog->ic_callbacks, &cb_list);
2809 spin_unlock(&log->l_icloglock);
2810
2811 trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
2812 xlog_cil_process_committed(&cb_list);
2813 trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
2814 ran_callback = true;
2815
2816 spin_lock(&log->l_icloglock);
2817 xlog_state_clean_iclog(log, iclog);
2818 iclog = iclog->ic_next;
2819 } while (iclog != first_iclog);
2820
2821 return ran_callback;
2822 }
2823
2824
2825
2826
2827
2828
2829 STATIC void
2830 xlog_state_do_callback(
2831 struct xlog *log)
2832 {
2833 int flushcnt = 0;
2834 int repeats = 0;
2835
2836 spin_lock(&log->l_icloglock);
2837 while (xlog_state_do_iclog_callbacks(log)) {
2838 if (xlog_is_shutdown(log))
2839 break;
2840
2841 if (++repeats > 5000) {
2842 flushcnt += repeats;
2843 repeats = 0;
2844 xfs_warn(log->l_mp,
2845 "%s: possible infinite loop (%d iterations)",
2846 __func__, flushcnt);
2847 }
2848 }
2849
2850 if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE)
2851 wake_up_all(&log->l_flush_wait);
2852
2853 spin_unlock(&log->l_icloglock);
2854 }
2855
2856
2857
2858
2859
2860
2861
2862
2863 STATIC void
2864 xlog_state_done_syncing(
2865 struct xlog_in_core *iclog)
2866 {
2867 struct xlog *log = iclog->ic_log;
2868
2869 spin_lock(&log->l_icloglock);
2870 ASSERT(atomic_read(&iclog->ic_refcnt) == 0);
2871 trace_xlog_iclog_sync_done(iclog, _RET_IP_);
2872
2873
2874
2875
2876
2877
2878 if (!xlog_is_shutdown(log)) {
2879 ASSERT(iclog->ic_state == XLOG_STATE_SYNCING);
2880 iclog->ic_state = XLOG_STATE_DONE_SYNC;
2881 }
2882
2883
2884
2885
2886
2887
2888 wake_up_all(&iclog->ic_write_wait);
2889 spin_unlock(&log->l_icloglock);
2890 xlog_state_do_callback(log);
2891 }
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911 STATIC int
2912 xlog_state_get_iclog_space(
2913 struct xlog *log,
2914 int len,
2915 struct xlog_in_core **iclogp,
2916 struct xlog_ticket *ticket,
2917 int *logoffsetp)
2918 {
2919 int log_offset;
2920 xlog_rec_header_t *head;
2921 xlog_in_core_t *iclog;
2922
2923 restart:
2924 spin_lock(&log->l_icloglock);
2925 if (xlog_is_shutdown(log)) {
2926 spin_unlock(&log->l_icloglock);
2927 return -EIO;
2928 }
2929
2930 iclog = log->l_iclog;
2931 if (iclog->ic_state != XLOG_STATE_ACTIVE) {
2932 XFS_STATS_INC(log->l_mp, xs_log_noiclogs);
2933
2934
2935 xlog_wait(&log->l_flush_wait, &log->l_icloglock);
2936 goto restart;
2937 }
2938
2939 head = &iclog->ic_header;
2940
2941 atomic_inc(&iclog->ic_refcnt);
2942 log_offset = iclog->ic_offset;
2943
2944 trace_xlog_iclog_get_space(iclog, _RET_IP_);
2945
2946
2947
2948
2949
2950
2951 if (log_offset == 0) {
2952 ticket->t_curr_res -= log->l_iclog_hsize;
2953 head->h_cycle = cpu_to_be32(log->l_curr_cycle);
2954 head->h_lsn = cpu_to_be64(
2955 xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
2956 ASSERT(log->l_curr_block >= 0);
2957 }
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968 if (iclog->ic_size - iclog->ic_offset < 2*sizeof(xlog_op_header_t)) {
2969 int error = 0;
2970
2971 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
2972
2973
2974
2975
2976
2977
2978
2979
2980 if (!atomic_add_unless(&iclog->ic_refcnt, -1, 1))
2981 error = xlog_state_release_iclog(log, iclog, ticket);
2982 spin_unlock(&log->l_icloglock);
2983 if (error)
2984 return error;
2985 goto restart;
2986 }
2987
2988
2989
2990
2991
2992
2993
2994 if (len <= iclog->ic_size - iclog->ic_offset)
2995 iclog->ic_offset += len;
2996 else
2997 xlog_state_switch_iclogs(log, iclog, iclog->ic_size);
2998 *iclogp = iclog;
2999
3000 ASSERT(iclog->ic_offset <= iclog->ic_size);
3001 spin_unlock(&log->l_icloglock);
3002
3003 *logoffsetp = log_offset;
3004 return 0;
3005 }
3006
3007
3008
3009
3010
3011
3012
3013
3014 void
3015 xfs_log_ticket_regrant(
3016 struct xlog *log,
3017 struct xlog_ticket *ticket)
3018 {
3019 trace_xfs_log_ticket_regrant(log, ticket);
3020
3021 if (ticket->t_cnt > 0)
3022 ticket->t_cnt--;
3023
3024 xlog_grant_sub_space(log, &log->l_reserve_head.grant,
3025 ticket->t_curr_res);
3026 xlog_grant_sub_space(log, &log->l_write_head.grant,
3027 ticket->t_curr_res);
3028 ticket->t_curr_res = ticket->t_unit_res;
3029
3030 trace_xfs_log_ticket_regrant_sub(log, ticket);
3031
3032
3033 if (!ticket->t_cnt) {
3034 xlog_grant_add_space(log, &log->l_reserve_head.grant,
3035 ticket->t_unit_res);
3036 trace_xfs_log_ticket_regrant_exit(log, ticket);
3037
3038 ticket->t_curr_res = ticket->t_unit_res;
3039 }
3040
3041 xfs_log_ticket_put(ticket);
3042 }
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058 void
3059 xfs_log_ticket_ungrant(
3060 struct xlog *log,
3061 struct xlog_ticket *ticket)
3062 {
3063 int bytes;
3064
3065 trace_xfs_log_ticket_ungrant(log, ticket);
3066
3067 if (ticket->t_cnt > 0)
3068 ticket->t_cnt--;
3069
3070 trace_xfs_log_ticket_ungrant_sub(log, ticket);
3071
3072
3073
3074
3075
3076 bytes = ticket->t_curr_res;
3077 if (ticket->t_cnt > 0) {
3078 ASSERT(ticket->t_flags & XLOG_TIC_PERM_RESERV);
3079 bytes += ticket->t_unit_res*ticket->t_cnt;
3080 }
3081
3082 xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
3083 xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);
3084
3085 trace_xfs_log_ticket_ungrant_exit(log, ticket);
3086
3087 xfs_log_space_wake(log->l_mp);
3088 xfs_log_ticket_put(ticket);
3089 }
3090
3091
3092
3093
3094
3095 void
3096 xlog_state_switch_iclogs(
3097 struct xlog *log,
3098 struct xlog_in_core *iclog,
3099 int eventual_size)
3100 {
3101 ASSERT(iclog->ic_state == XLOG_STATE_ACTIVE);
3102 assert_spin_locked(&log->l_icloglock);
3103 trace_xlog_iclog_switch(iclog, _RET_IP_);
3104
3105 if (!eventual_size)
3106 eventual_size = iclog->ic_offset;
3107 iclog->ic_state = XLOG_STATE_WANT_SYNC;
3108 iclog->ic_header.h_prev_block = cpu_to_be32(log->l_prev_block);
3109 log->l_prev_block = log->l_curr_block;
3110 log->l_prev_cycle = log->l_curr_cycle;
3111
3112
3113 log->l_curr_block += BTOBB(eventual_size)+BTOBB(log->l_iclog_hsize);
3114
3115
3116 if (log->l_iclog_roundoff > BBSIZE) {
3117 uint32_t sunit_bb = BTOBB(log->l_iclog_roundoff);
3118 log->l_curr_block = roundup(log->l_curr_block, sunit_bb);
3119 }
3120
3121 if (log->l_curr_block >= log->l_logBBsize) {
3122
3123
3124
3125
3126
3127
3128
3129 log->l_curr_block -= log->l_logBBsize;
3130 ASSERT(log->l_curr_block >= 0);
3131 smp_wmb();
3132 log->l_curr_cycle++;
3133 if (log->l_curr_cycle == XLOG_HEADER_MAGIC_NUM)
3134 log->l_curr_cycle++;
3135 }
3136 ASSERT(iclog == log->l_iclog);
3137 log->l_iclog = iclog->ic_next;
3138 }
3139
3140
3141
3142
3143
3144
3145
3146
3147 static int
3148 xlog_force_and_check_iclog(
3149 struct xlog_in_core *iclog,
3150 bool *completed)
3151 {
3152 xfs_lsn_t lsn = be64_to_cpu(iclog->ic_header.h_lsn);
3153 int error;
3154
3155 *completed = false;
3156 error = xlog_force_iclog(iclog);
3157 if (error)
3158 return error;
3159
3160
3161
3162
3163
3164 if (be64_to_cpu(iclog->ic_header.h_lsn) != lsn)
3165 *completed = true;
3166 return 0;
3167 }
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196 int
3197 xfs_log_force(
3198 struct xfs_mount *mp,
3199 uint flags)
3200 {
3201 struct xlog *log = mp->m_log;
3202 struct xlog_in_core *iclog;
3203
3204 XFS_STATS_INC(mp, xs_log_force);
3205 trace_xfs_log_force(mp, 0, _RET_IP_);
3206
3207 xlog_cil_force(log);
3208
3209 spin_lock(&log->l_icloglock);
3210 if (xlog_is_shutdown(log))
3211 goto out_error;
3212
3213 iclog = log->l_iclog;
3214 trace_xlog_iclog_force(iclog, _RET_IP_);
3215
3216 if (iclog->ic_state == XLOG_STATE_DIRTY ||
3217 (iclog->ic_state == XLOG_STATE_ACTIVE &&
3218 atomic_read(&iclog->ic_refcnt) == 0 && iclog->ic_offset == 0)) {
3219
3220
3221
3222
3223
3224
3225
3226
3227 iclog = iclog->ic_prev;
3228 } else if (iclog->ic_state == XLOG_STATE_ACTIVE) {
3229 if (atomic_read(&iclog->ic_refcnt) == 0) {
3230
3231 bool completed;
3232
3233 if (xlog_force_and_check_iclog(iclog, &completed))
3234 goto out_error;
3235
3236 if (completed)
3237 goto out_unlock;
3238 } else {
3239
3240
3241
3242
3243
3244 xlog_state_switch_iclogs(log, iclog, 0);
3245 }
3246 }
3247
3248
3249
3250
3251
3252
3253
3254 if (iclog->ic_state == XLOG_STATE_WANT_SYNC)
3255 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
3256
3257 if (flags & XFS_LOG_SYNC)
3258 return xlog_wait_on_iclog(iclog);
3259 out_unlock:
3260 spin_unlock(&log->l_icloglock);
3261 return 0;
3262 out_error:
3263 spin_unlock(&log->l_icloglock);
3264 return -EIO;
3265 }
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281 static int
3282 xlog_force_lsn(
3283 struct xlog *log,
3284 xfs_lsn_t lsn,
3285 uint flags,
3286 int *log_flushed,
3287 bool already_slept)
3288 {
3289 struct xlog_in_core *iclog;
3290 bool completed;
3291
3292 spin_lock(&log->l_icloglock);
3293 if (xlog_is_shutdown(log))
3294 goto out_error;
3295
3296 iclog = log->l_iclog;
3297 while (be64_to_cpu(iclog->ic_header.h_lsn) != lsn) {
3298 trace_xlog_iclog_force_lsn(iclog, _RET_IP_);
3299 iclog = iclog->ic_next;
3300 if (iclog == log->l_iclog)
3301 goto out_unlock;
3302 }
3303
3304 switch (iclog->ic_state) {
3305 case XLOG_STATE_ACTIVE:
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321 if (!already_slept &&
3322 (iclog->ic_prev->ic_state == XLOG_STATE_WANT_SYNC ||
3323 iclog->ic_prev->ic_state == XLOG_STATE_SYNCING)) {
3324 xlog_wait(&iclog->ic_prev->ic_write_wait,
3325 &log->l_icloglock);
3326 return -EAGAIN;
3327 }
3328 if (xlog_force_and_check_iclog(iclog, &completed))
3329 goto out_error;
3330 if (log_flushed)
3331 *log_flushed = 1;
3332 if (completed)
3333 goto out_unlock;
3334 break;
3335 case XLOG_STATE_WANT_SYNC:
3336
3337
3338
3339
3340
3341
3342
3343 iclog->ic_flags |= XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA;
3344 break;
3345 default:
3346
3347
3348
3349
3350
3351
3352 break;
3353 }
3354
3355 if (flags & XFS_LOG_SYNC)
3356 return xlog_wait_on_iclog(iclog);
3357 out_unlock:
3358 spin_unlock(&log->l_icloglock);
3359 return 0;
3360 out_error:
3361 spin_unlock(&log->l_icloglock);
3362 return -EIO;
3363 }
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374 int
3375 xfs_log_force_seq(
3376 struct xfs_mount *mp,
3377 xfs_csn_t seq,
3378 uint flags,
3379 int *log_flushed)
3380 {
3381 struct xlog *log = mp->m_log;
3382 xfs_lsn_t lsn;
3383 int ret;
3384 ASSERT(seq != 0);
3385
3386 XFS_STATS_INC(mp, xs_log_force);
3387 trace_xfs_log_force(mp, seq, _RET_IP_);
3388
3389 lsn = xlog_cil_force_seq(log, seq);
3390 if (lsn == NULLCOMMITLSN)
3391 return 0;
3392
3393 ret = xlog_force_lsn(log, lsn, flags, log_flushed, false);
3394 if (ret == -EAGAIN) {
3395 XFS_STATS_INC(mp, xs_log_force_sleep);
3396 ret = xlog_force_lsn(log, lsn, flags, log_flushed, true);
3397 }
3398 return ret;
3399 }
3400
3401
3402
3403
3404 void
3405 xfs_log_ticket_put(
3406 xlog_ticket_t *ticket)
3407 {
3408 ASSERT(atomic_read(&ticket->t_ref) > 0);
3409 if (atomic_dec_and_test(&ticket->t_ref))
3410 kmem_cache_free(xfs_log_ticket_cache, ticket);
3411 }
3412
3413 xlog_ticket_t *
3414 xfs_log_ticket_get(
3415 xlog_ticket_t *ticket)
3416 {
3417 ASSERT(atomic_read(&ticket->t_ref) > 0);
3418 atomic_inc(&ticket->t_ref);
3419 return ticket;
3420 }
3421
3422
3423
3424
3425
3426 static int
3427 xlog_calc_unit_res(
3428 struct xlog *log,
3429 int unit_bytes,
3430 int *niclogs)
3431 {
3432 int iclog_space;
3433 uint num_headers;
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467 unit_bytes += sizeof(xlog_op_header_t);
3468 unit_bytes += sizeof(xfs_trans_header_t);
3469
3470
3471 unit_bytes += sizeof(xlog_op_header_t);
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490 iclog_space = log->l_iclog_size - log->l_iclog_hsize;
3491 num_headers = howmany(unit_bytes, iclog_space);
3492
3493
3494 unit_bytes += sizeof(xlog_op_header_t) * num_headers;
3495
3496
3497 while (!num_headers ||
3498 howmany(unit_bytes, iclog_space) > num_headers) {
3499 unit_bytes += sizeof(xlog_op_header_t);
3500 num_headers++;
3501 }
3502 unit_bytes += log->l_iclog_hsize * num_headers;
3503
3504
3505 unit_bytes += log->l_iclog_hsize;
3506
3507
3508 unit_bytes += 2 * log->l_iclog_roundoff;
3509
3510 if (niclogs)
3511 *niclogs = num_headers;
3512 return unit_bytes;
3513 }
3514
3515 int
3516 xfs_log_calc_unit_res(
3517 struct xfs_mount *mp,
3518 int unit_bytes)
3519 {
3520 return xlog_calc_unit_res(mp->m_log, unit_bytes, NULL);
3521 }
3522
3523
3524
3525
3526 struct xlog_ticket *
3527 xlog_ticket_alloc(
3528 struct xlog *log,
3529 int unit_bytes,
3530 int cnt,
3531 bool permanent)
3532 {
3533 struct xlog_ticket *tic;
3534 int unit_res;
3535
3536 tic = kmem_cache_zalloc(xfs_log_ticket_cache, GFP_NOFS | __GFP_NOFAIL);
3537
3538 unit_res = xlog_calc_unit_res(log, unit_bytes, &tic->t_iclog_hdrs);
3539
3540 atomic_set(&tic->t_ref, 1);
3541 tic->t_task = current;
3542 INIT_LIST_HEAD(&tic->t_queue);
3543 tic->t_unit_res = unit_res;
3544 tic->t_curr_res = unit_res;
3545 tic->t_cnt = cnt;
3546 tic->t_ocnt = cnt;
3547 tic->t_tid = prandom_u32();
3548 if (permanent)
3549 tic->t_flags |= XLOG_TIC_PERM_RESERV;
3550
3551 return tic;
3552 }
3553
3554 #if defined(DEBUG)
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566 STATIC void
3567 xlog_verify_grant_tail(
3568 struct xlog *log)
3569 {
3570 int tail_cycle, tail_blocks;
3571 int cycle, space;
3572
3573 xlog_crack_grant_head(&log->l_write_head.grant, &cycle, &space);
3574 xlog_crack_atomic_lsn(&log->l_tail_lsn, &tail_cycle, &tail_blocks);
3575 if (tail_cycle != cycle) {
3576 if (cycle - 1 != tail_cycle &&
3577 !test_and_set_bit(XLOG_TAIL_WARN, &log->l_opstate)) {
3578 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3579 "%s: cycle - 1 != tail_cycle", __func__);
3580 }
3581
3582 if (space > BBTOB(tail_blocks) &&
3583 !test_and_set_bit(XLOG_TAIL_WARN, &log->l_opstate)) {
3584 xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
3585 "%s: space > BBTOB(tail_blocks)", __func__);
3586 }
3587 }
3588 }
3589
3590
3591 STATIC void
3592 xlog_verify_tail_lsn(
3593 struct xlog *log,
3594 struct xlog_in_core *iclog)
3595 {
3596 xfs_lsn_t tail_lsn = be64_to_cpu(iclog->ic_header.h_tail_lsn);
3597 int blocks;
3598
3599 if (CYCLE_LSN(tail_lsn) == log->l_prev_cycle) {
3600 blocks =
3601 log->l_logBBsize - (log->l_prev_block - BLOCK_LSN(tail_lsn));
3602 if (blocks < BTOBB(iclog->ic_offset)+BTOBB(log->l_iclog_hsize))
3603 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3604 } else {
3605 ASSERT(CYCLE_LSN(tail_lsn)+1 == log->l_prev_cycle);
3606
3607 if (BLOCK_LSN(tail_lsn) == log->l_prev_block)
3608 xfs_emerg(log->l_mp, "%s: tail wrapped", __func__);
3609
3610 blocks = BLOCK_LSN(tail_lsn) - log->l_prev_block;
3611 if (blocks < BTOBB(iclog->ic_offset) + 1)
3612 xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
3613 }
3614 }
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631 STATIC void
3632 xlog_verify_iclog(
3633 struct xlog *log,
3634 struct xlog_in_core *iclog,
3635 int count)
3636 {
3637 xlog_op_header_t *ophead;
3638 xlog_in_core_t *icptr;
3639 xlog_in_core_2_t *xhdr;
3640 void *base_ptr, *ptr, *p;
3641 ptrdiff_t field_offset;
3642 uint8_t clientid;
3643 int len, i, j, k, op_len;
3644 int idx;
3645
3646
3647 spin_lock(&log->l_icloglock);
3648 icptr = log->l_iclog;
3649 for (i = 0; i < log->l_iclog_bufs; i++, icptr = icptr->ic_next)
3650 ASSERT(icptr);
3651
3652 if (icptr != log->l_iclog)
3653 xfs_emerg(log->l_mp, "%s: corrupt iclog ring", __func__);
3654 spin_unlock(&log->l_icloglock);
3655
3656
3657 if (iclog->ic_header.h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3658 xfs_emerg(log->l_mp, "%s: invalid magic num", __func__);
3659
3660 base_ptr = ptr = &iclog->ic_header;
3661 p = &iclog->ic_header;
3662 for (ptr += BBSIZE; ptr < base_ptr + count; ptr += BBSIZE) {
3663 if (*(__be32 *)ptr == cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3664 xfs_emerg(log->l_mp, "%s: unexpected magic num",
3665 __func__);
3666 }
3667
3668
3669 len = be32_to_cpu(iclog->ic_header.h_num_logops);
3670 base_ptr = ptr = iclog->ic_datap;
3671 ophead = ptr;
3672 xhdr = iclog->ic_data;
3673 for (i = 0; i < len; i++) {
3674 ophead = ptr;
3675
3676
3677 p = &ophead->oh_clientid;
3678 field_offset = p - base_ptr;
3679 if (field_offset & 0x1ff) {
3680 clientid = ophead->oh_clientid;
3681 } else {
3682 idx = BTOBBT((void *)&ophead->oh_clientid - iclog->ic_datap);
3683 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3684 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3685 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3686 clientid = xlog_get_client_id(
3687 xhdr[j].hic_xheader.xh_cycle_data[k]);
3688 } else {
3689 clientid = xlog_get_client_id(
3690 iclog->ic_header.h_cycle_data[idx]);
3691 }
3692 }
3693 if (clientid != XFS_TRANSACTION && clientid != XFS_LOG) {
3694 xfs_warn(log->l_mp,
3695 "%s: op %d invalid clientid %d op "PTR_FMT" offset 0x%lx",
3696 __func__, i, clientid, ophead,
3697 (unsigned long)field_offset);
3698 }
3699
3700
3701 p = &ophead->oh_len;
3702 field_offset = p - base_ptr;
3703 if (field_offset & 0x1ff) {
3704 op_len = be32_to_cpu(ophead->oh_len);
3705 } else {
3706 idx = BTOBBT((void *)&ophead->oh_len - iclog->ic_datap);
3707 if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
3708 j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3709 k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
3710 op_len = be32_to_cpu(xhdr[j].hic_xheader.xh_cycle_data[k]);
3711 } else {
3712 op_len = be32_to_cpu(iclog->ic_header.h_cycle_data[idx]);
3713 }
3714 }
3715 ptr += sizeof(xlog_op_header_t) + op_len;
3716 }
3717 }
3718 #endif
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739 bool
3740 xlog_force_shutdown(
3741 struct xlog *log,
3742 uint32_t shutdown_flags)
3743 {
3744 bool log_error = (shutdown_flags & SHUTDOWN_LOG_IO_ERROR);
3745
3746 if (!log)
3747 return false;
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764 if (!log_error && !xlog_in_recovery(log))
3765 xfs_log_force(log->l_mp, XFS_LOG_SYNC);
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778 spin_lock(&log->l_icloglock);
3779 if (test_and_set_bit(XLOG_IO_ERROR, &log->l_opstate)) {
3780 spin_unlock(&log->l_icloglock);
3781 return false;
3782 }
3783 spin_unlock(&log->l_icloglock);
3784
3785
3786
3787
3788
3789 if (!test_and_set_bit(XFS_OPSTATE_SHUTDOWN, &log->l_mp->m_opstate)) {
3790 xfs_alert_tag(log->l_mp, XFS_PTAG_SHUTDOWN_LOGERROR,
3791 "Filesystem has been shut down due to log error (0x%x).",
3792 shutdown_flags);
3793 xfs_alert(log->l_mp,
3794 "Please unmount the filesystem and rectify the problem(s).");
3795 if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
3796 xfs_stack_trace();
3797 }
3798
3799
3800
3801
3802
3803
3804
3805
3806 xlog_grant_head_wake_all(&log->l_reserve_head);
3807 xlog_grant_head_wake_all(&log->l_write_head);
3808
3809
3810
3811
3812
3813
3814
3815 spin_lock(&log->l_cilp->xc_push_lock);
3816 wake_up_all(&log->l_cilp->xc_start_wait);
3817 wake_up_all(&log->l_cilp->xc_commit_wait);
3818 spin_unlock(&log->l_cilp->xc_push_lock);
3819
3820 spin_lock(&log->l_icloglock);
3821 xlog_state_shutdown_callbacks(log);
3822 spin_unlock(&log->l_icloglock);
3823
3824 wake_up_var(&log->l_opstate);
3825 return log_error;
3826 }
3827
3828 STATIC int
3829 xlog_iclogs_empty(
3830 struct xlog *log)
3831 {
3832 xlog_in_core_t *iclog;
3833
3834 iclog = log->l_iclog;
3835 do {
3836
3837
3838
3839 if (iclog->ic_header.h_num_logops)
3840 return 0;
3841 iclog = iclog->ic_next;
3842 } while (iclog != log->l_iclog);
3843 return 1;
3844 }
3845
3846
3847
3848
3849
3850 bool
3851 xfs_log_check_lsn(
3852 struct xfs_mount *mp,
3853 xfs_lsn_t lsn)
3854 {
3855 struct xlog *log = mp->m_log;
3856 bool valid;
3857
3858
3859
3860
3861
3862
3863 if (xfs_has_norecovery(mp))
3864 return true;
3865
3866
3867
3868
3869
3870 if (lsn == NULLCOMMITLSN)
3871 return true;
3872
3873 valid = xlog_valid_lsn(mp->m_log, lsn);
3874
3875
3876 if (!valid) {
3877 spin_lock(&log->l_icloglock);
3878 xfs_warn(mp,
3879 "Corruption warning: Metadata has LSN (%d:%d) ahead of current LSN (%d:%d). "
3880 "Please unmount and run xfs_repair (>= v4.3) to resolve.",
3881 CYCLE_LSN(lsn), BLOCK_LSN(lsn),
3882 log->l_curr_cycle, log->l_curr_block);
3883 spin_unlock(&log->l_icloglock);
3884 }
3885
3886 return valid;
3887 }
3888
3889
3890
3891
3892
3893
3894 void
3895 xlog_use_incompat_feat(
3896 struct xlog *log)
3897 {
3898 down_read(&log->l_incompat_users);
3899 }
3900
3901
3902 void
3903 xlog_drop_incompat_feat(
3904 struct xlog *log)
3905 {
3906 up_read(&log->l_incompat_users);
3907 }