cifs: Defer read completion

Defer read completion from the I/O thread to the cifsiod thread so as not
to slow down the I/O thread. This restores the behaviour of v6.9.

Fixes: 3ee1a1fc3981 ("cifs: Cut over to using netfslib")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Paulo Alcantara <pc@manguebit.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by David Howells and committed by Steve French ce5291e5 8bf02875

+12 -3
+12 -3
fs/smb/client/smb2pdu.c
··· 4484 4484 return rc; 4485 4485 } 4486 4486 4487 + static void smb2_readv_worker(struct work_struct *work) 4488 + { 4489 + struct cifs_io_subrequest *rdata = 4490 + container_of(work, struct cifs_io_subrequest, subreq.work); 4491 + 4492 + netfs_subreq_terminated(&rdata->subreq, 4493 + (rdata->result == 0 || rdata->result == -EAGAIN) ? 4494 + rdata->got_bytes : rdata->result, true); 4495 + } 4496 + 4487 4497 static void 4488 4498 smb2_readv_callback(struct mid_q_entry *mid) 4489 4499 { ··· 4588 4578 rdata->result = 0; 4589 4579 } 4590 4580 rdata->credits.value = 0; 4591 - netfs_subreq_terminated(&rdata->subreq, 4592 - (rdata->result == 0 || rdata->result == -EAGAIN) ? 4593 - rdata->got_bytes : rdata->result, true); 4581 + INIT_WORK(&rdata->subreq.work, smb2_readv_worker); 4582 + queue_work(cifsiod_wq, &rdata->subreq.work); 4594 4583 release_mid(mid); 4595 4584 add_credits(server, &credits, 0); 4596 4585 }