[Cluster-devel] [PATCH 12/29] xfs: enforce GFP_NOIO implicitly during nowait time update
Hao Xu <[email protected]> Fri, 25 Aug 2023 21:54:14 +0800
| Newsgroups | com.redhat.cluster-devel,net.sourceforge.lists.linux-f2fs-devel,org.infradead.lists.linux-mtd,org.kernel.vger.bpf,org.kernel.vger.ecryptfs,org.kernel.vger.io-uring,org.kernel.vger.linux-block,org.kernel.vger.linux-btrfs,org.kernel.vger.linux-cifs,org.kernel.vger.linux-ext4,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs,org.kernel.vger.linux-nilfs,org.kernel.vger.linux-s390,org.kernel.vger.linux-unionfs,org.kernel.vger.linux-xfs,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
From: Hao Xu <[email protected]> Enforce GFP_NOIO logic implicitly by set pflags if we are in nowait time update process. Nowait semantics means no waiting for IO, therefore GFP_NOIO is needed. Signed-off-by: Hao Xu <[email protected]> --- fs/xfs/xfs_iops.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index bf1d4c31f009..5fa391083de9 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1037,6 +1037,8 @@ xfs_vn_update_time( int log_flags = XFS_ILOG_TIMESTAMP; struct xfs_trans *tp; int error; + int old_pflags; + bool nowait = flags & S_NOWAIT; trace_xfs_update_time(ip); @@ -1049,13 +1051,18 @@ xfs_vn_update_time( log_flags |= XFS_ILOG_CORE; } + if (nowait) + old_pflags = memalloc_noio_save(); + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp); if (error) - return error; + goto out; - if (flags & S_NOWAIT) { - if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) - return -EAGAIN; + if (nowait) { + if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { + error = -EAGAIN; + goto out; + } } else { xfs_ilock(ip, XFS_ILOCK_EXCL); } @@ -1069,7 +1076,12 @@ xfs_vn_update_time( xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, log_flags); - return xfs_trans_commit(tp); + error = xfs_trans_commit(tp); + +out: + if (nowait) + memalloc_noio_restore(old_pflags); + return error; } STATIC int -- 2.25.1