Changes for 5.12-rc3:
- Fix quota accounting on creat() when id mapping is enabled. - Actually reclaim dirty quota inodes when mount fails. - Typo fixes for documentation. - Restrict both bulkstat calls on idmapped/namespaced mounts. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEUzaAxoMeQq6m2jMV+H93GTRKtOsFAmBPgosACgkQ+H93GTRK tOvUxRAAnseftovKcY/0DxuVyaqM+9MCOTSZ7vJ/buhRyyXOWjrpI/2IU8arJlc9 iY2Qc15djBKywGneQI1KHEErsU8PhfUIgqF1R9uwkoOqNgCBQ+nj23VHnLvS19XL 0J8f+V3udi4Hxl7iToRs1ZjzIvsiwkZHaEqs37MtG4ZxOn3u2OV5c9pMD+sOvLMU iJjkaAoikYFynHCndW+egLvwmcoJnnfl57cgj238twMN3oXDG2QDumJ6XbaKUfg9 7wZNbRNRzq9w9OMaABKWMljHT8MVLXPYavhdJ76GZhujJcD6vdJZJ8+vvtUtk4JT 0Z0YTsOoAeU1BjDcJH9g+wkQWFOj2Jme/TjhIPmz4KeQi65Ir+mlTfF47GGJySti YjRL/kTv5V5OvGsUmeMHQ2Y/Wt5YksdgtP9wQzzx7Lcv17SVgFbJ+nYbv05WMpke UUxYhoAWcfsC/kmOllpBbZTyisjAv7hjmiLpGiQteR5RY1DE8PtH532Y5jz08huM veHfqpa4rLUEACRl1Qg+gTeTd3dg/gTpVANIp0HWkpzP/V8I+OvrJxNZFEBcOHK4 WzZXSwG2tSAIi1hMuzB75q5qmUQTND3QOX6u1uzUBU+KMl/U16SJJbGkWrwx7Ko2 hucFDvCmcW6lgMgY41R56mM0Sy5TMgXqaSdZtiykE0yytT2hl+8= =MQhY -----END PGP SIGNATURE----- Merge tag 'xfs-5.12-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux Pull xfs fixes from Darrick Wong: "A couple of minor corrections for the new idmapping functionality, and a fix for a theoretical hang that could occur if we decide to abort a mount after dirtying the quota inodes. Summary: - Fix quota accounting on creat() when id mapping is enabled - Actually reclaim dirty quota inodes when mount fails - Typo fixes for documentation - Restrict both bulkstat calls on idmapped/namespaced mounts" * tag 'xfs-5.12-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: xfs: also reject BULKSTAT_SINGLE in a mount user namespace docs: ABI: Fix the spelling oustanding to outstanding in the file sysfs-fs-xfs xfs: force log and push AIL to clear pinned inodes when aborting mount xfs: fix quota accounting when a mount is idmapped
This commit is contained in:
commit
c73891c922
@ -33,7 +33,7 @@ Contact: xfs@oss.sgi.com
|
||||
Description:
|
||||
The current state of the log write grant head. It
|
||||
represents the total log reservation of all currently
|
||||
oustanding transactions, including regrants due to
|
||||
outstanding transactions, including regrants due to
|
||||
rolling transactions. The grant head is exported in
|
||||
"cycle:bytes" format.
|
||||
Users: xfstests
|
||||
|
@ -1007,9 +1007,10 @@ xfs_create(
|
||||
/*
|
||||
* Make sure that we have allocated dquot(s) on disk.
|
||||
*/
|
||||
error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
|
||||
&udqp, &gdqp, &pdqp);
|
||||
error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
|
||||
fsgid_into_mnt(mnt_userns), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
|
||||
&udqp, &gdqp, &pdqp);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@ -1157,9 +1158,10 @@ xfs_create_tmpfile(
|
||||
/*
|
||||
* Make sure that we have allocated dquot(s) on disk.
|
||||
*/
|
||||
error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
|
||||
&udqp, &gdqp, &pdqp);
|
||||
error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
|
||||
fsgid_into_mnt(mnt_userns), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
|
||||
&udqp, &gdqp, &pdqp);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
@ -168,6 +168,12 @@ xfs_bulkstat_one(
|
||||
};
|
||||
int error;
|
||||
|
||||
if (breq->mnt_userns != &init_user_ns) {
|
||||
xfs_warn_ratelimited(breq->mp,
|
||||
"bulkstat not supported inside of idmapped mounts.");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ASSERT(breq->icount == 1);
|
||||
|
||||
bc.buf = kmem_zalloc(sizeof(struct xfs_bulkstat),
|
||||
|
@ -634,6 +634,47 @@ xfs_check_summary_counts(
|
||||
return xfs_initialize_perag_data(mp, mp->m_sb.sb_agcount);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush and reclaim dirty inodes in preparation for unmount. Inodes and
|
||||
* internal inode structures can be sitting in the CIL and AIL at this point,
|
||||
* so we need to unpin them, write them back and/or reclaim them before unmount
|
||||
* can proceed.
|
||||
*
|
||||
* An inode cluster that has been freed can have its buffer still pinned in
|
||||
* memory because the transaction is still sitting in a iclog. The stale inodes
|
||||
* on that buffer will be pinned to the buffer until the transaction hits the
|
||||
* disk and the callbacks run. Pushing the AIL will skip the stale inodes and
|
||||
* may never see the pinned buffer, so nothing will push out the iclog and
|
||||
* unpin the buffer.
|
||||
*
|
||||
* Hence we need to force the log to unpin everything first. However, log
|
||||
* forces don't wait for the discards they issue to complete, so we have to
|
||||
* explicitly wait for them to complete here as well.
|
||||
*
|
||||
* Then we can tell the world we are unmounting so that error handling knows
|
||||
* that the filesystem is going away and we should error out anything that we
|
||||
* have been retrying in the background. This will prevent never-ending
|
||||
* retries in AIL pushing from hanging the unmount.
|
||||
*
|
||||
* Finally, we can push the AIL to clean all the remaining dirty objects, then
|
||||
* reclaim the remaining inodes that are still in memory at this point in time.
|
||||
*/
|
||||
static void
|
||||
xfs_unmount_flush_inodes(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
xfs_log_force(mp, XFS_LOG_SYNC);
|
||||
xfs_extent_busy_wait_all(mp);
|
||||
flush_workqueue(xfs_discard_wq);
|
||||
|
||||
mp->m_flags |= XFS_MOUNT_UNMOUNTING;
|
||||
|
||||
xfs_ail_push_all_sync(mp->m_ail);
|
||||
cancel_delayed_work_sync(&mp->m_reclaim_work);
|
||||
xfs_reclaim_inodes(mp);
|
||||
xfs_health_unmount(mp);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function does the following on an initial mount of a file system:
|
||||
* - reads the superblock from disk and init the mount struct
|
||||
@ -1008,7 +1049,7 @@ xfs_mountfs(
|
||||
/* Clean out dquots that might be in memory after quotacheck. */
|
||||
xfs_qm_unmount(mp);
|
||||
/*
|
||||
* Cancel all delayed reclaim work and reclaim the inodes directly.
|
||||
* Flush all inode reclamation work and flush the log.
|
||||
* We have to do this /after/ rtunmount and qm_unmount because those
|
||||
* two will have scheduled delayed reclaim for the rt/quota inodes.
|
||||
*
|
||||
@ -1018,11 +1059,8 @@ xfs_mountfs(
|
||||
* qm_unmount_quotas and therefore rely on qm_unmount to release the
|
||||
* quota inodes.
|
||||
*/
|
||||
cancel_delayed_work_sync(&mp->m_reclaim_work);
|
||||
xfs_reclaim_inodes(mp);
|
||||
xfs_health_unmount(mp);
|
||||
xfs_unmount_flush_inodes(mp);
|
||||
out_log_dealloc:
|
||||
mp->m_flags |= XFS_MOUNT_UNMOUNTING;
|
||||
xfs_log_mount_cancel(mp);
|
||||
out_fail_wait:
|
||||
if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
|
||||
@ -1063,47 +1101,7 @@ xfs_unmountfs(
|
||||
xfs_rtunmount_inodes(mp);
|
||||
xfs_irele(mp->m_rootip);
|
||||
|
||||
/*
|
||||
* We can potentially deadlock here if we have an inode cluster
|
||||
* that has been freed has its buffer still pinned in memory because
|
||||
* the transaction is still sitting in a iclog. The stale inodes
|
||||
* on that buffer will be pinned to the buffer until the
|
||||
* transaction hits the disk and the callbacks run. Pushing the AIL will
|
||||
* skip the stale inodes and may never see the pinned buffer, so
|
||||
* nothing will push out the iclog and unpin the buffer. Hence we
|
||||
* need to force the log here to ensure all items are flushed into the
|
||||
* AIL before we go any further.
|
||||
*/
|
||||
xfs_log_force(mp, XFS_LOG_SYNC);
|
||||
|
||||
/*
|
||||
* Wait for all busy extents to be freed, including completion of
|
||||
* any discard operation.
|
||||
*/
|
||||
xfs_extent_busy_wait_all(mp);
|
||||
flush_workqueue(xfs_discard_wq);
|
||||
|
||||
/*
|
||||
* We now need to tell the world we are unmounting. This will allow
|
||||
* us to detect that the filesystem is going away and we should error
|
||||
* out anything that we have been retrying in the background. This will
|
||||
* prevent neverending retries in AIL pushing from hanging the unmount.
|
||||
*/
|
||||
mp->m_flags |= XFS_MOUNT_UNMOUNTING;
|
||||
|
||||
/*
|
||||
* Flush all pending changes from the AIL.
|
||||
*/
|
||||
xfs_ail_push_all_sync(mp->m_ail);
|
||||
|
||||
/*
|
||||
* Reclaim all inodes. At this point there should be no dirty inodes and
|
||||
* none should be pinned or locked. Stop background inode reclaim here
|
||||
* if it is still running.
|
||||
*/
|
||||
cancel_delayed_work_sync(&mp->m_reclaim_work);
|
||||
xfs_reclaim_inodes(mp);
|
||||
xfs_health_unmount(mp);
|
||||
xfs_unmount_flush_inodes(mp);
|
||||
|
||||
xfs_qm_unmount(mp);
|
||||
|
||||
|
@ -182,7 +182,8 @@ xfs_symlink(
|
||||
/*
|
||||
* Make sure that we have allocated dquot(s) on disk.
|
||||
*/
|
||||
error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
|
||||
error = xfs_qm_vop_dqalloc(dp, fsuid_into_mnt(mnt_userns),
|
||||
fsgid_into_mnt(mnt_userns), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT,
|
||||
&udqp, &gdqp, &pdqp);
|
||||
if (error)
|
||||
|
Loading…
x
Reference in New Issue
Block a user