linux/fs/xfs
Dave Chinner c9c293240e xfs: delalloc and quota softlimit timers are incoherent
I've been seeing this failure on during xfs/050 recently:

 XFS: Assertion failed: dst->d_spc_timer != 0, file: fs/xfs/xfs_qm_syscalls.c, line: 435
....
 Call Trace:
  <TASK>
  xfs_qm_scall_getquota_fill_qc+0x2a2/0x2b0
  xfs_qm_scall_getquota_next+0x69/0xa0
  xfs_fs_get_nextdqblk+0x62/0xf0
  quota_getnextxquota+0xbf/0x320
  do_quotactl+0x1a1/0x410
  __se_sys_quotactl+0x126/0x310
  __x64_sys_quotactl+0x21/0x30
  x64_sys_call+0x2819/0x2ee0
  do_syscall_64+0x68/0x130
  entry_SYSCALL_64_after_hwframe+0x76/0x7e

It turns out that the _qmount call has silently been failing to
unmount and mount the filesystem, so when the softlimit is pushed
past with a buffered write, it is not getting synced to disk before
the next quota report is being run.

Hence when the quota report runs, we have 300 blocks of delalloc
data on an inode, with a soft limit of 200 blocks. XFS dquots
account delalloc reservations as used space, hence the dquot is over
the soft limit.

However, we don't update the soft limit timers until we do a
transactional update of the dquot. That is, the dquot sits over the
soft limit without a softlimit timer being started until writeback
occurs and the allocation modifies the dquot and we call
xfs_qm_adjust_dqtimers() from xfs_trans_apply_dquot_deltas() in
xfs_trans_commit() context.

