From patchwork Sat Feb 1 19:59:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 13956378 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 539761CBEA4 for ; Sat, 1 Feb 2025 19:59:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738439945; cv=none; b=C7+6B9YENbrn0KQgEvkdzfBgRijOP3Q8Z//67kjX/Bs/qFJbN5f4a084U4ZzRVlUKgpwG0fK12sks3awVuWlSLdI7hUQ+l+AhwJy6XeLSSD0JWFgtIP/SThjMeupRB7j8QftNbEL8WHYmodla9bF84v4CidmXA86tNxH9ROlUW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738439945; c=relaxed/simple; bh=OkMFOun3CcqVpITDxaDL7rZfpu6Ja1NzUNUuIETr54E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=fv5C3JvK/P34E2JSxpDbNCEmO6UVHEShr8vY/v9LfLROIwTe7YCwEO8dZcSd6uPntFw8hSbqjaCMT57OxPMWek8oz9TOQpCtYLQA+QpjHeZ64mUpZeblJOgxE7tgdgw6qC4TGluFxsE8p8rZumHAipzdPINPE2ONW0oJsBr+c4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=b055SIJe; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="b055SIJe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8EAB4C4CED3; Sat, 1 Feb 2025 19:59:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738439944; bh=OkMFOun3CcqVpITDxaDL7rZfpu6Ja1NzUNUuIETr54E=; h=From:To:Cc:Subject:Date:From; b=b055SIJeWUgHuPpygPjk7BW1pulXspVIGTkBlNCeBnpE/bq/Tm0PRmUfalx80mqFv eIf51yyHLU6BthgXzRGcOMOrYGBqUuUq2YrEMDo4H+W8r4c3OuYTgytP28gr4krL5o G9fVSaKhO03r2w7qXBklUTSY/UpiJxOILBg1rlP2EBs+RD+LnTc0REaq/t0ZKGtAjL 3FIzibKDz7YB829a/uvQiIzYwBpV3x6nWtKwgeqGmo9Fu6JpnZZeSfpOS9TOUX6gBa Kx2sHNOJgJ+OOQKLO8QiVu7w/e39jhtHBVlL0AF8bn5XJuAmF3qIkE6oBG1w3/NI4t RoHkohGdQ/iXw== From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Cc: Chuck Lever Subject: [PATCH 1/2] NFS: O_DIRECT writes must check and adjust the file length Date: Sat, 1 Feb 2025 14:59:02 -0500 Message-ID: <2e064c1d4ebaa8a58267fcd4f474e1a1e0089f38.1738439818.git.trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.48.1 Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Trond Myklebust While it is uncommon for delegations to be held while O_DIRECT writes are in progress, it is possible. The xfstests generic/647 and generic/729 both end up triggering that state, and end up failing due to the fact that the file size is not adjusted. Reported-by: Chuck Lever Link: https://bugzilla.kernel.org/show_bug.cgi?id=219738 Cc: stable@vger.kernel.org Signed-off-by: Trond Myklebust --- fs/nfs/direct.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index f45beea92d03..40e13c9a2873 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -130,6 +130,20 @@ static void nfs_direct_truncate_request(struct nfs_direct_req *dreq, dreq->count = req_start; } +static void nfs_direct_file_adjust_size_locked(struct inode *inode, + loff_t offset, size_t count) +{ + loff_t newsize = offset + (loff_t)count; + loff_t oldsize = i_size_read(inode); + + if (newsize > oldsize) { + i_size_write(inode, newsize); + NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE; + trace_nfs_size_grow(inode, newsize); + nfs_inc_stats(inode, NFSIOS_EXTENDWRITE); + } +} + /** * nfs_swap_rw - NFS address space operation for swap I/O * @iocb: target I/O control block @@ -741,6 +755,7 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) struct nfs_direct_req *dreq = hdr->dreq; struct nfs_commit_info cinfo; struct nfs_page *req = nfs_list_entry(hdr->pages.next); + struct inode *inode = dreq->inode; int flags = NFS_ODIRECT_DONE; trace_nfs_direct_write_completion(dreq); @@ -762,6 +777,10 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) } spin_unlock(&dreq->lock); + spin_lock(&inode->i_lock); + nfs_direct_file_adjust_size_locked(inode, dreq->io_start, dreq->count); + spin_unlock(&inode->i_lock); + while (!list_empty(&hdr->pages)) { req = nfs_list_entry(hdr->pages.next); From patchwork Sat Feb 1 19:59:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 13956379 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B31921CD1F1 for ; Sat, 1 Feb 2025 19:59:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738439945; cv=none; b=j+iplmIFeMzl6nsG9auHVJgiDWyd3zr/q92D2EXoBY0aDU88nU2zyZTHGwPfAO5eS+EZaDc29PMKTy+k8uQCj+UijydUj2VjgcWprKKBxI1rkZj5BLjxmkWSdJ45xLmcIOhdyNDgBuxT0V9ix0w8VLylTzN4qf9a2Ml4PNgf5Pk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738439945; c=relaxed/simple; bh=rWexCuC8cWY34tKPFVsYPSk8TRIWxLPG1Qt44hqc4cY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Yi8lQTpz52awLyFtvvekmZsnZsHew5GPAyWv/mrehzQF4sRVzBnkbSNLWMKaA5UnM9jsXWvccRFOrELO5ceb8Nruim68eEs8DEis2Qt8pAymAiC4+lG8gch+ifKVf/LklXf7C1/RVBqHB2DNZHz6u6C1ZEFr6jhJSNbIW4gnWEk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NEgP50k0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NEgP50k0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09B68C4CEE1; Sat, 1 Feb 2025 19:59:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738439945; bh=rWexCuC8cWY34tKPFVsYPSk8TRIWxLPG1Qt44hqc4cY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NEgP50k0i/sMNFSHfJ+ziVe+TE6cnU6hQf9ksGpqbkFRY39mrgs+VioVnvzXjzV0w IpGyWobCNbscIww/Utrid8jEdh/wnMviBmOyh2T2+fpRiqZhwLG8KZB0a2l2N8uryi toTfQIXRqZPqxPFyeOAjbnzQBP3m9jrwgriO2tgWFxDB7rdm+zQKfWmxkSwqpYDWDS E2wsgayAckS1FrNvog3ITGuGZd0JYeOrH6PxGkINq849QNxE6UxdNJ0uR/J8n7N/+a qWxpaP3f3RYy4kVwyTkbL78aqMN3CWWf0i/BN0gutzy/ReehlCoeEbhukcxWMf80Fe jsAS/QS8TuAnw== From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Cc: Chuck Lever Subject: [PATCH 2/2] NFS: Adjust delegated timestamps for O_DIRECT reads and writes Date: Sat, 1 Feb 2025 14:59:03 -0500 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: <2e064c1d4ebaa8a58267fcd4f474e1a1e0089f38.1738439818.git.trond.myklebust@hammerspace.com> References: <2e064c1d4ebaa8a58267fcd4f474e1a1e0089f38.1738439818.git.trond.myklebust@hammerspace.com> Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Trond Myklebust Adjust the timestamps if O_DIRECT is being combined with attribute delegations. Fixes: e12912d94137 ("NFSv4: Add support for delegated atime and mtime attributes") Signed-off-by: Trond Myklebust --- fs/nfs/direct.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 40e13c9a2873..f32f8d7c9122 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -56,6 +56,7 @@ #include #include +#include "delegation.h" #include "internal.h" #include "iostat.h" #include "pnfs.h" @@ -286,6 +287,8 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr) nfs_direct_count_bytes(dreq, hdr); spin_unlock(&dreq->lock); + nfs_update_delegated_atime(dreq->inode); + while (!list_empty(&hdr->pages)) { struct nfs_page *req = nfs_list_entry(hdr->pages.next); struct page *page = req->wb_page; @@ -779,6 +782,7 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) spin_lock(&inode->i_lock); nfs_direct_file_adjust_size_locked(inode, dreq->io_start, dreq->count); + nfs_update_delegated_mtime_locked(dreq->inode); spin_unlock(&inode->i_lock); while (!list_empty(&hdr->pages)) {