Skip to content

Commit 864cc6f

Browse files
committed
Merge: [cs9] HS fixes for 25q2
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/6756 Partner Hammerspace has identified critical client fixes for the quarter, we're going to roll in three upstream fixes here and then take them in the z-streams: 62e2a47 NFS/pnfs: Fix a live lock between recalled layouts and layoutget eb3fabd pnfs/flexfiles: retry getting layout segment for reads fcf857e NFS: O_DIRECT writes must check and adjust the file length JIRA: https://issues.redhat.com/browse/RHEL-87767 Signed-off-by: Benjamin Coddington <bcodding@redhat.com> Approved-by: Olga Kornievskaia <okorniev@redhat.com> Approved-by: Scott Mayhew <smayhew@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Augusto Caringi <acaringi@redhat.com>
2 parents adc2b14 + 42fcb65 commit 864cc6f

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

fs/nfs/direct.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,20 @@ static void nfs_direct_truncate_request(struct nfs_direct_req *dreq,
130130
dreq->count = req_start;
131131
}
132132

133+
static void nfs_direct_file_adjust_size_locked(struct inode *inode,
134+
loff_t offset, size_t count)
135+
{
136+
loff_t newsize = offset + (loff_t)count;
137+
loff_t oldsize = i_size_read(inode);
138+
139+
if (newsize > oldsize) {
140+
i_size_write(inode, newsize);
141+
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
142+
trace_nfs_size_grow(inode, newsize);
143+
nfs_inc_stats(inode, NFSIOS_EXTENDWRITE);
144+
}
145+
}
146+
133147
/**
134148
* nfs_swap_rw - NFS address space operation for swap I/O
135149
* @iocb: target I/O control block
@@ -732,6 +746,7 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
732746
struct nfs_direct_req *dreq = hdr->dreq;
733747
struct nfs_commit_info cinfo;
734748
struct nfs_page *req = nfs_list_entry(hdr->pages.next);
749+
struct inode *inode = dreq->inode;
735750
int flags = NFS_ODIRECT_DONE;
736751

737752
trace_nfs_direct_write_completion(dreq);
@@ -753,6 +768,10 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
753768
}
754769
spin_unlock(&dreq->lock);
755770

771+
spin_lock(&inode->i_lock);
772+
nfs_direct_file_adjust_size_locked(inode, dreq->io_start, dreq->count);
773+
spin_unlock(&inode->i_lock);
774+
756775
while (!list_empty(&hdr->pages)) {
757776

758777
req = nfs_list_entry(hdr->pages.next);

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,9 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
831831
struct nfs4_pnfs_ds *ds;
832832
u32 ds_idx;
833833

834+
if (NFS_SERVER(pgio->pg_inode)->flags &
835+
(NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
836+
pgio->pg_maxretrans = io_maxretrans;
834837
retry:
835838
pnfs_generic_pg_check_layout(pgio, req);
836839
/* Use full layout for now */
@@ -844,6 +847,8 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
844847
if (!pgio->pg_lseg)
845848
goto out_nolseg;
846849
}
850+
/* Reset wb_nio, since getting layout segment was successful */
851+
req->wb_nio = 0;
847852

848853
ds = ff_layout_get_ds_for_read(pgio, &ds_idx);
849854
if (!ds) {
@@ -860,14 +865,24 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
860865
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
861866

862867
pgio->pg_mirror_idx = ds_idx;
863-
864-
if (NFS_SERVER(pgio->pg_inode)->flags &
865-
(NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
866-
pgio->pg_maxretrans = io_maxretrans;
867868
return;
868869
out_nolseg:
869-
if (pgio->pg_error < 0)
870-
return;
870+
if (pgio->pg_error < 0) {
871+
if (pgio->pg_error != -EAGAIN)
872+
return;
873+
/* Retry getting layout segment if lower layer returned -EAGAIN */
874+
if (pgio->pg_maxretrans && req->wb_nio++ > pgio->pg_maxretrans) {
875+
if (NFS_SERVER(pgio->pg_inode)->flags & NFS_MOUNT_SOFTERR)
876+
pgio->pg_error = -ETIMEDOUT;
877+
else
878+
pgio->pg_error = -EIO;
879+
return;
880+
}
881+
pgio->pg_error = 0;
882+
/* Sleep for 1 second before retrying */
883+
ssleep(1);
884+
goto retry;
885+
}
871886
out_mds:
872887
trace_pnfs_mds_fallback_pg_init_read(pgio->pg_inode,
873888
0, NFS4_MAX_UINT64, IOMODE_READ,

fs/nfs/pnfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1308,7 +1308,7 @@ pnfs_prepare_layoutreturn(struct pnfs_layout_hdr *lo,
13081308
enum pnfs_iomode *iomode)
13091309
{
13101310
/* Serialise LAYOUTGET/LAYOUTRETURN */
1311-
if (atomic_read(&lo->plh_outstanding) != 0)
1311+
if (atomic_read(&lo->plh_outstanding) != 0 && lo->plh_return_seq == 0)
13121312
return false;
13131313
if (test_and_set_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags))
13141314
return false;

0 commit comments

Comments
 (0)