This isn't really a problem, except for this debug code in
xfs_qm_scall_getquota_fill_qc():

        if (xfs_dquot_is_enforced(dqp) && dqp->q_id != 0) {
                if ((dst->d_space > dst->d_spc_softlimit) &&
                    (dst->d_spc_softlimit > 0)) {
                        ASSERT(dst->d_spc_timer != 0);
                }
....

It asserts taht if the used block count is over the soft limit,
it *must* have a soft limit timer running. This is clearly not
the case, because we haven't committed the delalloc space to disk
yet. Hence the soft limit is only exceeded temporarily in memory
(which isn't an issue) and we start the timer the moment we exceed
the soft limit in journalled metadata.

This debug was introduced in:

commit 0d5ad8383061fbc0a9804fbb98218750000fe032
Author: Supriya Wickrematillake <sup@sgi.com>
Date:   Wed May 15 22:44:44 1996 +0000

    initial checkin
    quotactl syscall functions.

The very first quota support commit back in 1996. This is zero-day
debug for Irix and, as it turns out, a zero-day bug in the debug
code because the delalloc code on Irix didn't update the softlimit
timers, either.

IOWs, this issue has been in the code for 28 years.

We obviously don't care if soft limit timers are a bit rubbery when
we have delalloc reservations in memory. Production systems running
quota reports have been exposed to this situation for 28 years and
nobody has noticed it, so the debug code is essentially worthless at
this point in time.

We also have the on-disk dquot verifiers checking that the soft
limit timer is running whenever the dquot is over the soft limit
before we write it to disk and after we read it from disk. These
aren't firing, so it is clear the issue is purely a temporary
in-memory incoherency that I never would have noticed had the test
not silently failed to unmount the filesystem.

Hence I'm simply going to trash this runtime debug because it isn't
useful in the slightest for catching quota bugs.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2024-11-22 11:24:45 +01:00
..
libxfs xfs: fix sparse inode limits on runt AG 2024-11-22 11:24:40 +01:00
scrub xfs: update sb field checks when metadir is turned on 2024-11-05 13:38:46 -08:00
Kconfig xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
Makefile xfs: scrub the realtime group superblock 2024-11-05 13:38:43 -08:00
xfs_acl.c xfs: make attr removal an explicit operation 2024-04-23 07:46:51 -07:00
xfs_acl.h
xfs_aops.c xfs: support the COW fork in xfs_bmap_punch_delalloc_range 2024-10-15 11:37:42 +02:00
xfs_aops.h
xfs_attr_inactive.c xfs: report dir/attr block corruption errors to the health system 2024-02-22 12:32:18 -08:00
xfs_attr_item.c xfs: fix xfs_init_attr_trans not handling explicit operation codes 2024-05-27 15:55:52 +05:30
xfs_attr_item.h xfs: create attr log item opcodes and formats for parent pointers 2024-04-23 07:46:57 -07:00
xfs_attr_list.c xfs: eliminate lockdep false positives in xfs_attr_shortform_list 2024-11-22 09:52:03 +01:00
xfs_bio_io.c
xfs_bmap_item.c xfs: store rtgroup information with a bmap intent 2024-11-05 13:38:41 -08:00
xfs_bmap_item.h xfs: move xfs_bmap_defer_add to xfs_bmap_item.c 2024-02-22 12:44:21 -08:00
xfs_bmap_util.c xfs: shard the realtime section [v5.5 06/10] 2024-11-12 11:00:42 +01:00
xfs_bmap_util.h xfs: support the COW fork in xfs_bmap_punch_delalloc_range 2024-10-15 11:37:42 +02:00
xfs_buf_item_recover.c xfs: add block headers to realtime bitmap and summary blocks 2024-11-05 13:38:40 -08:00
xfs_buf_item.c xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
xfs_buf_item.h
xfs_buf_mem.c mm,tmpfs: consider end of file write in shmem_is_huge 2024-09-09 16:39:12 -07:00
xfs_buf_mem.h xfs: launder in-memory btree buffers before transaction commit 2024-02-22 12:43:36 -08:00
xfs_buf.c xfs: Support atomic write for statx 2024-11-04 16:22:10 -08:00
xfs_buf.h xfs: Support atomic write for statx 2024-11-04 16:22:10 -08:00
xfs_dahash_test.c xfs: test the ascii case-insensitive hash 2023-04-11 19:05:05 -07:00
xfs_dahash_test.h
xfs_dir2_readdir.c xfs: refactor dir format helpers 2024-04-26 11:21:46 +05:30
xfs_discard.c xfs: use rtgroup busy extent list for FITRIM 2024-11-05 13:38:44 -08:00
xfs_discard.h xfs: move log discard work to xfs_discard.c 2023-10-04 09:24:02 +11:00
xfs_dquot_item_recover.c xfs: dquot recovery does not validate the recovered dquot 2023-11-22 23:39:36 +05:30
xfs_dquot_item.c xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00
xfs_dquot_item.h
xfs_dquot.c xfs: create quota preallocation watermarks for realtime quota 2024-11-05 13:38:46 -08:00
xfs_dquot.h xfs: create quota preallocation watermarks for realtime quota 2024-11-05 13:38:46 -08:00
xfs_drain.c xfs: store a generic group structure in the intents 2024-11-05 13:38:30 -08:00
xfs_drain.h xfs: store a generic group structure in the intents 2024-11-05 13:38:30 -08:00
xfs_error.c xfs: add error injection to test file mapping exchange recovery 2024-04-15 14:54:19 -07:00
xfs_error.h
xfs_exchmaps_item.c xfs: capture inode generation numbers in the ondisk exchmaps log item 2024-04-15 14:54:24 -07:00
xfs_exchmaps_item.h xfs: create deferred log items for file mapping exchanges 2024-04-15 14:54:17 -07:00
xfs_exchrange.c New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_exchrange.h xfs: introduce new file range commit ioctls 2024-09-01 08:58:19 -07:00
xfs_export.c xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_export.h xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_extent_busy.c xfs: implement busy extent tracking for rtgroups 2024-11-05 13:38:44 -08:00
xfs_extent_busy.h xfs: convert busy extent tracking to the generic group structure 2024-11-05 13:38:29 -08:00
xfs_extfree_item.c xfs: support logging EFIs for realtime extents 2024-11-05 13:38:42 -08:00
xfs_extfree_item.h xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c 2024-07-02 11:37:03 -07:00
xfs_file.c New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_file.h xfs: create a new helper to return a file's allocation unit 2024-04-15 14:54:10 -07:00
xfs_filestream.c xfs: factor out a generic xfs_group structure 2024-11-05 13:38:27 -08:00
xfs_filestream.h
xfs_fsmap.c xfs: make RT extent numbers relative to the rtgroup 2024-11-05 13:38:38 -08:00
xfs_fsmap.h xfs: clean up xfs_getfsmap_helper arguments 2024-11-05 13:38:35 -08:00
xfs_fsops.c xfs: standardize EXPERIMENTAL warning generation 2024-11-05 13:38:30 -08:00
xfs_fsops.h xfs: split xfs_mod_freecounter 2024-04-22 18:00:47 +05:30
xfs_globals.c xfs: add debug knobs to control btree bulk load slack factors 2023-12-15 10:03:28 -08:00
xfs_handle.c simplify xfs_find_handle() a bit 2024-11-03 01:28:06 -05:00
xfs_handle.h xfs: add parent pointer ioctls 2024-04-23 07:47:00 -07:00
xfs_health.c xfs: export the geometry of realtime groups to userspace 2024-11-05 13:38:40 -08:00
xfs_hooks.c xfs: allow scrub to hook metadata updates in other writers 2024-02-22 12:30:45 -08:00
xfs_hooks.h xfs: allow scrub to hook metadata updates in other writers 2024-02-22 12:30:45 -08:00
xfs_icache.c xfs: record health problems with the metadata directory 2024-11-05 13:38:33 -08:00
xfs_icache.h xfs: use per-mount cpumask to track nonempty percpu inodegc lists 2023-09-11 08:39:03 -07:00
xfs_icreate_item.c xfs: convert kmem_free() for kvmalloc users to kvfree() 2024-02-13 18:07:34 +05:30
xfs_icreate_item.h
xfs_inode_item_recover.c xfs: define the on-disk format for the metadir feature 2024-11-05 13:38:31 -08:00
xfs_inode_item.c xfs: define the on-disk format for the metadir feature 2024-11-05 13:38:31 -08:00
xfs_inode_item.h xfs: fix AGF vs inode cluster buffer deadlock 2023-06-05 04:08:27 +10:00
xfs_inode.c xfs: remove XFS_ILOCK_RT* 2024-11-05 13:38:37 -08:00
xfs_inode.h New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_ioctl.c New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_ioctl.h xfs: move handle ioctl code to xfs_handle.c 2024-04-23 07:47:00 -07:00
xfs_ioctl32.c xfs: move handle ioctl code to xfs_handle.c 2024-04-23 07:47:00 -07:00
xfs_ioctl32.h arch: Remove Itanium (IA-64) architecture 2023-09-11 08:13:17 +00:00
xfs_iomap.c xfs: enable quota for realtime volumes [v5.5 08/10] 2024-11-12 11:02:25 +01:00
xfs_iomap.h xfs: remove xfs_page_mkwrite_iomap_ops 2024-11-05 13:52:57 +01:00
xfs_iops.c New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_iops.h xfs: declare xfs_file.c symbols in xfs_file.h 2024-04-15 14:54:09 -07:00
xfs_itable.c xfs: allow bulkstat to return metadata directories 2024-11-05 13:38:32 -08:00
xfs_itable.h xfs: allow bulkstat to return metadata directories 2024-11-05 13:38:32 -08:00
xfs_iunlink_item.c xfs: pass the iunlink item to the xfs_iunlink_update_dinode trace point 2024-11-05 13:38:26 -08:00
xfs_iunlink_item.h
xfs_iwalk.c xfs: switch perag iteration from the for_each macros to a while based iterator 2024-11-05 13:38:28 -08:00
xfs_iwalk.h xfs: factor out a xfs_iwalk_args helper 2024-11-05 13:38:27 -08:00
xfs_linux.h move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
xfs_log_cil.c xfs: remove the mount field from struct xfs_busy_extents 2024-11-05 13:38:25 -08:00
xfs_log_priv.h xfs: grant heads track byte counts, not LSNs 2024-07-04 12:46:47 +05:30
xfs_log_recover.c xfs: support logging EFIs for realtime extents 2024-11-05 13:38:42 -08:00
xfs_log.c xfs: Use xfs set and clear mp state helpers 2024-09-03 10:07:39 +05:30
xfs_log.h xfs: Remove empty declartion in header file 2024-10-07 08:00:11 +02:00
xfs_message.c xfs: define the on-disk format for the metadir feature 2024-11-05 13:38:31 -08:00
xfs_message.h xfs: define the on-disk format for the metadir feature 2024-11-05 13:38:31 -08:00
xfs_mount.c xfs: persist quota flags with metadir 2024-11-05 13:38:45 -08:00
xfs_mount.h xfs: persist quota flags with metadir 2024-11-05 13:38:45 -08:00
xfs_mru_cache.c xfs: use LIST_HEAD() to simplify code 2024-09-03 10:07:42 +05:30
xfs_mru_cache.h
xfs_notify_failure.c mm, pmem, xfs: Introduce MF_MEM_PRE_REMOVE for unbind 2023-12-07 14:34:26 +05:30
xfs_pnfs.c xfs: standardize EXPERIMENTAL warning generation 2024-11-05 13:38:30 -08:00
xfs_pnfs.h
xfs_pwork.c
xfs_pwork.h
xfs_qm_bhv.c xfs: report realtime block quota limits on realtime directories 2024-11-05 13:38:46 -08:00
xfs_qm_syscalls.c xfs: delalloc and quota softlimit timers are incoherent 2024-11-22 11:24:45 +01:00
xfs_qm.c xfs: enable realtime quota again 2024-11-05 13:38:46 -08:00
xfs_qm.h xfs: refactor loading quota inodes in the regular case 2024-09-01 08:58:20 -07:00
xfs_quota.h xfs: reserve quota for realtime files correctly 2024-11-05 13:38:46 -08:00
xfs_quotaops.c xfs: refactor loading quota inodes in the regular case 2024-09-01 08:58:20 -07:00
xfs_refcount_item.c xfs: store a generic group structure in the intents 2024-11-05 13:38:30 -08:00
xfs_refcount_item.h xfs: move xfs_refcount_update_defer_add to xfs_refcount_item.c 2024-07-02 11:37:07 -07:00
xfs_reflink.c xfs: switch perag iteration from the for_each macros to a while based iterator 2024-11-05 13:38:28 -08:00
xfs_reflink.h xfs: don't free cowblocks from under dirty pagecache on unshare 2024-10-09 10:05:10 +02:00
xfs_rmap_item.c xfs: store a generic group structure in the intents 2024-11-05 13:38:30 -08:00
xfs_rmap_item.h xfs: move xfs_rmap_update_defer_add to xfs_rmap_item.c 2024-07-02 11:37:05 -07:00
xfs_rtalloc.c xfs: enable realtime quota again 2024-11-05 13:38:46 -08:00
xfs_rtalloc.h xfs: check the realtime superblock at mount time 2024-11-05 13:38:39 -08:00
xfs_stats.c xfs: advertise realtime quota support in the xqm stat files 2024-11-05 13:38:45 -08:00
xfs_stats.h xfs: define an in-memory btree for storing refcount bag info during repairs 2024-02-22 12:43:40 -08:00
xfs_super.c New xfs code for 6.13 2024-11-21 09:20:07 -08:00
xfs_super.h xfs: create scaffolding for creating debugfs entries 2023-08-10 07:48:07 -07:00
xfs_symlink.c xfs: pass the icreate args object to xfs_dialloc 2024-09-01 08:58:19 -07:00
xfs_symlink.h xfs: move remote symlink target read function to libxfs 2024-02-22 12:45:17 -08:00
xfs_sysctl.c sysctl: treewide: constify the ctl_table argument of proc_handlers 2024-07-24 20:59:29 +02:00
xfs_sysctl.h xfs: add debug knobs to control btree bulk load slack factors 2023-12-15 10:03:28 -08:00
xfs_sysfs.c xfs: grant heads track byte counts, not LSNs 2024-07-04 12:46:47 +05:30
xfs_sysfs.h
xfs_trace.c xfs: create incore realtime group structures 2024-11-05 13:38:35 -08:00
xfs_trace.h xfs: shard the realtime section [v5.5 06/10] 2024-11-12 11:00:42 +01:00
xfs_trans_ail.c xfs: revert AIL TASK_KILLABLE threshold 2024-08-14 21:19:34 +05:30
xfs_trans_buf.c xfs: update realtime super every time we update the primary fs super 2024-11-05 13:38:39 -08:00
xfs_trans_dquot.c xfs: reserve quota for realtime files correctly 2024-11-05 13:38:46 -08:00
xfs_trans_priv.h xfs: l_last_sync_lsn is really AIL state 2024-07-04 12:46:46 +05:30
xfs_trans.c xfs: fix chown with rt quota 2024-11-05 13:38:45 -08:00
xfs_trans.h xfs: grow the realtime section when realtime groups are enabled 2024-11-05 13:38:41 -08:00
xfs_xattr.c xfs: standardize EXPERIMENTAL warning generation 2024-11-05 13:38:30 -08:00
xfs_xattr.h xfs: remove xfs_da_args.attr_flags 2024-04-23 07:46:50 -07:00
xfs.h xfs: verify buffer, inode, and dquot items every tx commit 2024-07-02 11:36:54 -07:00