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_inode.h"
0014 #include "xfs_trans.h"
0015 #include "xfs_trans_priv.h"
0016 #include "xfs_inode_item.h"
0017 #include "xfs_quota.h"
0018 #include "xfs_trace.h"
0019 #include "xfs_icache.h"
0020 #include "xfs_bmap_util.h"
0021 #include "xfs_dquot_item.h"
0022 #include "xfs_dquot.h"
0023 #include "xfs_reflink.h"
0024 #include "xfs_ialloc.h"
0025 #include "xfs_ag.h"
0026 #include "xfs_log_priv.h"
0027
0028 #include <linux/iversion.h>
0029
0030
0031
0032
0033 #define XFS_ICI_RECLAIM_TAG 0
0034
0035 #define XFS_ICI_BLOCKGC_TAG 1
0036
0037
0038
0039
0040
0041 enum xfs_icwalk_goal {
0042
0043 XFS_ICWALK_BLOCKGC = XFS_ICI_BLOCKGC_TAG,
0044 XFS_ICWALK_RECLAIM = XFS_ICI_RECLAIM_TAG,
0045 };
0046
0047 static int xfs_icwalk(struct xfs_mount *mp,
0048 enum xfs_icwalk_goal goal, struct xfs_icwalk *icw);
0049 static int xfs_icwalk_ag(struct xfs_perag *pag,
0050 enum xfs_icwalk_goal goal, struct xfs_icwalk *icw);
0051
0052
0053
0054
0055
0056
0057
0058 #define XFS_ICWALK_FLAG_SCAN_LIMIT (1U << 28)
0059
0060 #define XFS_ICWALK_FLAG_RECLAIM_SICK (1U << 27)
0061 #define XFS_ICWALK_FLAG_UNION (1U << 26)
0062
0063 #define XFS_ICWALK_PRIVATE_FLAGS (XFS_ICWALK_FLAG_SCAN_LIMIT | \
0064 XFS_ICWALK_FLAG_RECLAIM_SICK | \
0065 XFS_ICWALK_FLAG_UNION)
0066
0067
0068
0069
0070 struct xfs_inode *
0071 xfs_inode_alloc(
0072 struct xfs_mount *mp,
0073 xfs_ino_t ino)
0074 {
0075 struct xfs_inode *ip;
0076
0077
0078
0079
0080
0081 ip = alloc_inode_sb(mp->m_super, xfs_inode_cache, GFP_KERNEL | __GFP_NOFAIL);
0082
0083 if (inode_init_always(mp->m_super, VFS_I(ip))) {
0084 kmem_cache_free(xfs_inode_cache, ip);
0085 return NULL;
0086 }
0087
0088
0089 VFS_I(ip)->i_mode = 0;
0090 VFS_I(ip)->i_state = 0;
0091 mapping_set_large_folios(VFS_I(ip)->i_mapping);
0092
0093 XFS_STATS_INC(mp, vn_active);
0094 ASSERT(atomic_read(&ip->i_pincount) == 0);
0095 ASSERT(ip->i_ino == 0);
0096
0097
0098 ip->i_ino = ino;
0099 ip->i_mount = mp;
0100 memset(&ip->i_imap, 0, sizeof(struct xfs_imap));
0101 ip->i_cowfp = NULL;
0102 memset(&ip->i_af, 0, sizeof(ip->i_af));
0103 ip->i_af.if_format = XFS_DINODE_FMT_EXTENTS;
0104 memset(&ip->i_df, 0, sizeof(ip->i_df));
0105 ip->i_flags = 0;
0106 ip->i_delayed_blks = 0;
0107 ip->i_diflags2 = mp->m_ino_geo.new_diflags2;
0108 ip->i_nblocks = 0;
0109 ip->i_forkoff = 0;
0110 ip->i_sick = 0;
0111 ip->i_checked = 0;
0112 INIT_WORK(&ip->i_ioend_work, xfs_end_io);
0113 INIT_LIST_HEAD(&ip->i_ioend_list);
0114 spin_lock_init(&ip->i_ioend_lock);
0115 ip->i_next_unlinked = NULLAGINO;
0116 ip->i_prev_unlinked = NULLAGINO;
0117
0118 return ip;
0119 }
0120
0121 STATIC void
0122 xfs_inode_free_callback(
0123 struct rcu_head *head)
0124 {
0125 struct inode *inode = container_of(head, struct inode, i_rcu);
0126 struct xfs_inode *ip = XFS_I(inode);
0127
0128 switch (VFS_I(ip)->i_mode & S_IFMT) {
0129 case S_IFREG:
0130 case S_IFDIR:
0131 case S_IFLNK:
0132 xfs_idestroy_fork(&ip->i_df);
0133 break;
0134 }
0135
0136 xfs_ifork_zap_attr(ip);
0137
0138 if (ip->i_cowfp) {
0139 xfs_idestroy_fork(ip->i_cowfp);
0140 kmem_cache_free(xfs_ifork_cache, ip->i_cowfp);
0141 }
0142 if (ip->i_itemp) {
0143 ASSERT(!test_bit(XFS_LI_IN_AIL,
0144 &ip->i_itemp->ili_item.li_flags));
0145 xfs_inode_item_destroy(ip);
0146 ip->i_itemp = NULL;
0147 }
0148
0149 kmem_cache_free(xfs_inode_cache, ip);
0150 }
0151
0152 static void
0153 __xfs_inode_free(
0154 struct xfs_inode *ip)
0155 {
0156
0157 ASSERT(atomic_read(&ip->i_pincount) == 0);
0158 ASSERT(!ip->i_itemp || list_empty(&ip->i_itemp->ili_item.li_bio_list));
0159 XFS_STATS_DEC(ip->i_mount, vn_active);
0160
0161 call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback);
0162 }
0163
0164 void
0165 xfs_inode_free(
0166 struct xfs_inode *ip)
0167 {
0168 ASSERT(!xfs_iflags_test(ip, XFS_IFLUSHING));
0169
0170
0171
0172
0173
0174
0175
0176 spin_lock(&ip->i_flags_lock);
0177 ip->i_flags = XFS_IRECLAIM;
0178 ip->i_ino = 0;
0179 spin_unlock(&ip->i_flags_lock);
0180
0181 __xfs_inode_free(ip);
0182 }
0183
0184
0185
0186
0187
0188 static void
0189 xfs_reclaim_work_queue(
0190 struct xfs_mount *mp)
0191 {
0192
0193 rcu_read_lock();
0194 if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) {
0195 queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work,
0196 msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10));
0197 }
0198 rcu_read_unlock();
0199 }
0200
0201
0202
0203
0204
0205 static inline void
0206 xfs_blockgc_queue(
0207 struct xfs_perag *pag)
0208 {
0209 struct xfs_mount *mp = pag->pag_mount;
0210
0211 if (!xfs_is_blockgc_enabled(mp))
0212 return;
0213
0214 rcu_read_lock();
0215 if (radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_BLOCKGC_TAG))
0216 queue_delayed_work(pag->pag_mount->m_blockgc_wq,
0217 &pag->pag_blockgc_work,
0218 msecs_to_jiffies(xfs_blockgc_secs * 1000));
0219 rcu_read_unlock();
0220 }
0221
0222
0223 static void
0224 xfs_perag_set_inode_tag(
0225 struct xfs_perag *pag,
0226 xfs_agino_t agino,
0227 unsigned int tag)
0228 {
0229 struct xfs_mount *mp = pag->pag_mount;
0230 bool was_tagged;
0231
0232 lockdep_assert_held(&pag->pag_ici_lock);
0233
0234 was_tagged = radix_tree_tagged(&pag->pag_ici_root, tag);
0235 radix_tree_tag_set(&pag->pag_ici_root, agino, tag);
0236
0237 if (tag == XFS_ICI_RECLAIM_TAG)
0238 pag->pag_ici_reclaimable++;
0239
0240 if (was_tagged)
0241 return;
0242
0243
0244 spin_lock(&mp->m_perag_lock);
0245 radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, tag);
0246 spin_unlock(&mp->m_perag_lock);
0247
0248
0249 switch (tag) {
0250 case XFS_ICI_RECLAIM_TAG:
0251 xfs_reclaim_work_queue(mp);
0252 break;
0253 case XFS_ICI_BLOCKGC_TAG:
0254 xfs_blockgc_queue(pag);
0255 break;
0256 }
0257
0258 trace_xfs_perag_set_inode_tag(mp, pag->pag_agno, tag, _RET_IP_);
0259 }
0260
0261
0262 static void
0263 xfs_perag_clear_inode_tag(
0264 struct xfs_perag *pag,
0265 xfs_agino_t agino,
0266 unsigned int tag)
0267 {
0268 struct xfs_mount *mp = pag->pag_mount;
0269
0270 lockdep_assert_held(&pag->pag_ici_lock);
0271
0272
0273
0274
0275
0276 if (agino != NULLAGINO)
0277 radix_tree_tag_clear(&pag->pag_ici_root, agino, tag);
0278 else
0279 ASSERT(tag == XFS_ICI_RECLAIM_TAG);
0280
0281 if (tag == XFS_ICI_RECLAIM_TAG)
0282 pag->pag_ici_reclaimable--;
0283
0284 if (radix_tree_tagged(&pag->pag_ici_root, tag))
0285 return;
0286
0287
0288 spin_lock(&mp->m_perag_lock);
0289 radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, tag);
0290 spin_unlock(&mp->m_perag_lock);
0291
0292 trace_xfs_perag_clear_inode_tag(mp, pag->pag_agno, tag, _RET_IP_);
0293 }
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303 static int
0304 xfs_reinit_inode(
0305 struct xfs_mount *mp,
0306 struct inode *inode)
0307 {
0308 int error;
0309 uint32_t nlink = inode->i_nlink;
0310 uint32_t generation = inode->i_generation;
0311 uint64_t version = inode_peek_iversion(inode);
0312 umode_t mode = inode->i_mode;
0313 dev_t dev = inode->i_rdev;
0314 kuid_t uid = inode->i_uid;
0315 kgid_t gid = inode->i_gid;
0316
0317 error = inode_init_always(mp->m_super, inode);
0318
0319 set_nlink(inode, nlink);
0320 inode->i_generation = generation;
0321 inode_set_iversion_queried(inode, version);
0322 inode->i_mode = mode;
0323 inode->i_rdev = dev;
0324 inode->i_uid = uid;
0325 inode->i_gid = gid;
0326 mapping_set_large_folios(inode->i_mapping);
0327 return error;
0328 }
0329
0330
0331
0332
0333
0334 static int
0335 xfs_iget_recycle(
0336 struct xfs_perag *pag,
0337 struct xfs_inode *ip) __releases(&ip->i_flags_lock)
0338 {
0339 struct xfs_mount *mp = ip->i_mount;
0340 struct inode *inode = VFS_I(ip);
0341 int error;
0342
0343 trace_xfs_iget_recycle(ip);
0344
0345
0346
0347
0348
0349
0350
0351 ip->i_flags |= XFS_IRECLAIM;
0352
0353 spin_unlock(&ip->i_flags_lock);
0354 rcu_read_unlock();
0355
0356 ASSERT(!rwsem_is_locked(&inode->i_rwsem));
0357 error = xfs_reinit_inode(mp, inode);
0358 if (error) {
0359
0360
0361
0362
0363 rcu_read_lock();
0364 spin_lock(&ip->i_flags_lock);
0365 ip->i_flags &= ~(XFS_INEW | XFS_IRECLAIM);
0366 ASSERT(ip->i_flags & XFS_IRECLAIMABLE);
0367 spin_unlock(&ip->i_flags_lock);
0368 rcu_read_unlock();
0369
0370 trace_xfs_iget_recycle_fail(ip);
0371 return error;
0372 }
0373
0374 spin_lock(&pag->pag_ici_lock);
0375 spin_lock(&ip->i_flags_lock);
0376
0377
0378
0379
0380
0381
0382 ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS;
0383 ip->i_flags |= XFS_INEW;
0384 xfs_perag_clear_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
0385 XFS_ICI_RECLAIM_TAG);
0386 inode->i_state = I_NEW;
0387 spin_unlock(&ip->i_flags_lock);
0388 spin_unlock(&pag->pag_ici_lock);
0389
0390 return 0;
0391 }
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403 static int
0404 xfs_iget_check_free_state(
0405 struct xfs_inode *ip,
0406 int flags)
0407 {
0408 if (flags & XFS_IGET_CREATE) {
0409
0410 if (VFS_I(ip)->i_mode != 0) {
0411 xfs_warn(ip->i_mount,
0412 "Corruption detected! Free inode 0x%llx not marked free! (mode 0x%x)",
0413 ip->i_ino, VFS_I(ip)->i_mode);
0414 return -EFSCORRUPTED;
0415 }
0416
0417 if (ip->i_nblocks != 0) {
0418 xfs_warn(ip->i_mount,
0419 "Corruption detected! Free inode 0x%llx has blocks allocated!",
0420 ip->i_ino);
0421 return -EFSCORRUPTED;
0422 }
0423 return 0;
0424 }
0425
0426
0427 if (VFS_I(ip)->i_mode == 0)
0428 return -ENOENT;
0429
0430 return 0;
0431 }
0432
0433
0434 static void
0435 xfs_inodegc_queue_all(
0436 struct xfs_mount *mp)
0437 {
0438 struct xfs_inodegc *gc;
0439 int cpu;
0440
0441 for_each_online_cpu(cpu) {
0442 gc = per_cpu_ptr(mp->m_inodegc, cpu);
0443 if (!llist_empty(&gc->list))
0444 mod_delayed_work_on(cpu, mp->m_inodegc_wq, &gc->work, 0);
0445 }
0446 }
0447
0448
0449
0450
0451 static int
0452 xfs_iget_cache_hit(
0453 struct xfs_perag *pag,
0454 struct xfs_inode *ip,
0455 xfs_ino_t ino,
0456 int flags,
0457 int lock_flags) __releases(RCU)
0458 {
0459 struct inode *inode = VFS_I(ip);
0460 struct xfs_mount *mp = ip->i_mount;
0461 int error;
0462
0463
0464
0465
0466
0467
0468
0469
0470 spin_lock(&ip->i_flags_lock);
0471 if (ip->i_ino != ino)
0472 goto out_skip;
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492 if (ip->i_flags & (XFS_INEW | XFS_IRECLAIM | XFS_INACTIVATING))
0493 goto out_skip;
0494
0495 if (ip->i_flags & XFS_NEED_INACTIVE) {
0496
0497 if (VFS_I(ip)->i_nlink == 0) {
0498 error = -ENOENT;
0499 goto out_error;
0500 }
0501 goto out_inodegc_flush;
0502 }
0503
0504
0505
0506
0507
0508 error = xfs_iget_check_free_state(ip, flags);
0509 if (error)
0510 goto out_error;
0511
0512
0513 if ((flags & XFS_IGET_INCORE) &&
0514 (ip->i_flags & XFS_IRECLAIMABLE))
0515 goto out_skip;
0516
0517
0518 if (ip->i_flags & XFS_IRECLAIMABLE) {
0519
0520 error = xfs_iget_recycle(pag, ip);
0521 if (error)
0522 return error;
0523 } else {
0524
0525 if (!igrab(inode))
0526 goto out_skip;
0527
0528
0529 spin_unlock(&ip->i_flags_lock);
0530 rcu_read_unlock();
0531 trace_xfs_iget_hit(ip);
0532 }
0533
0534 if (lock_flags != 0)
0535 xfs_ilock(ip, lock_flags);
0536
0537 if (!(flags & XFS_IGET_INCORE))
0538 xfs_iflags_clear(ip, XFS_ISTALE);
0539 XFS_STATS_INC(mp, xs_ig_found);
0540
0541 return 0;
0542
0543 out_skip:
0544 trace_xfs_iget_skip(ip);
0545 XFS_STATS_INC(mp, xs_ig_frecycle);
0546 error = -EAGAIN;
0547 out_error:
0548 spin_unlock(&ip->i_flags_lock);
0549 rcu_read_unlock();
0550 return error;
0551
0552 out_inodegc_flush:
0553 spin_unlock(&ip->i_flags_lock);
0554 rcu_read_unlock();
0555
0556
0557
0558
0559 if (xfs_is_inodegc_enabled(mp))
0560 xfs_inodegc_queue_all(mp);
0561 return -EAGAIN;
0562 }
0563
0564 static int
0565 xfs_iget_cache_miss(
0566 struct xfs_mount *mp,
0567 struct xfs_perag *pag,
0568 xfs_trans_t *tp,
0569 xfs_ino_t ino,
0570 struct xfs_inode **ipp,
0571 int flags,
0572 int lock_flags)
0573 {
0574 struct xfs_inode *ip;
0575 int error;
0576 xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino);
0577 int iflags;
0578
0579 ip = xfs_inode_alloc(mp, ino);
0580 if (!ip)
0581 return -ENOMEM;
0582
0583 error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, flags);
0584 if (error)
0585 goto out_destroy;
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597 if (xfs_has_v3inodes(mp) &&
0598 (flags & XFS_IGET_CREATE) && !xfs_has_ikeep(mp)) {
0599 VFS_I(ip)->i_generation = prandom_u32();
0600 } else {
0601 struct xfs_buf *bp;
0602
0603 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp);
0604 if (error)
0605 goto out_destroy;
0606
0607 error = xfs_inode_from_disk(ip,
0608 xfs_buf_offset(bp, ip->i_imap.im_boffset));
0609 if (!error)
0610 xfs_buf_set_ref(bp, XFS_INO_REF);
0611 xfs_trans_brelse(tp, bp);
0612
0613 if (error)
0614 goto out_destroy;
0615 }
0616
0617 trace_xfs_iget_miss(ip);
0618
0619
0620
0621
0622
0623 error = xfs_iget_check_free_state(ip, flags);
0624 if (error)
0625 goto out_destroy;
0626
0627
0628
0629
0630
0631
0632
0633 if (radix_tree_preload(GFP_NOFS)) {
0634 error = -EAGAIN;
0635 goto out_destroy;
0636 }
0637
0638
0639
0640
0641
0642 if (lock_flags) {
0643 if (!xfs_ilock_nowait(ip, lock_flags))
0644 BUG();
0645 }
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656 iflags = XFS_INEW;
0657 if (flags & XFS_IGET_DONTCACHE)
0658 d_mark_dontcache(VFS_I(ip));
0659 ip->i_udquot = NULL;
0660 ip->i_gdquot = NULL;
0661 ip->i_pdquot = NULL;
0662 xfs_iflags_set(ip, iflags);
0663
0664
0665 spin_lock(&pag->pag_ici_lock);
0666 error = radix_tree_insert(&pag->pag_ici_root, agino, ip);
0667 if (unlikely(error)) {
0668 WARN_ON(error != -EEXIST);
0669 XFS_STATS_INC(mp, xs_ig_dup);
0670 error = -EAGAIN;
0671 goto out_preload_end;
0672 }
0673 spin_unlock(&pag->pag_ici_lock);
0674 radix_tree_preload_end();
0675
0676 *ipp = ip;
0677 return 0;
0678
0679 out_preload_end:
0680 spin_unlock(&pag->pag_ici_lock);
0681 radix_tree_preload_end();
0682 if (lock_flags)
0683 xfs_iunlock(ip, lock_flags);
0684 out_destroy:
0685 __destroy_inode(VFS_I(ip));
0686 xfs_inode_free(ip);
0687 return error;
0688 }
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702 int
0703 xfs_iget(
0704 struct xfs_mount *mp,
0705 struct xfs_trans *tp,
0706 xfs_ino_t ino,
0707 uint flags,
0708 uint lock_flags,
0709 struct xfs_inode **ipp)
0710 {
0711 struct xfs_inode *ip;
0712 struct xfs_perag *pag;
0713 xfs_agino_t agino;
0714 int error;
0715
0716 ASSERT((lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) == 0);
0717
0718
0719 if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount)
0720 return -EINVAL;
0721
0722 XFS_STATS_INC(mp, xs_ig_attempts);
0723
0724
0725 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino));
0726 agino = XFS_INO_TO_AGINO(mp, ino);
0727
0728 again:
0729 error = 0;
0730 rcu_read_lock();
0731 ip = radix_tree_lookup(&pag->pag_ici_root, agino);
0732
0733 if (ip) {
0734 error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags);
0735 if (error)
0736 goto out_error_or_again;
0737 } else {
0738 rcu_read_unlock();
0739 if (flags & XFS_IGET_INCORE) {
0740 error = -ENODATA;
0741 goto out_error_or_again;
0742 }
0743 XFS_STATS_INC(mp, xs_ig_missed);
0744
0745 error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip,
0746 flags, lock_flags);
0747 if (error)
0748 goto out_error_or_again;
0749 }
0750 xfs_perag_put(pag);
0751
0752 *ipp = ip;
0753
0754
0755
0756
0757
0758
0759 if (xfs_iflags_test(ip, XFS_INEW) && VFS_I(ip)->i_mode != 0)
0760 xfs_setup_existing_inode(ip);
0761 return 0;
0762
0763 out_error_or_again:
0764 if (!(flags & XFS_IGET_INCORE) && error == -EAGAIN) {
0765 delay(1);
0766 goto again;
0767 }
0768 xfs_perag_put(pag);
0769 return error;
0770 }
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791 int
0792 xfs_icache_inode_is_allocated(
0793 struct xfs_mount *mp,
0794 struct xfs_trans *tp,
0795 xfs_ino_t ino,
0796 bool *inuse)
0797 {
0798 struct xfs_inode *ip;
0799 int error;
0800
0801 error = xfs_iget(mp, tp, ino, XFS_IGET_INCORE, 0, &ip);
0802 if (error)
0803 return error;
0804
0805 *inuse = !!(VFS_I(ip)->i_mode);
0806 xfs_irele(ip);
0807 return 0;
0808 }
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827 static bool
0828 xfs_reclaim_igrab(
0829 struct xfs_inode *ip,
0830 struct xfs_icwalk *icw)
0831 {
0832 ASSERT(rcu_read_lock_held());
0833
0834 spin_lock(&ip->i_flags_lock);
0835 if (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) ||
0836 __xfs_iflags_test(ip, XFS_IRECLAIM)) {
0837
0838 spin_unlock(&ip->i_flags_lock);
0839 return false;
0840 }
0841
0842
0843 if (ip->i_sick &&
0844 (!icw || !(icw->icw_flags & XFS_ICWALK_FLAG_RECLAIM_SICK))) {
0845 spin_unlock(&ip->i_flags_lock);
0846 return false;
0847 }
0848
0849 __xfs_iflags_set(ip, XFS_IRECLAIM);
0850 spin_unlock(&ip->i_flags_lock);
0851 return true;
0852 }
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866 static void
0867 xfs_reclaim_inode(
0868 struct xfs_inode *ip,
0869 struct xfs_perag *pag)
0870 {
0871 xfs_ino_t ino = ip->i_ino;
0872
0873 if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL))
0874 goto out;
0875 if (xfs_iflags_test_and_set(ip, XFS_IFLUSHING))
0876 goto out_iunlock;
0877
0878
0879
0880
0881
0882
0883
0884
0885 if (xlog_is_shutdown(ip->i_mount->m_log)) {
0886 xfs_iunpin_wait(ip);
0887 xfs_iflush_shutdown_abort(ip);
0888 goto reclaim;
0889 }
0890 if (xfs_ipincount(ip))
0891 goto out_clear_flush;
0892 if (!xfs_inode_clean(ip))
0893 goto out_clear_flush;
0894
0895 xfs_iflags_clear(ip, XFS_IFLUSHING);
0896 reclaim:
0897 trace_xfs_inode_reclaiming(ip);
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909 spin_lock(&ip->i_flags_lock);
0910 ip->i_flags = XFS_IRECLAIM;
0911 ip->i_ino = 0;
0912 ip->i_sick = 0;
0913 ip->i_checked = 0;
0914 spin_unlock(&ip->i_flags_lock);
0915
0916 ASSERT(!ip->i_itemp || ip->i_itemp->ili_item.li_buf == NULL);
0917 xfs_iunlock(ip, XFS_ILOCK_EXCL);
0918
0919 XFS_STATS_INC(ip->i_mount, xs_ig_reclaims);
0920
0921
0922
0923
0924
0925
0926
0927 spin_lock(&pag->pag_ici_lock);
0928 if (!radix_tree_delete(&pag->pag_ici_root,
0929 XFS_INO_TO_AGINO(ip->i_mount, ino)))
0930 ASSERT(0);
0931 xfs_perag_clear_inode_tag(pag, NULLAGINO, XFS_ICI_RECLAIM_TAG);
0932 spin_unlock(&pag->pag_ici_lock);
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942 xfs_ilock(ip, XFS_ILOCK_EXCL);
0943 ASSERT(!ip->i_udquot && !ip->i_gdquot && !ip->i_pdquot);
0944 xfs_iunlock(ip, XFS_ILOCK_EXCL);
0945 ASSERT(xfs_inode_clean(ip));
0946
0947 __xfs_inode_free(ip);
0948 return;
0949
0950 out_clear_flush:
0951 xfs_iflags_clear(ip, XFS_IFLUSHING);
0952 out_iunlock:
0953 xfs_iunlock(ip, XFS_ILOCK_EXCL);
0954 out:
0955 xfs_iflags_clear(ip, XFS_IRECLAIM);
0956 }
0957
0958
0959 static inline bool
0960 xfs_want_reclaim_sick(
0961 struct xfs_mount *mp)
0962 {
0963 return xfs_is_unmounting(mp) || xfs_has_norecovery(mp) ||
0964 xfs_is_shutdown(mp);
0965 }
0966
0967 void
0968 xfs_reclaim_inodes(
0969 struct xfs_mount *mp)
0970 {
0971 struct xfs_icwalk icw = {
0972 .icw_flags = 0,
0973 };
0974
0975 if (xfs_want_reclaim_sick(mp))
0976 icw.icw_flags |= XFS_ICWALK_FLAG_RECLAIM_SICK;
0977
0978 while (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) {
0979 xfs_ail_push_all_sync(mp->m_ail);
0980 xfs_icwalk(mp, XFS_ICWALK_RECLAIM, &icw);
0981 }
0982 }
0983
0984
0985
0986
0987
0988
0989
0990
0991 long
0992 xfs_reclaim_inodes_nr(
0993 struct xfs_mount *mp,
0994 unsigned long nr_to_scan)
0995 {
0996 struct xfs_icwalk icw = {
0997 .icw_flags = XFS_ICWALK_FLAG_SCAN_LIMIT,
0998 .icw_scan_limit = min_t(unsigned long, LONG_MAX, nr_to_scan),
0999 };
1000
1001 if (xfs_want_reclaim_sick(mp))
1002 icw.icw_flags |= XFS_ICWALK_FLAG_RECLAIM_SICK;
1003
1004
1005 xfs_reclaim_work_queue(mp);
1006 xfs_ail_push_all(mp->m_ail);
1007
1008 xfs_icwalk(mp, XFS_ICWALK_RECLAIM, &icw);
1009 return 0;
1010 }
1011
1012
1013
1014
1015
1016 long
1017 xfs_reclaim_inodes_count(
1018 struct xfs_mount *mp)
1019 {
1020 struct xfs_perag *pag;
1021 xfs_agnumber_t ag = 0;
1022 long reclaimable = 0;
1023
1024 while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) {
1025 ag = pag->pag_agno + 1;
1026 reclaimable += pag->pag_ici_reclaimable;
1027 xfs_perag_put(pag);
1028 }
1029 return reclaimable;
1030 }
1031
1032 STATIC bool
1033 xfs_icwalk_match_id(
1034 struct xfs_inode *ip,
1035 struct xfs_icwalk *icw)
1036 {
1037 if ((icw->icw_flags & XFS_ICWALK_FLAG_UID) &&
1038 !uid_eq(VFS_I(ip)->i_uid, icw->icw_uid))
1039 return false;
1040
1041 if ((icw->icw_flags & XFS_ICWALK_FLAG_GID) &&
1042 !gid_eq(VFS_I(ip)->i_gid, icw->icw_gid))
1043 return false;
1044
1045 if ((icw->icw_flags & XFS_ICWALK_FLAG_PRID) &&
1046 ip->i_projid != icw->icw_prid)
1047 return false;
1048
1049 return true;
1050 }
1051
1052
1053
1054
1055
1056 STATIC bool
1057 xfs_icwalk_match_id_union(
1058 struct xfs_inode *ip,
1059 struct xfs_icwalk *icw)
1060 {
1061 if ((icw->icw_flags & XFS_ICWALK_FLAG_UID) &&
1062 uid_eq(VFS_I(ip)->i_uid, icw->icw_uid))
1063 return true;
1064
1065 if ((icw->icw_flags & XFS_ICWALK_FLAG_GID) &&
1066 gid_eq(VFS_I(ip)->i_gid, icw->icw_gid))
1067 return true;
1068
1069 if ((icw->icw_flags & XFS_ICWALK_FLAG_PRID) &&
1070 ip->i_projid == icw->icw_prid)
1071 return true;
1072
1073 return false;
1074 }
1075
1076
1077
1078
1079
1080
1081 static bool
1082 xfs_icwalk_match(
1083 struct xfs_inode *ip,
1084 struct xfs_icwalk *icw)
1085 {
1086 bool match;
1087
1088 if (!icw)
1089 return true;
1090
1091 if (icw->icw_flags & XFS_ICWALK_FLAG_UNION)
1092 match = xfs_icwalk_match_id_union(ip, icw);
1093 else
1094 match = xfs_icwalk_match_id(ip, icw);
1095 if (!match)
1096 return false;
1097
1098
1099 if ((icw->icw_flags & XFS_ICWALK_FLAG_MINFILESIZE) &&
1100 XFS_ISIZE(ip) < icw->icw_min_file_size)
1101 return false;
1102
1103 return true;
1104 }
1105
1106
1107
1108
1109
1110
1111
1112 void
1113 xfs_reclaim_worker(
1114 struct work_struct *work)
1115 {
1116 struct xfs_mount *mp = container_of(to_delayed_work(work),
1117 struct xfs_mount, m_reclaim_work);
1118
1119 xfs_icwalk(mp, XFS_ICWALK_RECLAIM, NULL);
1120 xfs_reclaim_work_queue(mp);
1121 }
1122
1123 STATIC int
1124 xfs_inode_free_eofblocks(
1125 struct xfs_inode *ip,
1126 struct xfs_icwalk *icw,
1127 unsigned int *lockflags)
1128 {
1129 bool wait;
1130
1131 wait = icw && (icw->icw_flags & XFS_ICWALK_FLAG_SYNC);
1132
1133 if (!xfs_iflags_test(ip, XFS_IEOFBLOCKS))
1134 return 0;
1135
1136
1137
1138
1139
1140 if (!wait && mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY))
1141 return 0;
1142
1143 if (!xfs_icwalk_match(ip, icw))
1144 return 0;
1145
1146
1147
1148
1149
1150 if (!xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) {
1151 if (wait)
1152 return -EAGAIN;
1153 return 0;
1154 }
1155 *lockflags |= XFS_IOLOCK_EXCL;
1156
1157 if (xfs_can_free_eofblocks(ip, false))
1158 return xfs_free_eofblocks(ip);
1159
1160
1161 trace_xfs_inode_free_eofblocks_invalid(ip);
1162 xfs_inode_clear_eofblocks_tag(ip);
1163 return 0;
1164 }
1165
1166 static void
1167 xfs_blockgc_set_iflag(
1168 struct xfs_inode *ip,
1169 unsigned long iflag)
1170 {
1171 struct xfs_mount *mp = ip->i_mount;
1172 struct xfs_perag *pag;
1173
1174 ASSERT((iflag & ~(XFS_IEOFBLOCKS | XFS_ICOWBLOCKS)) == 0);
1175
1176
1177
1178
1179
1180 if (ip->i_flags & iflag)
1181 return;
1182 spin_lock(&ip->i_flags_lock);
1183 ip->i_flags |= iflag;
1184 spin_unlock(&ip->i_flags_lock);
1185
1186 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
1187 spin_lock(&pag->pag_ici_lock);
1188
1189 xfs_perag_set_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
1190 XFS_ICI_BLOCKGC_TAG);
1191
1192 spin_unlock(&pag->pag_ici_lock);
1193 xfs_perag_put(pag);
1194 }
1195
1196 void
1197 xfs_inode_set_eofblocks_tag(
1198 xfs_inode_t *ip)
1199 {
1200 trace_xfs_inode_set_eofblocks_tag(ip);
1201 return xfs_blockgc_set_iflag(ip, XFS_IEOFBLOCKS);
1202 }
1203
1204 static void
1205 xfs_blockgc_clear_iflag(
1206 struct xfs_inode *ip,
1207 unsigned long iflag)
1208 {
1209 struct xfs_mount *mp = ip->i_mount;
1210 struct xfs_perag *pag;
1211 bool clear_tag;
1212
1213 ASSERT((iflag & ~(XFS_IEOFBLOCKS | XFS_ICOWBLOCKS)) == 0);
1214
1215 spin_lock(&ip->i_flags_lock);
1216 ip->i_flags &= ~iflag;
1217 clear_tag = (ip->i_flags & (XFS_IEOFBLOCKS | XFS_ICOWBLOCKS)) == 0;
1218 spin_unlock(&ip->i_flags_lock);
1219
1220 if (!clear_tag)
1221 return;
1222
1223 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
1224 spin_lock(&pag->pag_ici_lock);
1225
1226 xfs_perag_clear_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
1227 XFS_ICI_BLOCKGC_TAG);
1228
1229 spin_unlock(&pag->pag_ici_lock);
1230 xfs_perag_put(pag);
1231 }
1232
1233 void
1234 xfs_inode_clear_eofblocks_tag(
1235 xfs_inode_t *ip)
1236 {
1237 trace_xfs_inode_clear_eofblocks_tag(ip);
1238 return xfs_blockgc_clear_iflag(ip, XFS_IEOFBLOCKS);
1239 }
1240
1241
1242
1243
1244
1245
1246 static bool
1247 xfs_prep_free_cowblocks(
1248 struct xfs_inode *ip)
1249 {
1250
1251
1252
1253
1254 if (!xfs_inode_has_cow_data(ip)) {
1255 trace_xfs_inode_free_cowblocks_invalid(ip);
1256 xfs_inode_clear_cowblocks_tag(ip);
1257 return false;
1258 }
1259
1260
1261
1262
1263
1264 if ((VFS_I(ip)->i_state & I_DIRTY_PAGES) ||
1265 mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY) ||
1266 mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_WRITEBACK) ||
1267 atomic_read(&VFS_I(ip)->i_dio_count))
1268 return false;
1269
1270 return true;
1271 }
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285 STATIC int
1286 xfs_inode_free_cowblocks(
1287 struct xfs_inode *ip,
1288 struct xfs_icwalk *icw,
1289 unsigned int *lockflags)
1290 {
1291 bool wait;
1292 int ret = 0;
1293
1294 wait = icw && (icw->icw_flags & XFS_ICWALK_FLAG_SYNC);
1295
1296 if (!xfs_iflags_test(ip, XFS_ICOWBLOCKS))
1297 return 0;
1298
1299 if (!xfs_prep_free_cowblocks(ip))
1300 return 0;
1301
1302 if (!xfs_icwalk_match(ip, icw))
1303 return 0;
1304
1305
1306
1307
1308
1309 if (!(*lockflags & XFS_IOLOCK_EXCL) &&
1310 !xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) {
1311 if (wait)
1312 return -EAGAIN;
1313 return 0;
1314 }
1315 *lockflags |= XFS_IOLOCK_EXCL;
1316
1317 if (!xfs_ilock_nowait(ip, XFS_MMAPLOCK_EXCL)) {
1318 if (wait)
1319 return -EAGAIN;
1320 return 0;
1321 }
1322 *lockflags |= XFS_MMAPLOCK_EXCL;
1323
1324
1325
1326
1327
1328 if (xfs_prep_free_cowblocks(ip))
1329 ret = xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, false);
1330 return ret;
1331 }
1332
1333 void
1334 xfs_inode_set_cowblocks_tag(
1335 xfs_inode_t *ip)
1336 {
1337 trace_xfs_inode_set_cowblocks_tag(ip);
1338 return xfs_blockgc_set_iflag(ip, XFS_ICOWBLOCKS);
1339 }
1340
1341 void
1342 xfs_inode_clear_cowblocks_tag(
1343 xfs_inode_t *ip)
1344 {
1345 trace_xfs_inode_clear_cowblocks_tag(ip);
1346 return xfs_blockgc_clear_iflag(ip, XFS_ICOWBLOCKS);
1347 }
1348
1349
1350 void
1351 xfs_blockgc_stop(
1352 struct xfs_mount *mp)
1353 {
1354 struct xfs_perag *pag;
1355 xfs_agnumber_t agno;
1356
1357 if (!xfs_clear_blockgc_enabled(mp))
1358 return;
1359
1360 for_each_perag(mp, agno, pag)
1361 cancel_delayed_work_sync(&pag->pag_blockgc_work);
1362 trace_xfs_blockgc_stop(mp, __return_address);
1363 }
1364
1365
1366 void
1367 xfs_blockgc_start(
1368 struct xfs_mount *mp)
1369 {
1370 struct xfs_perag *pag;
1371 xfs_agnumber_t agno;
1372
1373 if (xfs_set_blockgc_enabled(mp))
1374 return;
1375
1376 trace_xfs_blockgc_start(mp, __return_address);
1377 for_each_perag_tag(mp, agno, pag, XFS_ICI_BLOCKGC_TAG)
1378 xfs_blockgc_queue(pag);
1379 }
1380
1381
1382 #define XFS_BLOCKGC_NOGRAB_IFLAGS (XFS_INEW | \
1383 XFS_NEED_INACTIVE | \
1384 XFS_INACTIVATING | \
1385 XFS_IRECLAIMABLE | \
1386 XFS_IRECLAIM)
1387
1388
1389
1390
1391
1392 static bool
1393 xfs_blockgc_igrab(
1394 struct xfs_inode *ip)
1395 {
1396 struct inode *inode = VFS_I(ip);
1397
1398 ASSERT(rcu_read_lock_held());
1399
1400
1401 spin_lock(&ip->i_flags_lock);
1402 if (!ip->i_ino)
1403 goto out_unlock_noent;
1404
1405 if (ip->i_flags & XFS_BLOCKGC_NOGRAB_IFLAGS)
1406 goto out_unlock_noent;
1407 spin_unlock(&ip->i_flags_lock);
1408
1409
1410 if (xfs_is_shutdown(ip->i_mount))
1411 return false;
1412
1413
1414 if (!igrab(inode))
1415 return false;
1416
1417
1418 return true;
1419
1420 out_unlock_noent:
1421 spin_unlock(&ip->i_flags_lock);
1422 return false;
1423 }
1424
1425
1426 static int
1427 xfs_blockgc_scan_inode(
1428 struct xfs_inode *ip,
1429 struct xfs_icwalk *icw)
1430 {
1431 unsigned int lockflags = 0;
1432 int error;
1433
1434 error = xfs_inode_free_eofblocks(ip, icw, &lockflags);
1435 if (error)
1436 goto unlock;
1437
1438 error = xfs_inode_free_cowblocks(ip, icw, &lockflags);
1439 unlock:
1440 if (lockflags)
1441 xfs_iunlock(ip, lockflags);
1442 xfs_irele(ip);
1443 return error;
1444 }
1445
1446
1447 void
1448 xfs_blockgc_worker(
1449 struct work_struct *work)
1450 {
1451 struct xfs_perag *pag = container_of(to_delayed_work(work),
1452 struct xfs_perag, pag_blockgc_work);
1453 struct xfs_mount *mp = pag->pag_mount;
1454 int error;
1455
1456 trace_xfs_blockgc_worker(mp, __return_address);
1457
1458 error = xfs_icwalk_ag(pag, XFS_ICWALK_BLOCKGC, NULL);
1459 if (error)
1460 xfs_info(mp, "AG %u preallocation gc worker failed, err=%d",
1461 pag->pag_agno, error);
1462 xfs_blockgc_queue(pag);
1463 }
1464
1465
1466
1467
1468
1469 int
1470 xfs_blockgc_free_space(
1471 struct xfs_mount *mp,
1472 struct xfs_icwalk *icw)
1473 {
1474 int error;
1475
1476 trace_xfs_blockgc_free_space(mp, icw, _RET_IP_);
1477
1478 error = xfs_icwalk(mp, XFS_ICWALK_BLOCKGC, icw);
1479 if (error)
1480 return error;
1481
1482 xfs_inodegc_flush(mp);
1483 return 0;
1484 }
1485
1486
1487
1488
1489
1490 void
1491 xfs_blockgc_flush_all(
1492 struct xfs_mount *mp)
1493 {
1494 struct xfs_perag *pag;
1495 xfs_agnumber_t agno;
1496
1497 trace_xfs_blockgc_flush_all(mp, __return_address);
1498
1499
1500
1501
1502
1503
1504 for_each_perag_tag(mp, agno, pag, XFS_ICI_BLOCKGC_TAG)
1505 mod_delayed_work(pag->pag_mount->m_blockgc_wq,
1506 &pag->pag_blockgc_work, 0);
1507
1508 for_each_perag_tag(mp, agno, pag, XFS_ICI_BLOCKGC_TAG)
1509 flush_delayed_work(&pag->pag_blockgc_work);
1510
1511 xfs_inodegc_flush(mp);
1512 }
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524 int
1525 xfs_blockgc_free_dquots(
1526 struct xfs_mount *mp,
1527 struct xfs_dquot *udqp,
1528 struct xfs_dquot *gdqp,
1529 struct xfs_dquot *pdqp,
1530 unsigned int iwalk_flags)
1531 {
1532 struct xfs_icwalk icw = {0};
1533 bool do_work = false;
1534
1535 if (!udqp && !gdqp && !pdqp)
1536 return 0;
1537
1538
1539
1540
1541
1542 icw.icw_flags = XFS_ICWALK_FLAG_UNION | iwalk_flags;
1543
1544 if (XFS_IS_UQUOTA_ENFORCED(mp) && udqp && xfs_dquot_lowsp(udqp)) {
1545 icw.icw_uid = make_kuid(mp->m_super->s_user_ns, udqp->q_id);
1546 icw.icw_flags |= XFS_ICWALK_FLAG_UID;
1547 do_work = true;
1548 }
1549
1550 if (XFS_IS_UQUOTA_ENFORCED(mp) && gdqp && xfs_dquot_lowsp(gdqp)) {
1551 icw.icw_gid = make_kgid(mp->m_super->s_user_ns, gdqp->q_id);
1552 icw.icw_flags |= XFS_ICWALK_FLAG_GID;
1553 do_work = true;
1554 }
1555
1556 if (XFS_IS_PQUOTA_ENFORCED(mp) && pdqp && xfs_dquot_lowsp(pdqp)) {
1557 icw.icw_prid = pdqp->q_id;
1558 icw.icw_flags |= XFS_ICWALK_FLAG_PRID;
1559 do_work = true;
1560 }
1561
1562 if (!do_work)
1563 return 0;
1564
1565 return xfs_blockgc_free_space(mp, &icw);
1566 }
1567
1568
1569 int
1570 xfs_blockgc_free_quota(
1571 struct xfs_inode *ip,
1572 unsigned int iwalk_flags)
1573 {
1574 return xfs_blockgc_free_dquots(ip->i_mount,
1575 xfs_inode_dquot(ip, XFS_DQTYPE_USER),
1576 xfs_inode_dquot(ip, XFS_DQTYPE_GROUP),
1577 xfs_inode_dquot(ip, XFS_DQTYPE_PROJ), iwalk_flags);
1578 }
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588 #define XFS_LOOKUP_BATCH 32
1589
1590
1591
1592
1593
1594
1595 static inline bool
1596 xfs_icwalk_igrab(
1597 enum xfs_icwalk_goal goal,
1598 struct xfs_inode *ip,
1599 struct xfs_icwalk *icw)
1600 {
1601 switch (goal) {
1602 case XFS_ICWALK_BLOCKGC:
1603 return xfs_blockgc_igrab(ip);
1604 case XFS_ICWALK_RECLAIM:
1605 return xfs_reclaim_igrab(ip, icw);
1606 default:
1607 return false;
1608 }
1609 }
1610
1611
1612
1613
1614
1615 static inline int
1616 xfs_icwalk_process_inode(
1617 enum xfs_icwalk_goal goal,
1618 struct xfs_inode *ip,
1619 struct xfs_perag *pag,
1620 struct xfs_icwalk *icw)
1621 {
1622 int error = 0;
1623
1624 switch (goal) {
1625 case XFS_ICWALK_BLOCKGC:
1626 error = xfs_blockgc_scan_inode(ip, icw);
1627 break;
1628 case XFS_ICWALK_RECLAIM:
1629 xfs_reclaim_inode(ip, pag);
1630 break;
1631 }
1632 return error;
1633 }
1634
1635
1636
1637
1638
1639 static int
1640 xfs_icwalk_ag(
1641 struct xfs_perag *pag,
1642 enum xfs_icwalk_goal goal,
1643 struct xfs_icwalk *icw)
1644 {
1645 struct xfs_mount *mp = pag->pag_mount;
1646 uint32_t first_index;
1647 int last_error = 0;
1648 int skipped;
1649 bool done;
1650 int nr_found;
1651
1652 restart:
1653 done = false;
1654 skipped = 0;
1655 if (goal == XFS_ICWALK_RECLAIM)
1656 first_index = READ_ONCE(pag->pag_ici_reclaim_cursor);
1657 else
1658 first_index = 0;
1659 nr_found = 0;
1660 do {
1661 struct xfs_inode *batch[XFS_LOOKUP_BATCH];
1662 int error = 0;
1663 int i;
1664
1665 rcu_read_lock();
1666
1667 nr_found = radix_tree_gang_lookup_tag(&pag->pag_ici_root,
1668 (void **) batch, first_index,
1669 XFS_LOOKUP_BATCH, goal);
1670 if (!nr_found) {
1671 done = true;
1672 rcu_read_unlock();
1673 break;
1674 }
1675
1676
1677
1678
1679
1680 for (i = 0; i < nr_found; i++) {
1681 struct xfs_inode *ip = batch[i];
1682
1683 if (done || !xfs_icwalk_igrab(goal, ip, icw))
1684 batch[i] = NULL;
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698 if (XFS_INO_TO_AGNO(mp, ip->i_ino) != pag->pag_agno)
1699 continue;
1700 first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1);
1701 if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino))
1702 done = true;
1703 }
1704
1705
1706 rcu_read_unlock();
1707
1708 for (i = 0; i < nr_found; i++) {
1709 if (!batch[i])
1710 continue;
1711 error = xfs_icwalk_process_inode(goal, batch[i], pag,
1712 icw);
1713 if (error == -EAGAIN) {
1714 skipped++;
1715 continue;
1716 }
1717 if (error && last_error != -EFSCORRUPTED)
1718 last_error = error;
1719 }
1720
1721
1722 if (error == -EFSCORRUPTED)
1723 break;
1724
1725 cond_resched();
1726
1727 if (icw && (icw->icw_flags & XFS_ICWALK_FLAG_SCAN_LIMIT)) {
1728 icw->icw_scan_limit -= XFS_LOOKUP_BATCH;
1729 if (icw->icw_scan_limit <= 0)
1730 break;
1731 }
1732 } while (nr_found && !done);
1733
1734 if (goal == XFS_ICWALK_RECLAIM) {
1735 if (done)
1736 first_index = 0;
1737 WRITE_ONCE(pag->pag_ici_reclaim_cursor, first_index);
1738 }
1739
1740 if (skipped) {
1741 delay(1);
1742 goto restart;
1743 }
1744 return last_error;
1745 }
1746
1747
1748 static int
1749 xfs_icwalk(
1750 struct xfs_mount *mp,
1751 enum xfs_icwalk_goal goal,
1752 struct xfs_icwalk *icw)
1753 {
1754 struct xfs_perag *pag;
1755 int error = 0;
1756 int last_error = 0;
1757 xfs_agnumber_t agno;
1758
1759 for_each_perag_tag(mp, agno, pag, goal) {
1760 error = xfs_icwalk_ag(pag, goal, icw);
1761 if (error) {
1762 last_error = error;
1763 if (error == -EFSCORRUPTED) {
1764 xfs_perag_put(pag);
1765 break;
1766 }
1767 }
1768 }
1769 return last_error;
1770 BUILD_BUG_ON(XFS_ICWALK_PRIVATE_FLAGS & XFS_ICWALK_FLAGS_VALID);
1771 }
1772
1773 #ifdef DEBUG
1774 static void
1775 xfs_check_delalloc(
1776 struct xfs_inode *ip,
1777 int whichfork)
1778 {
1779 struct xfs_ifork *ifp = xfs_ifork_ptr(ip, whichfork);
1780 struct xfs_bmbt_irec got;
1781 struct xfs_iext_cursor icur;
1782
1783 if (!ifp || !xfs_iext_lookup_extent(ip, ifp, 0, &icur, &got))
1784 return;
1785 do {
1786 if (isnullstartblock(got.br_startblock)) {
1787 xfs_warn(ip->i_mount,
1788 "ino %llx %s fork has delalloc extent at [0x%llx:0x%llx]",
1789 ip->i_ino,
1790 whichfork == XFS_DATA_FORK ? "data" : "cow",
1791 got.br_startoff, got.br_blockcount);
1792 }
1793 } while (xfs_iext_next_extent(ifp, &icur, &got));
1794 }
1795 #else
1796 #define xfs_check_delalloc(ip, whichfork) do { } while (0)
1797 #endif
1798
1799
1800 static void
1801 xfs_inodegc_set_reclaimable(
1802 struct xfs_inode *ip)
1803 {
1804 struct xfs_mount *mp = ip->i_mount;
1805 struct xfs_perag *pag;
1806
1807 if (!xfs_is_shutdown(mp) && ip->i_delayed_blks) {
1808 xfs_check_delalloc(ip, XFS_DATA_FORK);
1809 xfs_check_delalloc(ip, XFS_COW_FORK);
1810 ASSERT(0);
1811 }
1812
1813 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
1814 spin_lock(&pag->pag_ici_lock);
1815 spin_lock(&ip->i_flags_lock);
1816
1817 trace_xfs_inode_set_reclaimable(ip);
1818 ip->i_flags &= ~(XFS_NEED_INACTIVE | XFS_INACTIVATING);
1819 ip->i_flags |= XFS_IRECLAIMABLE;
1820 xfs_perag_set_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino),
1821 XFS_ICI_RECLAIM_TAG);
1822
1823 spin_unlock(&ip->i_flags_lock);
1824 spin_unlock(&pag->pag_ici_lock);
1825 xfs_perag_put(pag);
1826 }
1827
1828
1829
1830
1831
1832
1833 static void
1834 xfs_inodegc_inactivate(
1835 struct xfs_inode *ip)
1836 {
1837 trace_xfs_inode_inactivating(ip);
1838 xfs_inactive(ip);
1839 xfs_inodegc_set_reclaimable(ip);
1840 }
1841
1842 void
1843 xfs_inodegc_worker(
1844 struct work_struct *work)
1845 {
1846 struct xfs_inodegc *gc = container_of(to_delayed_work(work),
1847 struct xfs_inodegc, work);
1848 struct llist_node *node = llist_del_all(&gc->list);
1849 struct xfs_inode *ip, *n;
1850
1851 WRITE_ONCE(gc->items, 0);
1852
1853 if (!node)
1854 return;
1855
1856 ip = llist_entry(node, struct xfs_inode, i_gclist);
1857 trace_xfs_inodegc_worker(ip->i_mount, READ_ONCE(gc->shrinker_hits));
1858
1859 WRITE_ONCE(gc->shrinker_hits, 0);
1860 llist_for_each_entry_safe(ip, n, node, i_gclist) {
1861 xfs_iflags_set(ip, XFS_INACTIVATING);
1862 xfs_inodegc_inactivate(ip);
1863 }
1864 }
1865
1866
1867
1868
1869
1870 void
1871 xfs_inodegc_push(
1872 struct xfs_mount *mp)
1873 {
1874 if (!xfs_is_inodegc_enabled(mp))
1875 return;
1876 trace_xfs_inodegc_push(mp, __return_address);
1877 xfs_inodegc_queue_all(mp);
1878 }
1879
1880
1881
1882
1883
1884 void
1885 xfs_inodegc_flush(
1886 struct xfs_mount *mp)
1887 {
1888 xfs_inodegc_push(mp);
1889 trace_xfs_inodegc_flush(mp, __return_address);
1890 flush_workqueue(mp->m_inodegc_wq);
1891 }
1892
1893
1894
1895
1896
1897 void
1898 xfs_inodegc_stop(
1899 struct xfs_mount *mp)
1900 {
1901 if (!xfs_clear_inodegc_enabled(mp))
1902 return;
1903
1904 xfs_inodegc_queue_all(mp);
1905 drain_workqueue(mp->m_inodegc_wq);
1906
1907 trace_xfs_inodegc_stop(mp, __return_address);
1908 }
1909
1910
1911
1912
1913
1914 void
1915 xfs_inodegc_start(
1916 struct xfs_mount *mp)
1917 {
1918 if (xfs_set_inodegc_enabled(mp))
1919 return;
1920
1921 trace_xfs_inodegc_start(mp, __return_address);
1922 xfs_inodegc_queue_all(mp);
1923 }
1924
1925 #ifdef CONFIG_XFS_RT
1926 static inline bool
1927 xfs_inodegc_want_queue_rt_file(
1928 struct xfs_inode *ip)
1929 {
1930 struct xfs_mount *mp = ip->i_mount;
1931
1932 if (!XFS_IS_REALTIME_INODE(ip))
1933 return false;
1934
1935 if (__percpu_counter_compare(&mp->m_frextents,
1936 mp->m_low_rtexts[XFS_LOWSP_5_PCNT],
1937 XFS_FDBLOCKS_BATCH) < 0)
1938 return true;
1939
1940 return false;
1941 }
1942 #else
1943 # define xfs_inodegc_want_queue_rt_file(ip) (false)
1944 #endif
1945
1946
1947
1948
1949
1950
1951
1952
1953 static inline bool
1954 xfs_inodegc_want_queue_work(
1955 struct xfs_inode *ip,
1956 unsigned int items)
1957 {
1958 struct xfs_mount *mp = ip->i_mount;
1959
1960 if (items > mp->m_ino_geo.inodes_per_cluster)
1961 return true;
1962
1963 if (__percpu_counter_compare(&mp->m_fdblocks,
1964 mp->m_low_space[XFS_LOWSP_5_PCNT],
1965 XFS_FDBLOCKS_BATCH) < 0)
1966 return true;
1967
1968 if (xfs_inodegc_want_queue_rt_file(ip))
1969 return true;
1970
1971 if (xfs_inode_near_dquot_enforcement(ip, XFS_DQTYPE_USER))
1972 return true;
1973
1974 if (xfs_inode_near_dquot_enforcement(ip, XFS_DQTYPE_GROUP))
1975 return true;
1976
1977 if (xfs_inode_near_dquot_enforcement(ip, XFS_DQTYPE_PROJ))
1978 return true;
1979
1980 return false;
1981 }
1982
1983
1984
1985
1986
1987 #define XFS_INODEGC_MAX_BACKLOG (4 * XFS_INODES_PER_CHUNK)
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998 static inline bool
1999 xfs_inodegc_want_flush_work(
2000 struct xfs_inode *ip,
2001 unsigned int items,
2002 unsigned int shrinker_hits)
2003 {
2004 if (current->journal_info)
2005 return false;
2006
2007 if (shrinker_hits > 0)
2008 return true;
2009
2010 if (items > XFS_INODEGC_MAX_BACKLOG)
2011 return true;
2012
2013 return false;
2014 }
2015
2016
2017
2018
2019
2020
2021 static void
2022 xfs_inodegc_queue(
2023 struct xfs_inode *ip)
2024 {
2025 struct xfs_mount *mp = ip->i_mount;
2026 struct xfs_inodegc *gc;
2027 int items;
2028 unsigned int shrinker_hits;
2029 unsigned long queue_delay = 1;
2030
2031 trace_xfs_inode_set_need_inactive(ip);
2032 spin_lock(&ip->i_flags_lock);
2033 ip->i_flags |= XFS_NEED_INACTIVE;
2034 spin_unlock(&ip->i_flags_lock);
2035
2036 gc = get_cpu_ptr(mp->m_inodegc);
2037 llist_add(&ip->i_gclist, &gc->list);
2038 items = READ_ONCE(gc->items);
2039 WRITE_ONCE(gc->items, items + 1);
2040 shrinker_hits = READ_ONCE(gc->shrinker_hits);
2041
2042
2043
2044
2045
2046 if (!xfs_is_inodegc_enabled(mp)) {
2047 put_cpu_ptr(gc);
2048 return;
2049 }
2050
2051 if (xfs_inodegc_want_queue_work(ip, items))
2052 queue_delay = 0;
2053
2054 trace_xfs_inodegc_queue(mp, __return_address);
2055 mod_delayed_work(mp->m_inodegc_wq, &gc->work, queue_delay);
2056 put_cpu_ptr(gc);
2057
2058 if (xfs_inodegc_want_flush_work(ip, items, shrinker_hits)) {
2059 trace_xfs_inodegc_throttle(mp, __return_address);
2060 flush_delayed_work(&gc->work);
2061 }
2062 }
2063
2064
2065
2066
2067 void
2068 xfs_inodegc_cpu_dead(
2069 struct xfs_mount *mp,
2070 unsigned int dead_cpu)
2071 {
2072 struct xfs_inodegc *dead_gc, *gc;
2073 struct llist_node *first, *last;
2074 unsigned int count = 0;
2075
2076 dead_gc = per_cpu_ptr(mp->m_inodegc, dead_cpu);
2077 cancel_delayed_work_sync(&dead_gc->work);
2078
2079 if (llist_empty(&dead_gc->list))
2080 return;
2081
2082 first = dead_gc->list.first;
2083 last = first;
2084 while (last->next) {
2085 last = last->next;
2086 count++;
2087 }
2088 dead_gc->list.first = NULL;
2089 dead_gc->items = 0;
2090
2091
2092 gc = get_cpu_ptr(mp->m_inodegc);
2093 llist_add_batch(first, last, &gc->list);
2094 count += READ_ONCE(gc->items);
2095 WRITE_ONCE(gc->items, count);
2096
2097 if (xfs_is_inodegc_enabled(mp)) {
2098 trace_xfs_inodegc_queue(mp, __return_address);
2099 mod_delayed_work(mp->m_inodegc_wq, &gc->work, 0);
2100 }
2101 put_cpu_ptr(gc);
2102 }
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114 void
2115 xfs_inode_mark_reclaimable(
2116 struct xfs_inode *ip)
2117 {
2118 struct xfs_mount *mp = ip->i_mount;
2119 bool need_inactive;
2120
2121 XFS_STATS_INC(mp, vn_reclaim);
2122
2123
2124
2125
2126 ASSERT_ALWAYS(!xfs_iflags_test(ip, XFS_ALL_IRECLAIM_FLAGS));
2127
2128 need_inactive = xfs_inode_needs_inactive(ip);
2129 if (need_inactive) {
2130 xfs_inodegc_queue(ip);
2131 return;
2132 }
2133
2134
2135 xfs_qm_dqdetach(ip);
2136 xfs_inodegc_set_reclaimable(ip);
2137 }
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149 #define XFS_INODEGC_SHRINKER_COUNT (1UL << DEF_PRIORITY)
2150 #define XFS_INODEGC_SHRINKER_BATCH ((XFS_INODEGC_SHRINKER_COUNT / 2) + 1)
2151
2152 static unsigned long
2153 xfs_inodegc_shrinker_count(
2154 struct shrinker *shrink,
2155 struct shrink_control *sc)
2156 {
2157 struct xfs_mount *mp = container_of(shrink, struct xfs_mount,
2158 m_inodegc_shrinker);
2159 struct xfs_inodegc *gc;
2160 int cpu;
2161
2162 if (!xfs_is_inodegc_enabled(mp))
2163 return 0;
2164
2165 for_each_online_cpu(cpu) {
2166 gc = per_cpu_ptr(mp->m_inodegc, cpu);
2167 if (!llist_empty(&gc->list))
2168 return XFS_INODEGC_SHRINKER_COUNT;
2169 }
2170
2171 return 0;
2172 }
2173
2174 static unsigned long
2175 xfs_inodegc_shrinker_scan(
2176 struct shrinker *shrink,
2177 struct shrink_control *sc)
2178 {
2179 struct xfs_mount *mp = container_of(shrink, struct xfs_mount,
2180 m_inodegc_shrinker);
2181 struct xfs_inodegc *gc;
2182 int cpu;
2183 bool no_items = true;
2184
2185 if (!xfs_is_inodegc_enabled(mp))
2186 return SHRINK_STOP;
2187
2188 trace_xfs_inodegc_shrinker_scan(mp, sc, __return_address);
2189
2190 for_each_online_cpu(cpu) {
2191 gc = per_cpu_ptr(mp->m_inodegc, cpu);
2192 if (!llist_empty(&gc->list)) {
2193 unsigned int h = READ_ONCE(gc->shrinker_hits);
2194
2195 WRITE_ONCE(gc->shrinker_hits, h + 1);
2196 mod_delayed_work_on(cpu, mp->m_inodegc_wq, &gc->work, 0);
2197 no_items = false;
2198 }
2199 }
2200
2201
2202
2203
2204
2205 if (no_items)
2206 return LONG_MAX;
2207
2208 return SHRINK_STOP;
2209 }
2210
2211
2212 int
2213 xfs_inodegc_register_shrinker(
2214 struct xfs_mount *mp)
2215 {
2216 struct shrinker *shrink = &mp->m_inodegc_shrinker;
2217
2218 shrink->count_objects = xfs_inodegc_shrinker_count;
2219 shrink->scan_objects = xfs_inodegc_shrinker_scan;
2220 shrink->seeks = 0;
2221 shrink->flags = SHRINKER_NONSLAB;
2222 shrink->batch = XFS_INODEGC_SHRINKER_BATCH;
2223
2224 return register_shrinker(shrink, "xfs-inodegc:%s", mp->m_super->s_id);
2225 }