From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 EC17953372 for ; Thu, 28 Mar 2024 16:59:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645149; cv=none; b=ThyHTMI7GFR43DVy9cG4yYZ4iFZ166V2/Mgf8nv8JRzR8c+TkRGGXPX6lr0bJRDOaN4vxfmGdRXcagBNhrrOrHeAmxGL7VhBRiin1ai0sRoefc+xQ8e9vqNvpJPIgv6FeAn0FxYULYEb7iMX6U3ysC2aoyrsa1s3y4tV7odvCwE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645149; c=relaxed/simple; bh=GoHQrn/5nYWtLfVVX1LkVMGkOGpC+tCx8SBtvJ4VS5M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fY8nr69UH4kj1/jFfvnYDd7zHyE/+2WZhenvMIUv1VjGKOjbMwPji0sOIkp2lQkuZe0xHgFjqADX1ed7Dmp1RA3/u7urIHPQB0a3LeKqhCwn+Ikfyh/NbdNWCy/7kwqseN/p+l/WzQFcXHUAbiUpIHkEL1XjK/oikKU5vtP5LQ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=UtKCjOVC; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="UtKCjOVC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645147; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1zPgZV9gXgLrfSBlyjitp+cfQt8mq6WGmI4HxWVquPk=; b=UtKCjOVCTpPwx4nneJC85cflAtfEkIsBd11nZDu/gKoxf7RtCTAh4mdX0uQrsOHm+e1G7k fs/is83MnXFkRGi24mQZ/4BVw1j/vRI0I/MLkhvDe99YDvAaDzS7oda4OTnsrwxLG5pe08 Z2KthN+duYe5vHKXqCBa7q/mkfMtU0I= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-618-BhGt0NL8NRmOgk7VVVSjYg-1; Thu, 28 Mar 2024 12:59:01 -0400 X-MC-Unique: BhGt0NL8NRmOgk7VVVSjYg-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B1FCF28EC112; Thu, 28 Mar 2024 16:59:00 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id B4EF1492BC6; Thu, 28 Mar 2024 16:58:58 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 01/15] cifs: Replace cifs_readdata with a wrapper around netfs_io_subrequest Date: Thu, 28 Mar 2024 16:57:52 +0000 Message-ID: <20240328165845.2782259-2-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 Content-Type: text/plain; charset="utf-8" Netfslib has a facility whereby the allocation for netfs_io_subrequest can be increased to so that filesystem-specific data can be tagged on the end. Prepare to use this by making a struct, cifs_io_subrequest, that wraps netfs_io_subrequest, and absorb struct cifs_readdata into it. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 22 +++++++++++--------- fs/smb/client/cifsproto.h | 13 ++++++++++-- fs/smb/client/cifssmb.c | 11 ++++------ fs/smb/client/file.c | 44 ++++++++++++++++++--------------------- fs/smb/client/smb2ops.c | 2 +- fs/smb/client/smb2pdu.c | 12 ++++++----- fs/smb/client/smb2proto.h | 2 +- fs/smb/client/transport.c | 4 ++-- 8 files changed, 58 insertions(+), 52 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 7ed9d05f6890..930b2879383a 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -268,7 +268,7 @@ struct dfs_info3_param; struct cifs_fattr; struct smb3_fs_context; struct cifs_fid; -struct cifs_readdata; +struct cifs_io_subrequest; struct cifs_writedata; struct cifs_io_parms; struct cifs_search_info; @@ -450,7 +450,7 @@ struct smb_version_operations { /* send a flush request to the server */ int (*flush)(const unsigned int, struct cifs_tcon *, struct cifs_fid *); /* async read from the server */ - int (*async_readv)(struct cifs_readdata *); + int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ int (*async_writev)(struct cifs_writedata *, void (*release)(struct kref *)); @@ -1488,26 +1488,28 @@ struct cifs_aio_ctx { }; =20 /* asynchronous read support */ -struct cifs_readdata { - struct kref refcount; - struct list_head list; - struct completion done; +struct cifs_io_subrequest { + struct netfs_io_subrequest subreq; struct cifsFileInfo *cfile; struct address_space *mapping; struct cifs_aio_ctx *ctx; - __u64 offset; ssize_t got_bytes; - unsigned int bytes; pid_t pid; int result; - struct work_struct work; - struct iov_iter iter; struct kvec iov[2]; struct TCP_Server_Info *server; #ifdef CONFIG_CIFS_SMB_DIRECT struct smbd_mr *mr; #endif struct cifs_credits credits; + + // TODO: Remove following elements + struct list_head list; + struct completion done; + struct work_struct work; + struct iov_iter iter; + __u64 offset; + unsigned int bytes; }; =20 /* asynchronous write support */ diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 0723e1b57256..ccb6999dd26f 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -598,8 +598,17 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *c= tx); =20 -void cifs_readdata_release(struct kref *refcount); -int cifs_async_readv(struct cifs_readdata *rdata); +void cifs_readdata_release(struct cifs_io_subrequest *rdata); +static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) +{ + refcount_inc(&rdata->subreq.ref); +} +static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) +{ + if (refcount_dec_and_test(&rdata->subreq.ref)) + cifs_readdata_release(rdata); +} +int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry = *mid); =20 int cifs_async_writev(struct cifs_writedata *wdata, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 5aee55551573..014171cc5cf7 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include "cifspdu.h" #include "cifsfs.h" #include "cifsglob.h" @@ -1262,12 +1264,11 @@ CIFS_open(const unsigned int xid, struct cifs_open_= parms *oparms, int *oplock, static void cifs_readv_callback(struct mid_q_entry *mid) { - struct cifs_readdata *rdata =3D mid->callback_data; + struct cifs_io_subrequest *rdata =3D mid->callback_data; struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); struct TCP_Server_Info *server =3D tcon->ses->server; struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 2, - .rq_iter_size =3D iov_iter_count(&rdata->iter), .rq_iter =3D rdata->iter }; struct cifs_credits credits =3D { .value =3D 1, .instance =3D 0 }; =20 @@ -1312,7 +1313,7 @@ cifs_readv_callback(struct mid_q_entry *mid) =20 /* cifs_async_readv - send an async write, and set up mid to handle result= */ int -cifs_async_readv(struct cifs_readdata *rdata) +cifs_async_readv(struct cifs_io_subrequest *rdata) { int rc; READ_REQ *smb =3D NULL; @@ -1364,15 +1365,11 @@ cifs_async_readv(struct cifs_readdata *rdata) rdata->iov[1].iov_base =3D (char *)smb + 4; rdata->iov[1].iov_len =3D get_rfc1002_length(smb); =20 - kref_get(&rdata->refcount); rc =3D cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, cifs_readv_callback, NULL, rdata, 0, NULL); =20 if (rc =3D=3D 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); - else - kref_put(&rdata->refcount, cifs_readdata_release); - cifs_small_buf_release(smb); return rc; } diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index f92d4d42e87e..d70d3c12bb70 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -3743,13 +3743,13 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_i= ter *from) return written; } =20 -static struct cifs_readdata *cifs_readdata_alloc(work_func_t complete) +static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) { - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; =20 rdata =3D kzalloc(sizeof(*rdata), GFP_KERNEL); if (rdata) { - kref_init(&rdata->refcount); + refcount_set(&rdata->subreq.ref, 1); INIT_LIST_HEAD(&rdata->list); init_completion(&rdata->done); INIT_WORK(&rdata->work, complete); @@ -3759,11 +3759,8 @@ static struct cifs_readdata *cifs_readdata_alloc(wor= k_func_t complete) } =20 void -cifs_readdata_release(struct kref *refcount) +cifs_readdata_release(struct cifs_io_subrequest *rdata) { - struct cifs_readdata *rdata =3D container_of(refcount, - struct cifs_readdata, refcount); - if (rdata->ctx) kref_put(&rdata->ctx->refcount, cifs_aio_ctx_release); #ifdef CONFIG_CIFS_SMB_DIRECT @@ -3783,16 +3780,16 @@ static void collect_uncached_read_data(struct cifs_= aio_ctx *ctx); static void cifs_uncached_readv_complete(struct work_struct *work) { - struct cifs_readdata *rdata =3D container_of(work, - struct cifs_readdata, work); + struct cifs_io_subrequest *rdata =3D + container_of(work, struct cifs_io_subrequest, work); =20 complete(&rdata->done); collect_uncached_read_data(rdata->ctx); /* the below call can possibly free the last ref to aio ctx */ - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } =20 -static int cifs_resend_rdata(struct cifs_readdata *rdata, +static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { @@ -3860,7 +3857,7 @@ static int cifs_resend_rdata(struct cifs_readdata *rd= ata, } while (rc =3D=3D -EAGAIN); =20 fail: - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); return rc; } =20 @@ -3869,7 +3866,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct = cifsFileInfo *open_file, struct cifs_sb_info *cifs_sb, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; unsigned int rsize, nsegs, max_segs =3D INT_MAX; struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; @@ -3951,7 +3948,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct = cifsFileInfo *open_file, =20 if (rc) { add_credits_and_wake_if(server, &rdata->credits, 0); - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); if (rc =3D=3D -EAGAIN) continue; break; @@ -3969,7 +3966,7 @@ cifs_send_async_read(loff_t fpos, size_t len, struct = cifsFileInfo *open_file, static void collect_uncached_read_data(struct cifs_aio_ctx *ctx) { - struct cifs_readdata *rdata, *tmp; + struct cifs_io_subrequest *rdata, *tmp; struct cifs_sb_info *cifs_sb; int rc; =20 @@ -4015,8 +4012,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) rdata->cfile, cifs_sb, &tmp_list, ctx); =20 - kref_put(&rdata->refcount, - cifs_readdata_release); + cifs_put_readdata(rdata); } =20 list_splice(&tmp_list, &ctx->list); @@ -4032,7 +4028,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) ctx->total_len +=3D rdata->got_bytes; } list_del_init(&rdata->list); - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } =20 /* mask nodata case */ @@ -4404,8 +4400,8 @@ static void cifs_unlock_folios(struct address_space *= mapping, pgoff_t first, pgo =20 static void cifs_readahead_complete(struct work_struct *work) { - struct cifs_readdata *rdata =3D container_of(work, - struct cifs_readdata, work); + struct cifs_io_subrequest *rdata =3D container_of(work, + struct cifs_io_subrequest, work); struct folio *folio; pgoff_t last; bool good =3D rdata->result =3D=3D 0 || (rdata->result =3D=3D -EAGAIN && = rdata->got_bytes); @@ -4431,7 +4427,7 @@ static void cifs_readahead_complete(struct work_struc= t *work) } rcu_read_unlock(); =20 - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } =20 static void cifs_readahead(struct readahead_control *ractl) @@ -4471,7 +4467,7 @@ static void cifs_readahead(struct readahead_control *= ractl) */ while ((nr_pages =3D ra_pages)) { unsigned int i, rsize; - struct cifs_readdata *rdata; + struct cifs_io_subrequest *rdata; struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; struct folio *folio; @@ -4590,11 +4586,11 @@ static void cifs_readahead(struct readahead_control= *ractl) rdata->offset / PAGE_SIZE, (rdata->offset + rdata->bytes - 1) / PAGE_SIZE); /* Fallback to the readpage in error/reconnect cases */ - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); break; } =20 - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); } =20 free_xid(xid); diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 2ed456948f34..072230d5b19b 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4482,7 +4482,7 @@ handle_read_data(struct TCP_Server_Info *server, stru= ct mid_q_entry *mid, unsigned int cur_off; unsigned int cur_page_idx; unsigned int pad_len; - struct cifs_readdata *rdata =3D mid->callback_data; + struct cifs_io_subrequest *rdata =3D mid->callback_data; struct smb2_hdr *shdr =3D (struct smb2_hdr *)buf; int length; bool use_rdma_mr =3D false; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 3ea688558e6c..33a7ad4f16bb 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include "cifsglob.h" #include "cifsacl.h" #include "cifsproto.h" @@ -4378,7 +4380,7 @@ static inline bool smb3_use_rdma_offload(struct cifs_= io_parms *io_parms) */ static int smb2_new_read_req(void **buf, unsigned int *total_len, - struct cifs_io_parms *io_parms, struct cifs_readdata *rdata, + struct cifs_io_parms *io_parms, struct cifs_io_subrequest *rdata, unsigned int remaining_bytes, int request_type) { int rc =3D -EACCES; @@ -4470,7 +4472,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len, static void smb2_readv_callback(struct mid_q_entry *mid) { - struct cifs_readdata *rdata =3D mid->callback_data; + struct cifs_io_subrequest *rdata =3D mid->callback_data; struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); struct TCP_Server_Info *server =3D rdata->server; struct smb2_hdr *shdr =3D @@ -4557,7 +4559,7 @@ smb2_readv_callback(struct mid_q_entry *mid) =20 /* smb2_async_readv - send an async read, and set up mid to handle result = */ int -smb2_async_readv(struct cifs_readdata *rdata) +smb2_async_readv(struct cifs_io_subrequest *rdata) { int rc, flags =3D 0; char *buf; @@ -4615,13 +4617,13 @@ smb2_async_readv(struct cifs_readdata *rdata) flags |=3D CIFS_HAS_CREDITS; } =20 - kref_get(&rdata->refcount); + cifs_get_readdata(rdata); rc =3D cifs_call_async(server, &rqst, cifs_readv_receive, smb2_readv_callback, smb3_handle_read_data, rdata, flags, &rdata->credits); if (rc) { - kref_put(&rdata->refcount, cifs_readdata_release); + cifs_put_readdata(rdata); cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); trace_smb3_read_err(0 /* xid */, io_parms.persistent_fid, io_parms.tcon->tid, diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 732169d8a67a..740053c0118e 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -210,7 +210,7 @@ extern int SMB2_query_acl(const unsigned int xid, struc= t cifs_tcon *tcon, extern int SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid, __le64 *uniqueid); -extern int smb2_async_readv(struct cifs_readdata *rdata); +extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parm= s, unsigned int *nbytes, char **buf, int *buf_type); extern int smb2_async_writev(struct cifs_writedata *wdata, diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 994d70193432..a5bab478e6de 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1687,7 +1687,7 @@ __cifs_readv_discard(struct TCP_Server_Info *server, = struct mid_q_entry *mid, static int cifs_readv_discard(struct TCP_Server_Info *server, struct mid_q_entry *mid) { - struct cifs_readdata *rdata =3D mid->callback_data; + struct cifs_io_subrequest *rdata =3D mid->callback_data; =20 return __cifs_readv_discard(server, mid, rdata->result); } @@ -1697,7 +1697,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, st= ruct mid_q_entry *mid) { int length, len; unsigned int data_offset, data_len; - struct cifs_readdata *rdata =3D mid->callback_data; + struct cifs_io_subrequest *rdata =3D mid->callback_data; char *buf =3D server->smallbuf; unsigned int buflen =3D server->pdu_size + HEADER_PREAMBLE_SIZE(server); bool use_rdma_mr =3D false; From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 A00513C08E for ; Thu, 28 Mar 2024 16:59:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645171; cv=none; b=Z62S/7LmMKKSxAzas+WOyt9JAlAI2Hr1JNOvrv4WlksmnbjaqfYVs4vcSNAnZOayLIZD4OfLjiERi831LfNj7Sxnwpyd9hRN1AUS344H9U5AnFSKW/dVQscztoQEAQ0OEDXEhOdcu8BsXXJXTZaijzR/CBOuJg4ClLy8BMidEc0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645171; c=relaxed/simple; bh=++HvzNydxINImoXizI0lJF3pyjH43Ejmo8rg3hIaoFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rg62JlzDJquXJ4+udGcEtZtxLxVwrnfL3EZLUOnQEN4KkPV5t+CMlPbnI3YOZCJbTvMlpVK6EeK93HZ93bYUzOi4zR6kvcKzpxb4RhybRC/BAtk8e6AmtCPjF9sqqRj9Sgux+Yx5pRRgtIJ5fSutgO5eNW+0jL1W9/mJ0ZfkWI0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=MC3hBkte; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="MC3hBkte" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645167; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=svz6MoUD1gw7sAwkcyvA8L5W/Po7UC2QRr0kVwkjy24=; b=MC3hBktep+VmbGJaikx8tc+IhNoJLl7viSUlBnN7DeHqT7w06Nj7vvxgQscw6uQVIVKE2y o0dUjHr34J5HeCLR8qUAsTnRZd6itBZQLwry44ptnABoB8g2tbMivS07ckIsUDBTTWTxCL BlK5ii/pf/rNhoE4/MU2ifwBSGkBE14= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-662-ina21XdfOXCotteHEbUN_w-1; Thu, 28 Mar 2024 12:59:24 -0400 X-MC-Unique: ina21XdfOXCotteHEbUN_w-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6D5FF3C01C14; Thu, 28 Mar 2024 16:59:23 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6F7A93C20; Thu, 28 Mar 2024 16:59:21 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 02/15] cifs: Replace cifs_writedata with a wrapper around netfs_io_subrequest Date: Thu, 28 Mar 2024 16:57:53 +0000 Message-ID: <20240328165845.2782259-3-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 Content-Type: text/plain; charset="utf-8" Replace the cifs_writedata struct with the same wrapper around netfs_io_subrequest that was used to replace cifs_readdata. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 32 +++------------- fs/smb/client/cifsproto.h | 16 ++++++-- fs/smb/client/cifssmb.c | 9 ++--- fs/smb/client/file.c | 79 ++++++++++++++++----------------------- fs/smb/client/smb2pdu.c | 9 ++--- fs/smb/client/smb2proto.h | 3 +- 6 files changed, 59 insertions(+), 89 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 930b2879383a..99c235bac554 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -269,7 +269,6 @@ struct cifs_fattr; struct smb3_fs_context; struct cifs_fid; struct cifs_io_subrequest; -struct cifs_writedata; struct cifs_io_parms; struct cifs_search_info; struct cifsInodeInfo; @@ -452,8 +451,7 @@ struct smb_version_operations { /* async read from the server */ int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ - int (*async_writev)(struct cifs_writedata *, - void (*release)(struct kref *)); + int (*async_writev)(struct cifs_io_subrequest *); /* sync read from the server */ int (*sync_read)(const unsigned int, struct cifs_fid *, struct cifs_io_parms *, unsigned int *, char **, @@ -1503,36 +1501,18 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; =20 - // TODO: Remove following elements - struct list_head list; - struct completion done; - struct work_struct work; - struct iov_iter iter; - __u64 offset; - unsigned int bytes; -}; + enum writeback_sync_modes sync_mode; + bool uncached; + bool replay; + struct bio_vec *bv; =20 -/* asynchronous write support */ -struct cifs_writedata { - struct kref refcount; + // TODO: Remove following elements struct list_head list; struct completion done; - enum writeback_sync_modes sync_mode; struct work_struct work; - struct cifsFileInfo *cfile; - struct cifs_aio_ctx *ctx; struct iov_iter iter; - struct bio_vec *bv; __u64 offset; - pid_t pid; unsigned int bytes; - int result; - struct TCP_Server_Info *server; -#ifdef CONFIG_CIFS_SMB_DIRECT - struct smbd_mr *mr; -#endif - struct cifs_credits credits; - bool replay; }; =20 /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index ccb6999dd26f..010601a89fe5 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -611,11 +611,19 @@ static inline void cifs_put_readdata(struct cifs_io_s= ubrequest *rdata) int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry = *mid); =20 -int cifs_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)); +int cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); -struct cifs_writedata *cifs_writedata_alloc(work_func_t complete); -void cifs_writedata_release(struct kref *refcount); +struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); +void cifs_writedata_release(struct cifs_io_subrequest *rdata); +static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) +{ + refcount_inc(&wdata->subreq.ref); +} +static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata) +{ + if (refcount_dec_and_test(&wdata->subreq.ref)) + cifs_writedata_release(wdata); +} int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 014171cc5cf7..c84f2991c93a 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1612,7 +1612,7 @@ CIFSSMBWrite(const unsigned int xid, struct cifs_io_p= arms *io_parms, static void cifs_writev_callback(struct mid_q_entry *mid) { - struct cifs_writedata *wdata =3D mid->callback_data; + struct cifs_io_subrequest *wdata =3D mid->callback_data; struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); unsigned int written; WRITE_RSP *smb =3D (WRITE_RSP *)mid->resp_buf; @@ -1657,8 +1657,7 @@ cifs_writev_callback(struct mid_q_entry *mid) =20 /* cifs_async_writev - send an async write, and set up mid to handle resul= t */ int -cifs_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)) +cifs_async_writev(struct cifs_io_subrequest *wdata) { int rc =3D -EACCES; WRITE_REQ *smb =3D NULL; @@ -1725,14 +1724,14 @@ cifs_async_writev(struct cifs_writedata *wdata, iov[1].iov_len +=3D 4; /* pad bigger by four bytes */ } =20 - kref_get(&wdata->refcount); + cifs_get_writedata(wdata); rc =3D cifs_call_async(tcon->ses->server, &rqst, NULL, cifs_writev_callback, NULL, wdata, 0, NULL); =20 if (rc =3D=3D 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); else - kref_put(&wdata->refcount, release); + cifs_put_writedata(wdata); =20 async_writev_out: cifs_small_buf_release(smb); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index d70d3c12bb70..32c36947c515 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2431,10 +2431,10 @@ cifs_get_readable_path(struct cifs_tcon *tcon, cons= t char *name, } =20 void -cifs_writedata_release(struct kref *refcount) +cifs_writedata_release(struct cifs_io_subrequest *wdata) { - struct cifs_writedata *wdata =3D container_of(refcount, - struct cifs_writedata, refcount); + if (wdata->uncached) + kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr) { smbd_deregister_mr(wdata->mr); @@ -2453,7 +2453,7 @@ cifs_writedata_release(struct kref *refcount) * possible that the page was redirtied so re-clean the page. */ static void -cifs_writev_requeue(struct cifs_writedata *wdata) +cifs_writev_requeue(struct cifs_io_subrequest *wdata) { int rc =3D 0; struct inode *inode =3D d_inode(wdata->cfile->dentry); @@ -2463,7 +2463,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) =20 server =3D tlink_tcon(wdata->cfile->tlink)->ses->server; do { - struct cifs_writedata *wdata2; + struct cifs_io_subrequest *wdata2; unsigned int wsize, cur_len; =20 wsize =3D server->ops->wp_retry_size(inode); @@ -2486,7 +2486,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) wdata2->sync_mode =3D wdata->sync_mode; wdata2->offset =3D fpos; wdata2->bytes =3D cur_len; - wdata2->iter =3D wdata->iter; + wdata2->iter =3D wdata->iter; =20 iov_iter_advance(&wdata2->iter, fpos - wdata->offset); iov_iter_truncate(&wdata2->iter, wdata2->bytes); @@ -2508,11 +2508,10 @@ cifs_writev_requeue(struct cifs_writedata *wdata) rc =3D -EBADF; } else { wdata2->pid =3D wdata2->cfile->pid; - rc =3D server->ops->async_writev(wdata2, - cifs_writedata_release); + rc =3D server->ops->async_writev(wdata2); } =20 - kref_put(&wdata2->refcount, cifs_writedata_release); + cifs_put_writedata(wdata2); if (rc) { if (is_retryable_error(rc)) continue; @@ -2531,14 +2530,14 @@ cifs_writev_requeue(struct cifs_writedata *wdata) =20 if (rc !=3D 0 && !is_retryable_error(rc)) mapping_set_error(inode->i_mapping, rc); - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); } =20 void cifs_writev_complete(struct work_struct *work) { - struct cifs_writedata *wdata =3D container_of(work, - struct cifs_writedata, work); + struct cifs_io_subrequest *wdata =3D container_of(work, + struct cifs_io_subrequest, work); struct inode *inode =3D d_inode(wdata->cfile->dentry); =20 if (wdata->result =3D=3D 0) { @@ -2559,16 +2558,16 @@ cifs_writev_complete(struct work_struct *work) =20 if (wdata->result !=3D -EAGAIN) mapping_set_error(inode->i_mapping, wdata->result); - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); } =20 -struct cifs_writedata *cifs_writedata_alloc(work_func_t complete) +struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete) { - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; =20 wdata =3D kzalloc(sizeof(*wdata), GFP_NOFS); if (wdata !=3D NULL) { - kref_init(&wdata->refcount); + refcount_set(&wdata->subreq.ref, 1); INIT_LIST_HEAD(&wdata->list); init_completion(&wdata->done); INIT_WORK(&wdata->work, complete); @@ -2699,7 +2698,7 @@ static ssize_t cifs_write_back_from_locked_folio(stru= ct address_space *mapping, { struct inode *inode =3D mapping->host; struct TCP_Server_Info *server; - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; struct cifs_sb_info *cifs_sb =3D CIFS_SB(inode->i_sb); struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; @@ -2792,10 +2791,9 @@ static ssize_t cifs_write_back_from_locked_folio(str= uct address_space *mapping, if (wdata->cfile->invalidHandle) rc =3D -EAGAIN; else - rc =3D wdata->server->ops->async_writev(wdata, - cifs_writedata_release); + rc =3D wdata->server->ops->async_writev(wdata); if (rc >=3D 0) { - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); goto err_close; } } else { @@ -2805,7 +2803,7 @@ static ssize_t cifs_write_back_from_locked_folio(stru= ct address_space *mapping, } =20 err_wdata: - kref_put(&wdata->refcount, cifs_writedata_release); + cifs_put_writedata(wdata); err_uncredit: add_credits_and_wake_if(server, credits, 0); err_close: @@ -3182,23 +3180,13 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } =20 -static void -cifs_uncached_writedata_release(struct kref *refcount) -{ - struct cifs_writedata *wdata =3D container_of(refcount, - struct cifs_writedata, refcount); - - kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); - cifs_writedata_release(refcount); -} - static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); =20 static void cifs_uncached_writev_complete(struct work_struct *work) { - struct cifs_writedata *wdata =3D container_of(work, - struct cifs_writedata, work); + struct cifs_io_subrequest *wdata =3D container_of(work, + struct cifs_io_subrequest, work); struct inode *inode =3D d_inode(wdata->cfile->dentry); struct cifsInodeInfo *cifsi =3D CIFS_I(inode); =20 @@ -3211,11 +3199,11 @@ cifs_uncached_writev_complete(struct work_struct *w= ork) complete(&wdata->done); collect_uncached_write_data(wdata->ctx); /* the below call can possibly free the last ref to aio ctx */ - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } =20 static int -cifs_resend_wdata(struct cifs_writedata *wdata, struct list_head *wdata_li= st, +cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdat= a_list, struct cifs_aio_ctx *ctx) { unsigned int wsize; @@ -3265,8 +3253,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struc= t list_head *wdata_list, wdata->mr =3D NULL; } #endif - rc =3D server->ops->async_writev(wdata, - cifs_uncached_writedata_release); + rc =3D server->ops->async_writev(wdata); } } =20 @@ -3281,7 +3268,7 @@ cifs_resend_wdata(struct cifs_writedata *wdata, struc= t list_head *wdata_list, } while (rc =3D=3D -EAGAIN); =20 fail: - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); return rc; } =20 @@ -3333,7 +3320,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct = iov_iter *from, { int rc =3D 0; size_t cur_len, max_len; - struct cifs_writedata *wdata; + struct cifs_io_subrequest *wdata; pid_t pid; struct TCP_Server_Info *server; unsigned int xid, max_segs =3D INT_MAX; @@ -3397,6 +3384,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct = iov_iter *from, break; } =20 + wdata->uncached =3D true; wdata->sync_mode =3D WB_SYNC_ALL; wdata->offset =3D (__u64)fpos; wdata->cfile =3D cifsFileInfo_get(open_file); @@ -3416,14 +3404,12 @@ cifs_write_from_iter(loff_t fpos, size_t len, struc= t iov_iter *from, if (wdata->cfile->invalidHandle) rc =3D -EAGAIN; else - rc =3D server->ops->async_writev(wdata, - cifs_uncached_writedata_release); + rc =3D server->ops->async_writev(wdata); } =20 if (rc) { add_credits_and_wake_if(server, &wdata->credits, 0); - kref_put(&wdata->refcount, - cifs_uncached_writedata_release); + cifs_put_writedata(wdata); if (rc =3D=3D -EAGAIN) continue; break; @@ -3441,7 +3427,7 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct = iov_iter *from, =20 static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) { - struct cifs_writedata *wdata, *tmp; + struct cifs_io_subrequest *wdata, *tmp; struct cifs_tcon *tcon; struct cifs_sb_info *cifs_sb; struct dentry *dentry =3D ctx->cfile->dentry; @@ -3496,8 +3482,7 @@ static void collect_uncached_write_data(struct cifs_a= io_ctx *ctx) ctx->cfile, cifs_sb, &tmp_list, ctx); =20 - kref_put(&wdata->refcount, - cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } =20 list_splice(&tmp_list, &ctx->list); @@ -3505,7 +3490,7 @@ static void collect_uncached_write_data(struct cifs_a= io_ctx *ctx) } } list_del_init(&wdata->list); - kref_put(&wdata->refcount, cifs_uncached_writedata_release); + cifs_put_writedata(wdata); } =20 cifs_stats_bytes_written(tcon, ctx->total_len); diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 33a7ad4f16bb..f2f7e107fab4 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4724,7 +4724,7 @@ SMB2_read(const unsigned int xid, struct cifs_io_parm= s *io_parms, static void smb2_writev_callback(struct mid_q_entry *mid) { - struct cifs_writedata *wdata =3D mid->callback_data; + struct cifs_io_subrequest *wdata =3D mid->callback_data; struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); struct TCP_Server_Info *server =3D wdata->server; unsigned int written; @@ -4805,8 +4805,7 @@ smb2_writev_callback(struct mid_q_entry *mid) =20 /* smb2_async_writev - send an async write, and set up mid to handle resul= t */ int -smb2_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)) +smb2_async_writev(struct cifs_io_subrequest *wdata) { int rc =3D -EACCES, flags =3D 0; struct smb2_write_req *req =3D NULL; @@ -4940,7 +4939,7 @@ smb2_async_writev(struct cifs_writedata *wdata, flags |=3D CIFS_HAS_CREDITS; } =20 - kref_get(&wdata->refcount); + cifs_get_writedata(wdata); rc =3D cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL, wdata, flags, &wdata->credits); =20 @@ -4952,7 +4951,7 @@ smb2_async_writev(struct cifs_writedata *wdata, io_parms->offset, io_parms->length, rc); - kref_put(&wdata->refcount, release); + cifs_put_writedata(wdata); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); } =20 diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index 740053c0118e..c781eaa0cba8 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -213,8 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, str= uct cifs_tcon *tcon, extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parm= s, unsigned int *nbytes, char **buf, int *buf_type); -extern int smb2_async_writev(struct cifs_writedata *wdata, - void (*release)(struct kref *kref)); +extern int smb2_async_writev(struct cifs_io_subrequest *wdata); extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_par= ms, unsigned int *nbytes, struct kvec *iov, int n_vec); extern int SMB2_echo(struct TCP_Server_Info *server); From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 453EE5BAD4 for ; Thu, 28 Mar 2024 16:59:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645177; cv=none; b=WEAXeVIDHxkfEJgYQiKVKxorpuYLdTU3Uf0AsJotcrQmhGJKH/mVHrPE1Ehx60A6iEedsDPo2nUm8Wc0SZ3/iXOtT8UUDJDEJgWlWQ4fxDk6mEV9ArEsokb5Z2Yqjkih2/XbbwjQ42Ekv1PKZlXDOr+EDGQJhyNAXocn5OvNjek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645177; c=relaxed/simple; bh=SxTRZHskEq5eG6CllWwMOmK04+7G41QXd50616dQfHw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CKcTbXP36lCw5D+18D749xqg+RH6s1GRC64B8IPh5Q4UDjbWkoMhGnPsWSdvs373bGgKUzz34alEAzDFLshCfzVAmHu/Hfjtk5CJ2WcUVSA0wAYY2l9lrggN72l210WbFdsWCOwSmHHKgL9w/szLArN862YdiTIUlel+AaPy16Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=EQ26vgB4; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="EQ26vgB4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645173; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1k4PbESEF7eq6RtwqTV/SLpkR/gjfmnno8jsSqmzvgE=; b=EQ26vgB4/DgeFK4oT5uNHoVNwod8XCJHARaVcYTgQjZVlZSOP1KnNYpoUv+Cd8puoXtOhk /x2A0yFpDxBu6HG3kR3CUoXK+THW70TLQxtNxudqpb2LMbqTug+OjdawbK5Gxsx979Sp9u ctw5ts99dSWvC6lI99JAqExBoDBbSJg= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-691-Zh--x8c9M0W7tAfg5R90TA-1; Thu, 28 Mar 2024 12:59:30 -0400 X-MC-Unique: Zh--x8c9M0W7tAfg5R90TA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 2E7D984B162; Thu, 28 Mar 2024 16:59:29 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F376200AFFC; Thu, 28 Mar 2024 16:59:27 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 03/15] cifs: Use more fields from netfs_io_subrequest Date: Thu, 28 Mar 2024 16:57:54 +0000 Message-ID: <20240328165845.2782259-4-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.4 Content-Type: text/plain; charset="utf-8" Use more fields from netfs_io_subrequest instead of those incorporated into cifs_io_subrequest from cifs_readdata and cifs_writedata. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 3 - fs/smb/client/cifssmb.c | 52 +++++++++--------- fs/smb/client/file.c | 112 +++++++++++++++++++------------------- fs/smb/client/smb2ops.c | 4 +- fs/smb/client/smb2pdu.c | 52 +++++++++--------- fs/smb/client/transport.c | 6 +- 6 files changed, 113 insertions(+), 116 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 99c235bac554..ff86ab3d6166 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1510,9 +1510,6 @@ struct cifs_io_subrequest { struct list_head list; struct completion done; struct work_struct work; - struct iov_iter iter; - __u64 offset; - unsigned int bytes; }; =20 /* diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index c84f2991c93a..72962985bac5 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1269,12 +1269,12 @@ cifs_readv_callback(struct mid_q_entry *mid) struct TCP_Server_Info *server =3D tcon->ses->server; struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 2, - .rq_iter =3D rdata->iter }; + .rq_iter =3D rdata->subreq.io_iter }; struct cifs_credits credits =3D { .value =3D 1, .instance =3D 0 }; =20 - cifs_dbg(FYI, "%s: mid=3D%llu state=3D%d result=3D%d bytes=3D%u\n", + cifs_dbg(FYI, "%s: mid=3D%llu state=3D%d result=3D%d bytes=3D%zu\n", __func__, mid->mid, mid->mid_state, rdata->result, - rdata->bytes); + rdata->subreq.len); =20 switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: @@ -1322,14 +1322,14 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 2 }; =20 - cifs_dbg(FYI, "%s: offset=3D%llu bytes=3D%u\n", - __func__, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: offset=3D%llu bytes=3D%zu\n", + __func__, rdata->subreq.start, rdata->subreq.len); =20 if (tcon->ses->capabilities & CAP_LARGE_FILES) wct =3D 12; else { wct =3D 10; /* old style read */ - if ((rdata->offset >> 32) > 0) { + if ((rdata->subreq.start >> 32) > 0) { /* can not handle this big offset for old */ return -EIO; } @@ -1344,12 +1344,12 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) =20 smb->AndXCommand =3D 0xFF; /* none */ smb->Fid =3D rdata->cfile->fid.netfid; - smb->OffsetLow =3D cpu_to_le32(rdata->offset & 0xFFFFFFFF); + smb->OffsetLow =3D cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); if (wct =3D=3D 12) - smb->OffsetHigh =3D cpu_to_le32(rdata->offset >> 32); + smb->OffsetHigh =3D cpu_to_le32(rdata->subreq.start >> 32); smb->Remaining =3D 0; - smb->MaxCount =3D cpu_to_le16(rdata->bytes & 0xFFFF); - smb->MaxCountHigh =3D cpu_to_le32(rdata->bytes >> 16); + smb->MaxCount =3D cpu_to_le16(rdata->subreq.len & 0xFFFF); + smb->MaxCountHigh =3D cpu_to_le32(rdata->subreq.len >> 16); if (wct =3D=3D 12) smb->ByteCount =3D 0; else { @@ -1633,13 +1633,13 @@ cifs_writev_callback(struct mid_q_entry *mid) * client. OS/2 servers are known to set incorrect * CountHigh values. */ - if (written > wdata->bytes) + if (written > wdata->subreq.len) written &=3D 0xFFFF; =20 - if (written < wdata->bytes) + if (written < wdata->subreq.len) wdata->result =3D -ENOSPC; else - wdata->bytes =3D written; + wdata->subreq.len =3D written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: @@ -1670,7 +1670,7 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) wct =3D 14; } else { wct =3D 12; - if (wdata->offset >> 32 > 0) { + if (wdata->subreq.start >> 32 > 0) { /* can not handle big offset for old srv */ return -EIO; } @@ -1685,9 +1685,9 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) =20 smb->AndXCommand =3D 0xFF; /* none */ smb->Fid =3D wdata->cfile->fid.netfid; - smb->OffsetLow =3D cpu_to_le32(wdata->offset & 0xFFFFFFFF); + smb->OffsetLow =3D cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); if (wct =3D=3D 14) - smb->OffsetHigh =3D cpu_to_le32(wdata->offset >> 32); + smb->OffsetHigh =3D cpu_to_le32(wdata->subreq.start >> 32); smb->Reserved =3D 0xFFFFFFFF; smb->WriteMode =3D 0; smb->Remaining =3D 0; @@ -1703,24 +1703,24 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) =20 rqst.rq_iov =3D iov; rqst.rq_nvec =3D 2; - rqst.rq_iter =3D wdata->iter; - rqst.rq_iter_size =3D iov_iter_count(&wdata->iter); + rqst.rq_iter =3D wdata->subreq.io_iter; + rqst.rq_iter_size =3D iov_iter_count(&wdata->subreq.io_iter); =20 - cifs_dbg(FYI, "async write at %llu %u bytes\n", - wdata->offset, wdata->bytes); + cifs_dbg(FYI, "async write at %llu %zu bytes\n", + wdata->subreq.start, wdata->subreq.len); =20 - smb->DataLengthLow =3D cpu_to_le16(wdata->bytes & 0xFFFF); - smb->DataLengthHigh =3D cpu_to_le16(wdata->bytes >> 16); + smb->DataLengthLow =3D cpu_to_le16(wdata->subreq.len & 0xFFFF); + smb->DataLengthHigh =3D cpu_to_le16(wdata->subreq.len >> 16); =20 if (wct =3D=3D 14) { - inc_rfc1001_len(&smb->hdr, wdata->bytes + 1); - put_bcc(wdata->bytes + 1, &smb->hdr); + inc_rfc1001_len(&smb->hdr, wdata->subreq.len + 1); + put_bcc(wdata->subreq.len + 1, &smb->hdr); } else { /* wct =3D=3D 12 */ struct smb_com_writex_req *smbw =3D (struct smb_com_writex_req *)smb; - inc_rfc1001_len(&smbw->hdr, wdata->bytes + 5); - put_bcc(wdata->bytes + 5, &smbw->hdr); + inc_rfc1001_len(&smbw->hdr, wdata->subreq.len + 5); + put_bcc(wdata->subreq.len + 5, &smbw->hdr); iov[1].iov_len +=3D 4; /* pad bigger by four bytes */ } =20 diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 32c36947c515..c5850a1c484f 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2458,8 +2458,8 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdata) int rc =3D 0; struct inode *inode =3D d_inode(wdata->cfile->dentry); struct TCP_Server_Info *server; - unsigned int rest_len =3D wdata->bytes; - loff_t fpos =3D wdata->offset; + unsigned int rest_len =3D wdata->subreq.len; + loff_t fpos =3D wdata->subreq.start; =20 server =3D tlink_tcon(wdata->cfile->tlink)->ses->server; do { @@ -2484,14 +2484,14 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdat= a) } =20 wdata2->sync_mode =3D wdata->sync_mode; - wdata2->offset =3D fpos; - wdata2->bytes =3D cur_len; - wdata2->iter =3D wdata->iter; + wdata2->subreq.start =3D fpos; + wdata2->subreq.len =3D cur_len; + wdata2->subreq.io_iter =3D wdata->subreq.io_iter; =20 - iov_iter_advance(&wdata2->iter, fpos - wdata->offset); - iov_iter_truncate(&wdata2->iter, wdata2->bytes); + iov_iter_advance(&wdata2->subreq.io_iter, fpos - wdata->subreq.start); + iov_iter_truncate(&wdata2->subreq.io_iter, wdata2->subreq.len); =20 - if (iov_iter_is_xarray(&wdata2->iter)) + if (iov_iter_is_xarray(&wdata2->subreq.io_iter)) /* Check for pages having been redirtied and clean * them. We can do this by walking the xarray. If * it's not an xarray, then it's a DIO and we shouldn't @@ -2525,7 +2525,7 @@ cifs_writev_requeue(struct cifs_io_subrequest *wdata) } while (rest_len > 0); =20 /* Clean up remaining pages from the original wdata */ - if (iov_iter_is_xarray(&wdata->iter)) + if (iov_iter_is_xarray(&wdata->subreq.io_iter)) cifs_pages_write_failed(inode, fpos, rest_len); =20 if (rc !=3D 0 && !is_retryable_error(rc)) @@ -2542,19 +2542,19 @@ cifs_writev_complete(struct work_struct *work) =20 if (wdata->result =3D=3D 0) { spin_lock(&inode->i_lock); - cifs_update_eof(CIFS_I(inode), wdata->offset, wdata->bytes); + cifs_update_eof(CIFS_I(inode), wdata->subreq.start, wdata->subreq.len); spin_unlock(&inode->i_lock); cifs_stats_bytes_written(tlink_tcon(wdata->cfile->tlink), - wdata->bytes); + wdata->subreq.len); } else if (wdata->sync_mode =3D=3D WB_SYNC_ALL && wdata->result =3D=3D -E= AGAIN) return cifs_writev_requeue(wdata); =20 if (wdata->result =3D=3D -EAGAIN) - cifs_pages_write_redirty(inode, wdata->offset, wdata->bytes); + cifs_pages_write_redirty(inode, wdata->subreq.start, wdata->subreq.len); else if (wdata->result < 0) - cifs_pages_write_failed(inode, wdata->offset, wdata->bytes); + cifs_pages_write_failed(inode, wdata->subreq.start, wdata->subreq.len); else - cifs_pages_written_back(inode, wdata->offset, wdata->bytes); + cifs_pages_written_back(inode, wdata->subreq.start, wdata->subreq.len); =20 if (wdata->result !=3D -EAGAIN) mapping_set_error(inode->i_mapping, wdata->result); @@ -2737,7 +2737,7 @@ static ssize_t cifs_write_back_from_locked_folio(stru= ct address_space *mapping, } =20 wdata->sync_mode =3D wbc->sync_mode; - wdata->offset =3D folio_pos(folio); + wdata->subreq.start =3D folio_pos(folio); wdata->pid =3D cfile->pid; wdata->credits =3D credits_on_stack; wdata->cfile =3D cfile; @@ -2778,13 +2778,13 @@ static ssize_t cifs_write_back_from_locked_folio(st= ruct address_space *mapping, * have been unlocked. */ folio_unlock(folio); - wdata->bytes =3D len; + wdata->subreq.len =3D len; =20 if (start < i_size) { - iov_iter_xarray(&wdata->iter, ITER_SOURCE, &mapping->i_pages, + iov_iter_xarray(&wdata->subreq.io_iter, ITER_SOURCE, &mapping->i_pages, start, len); =20 - rc =3D adjust_credits(wdata->server, &wdata->credits, wdata->bytes); + rc =3D adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); if (rc) goto err_wdata; =20 @@ -3191,7 +3191,7 @@ cifs_uncached_writev_complete(struct work_struct *wor= k) struct cifsInodeInfo *cifsi =3D CIFS_I(inode); =20 spin_lock(&inode->i_lock); - cifs_update_eof(cifsi, wdata->offset, wdata->bytes); + cifs_update_eof(cifsi, wdata->subreq.start, wdata->subreq.len); if (cifsi->netfs.remote_i_size > inode->i_size) i_size_write(inode, cifsi->netfs.remote_i_size); spin_unlock(&inode->i_lock); @@ -3227,19 +3227,19 @@ cifs_resend_wdata(struct cifs_io_subrequest *wdata,= struct list_head *wdata_list * segments */ do { - rc =3D server->ops->wait_mtu_credits(server, wdata->bytes, + rc =3D server->ops->wait_mtu_credits(server, wdata->subreq.len, &wsize, &credits); if (rc) goto fail; =20 - if (wsize < wdata->bytes) { + if (wsize < wdata->subreq.len) { add_credits_and_wake_if(server, &credits, 0); msleep(1000); } - } while (wsize < wdata->bytes); + } while (wsize < wdata->subreq.len); wdata->credits =3D credits; =20 - rc =3D adjust_credits(server, &wdata->credits, wdata->bytes); + rc =3D adjust_credits(server, &wdata->credits, wdata->subreq.len); =20 if (!rc) { if (wdata->cfile->invalidHandle) @@ -3386,19 +3386,19 @@ cifs_write_from_iter(loff_t fpos, size_t len, struc= t iov_iter *from, =20 wdata->uncached =3D true; wdata->sync_mode =3D WB_SYNC_ALL; - wdata->offset =3D (__u64)fpos; + wdata->subreq.start =3D (__u64)fpos; wdata->cfile =3D cifsFileInfo_get(open_file); wdata->server =3D server; wdata->pid =3D pid; - wdata->bytes =3D cur_len; + wdata->subreq.len =3D cur_len; wdata->credits =3D credits_on_stack; - wdata->iter =3D *from; + wdata->subreq.io_iter =3D *from; wdata->ctx =3D ctx; kref_get(&ctx->refcount); =20 - iov_iter_truncate(&wdata->iter, cur_len); + iov_iter_truncate(&wdata->subreq.io_iter, cur_len); =20 - rc =3D adjust_credits(server, &wdata->credits, wdata->bytes); + rc =3D adjust_credits(server, &wdata->credits, wdata->subreq.len); =20 if (!rc) { if (wdata->cfile->invalidHandle) @@ -3460,7 +3460,7 @@ static void collect_uncached_write_data(struct cifs_a= io_ctx *ctx) if (wdata->result) rc =3D wdata->result; else - ctx->total_len +=3D wdata->bytes; + ctx->total_len +=3D wdata->subreq.len; =20 /* resend call if it's a retryable error */ if (rc =3D=3D -EAGAIN) { @@ -3475,10 +3475,10 @@ static void collect_uncached_write_data(struct cifs= _aio_ctx *ctx) wdata, &tmp_list, ctx); else { iov_iter_advance(&tmp_from, - wdata->offset - ctx->pos); + wdata->subreq.start - ctx->pos); =20 - rc =3D cifs_write_from_iter(wdata->offset, - wdata->bytes, &tmp_from, + rc =3D cifs_write_from_iter(wdata->subreq.start, + wdata->subreq.len, &tmp_from, ctx->cfile, cifs_sb, &tmp_list, ctx); =20 @@ -3801,20 +3801,20 @@ static int cifs_resend_rdata(struct cifs_io_subrequ= est *rdata, * segments */ do { - rc =3D server->ops->wait_mtu_credits(server, rdata->bytes, + rc =3D server->ops->wait_mtu_credits(server, rdata->subreq.len, &rsize, &credits); =20 if (rc) goto fail; =20 - if (rsize < rdata->bytes) { + if (rsize < rdata->subreq.len) { add_credits_and_wake_if(server, &credits, 0); msleep(1000); } - } while (rsize < rdata->bytes); + } while (rsize < rdata->subreq.len); rdata->credits =3D credits; =20 - rc =3D adjust_credits(server, &rdata->credits, rdata->bytes); + rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); if (!rc) { if (rdata->cfile->invalidHandle) rc =3D -EAGAIN; @@ -3912,17 +3912,17 @@ cifs_send_async_read(loff_t fpos, size_t len, struc= t cifsFileInfo *open_file, =20 rdata->server =3D server; rdata->cfile =3D cifsFileInfo_get(open_file); - rdata->offset =3D fpos; - rdata->bytes =3D cur_len; + rdata->subreq.start =3D fpos; + rdata->subreq.len =3D cur_len; rdata->pid =3D pid; rdata->credits =3D credits_on_stack; rdata->ctx =3D ctx; kref_get(&ctx->refcount); =20 - rdata->iter =3D ctx->iter; - iov_iter_truncate(&rdata->iter, cur_len); + rdata->subreq.io_iter =3D ctx->iter; + iov_iter_truncate(&rdata->subreq.io_iter, cur_len); =20 - rc =3D adjust_credits(server, &rdata->credits, rdata->bytes); + rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); =20 if (!rc) { if (rdata->cfile->invalidHandle) @@ -3992,8 +3992,8 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) &tmp_list, ctx); } else { rc =3D cifs_send_async_read( - rdata->offset + got_bytes, - rdata->bytes - got_bytes, + rdata->subreq.start + got_bytes, + rdata->subreq.len - got_bytes, rdata->cfile, cifs_sb, &tmp_list, ctx); =20 @@ -4007,7 +4007,7 @@ collect_uncached_read_data(struct cifs_aio_ctx *ctx) rc =3D rdata->result; =20 /* if there was a short read -- discard anything left */ - if (rdata->got_bytes && rdata->got_bytes < rdata->bytes) + if (rdata->got_bytes && rdata->got_bytes < rdata->subreq.len) rc =3D -ENODATA; =20 ctx->total_len +=3D rdata->got_bytes; @@ -4391,16 +4391,16 @@ static void cifs_readahead_complete(struct work_str= uct *work) pgoff_t last; bool good =3D rdata->result =3D=3D 0 || (rdata->result =3D=3D -EAGAIN && = rdata->got_bytes); =20 - XA_STATE(xas, &rdata->mapping->i_pages, rdata->offset / PAGE_SIZE); + XA_STATE(xas, &rdata->mapping->i_pages, rdata->subreq.start / PAGE_SIZE); =20 if (good) cifs_readahead_to_fscache(rdata->mapping->host, - rdata->offset, rdata->bytes); + rdata->subreq.start, rdata->subreq.len); =20 - if (iov_iter_count(&rdata->iter) > 0) - iov_iter_zero(iov_iter_count(&rdata->iter), &rdata->iter); + if (iov_iter_count(&rdata->subreq.io_iter) > 0) + iov_iter_zero(iov_iter_count(&rdata->subreq.io_iter), &rdata->subreq.io_= iter); =20 - last =3D (rdata->offset + rdata->bytes - 1) / PAGE_SIZE; + last =3D (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE; =20 rcu_read_lock(); xas_for_each(&xas, folio, last) { @@ -4539,8 +4539,8 @@ static void cifs_readahead(struct readahead_control *= ractl) break; } =20 - rdata->offset =3D ra_index * PAGE_SIZE; - rdata->bytes =3D nr_pages * PAGE_SIZE; + rdata->subreq.start =3D ra_index * PAGE_SIZE; + rdata->subreq.len =3D nr_pages * PAGE_SIZE; rdata->cfile =3D cifsFileInfo_get(open_file); rdata->server =3D server; rdata->mapping =3D ractl->mapping; @@ -4554,10 +4554,10 @@ static void cifs_readahead(struct readahead_control= *ractl) ra_pages -=3D nr_pages; ra_index +=3D nr_pages; =20 - iov_iter_xarray(&rdata->iter, ITER_DEST, &rdata->mapping->i_pages, - rdata->offset, rdata->bytes); + iov_iter_xarray(&rdata->subreq.io_iter, ITER_DEST, &rdata->mapping->i_pa= ges, + rdata->subreq.start, rdata->subreq.len); =20 - rc =3D adjust_credits(server, &rdata->credits, rdata->bytes); + rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); if (!rc) { if (rdata->cfile->invalidHandle) rc =3D -EAGAIN; @@ -4568,8 +4568,8 @@ static void cifs_readahead(struct readahead_control *= ractl) if (rc) { add_credits_and_wake_if(server, &rdata->credits, 0); cifs_unlock_folios(rdata->mapping, - rdata->offset / PAGE_SIZE, - (rdata->offset + rdata->bytes - 1) / PAGE_SIZE); + rdata->subreq.start / PAGE_SIZE, + (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE); /* Fallback to the readpage in error/reconnect cases */ cifs_put_readdata(rdata); break; diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 072230d5b19b..b185b07ea86b 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -4584,7 +4584,7 @@ handle_read_data(struct TCP_Server_Info *server, stru= ct mid_q_entry *mid, =20 /* Copy the data to the output I/O iterator. */ rdata->result =3D cifs_copy_pages_to_iter(pages, pages_len, - cur_off, &rdata->iter); + cur_off, &rdata->subreq.io_iter); if (rdata->result !=3D 0) { if (is_offloaded) mid->mid_state =3D MID_RESPONSE_MALFORMED; @@ -4598,7 +4598,7 @@ handle_read_data(struct TCP_Server_Info *server, stru= ct mid_q_entry *mid, /* read response payload is in buf */ WARN_ONCE(pages && !xa_empty(pages), "read data can be either in buf or in pages"); - length =3D copy_to_iter(buf + data_offset, data_len, &rdata->iter); + length =3D copy_to_iter(buf + data_offset, data_len, &rdata->subreq.io_i= ter); if (length < 0) return length; rdata->got_bytes =3D data_len; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index f2f7e107fab4..ddd69db1f0a8 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4421,7 +4421,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len, struct smbd_buffer_descriptor_v1 *v1; bool need_invalidate =3D server->dialect =3D=3D SMB30_PROT_ID; =20 - rdata->mr =3D smbd_register_mr(server->smbd_conn, &rdata->iter, + rdata->mr =3D smbd_register_mr(server->smbd_conn, &rdata->subreq.io_iter, true, need_invalidate); if (!rdata->mr) return -EAGAIN; @@ -4481,17 +4481,17 @@ smb2_readv_callback(struct mid_q_entry *mid) struct smb_rqst rqst =3D { .rq_iov =3D &rdata->iov[1], .rq_nvec =3D 1 }; =20 if (rdata->got_bytes) { - rqst.rq_iter =3D rdata->iter; - rqst.rq_iter_size =3D iov_iter_count(&rdata->iter); + rqst.rq_iter =3D rdata->subreq.io_iter; + rqst.rq_iter_size =3D iov_iter_count(&rdata->subreq.io_iter); } =20 WARN_ONCE(rdata->server !=3D mid->server, "rdata server %p !=3D mid server %p", rdata->server, mid->server); =20 - cifs_dbg(FYI, "%s: mid=3D%llu state=3D%d result=3D%d bytes=3D%u\n", + cifs_dbg(FYI, "%s: mid=3D%llu state=3D%d result=3D%d bytes=3D%zu\n", __func__, mid->mid, mid->mid_state, rdata->result, - rdata->bytes); + rdata->subreq.len); =20 switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: @@ -4544,13 +4544,13 @@ smb2_readv_callback(struct mid_q_entry *mid) cifs_stats_fail_inc(tcon, SMB2_READ_HE); trace_smb3_read_err(0 /* xid */, rdata->cfile->fid.persistent_fid, - tcon->tid, tcon->ses->Suid, rdata->offset, - rdata->bytes, rdata->result); + tcon->tid, tcon->ses->Suid, rdata->subreq.start, + rdata->subreq.len, rdata->result); } else trace_smb3_read_done(0 /* xid */, rdata->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, - rdata->offset, rdata->got_bytes); + rdata->subreq.start, rdata->got_bytes); =20 queue_work(cifsiod_wq, &rdata->work); release_mid(mid); @@ -4572,16 +4572,16 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) unsigned int total_len; int credit_request; =20 - cifs_dbg(FYI, "%s: offset=3D%llu bytes=3D%u\n", - __func__, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: offset=3D%llu bytes=3D%zu\n", + __func__, rdata->subreq.start, rdata->subreq.len); =20 if (!rdata->server) rdata->server =3D cifs_pick_channel(tcon->ses); =20 io_parms.tcon =3D tlink_tcon(rdata->cfile->tlink); io_parms.server =3D server =3D rdata->server; - io_parms.offset =3D rdata->offset; - io_parms.length =3D rdata->bytes; + io_parms.offset =3D rdata->subreq.start; + io_parms.length =3D rdata->subreq.len; io_parms.persistent_fid =3D rdata->cfile->fid.persistent_fid; io_parms.volatile_fid =3D rdata->cfile->fid.volatile_fid; io_parms.pid =3D rdata->pid; @@ -4600,7 +4600,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) shdr =3D (struct smb2_hdr *)buf; =20 if (rdata->credits.value > 0) { - shdr->CreditCharge =3D cpu_to_le16(DIV_ROUND_UP(rdata->bytes, + shdr->CreditCharge =3D cpu_to_le16(DIV_ROUND_UP(rdata->subreq.len, SMB2_MAX_BUFFER_SIZE)); credit_request =3D le16_to_cpu(shdr->CreditCharge) + 8; if (server->credits >=3D server->max_credits) @@ -4610,7 +4610,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) min_t(int, server->max_credits - server->credits, credit_request)); =20 - rc =3D adjust_credits(server, &rdata->credits, rdata->bytes); + rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); if (rc) goto async_readv_out; =20 @@ -4750,13 +4750,13 @@ smb2_writev_callback(struct mid_q_entry *mid) * client. OS/2 servers are known to set incorrect * CountHigh values. */ - if (written > wdata->bytes) + if (written > wdata->subreq.len) written &=3D 0xFFFF; =20 - if (written < wdata->bytes) + if (written < wdata->subreq.len) wdata->result =3D -ENOSPC; else - wdata->bytes =3D written; + wdata->subreq.len =3D written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: @@ -4787,8 +4787,8 @@ smb2_writev_callback(struct mid_q_entry *mid) cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); trace_smb3_write_err(0 /* no xid */, wdata->cfile->fid.persistent_fid, - tcon->tid, tcon->ses->Suid, wdata->offset, - wdata->bytes, wdata->result); + tcon->tid, tcon->ses->Suid, wdata->subreq.start, + wdata->subreq.len, wdata->result); if (wdata->result =3D=3D -ENOSPC) pr_warn_once("Out of space writing to %s\n", tcon->tree_name); @@ -4796,7 +4796,7 @@ smb2_writev_callback(struct mid_q_entry *mid) trace_smb3_write_done(0 /* no xid */, wdata->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, - wdata->offset, wdata->bytes); + wdata->subreq.start, wdata->subreq.len); =20 queue_work(cifsiod_wq, &wdata->work); release_mid(mid); @@ -4829,8 +4829,8 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) _io_parms =3D (struct cifs_io_parms) { .tcon =3D tcon, .server =3D server, - .offset =3D wdata->offset, - .length =3D wdata->bytes, + .offset =3D wdata->subreq.start, + .length =3D wdata->subreq.len, .persistent_fid =3D wdata->cfile->fid.persistent_fid, .volatile_fid =3D wdata->cfile->fid.volatile_fid, .pid =3D wdata->pid, @@ -4872,10 +4872,10 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) */ if (smb3_use_rdma_offload(io_parms)) { struct smbd_buffer_descriptor_v1 *v1; - size_t data_size =3D iov_iter_count(&wdata->iter); + size_t data_size =3D iov_iter_count(&wdata->subreq.io_iter); bool need_invalidate =3D server->dialect =3D=3D SMB30_PROT_ID; =20 - wdata->mr =3D smbd_register_mr(server->smbd_conn, &wdata->iter, + wdata->mr =3D smbd_register_mr(server->smbd_conn, &wdata->subreq.io_iter, false, need_invalidate); if (!wdata->mr) { rc =3D -EAGAIN; @@ -4902,7 +4902,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) =20 rqst.rq_iov =3D iov; rqst.rq_nvec =3D 1; - rqst.rq_iter =3D wdata->iter; + rqst.rq_iter =3D wdata->subreq.io_iter; rqst.rq_iter_size =3D iov_iter_count(&rqst.rq_iter); if (wdata->replay) smb2_set_replay(server, &rqst); @@ -4922,7 +4922,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) #endif =20 if (wdata->credits.value > 0) { - shdr->CreditCharge =3D cpu_to_le16(DIV_ROUND_UP(wdata->bytes, + shdr->CreditCharge =3D cpu_to_le16(DIV_ROUND_UP(wdata->subreq.len, SMB2_MAX_BUFFER_SIZE)); credit_request =3D le16_to_cpu(shdr->CreditCharge) + 8; if (server->credits >=3D server->max_credits) diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index a5bab478e6de..e52967de59e6 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1702,8 +1702,8 @@ cifs_readv_receive(struct TCP_Server_Info *server, st= ruct mid_q_entry *mid) unsigned int buflen =3D server->pdu_size + HEADER_PREAMBLE_SIZE(server); bool use_rdma_mr =3D false; =20 - cifs_dbg(FYI, "%s: mid=3D%llu offset=3D%llu bytes=3D%u\n", - __func__, mid->mid, rdata->offset, rdata->bytes); + cifs_dbg(FYI, "%s: mid=3D%llu offset=3D%llu bytes=3D%zu\n", + __func__, mid->mid, rdata->subreq.start, rdata->subreq.len); =20 /* * read the rest of READ_RSP header (sans Data array), or whatever we @@ -1808,7 +1808,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, st= ruct mid_q_entry *mid) length =3D data_len; /* An RDMA read is already done. */ else #endif - length =3D cifs_read_iter_from_socket(server, &rdata->iter, + length =3D cifs_read_iter_from_socket(server, &rdata->subreq.io_iter, data_len); if (length > 0) rdata->got_bytes +=3D length; From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 2FB6282870 for ; Thu, 28 Mar 2024 16:59:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645183; cv=none; b=ZBV3/bcaQLn+j5RExYqq5ed1M6Bo9Esmzb9Veh8UGt+whFi7ogHADK/J/erP+PYG920DfbNL6epLFKsrYp2GK8Bbxk+RzdIIVNyz/nz1szB2n9raplmGWwF8vQ6D0EcDYu8/R9+eoEYLlEjm7MVBALB3iowdFTzRfluU6THMOEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645183; c=relaxed/simple; bh=91203nhPa825Pcw3EKi4vZbAvQwkqupVawlE3FIuJdA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eEKj1H1lLdg0ut9zHy4tytcv/5/j2UCOjjX6yuAqLkqy8Xmoz4iR1hWtCPuIwxkM/ikx8FwdKe8+JGGeou2WP43or1lDZ5DA4Qq3sxYwp7V9BCyonMChmcv+IO0IixVuKxbuZwS3ldVnpdqkAJDwMyhq27X9J9AzcakMo4LemzU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Vzhs6N0g; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Vzhs6N0g" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645181; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tzNFrIx51OPZGYIohrzRvwjxtNHaaHVdYPKmPKDLG9U=; b=Vzhs6N0g+G9hd7HgS0/lmlbWkdHRwohOUh5iWBQDykNIopksEWdX9VrGYfRA5v3tm+wRkG 9da5RvCztFctdeezzA3tNavERfXtMs4+keFIzF/3X+UafZlUoAEnrTiZoFDI5AOarkNmgc McQj8BQf2RERQejzR32+7I0E2eOoEsA= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-393-M-9TrocPM52Eo_XJTQe1gg-1; Thu, 28 Mar 2024 12:59:38 -0400 X-MC-Unique: M-9TrocPM52Eo_XJTQe1gg-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1748D28EC105; Thu, 28 Mar 2024 16:59:36 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id D6D84492BD0; Thu, 28 Mar 2024 16:59:33 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula , linux-cachefs@redhat.com Subject: [PATCH v6 04/15] cifs: Make wait_mtu_credits take size_t args Date: Thu, 28 Mar 2024 16:57:55 +0000 Message-ID: <20240328165845.2782259-5-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.10 Content-Type: text/plain; charset="utf-8" Make the wait_mtu_credits functions use size_t for the size and num arguments rather than unsigned int as netfslib uses size_t/ssize_t for arguments and return values to allow for extra capacity. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: linux-cachefs@redhat.com cc: netfs@lists.linux.dev cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 4 ++-- fs/smb/client/cifsproto.h | 2 +- fs/smb/client/file.c | 17 ++++++++++------- fs/smb/client/smb2ops.c | 4 ++-- fs/smb/client/transport.c | 4 ++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index ff86ab3d6166..6436d360b9f4 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -546,8 +546,8 @@ struct smb_version_operations { /* writepages retry size */ unsigned int (*wp_retry_size)(struct inode *); /* get mtu credits */ - int (*wait_mtu_credits)(struct TCP_Server_Info *, unsigned int, - unsigned int *, struct cifs_credits *); + int (*wait_mtu_credits)(struct TCP_Server_Info *, size_t, + size_t *, struct cifs_credits *); /* adjust previously taken mtu credits to request size */ int (*adjust_credits)(struct TCP_Server_Info *server, struct cifs_credits *credits, diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 010601a89fe5..95b5fa385196 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -121,7 +121,7 @@ extern struct mid_q_entry *cifs_setup_async_request(str= uct TCP_Server_Info *, extern int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, bool log_error); extern int cifs_wait_mtu_credits(struct TCP_Server_Info *server, - unsigned int size, unsigned int *num, + size_t size, size_t *num, struct cifs_credits *credits); extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, struct kvec *, int /* nvec to send */, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index c5850a1c484f..76bfefa9b669 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2704,7 +2704,8 @@ static ssize_t cifs_write_back_from_locked_folio(stru= ct address_space *mapping, struct cifs_credits *credits =3D &credits_on_stack; struct cifsFileInfo *cfile =3D NULL; unsigned long long i_size =3D i_size_read(inode), max_len; - unsigned int xid, wsize; + unsigned int xid; + size_t wsize; size_t len =3D folio_size(folio); long count =3D wbc->nr_to_write; int rc; @@ -3206,7 +3207,7 @@ static int cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdat= a_list, struct cifs_aio_ctx *ctx) { - unsigned int wsize; + size_t wsize; struct cifs_credits credits; int rc; struct TCP_Server_Info *server =3D wdata->server; @@ -3341,7 +3342,8 @@ cifs_write_from_iter(loff_t fpos, size_t len, struct = iov_iter *from, do { struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; - unsigned int wsize, nsegs =3D 0; + unsigned int nsegs =3D 0; + size_t wsize; =20 if (signal_pending(current)) { rc =3D -EINTR; @@ -3778,7 +3780,7 @@ static int cifs_resend_rdata(struct cifs_io_subreques= t *rdata, struct list_head *rdata_list, struct cifs_aio_ctx *ctx) { - unsigned int rsize; + size_t rsize; struct cifs_credits credits; int rc; struct TCP_Server_Info *server; @@ -3852,10 +3854,10 @@ cifs_send_async_read(loff_t fpos, size_t len, struc= t cifsFileInfo *open_file, struct cifs_aio_ctx *ctx) { struct cifs_io_subrequest *rdata; - unsigned int rsize, nsegs, max_segs =3D INT_MAX; + unsigned int nsegs, max_segs =3D INT_MAX; struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; - size_t cur_len, max_len; + size_t cur_len, max_len, rsize; int rc; pid_t pid; struct TCP_Server_Info *server; @@ -4451,12 +4453,13 @@ static void cifs_readahead(struct readahead_control= *ractl) * Chop the readahead request up into rsize-sized read requests. */ while ((nr_pages =3D ra_pages)) { - unsigned int i, rsize; + unsigned int i; struct cifs_io_subrequest *rdata; struct cifs_credits credits_on_stack; struct cifs_credits *credits =3D &credits_on_stack; struct folio *folio; pgoff_t fsize; + size_t rsize; =20 /* * Find out if we have anything cached in the range of diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index b185b07ea86b..2413006e5f39 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -217,8 +217,8 @@ smb2_get_credits(struct mid_q_entry *mid) } =20 static int -smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size, - unsigned int *num, struct cifs_credits *credits) +smb2_wait_mtu_credits(struct TCP_Server_Info *server, size_t size, + size_t *num, struct cifs_credits *credits) { int rc =3D 0; unsigned int scredits, in_flight; diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index e52967de59e6..5a69a7430ffa 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -691,8 +691,8 @@ wait_for_compound_request(struct TCP_Server_Info *serve= r, int num, } =20 int -cifs_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size, - unsigned int *num, struct cifs_credits *credits) +cifs_wait_mtu_credits(struct TCP_Server_Info *server, size_t size, + size_t *num, struct cifs_credits *credits) { *num =3D size; credits->value =3D 0; From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 A280C130A4D for ; Thu, 28 Mar 2024 16:59:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645191; cv=none; b=XkYfWrGIPtdBKNSqrPT26hDXhIMFr15+xKI0/gQqxcjB0Ejl1EqKof0qIzXXkYr+6WdYOjsb3tiVWTXjTbD5rQzrIV00k6+aUbi08JD7IoqvW+gAewXdwAjvqMs0pVWOTy5usSJMq64RS/MgqcgYkMp/yxm/oksjMJu4VEeLMM4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645191; c=relaxed/simple; bh=NaiYCpKD/naLFX/mBnWa0fNHnJcl1Aa3tXqEyM0Fyuo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VnFW6yi5JPK7Aj8q24OmnLjG3p8VSg6vBmtiNtHOeYB+6DjabtPpK+dYtaDB5OsPGZ01iHzW/UmqW9Cv4mhFL7OMPfhWuKFce4NUEvk66sRRETDL5YslB7r6ulDtCvsHxWGCRn0SFn5J1R2O6Lnp/A/n/CbhF1sDSaIq4VBThuU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ierBdh1f; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ierBdh1f" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645188; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FP3I6/3Lail3PRtRjCFYUrK7RtWmkgk5AkVOW5arfmM=; b=ierBdh1fE80SF34sNWGxdIY/MffgXOCXK7NMa5m8YWWPvNNfE+Lc1LYzLP/PRKwBLmrJkr pkQIs0meIDxhxyJF6ROBhaTIG5l54GSeJCpP2zg7+HD9b/EmsrgyWyIkdOpyOz/XpsIJte KP5e8uqUGZOSZaNn46RNDBsDuxo0Rvs= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-130--_LPE4uLM_G2IXbLkWEMMQ-1; Thu, 28 Mar 2024 12:59:43 -0400 X-MC-Unique: -_LPE4uLM_G2IXbLkWEMMQ-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B0A5680026D; Thu, 28 Mar 2024 16:59:42 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id C5C27C4C7A0; Thu, 28 Mar 2024 16:59:40 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 05/15] cifs: Replace the writedata replay bool with a netfs sreq flag Date: Thu, 28 Mar 2024 16:57:56 +0000 Message-ID: <20240328165845.2782259-6-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 Content-Type: text/plain; charset="utf-8" Replace the 'replay' bool in cifs_writedata (now cifs_io_subrequest) with a flag in the netfs_io_subrequest flags. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 2 +- fs/smb/client/smb2pdu.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 76bfefa9b669..6f6459b506d1 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -3246,7 +3246,7 @@ cifs_resend_wdata(struct cifs_io_subrequest *wdata, s= truct list_head *wdata_list if (wdata->cfile->invalidHandle) rc =3D -EAGAIN; else { - wdata->replay =3D true; + set_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr) { wdata->mr->need_invalidate =3D true; diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index ddd69db1f0a8..2e29c6c2dca6 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4819,7 +4819,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) struct cifs_io_parms *io_parms =3D NULL; int credit_request; =20 - if (!wdata->server || wdata->replay) + if (!wdata->server || test_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags)) server =3D wdata->server =3D cifs_pick_channel(tcon->ses); =20 /* @@ -4904,7 +4904,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) rqst.rq_nvec =3D 1; rqst.rq_iter =3D wdata->subreq.io_iter; rqst.rq_iter_size =3D iov_iter_count(&rqst.rq_iter); - if (wdata->replay) + if (test_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags)) smb2_set_replay(server, &rqst); #ifdef CONFIG_CIFS_SMB_DIRECT if (wdata->mr) From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 3CACC131BC4 for ; Thu, 28 Mar 2024 16:59:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645198; cv=none; b=TI+BNr+vb9q+24yI7P+6ydmRERYNbhHnFffaZ25PfRCo74Tfeq+yEpWFHtP+E64ZXShVW+P0ZwLMFwvlAQNKhDGW65WBpaWE6Zoz9bwe62/PdDsa09NojahH8RPrBp9IBw91p3QF+MzVS9mstnntsy88GOPmLeHRT4egxta1uMI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645198; c=relaxed/simple; bh=FTHCqrlzgvMHVEi92rZok3zSp6ynK4AM/ag67/+d9PY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iUrqB1Rm0zOj24ogUtD0zR7FVCJp4sbJMWa5VGs9Ok2PO/RMOtkIJpU6pvGH5uo8jxysa+gzUyaOvnidcZoL2nUBASE8fBRY7JdRFyrRG5uJQGo65aYmt0MvhZ2hdFbSe1PouHTElwjp5D596akKmALbt1/98EpoMs2SxPY7va8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=LUfu3nGp; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="LUfu3nGp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645196; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7JnNdknZO0gOyZV3FCpaW6PVLWdhRk55wXZfkMYs5KI=; b=LUfu3nGp98qw/yoxVdmE5KUYEr16cDo66rb7Irqmdbf7OsXIcaygY0WHuDdhxd2gdh6Z/h hVvAyQ/kPzI2zZfbte1qp2J6gzKVaR7YupmkpYptfoh/j/dylOjnRT6QCpD7PTzGEwsae9 xjiJRi59qYIUc5rEx2wLKN2QWVbQS0A= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-614-h8Wy3gy6MbKf59H0KMZPPA-1; Thu, 28 Mar 2024 12:59:50 -0400 X-MC-Unique: h8Wy3gy6MbKf59H0KMZPPA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 478A48007A7; Thu, 28 Mar 2024 16:59:49 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6463817AA3; Thu, 28 Mar 2024 16:59:47 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 06/15] cifs: Move cifs_loose_read_iter() and cifs_file_write_iter() to file.c Date: Thu, 28 Mar 2024 16:57:57 +0000 Message-ID: <20240328165845.2782259-7-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.5 Content-Type: text/plain; charset="utf-8" Move cifs_loose_read_iter() and cifs_file_write_iter() to file.c so that they are colocated with similar functions rather than being split with cifsfs.c. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 55 ------------------------------------------ fs/smb/client/cifsfs.h | 2 ++ fs/smb/client/file.c | 53 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index aa6f1ecb7c0e..e01ba9f8706a 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -982,61 +982,6 @@ cifs_smb3_do_mount(struct file_system_type *fs_type, return root; } =20 - -static ssize_t -cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) -{ - ssize_t rc; - struct inode *inode =3D file_inode(iocb->ki_filp); - - if (iocb->ki_flags & IOCB_DIRECT) - return cifs_user_readv(iocb, iter); - - rc =3D cifs_revalidate_mapping(inode); - if (rc) - return rc; - - return generic_file_read_iter(iocb, iter); -} - -static ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *f= rom) -{ - struct inode *inode =3D file_inode(iocb->ki_filp); - struct cifsInodeInfo *cinode =3D CIFS_I(inode); - ssize_t written; - int rc; - - if (iocb->ki_filp->f_flags & O_DIRECT) { - written =3D cifs_user_writev(iocb, from); - if (written > 0 && CIFS_CACHE_READ(cinode)) { - cifs_zap_mapping(inode); - cifs_dbg(FYI, - "Set no oplock for inode=3D%p after a write operation\n", - inode); - cinode->oplock =3D 0; - } - return written; - } - - written =3D cifs_get_writer(cinode); - if (written) - return written; - - written =3D generic_file_write_iter(iocb, from); - - if (CIFS_CACHE_WRITE(CIFS_I(inode))) - goto out; - - rc =3D filemap_fdatawrite(inode->i_mapping); - if (rc) - cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", - rc, inode); - -out: - cifs_put_writer(cinode); - return written; -} - static loff_t cifs_llseek(struct file *file, loff_t offset, int whence) { struct cifsFileInfo *cfile =3D file->private_data; diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 1ab7e5998c58..1acf6bfc06de 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -99,6 +99,8 @@ extern ssize_t cifs_strict_readv(struct kiocb *iocb, stru= ct iov_iter *to); extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from); extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *fro= m); extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *fro= m); +ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from); +ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter); extern int cifs_flock(struct file *pfile, int cmd, struct file_lock *plock= ); extern int cifs_lock(struct file *, int, struct file_lock *); extern int cifs_fsync(struct file *, loff_t, loff_t, int); diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 6f6459b506d1..e40ba6de0a28 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -4171,6 +4171,59 @@ ssize_t cifs_user_readv(struct kiocb *iocb, struct i= ov_iter *to) return __cifs_readv(iocb, to, false); } =20 +ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + ssize_t rc; + struct inode *inode =3D file_inode(iocb->ki_filp); + + if (iocb->ki_flags & IOCB_DIRECT) + return cifs_user_readv(iocb, iter); + + rc =3D cifs_revalidate_mapping(inode); + if (rc) + return rc; + + return generic_file_read_iter(iocb, iter); +} + +ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + struct inode *inode =3D file_inode(iocb->ki_filp); + struct cifsInodeInfo *cinode =3D CIFS_I(inode); + ssize_t written; + int rc; + + if (iocb->ki_filp->f_flags & O_DIRECT) { + written =3D cifs_user_writev(iocb, from); + if (written > 0 && CIFS_CACHE_READ(cinode)) { + cifs_zap_mapping(inode); + cifs_dbg(FYI, + "Set no oplock for inode=3D%p after a write operation\n", + inode); + cinode->oplock =3D 0; + } + return written; + } + + written =3D cifs_get_writer(cinode); + if (written) + return written; + + written =3D generic_file_write_iter(iocb, from); + + if (CIFS_CACHE_WRITE(CIFS_I(inode))) + goto out; + + rc =3D filemap_fdatawrite(inode->i_mapping); + if (rc) + cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", + rc, inode); + +out: + cifs_put_writer(cinode); + return written; +} + ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) { From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 170AC1327F8 for ; Thu, 28 Mar 2024 16:59:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645201; cv=none; b=sHl2rX5LCgpfC/vI8TnNFj3jTMOHWoWVxI8wh/EjbV3+19OyGneZUvr2r236R1jACdmSA0cFzOOYSy6VD6nuR6afCPCYmhIOPu49GgCA7GsgJonG3rzuPl4wkOR64BQWRmhImM0Eb+Douf1tfrGYmH8pWQEUgAnOyaZybL/M1nk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645201; c=relaxed/simple; bh=lViBTFxW094B27mO0CNb4JcXxIC1M1VJ7XSGfavhzeI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mQ+Xm4l4hdqU639p6PxeToHuEUhXL77vg8quYE+IfkyAJS6ufIamt5h+Mrb3yuqUe/Q3N1RZlma6CUbrXPvU1QyjXJ0+V4leTR9Bi9vlJVH1g4+3s5kbG81w93MnXBYxXMw+d3v9WBk9eEfdTQK14s0VXZARnmAvXiAiKCFlpXY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=BsjeLdQ/; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BsjeLdQ/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645199; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=koZtPsH7hhKYp0dfXQczx6sKrVXjOZT1GIZj0qwvbyc=; b=BsjeLdQ/P3A0lBeDoU+x35AjMBHMQk/JcRaOSkjSQm1rOu1hlDdtscq1SrTCn5WXk53wuq 48Q+V6BZhXBRQEUouTi11oTRqijH3hcbC2P4kSDSlfGDHgad55dKW+aHfpv1TSeSHlKcfT opIm6gyALbVOqfJKoP0v35UJArpD7ig= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-270-x0mgGlrpM3uifVCi1HPq0w-1; Thu, 28 Mar 2024 12:59:55 -0400 X-MC-Unique: x0mgGlrpM3uifVCi1HPq0w-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F0E5A28EC106; Thu, 28 Mar 2024 16:59:54 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id F01722166B31; Thu, 28 Mar 2024 16:59:52 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 07/15] cifs: Set zero_point in the copy_file_range() and remap_file_range() Date: Thu, 28 Mar 2024 16:57:58 +0000 Message-ID: <20240328165845.2782259-8-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 Content-Type: text/plain; charset="utf-8" Set zero_point in the copy_file_range() and remap_file_range() implementations so that we don't skip reading data modified on a server-side copy. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index e01ba9f8706a..2dd29663dab1 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1283,6 +1283,8 @@ static loff_t cifs_remap_file_range(struct file *src_= file, loff_t off, rc =3D cifs_flush_folio(target_inode, destend, &fstart, &fend, false); if (rc) goto unlock; + if (fend > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point =3D fend + 1; =20 /* Discard all the folios that overlap the destination region. */ cifs_dbg(FYI, "about to discard pages %llx-%llx\n", fstart, fend); @@ -1301,6 +1303,8 @@ static loff_t cifs_remap_file_range(struct file *src_= file, loff_t off, fscache_resize_cookie(cifs_inode_cookie(target_inode), new_size); } + if (rc =3D=3D 0 && new_size > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point =3D new_size; } =20 /* force revalidate of size and timestamps of target file now @@ -1392,6 +1396,8 @@ ssize_t cifs_file_copychunk_range(unsigned int xid, rc =3D cifs_flush_folio(target_inode, destend, &fstart, &fend, false); if (rc) goto unlock; + if (fend > target_cifsi->netfs.zero_point) + target_cifsi->netfs.zero_point =3D fend + 1; =20 /* Discard all the folios that overlap the destination region. */ truncate_inode_pages_range(&target_inode->i_data, fstart, fend); From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 3D5F3136E23 for ; Thu, 28 Mar 2024 17:00:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645208; cv=none; b=r43OBpWAtVtVBc3LCseqBrb1PQ0doWdOjIYbY5SjvAWoipN/lExNshJIDhwOqmScPu5mCQohnzTB0/9q6i7JiySRGXIjghZc+vlyBXhNwp9lQD1Vqwo2eFrWbr+Bv/jtykSddkckjC3SsW8R6eIpJ+DsdrLHnsg7JZJ3W33lfJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645208; c=relaxed/simple; bh=1H+o+v897zLhA37MJj9BJEjve71vHhPdyEjqxJssFSQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N+LoByZoCNDGF/6k/NQ5HZae95XWVqVsIACCirnegTOmKCO3QZuFa+9WRg9MxZCbwnAno71ePKuHpnpljCp2tu5cEp9iKOe7Cr4CXma1kJJoFzmVsG7KO3ST/oSz7ow33qgsABBWymTnxOMI1RWFUvlTZimXu9/709mW5EbjelQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=R+lMY3K4; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="R+lMY3K4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645206; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FdETRfB8DnsEfVd472r7IU+9uzPySp2hW2I+XAgROTY=; b=R+lMY3K4u8aEFaVCjYaXD0JtSBB6E+mqBZ9wrsnhMIV27vlPSeCG05VmHz10UT2CJBep99 Z7GXYHVjehK2kJG6UgQOeAGcw3PiFzBGCGlY6lif65/hua65fR9NbXz0j3WQFBMY4SpwwM av0O5sFH/IIPWpRuJx/xeIeLpFEiSuw= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-400-B-6RQZNSNq6woioU60vOtQ-1; Thu, 28 Mar 2024 13:00:00 -0400 X-MC-Unique: B-6RQZNSNq6woioU60vOtQ-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E51281C2CDE3; Thu, 28 Mar 2024 16:59:59 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id F29CF2166B31; Thu, 28 Mar 2024 16:59:57 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 08/15] cifs: Add mempools for cifs_io_request and cifs_io_subrequest structs Date: Thu, 28 Mar 2024 16:57:59 +0000 Message-ID: <20240328165845.2782259-9-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 Content-Type: text/plain; charset="utf-8" Add mempools for the allocation of cifs_io_request and cifs_io_subrequest structs for netfslib to use so that it can guarantee eventual allocation in writeback. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsfs.c | 55 +++++++++++++++++++++++++++++++++++++++- fs/smb/client/cifsglob.h | 2 ++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 2dd29663dab1..d8c31383752a 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -370,9 +370,13 @@ static struct kmem_cache *cifs_inode_cachep; static struct kmem_cache *cifs_req_cachep; static struct kmem_cache *cifs_mid_cachep; static struct kmem_cache *cifs_sm_req_cachep; +static struct kmem_cache *cifs_io_request_cachep; +static struct kmem_cache *cifs_io_subrequest_cachep; mempool_t *cifs_sm_req_poolp; mempool_t *cifs_req_poolp; mempool_t *cifs_mid_poolp; +mempool_t cifs_io_request_pool; +mempool_t cifs_io_subrequest_pool; =20 static struct inode * cifs_alloc_inode(struct super_block *sb) @@ -1746,6 +1750,48 @@ static void destroy_mids(void) kmem_cache_destroy(cifs_mid_cachep); } =20 +static int cifs_init_netfs(void) +{ + cifs_io_request_cachep =3D + kmem_cache_create("cifs_io_request", + sizeof(struct netfs_io_request), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!cifs_io_request_cachep) + goto nomem_req; + + if (mempool_init_slab_pool(&cifs_io_request_pool, 100, cifs_io_request_ca= chep) < 0) + goto nomem_reqpool; + + cifs_io_subrequest_cachep =3D + kmem_cache_create("cifs_io_subrequest", + sizeof(struct cifs_io_subrequest), 0, + SLAB_HWCACHE_ALIGN, NULL); + if (!cifs_io_subrequest_cachep) + goto nomem_subreq; + + if (mempool_init_slab_pool(&cifs_io_subrequest_pool, 100, cifs_io_subrequ= est_cachep) < 0) + goto nomem_subreqpool; + + return 0; + +nomem_subreqpool: + kmem_cache_destroy(cifs_io_subrequest_cachep); +nomem_subreq: + mempool_destroy(&cifs_io_request_pool); +nomem_reqpool: + kmem_cache_destroy(cifs_io_request_cachep); +nomem_req: + return -ENOMEM; +} + +static void cifs_destroy_netfs(void) +{ + mempool_destroy(&cifs_io_subrequest_pool); + kmem_cache_destroy(cifs_io_subrequest_cachep); + mempool_destroy(&cifs_io_request_pool); + kmem_cache_destroy(cifs_io_request_cachep); +} + static int __init init_cifs(void) { @@ -1843,10 +1889,14 @@ init_cifs(void) if (rc) goto out_destroy_deferredclose_wq; =20 - rc =3D init_mids(); + rc =3D cifs_init_netfs(); if (rc) goto out_destroy_inodecache; =20 + rc =3D init_mids(); + if (rc) + goto out_destroy_netfs; + rc =3D cifs_init_request_bufs(); if (rc) goto out_destroy_mids; @@ -1901,6 +1951,8 @@ init_cifs(void) cifs_destroy_request_bufs(); out_destroy_mids: destroy_mids(); +out_destroy_netfs: + cifs_destroy_netfs(); out_destroy_inodecache: cifs_destroy_inodecache(); out_destroy_deferredclose_wq: @@ -1937,6 +1989,7 @@ exit_cifs(void) #endif cifs_destroy_request_bufs(); destroy_mids(); + cifs_destroy_netfs(); cifs_destroy_inodecache(); destroy_workqueue(deferredclose_wq); destroy_workqueue(cifsoplockd_wq); diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 6436d360b9f4..057a7933b175 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -2089,6 +2089,8 @@ extern __u32 cifs_lock_secret; extern mempool_t *cifs_sm_req_poolp; extern mempool_t *cifs_req_poolp; extern mempool_t *cifs_mid_poolp; +extern mempool_t cifs_io_request_pool; +extern mempool_t cifs_io_subrequest_pool; =20 /* Operations for different SMB versions */ #define SMB1_VERSION_STRING "1.0" From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 87E9A5B678 for ; Thu, 28 Mar 2024 17:00:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645216; cv=none; b=DntERKyoE5cvgSTtnPCj18716QW3seOPXQHK1//87ap1+F2JzNrwSl/fUnz5rMiYi7p+03+pA76TuLLkn8k0Zb3DkkPSMxX9z83fjsxu8vOiYZpDQ2h8hNaK7Y/AKc25DTQ0O1jpz57rCdT2tvt9gOYDUvTuV3Ea5sSXCzqjOsg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645216; c=relaxed/simple; bh=a7ZDTPEmZI5vb0iw+H7BOuZ7gMj6e/DdhQq/AVsEQy4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jW9XRTj916C/y/SYxsuA6xtg9phwcNY/jMh0ky76ocj6Y5AJ3QZ7iKPS4yhn20+gSDHZTg8hkuRWi3Rono1M+QAzkc/G7j3Y8qLEG+PV8otNpSlftccW0+LdJGhrysxl83ospuqImUvnPD/7Zs1XhPnskKYmXHRfxCJKMJ9ZOgg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ZrkXxdgD; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ZrkXxdgD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645213; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CntTp3Jyu1WRS7BeCEXY9WjviKzEFkeTql7WaUHGCEY=; b=ZrkXxdgDwNGfSE37YOwudII2+JPvp0rZPONs3i/QD/mVZpmTB2dGOwBNW1NlMD1ZGWIorO GCWnBfBEui3bjFWGcHQn/1tXnfx94zqTujuW6XTfZOzl3ReNPUe9z+kawYwz0dKcVHpQwy 0Eq868dUKsp+JxftJ0LG4RNc0mgkDUg= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-661-WeYapp8YNLeeFBVwym_fhQ-1; Thu, 28 Mar 2024 13:00:06 -0400 X-MC-Unique: WeYapp8YNLeeFBVwym_fhQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 68888101A56C; Thu, 28 Mar 2024 17:00:05 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8565E1121306; Thu, 28 Mar 2024 17:00:03 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 09/15] cifs: Make add_credits_and_wake_if() clear deducted credits Date: Thu, 28 Mar 2024 16:58:00 +0000 Message-ID: <20240328165845.2782259-10-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 Content-Type: text/plain; charset="utf-8" Make add_credits_and_wake_if() clear the amount of credits in the cifs_credits struct after it has returned them to the overall counter. This allows add_credits_and_wake_if() to be called multiple times during the error handling and cleanup without accidentally returning the credits again and again. Note that the wake_up() in add_credits_and_wake_if() may also be superfluous as ->add_credits() also does a wake on the request_q. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org --- fs/smb/client/cifsglob.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 057a7933b175..704f526a9e81 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -881,11 +881,12 @@ add_credits(struct TCP_Server_Info *server, const str= uct cifs_credits *credits, =20 static inline void add_credits_and_wake_if(struct TCP_Server_Info *server, - const struct cifs_credits *credits, const int optype) + struct cifs_credits *credits, const int optype) { if (credits->value) { server->ops->add_credits(server, credits, optype); wake_up(&server->request_q); + credits->value =3D 0; } } From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 70F0453387 for ; Thu, 28 Mar 2024 17:00:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645217; cv=none; b=jkAML1+cvyUujspQBrQGcU8kXVyuOyGJOc/IIkoIffWfIlLMIujVNfEx1llesqOgAcqnXchMJu/abSmSr/w1vH+iRwkut0bzHPMJvMypx8XgWmwCA7nvpkSnIhRobevKUBOqgLNk3oQ/BAyOa8T0GJLE8LHlYqtTkWB/rVUpBzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645217; c=relaxed/simple; bh=Q4NYs8avKCbELFNJ69BnmvUy9TV7IxgEZ3hwwqqqCK4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r3dZwo4UNqCZObQnqUzqWA7YBjBP8Gm5gq5tCttkS9LT1dwVOWiQxIOx3ifGzF+3dA4VzHQs43a070PO7ftebgp7c6eH6bOubepV+OqSE4m9IUvWBmr5V13IfNcnzpMYJ7q6IHF3nDbFQJQhpiHJMIY09ppyO5ll2zzxHwIEMP0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ZRH0iR5j; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ZRH0iR5j" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645214; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/iu1wjgW6NUFrJdHYjWcVNG2nPTvvseGUk2/qQlW9y8=; b=ZRH0iR5jyRCiMUkzwArR2Yr/YXhYLtRxE4f3n+K4QnzQRwsKYg4EPATV5cYCclVYdDrhND C2VGA7lplT89fRioqbvCgu6FAphWMQ8SR6RYZieOCpFvsUmmBzaODZzfMVY0qRZJ4rkBBk fRGcTU/aMsb/sAg0Uz8dyld2JdcXDGc= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-617-Ra3Ku4JVPhKL6AKlnrMLvw-1; Thu, 28 Mar 2024 13:00:12 -0400 X-MC-Unique: Ra3Ku4JVPhKL6AKlnrMLvw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D4ECC8007A7; Thu, 28 Mar 2024 17:00:11 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id D7AE32166B31; Thu, 28 Mar 2024 17:00:09 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 10/15] cifs: Implement netfslib hooks Date: Thu, 28 Mar 2024 16:58:01 +0000 Message-ID: <20240328165845.2782259-11-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 Content-Type: text/plain; charset="utf-8" Provide implementation of the netfslib hooks that will be used by netfslib to ask cifs to set up and perform operations. Of particular note are (*) cifs_clamp_length() - This is used to negotiate the size of the next subrequest in a read request, taking into account the credit available and the rsize. The credits are attached to the subrequest. (*) cifs_req_issue_read() - This is used to issue a subrequest that has been set up and clamped. (*) cifs_prepare_write() - This prepares to fill a subrequest by picking a channel, reopening the file and requesting credits so that we can set the maximum size of the subrequest and also sets the maximum number of segments if we're doing RDMA. (*) cifs_issue_write() - This releases any unneeded credits and issues an asynchronous data write for the contiguous slice of file covered by the subrequest. This should possibly be folded in to all ->async_writev() ops and that called directly. (*) cifs_begin_writeback() - This gets the cached writable handle through which we do writeback (this does not affect writethrough, unbuffered or direct writes). At this point, cifs is not wired up to actually *use* netfslib; that will be done in a subsequent patch. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/buffered_write.c | 6 + fs/smb/client/Kconfig | 1 + fs/smb/client/cifsfs.c | 2 +- fs/smb/client/cifsfs.h | 1 + fs/smb/client/cifsglob.h | 28 +++- fs/smb/client/file.c | 315 +++++++++++++++++++++++++++++++++++ include/linux/netfs.h | 1 + include/trace/events/netfs.h | 1 + 8 files changed, 345 insertions(+), 10 deletions(-) diff --git a/fs/netfs/buffered_write.c b/fs/netfs/buffered_write.c index 1eff9413eb1b..a3ef053d9789 100644 --- a/fs/netfs/buffered_write.c +++ b/fs/netfs/buffered_write.c @@ -407,6 +407,9 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct = iov_iter *iter, } while (iov_iter_count(iter)); =20 out: + if (likely(written) && ctx->ops->post_modify) + ctx->ops->post_modify(inode); + if (unlikely(wreq)) { ret2 =3D netfs_end_writethrough(wreq, &wbc, writethrough); wbc_detach_inode(&wbc); @@ -523,6 +526,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, str= uct netfs_group *netfs_gr struct folio *folio =3D page_folio(vmf->page); struct file *file =3D vmf->vma->vm_file; struct inode *inode =3D file_inode(file); + struct netfs_inode *ictx =3D netfs_inode(inode); vm_fault_t ret =3D VM_FAULT_RETRY; int err; =20 @@ -569,6 +573,8 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, str= uct netfs_group *netfs_gr trace_netfs_folio(folio, netfs_folio_trace_mkwrite); netfs_set_group(folio, netfs_group); file_update_time(file); + if (ictx->ops->post_modify) + ictx->ops->post_modify(inode); ret =3D VM_FAULT_LOCKED; out: sb_end_pagefault(inode->i_sb); diff --git a/fs/smb/client/Kconfig b/fs/smb/client/Kconfig index 2927bd174a88..2517dc242386 100644 --- a/fs/smb/client/Kconfig +++ b/fs/smb/client/Kconfig @@ -2,6 +2,7 @@ config CIFS tristate "SMB3 and CIFS support (advanced network filesystem)" depends on INET + select NETFS_SUPPORT select NLS select NLS_UCS2_UTILS select CRYPTO diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index d8c31383752a..90801a0077da 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1754,7 +1754,7 @@ static int cifs_init_netfs(void) { cifs_io_request_cachep =3D kmem_cache_create("cifs_io_request", - sizeof(struct netfs_io_request), 0, + sizeof(struct cifs_io_request), 0, SLAB_HWCACHE_ALIGN, NULL); if (!cifs_io_request_cachep) goto nomem_req; diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 1acf6bfc06de..922c10d7cfdd 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -84,6 +84,7 @@ extern const struct inode_operations cifs_namespace_inode= _operations; =20 =20 /* Functions related to files and directories */ +extern const struct netfs_request_ops cifs_req_ops; extern const struct file_operations cifs_file_ops; extern const struct file_operations cifs_file_direct_ops; /* if directio m= nt */ extern const struct file_operations cifs_file_strict_ops; /* if strictio m= nt */ diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 704f526a9e81..18a3babbe577 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1486,15 +1486,24 @@ struct cifs_aio_ctx { bool direct_io; }; =20 +struct cifs_io_request { + struct netfs_io_request rreq; + struct cifsFileInfo *cfile; +}; + /* asynchronous read support */ struct cifs_io_subrequest { - struct netfs_io_subrequest subreq; - struct cifsFileInfo *cfile; - struct address_space *mapping; - struct cifs_aio_ctx *ctx; + union { + struct netfs_io_subrequest subreq; + struct netfs_io_request *rreq; + struct cifs_io_request *req; + }; ssize_t got_bytes; pid_t pid; + unsigned int xid; int result; + bool have_xid; + bool replay; struct kvec iov[2]; struct TCP_Server_Info *server; #ifdef CONFIG_CIFS_SMB_DIRECT @@ -1502,15 +1511,16 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; =20 - enum writeback_sync_modes sync_mode; - bool uncached; - bool replay; - struct bio_vec *bv; - // TODO: Remove following elements struct list_head list; struct completion done; struct work_struct work; + struct cifsFileInfo *cfile; + struct address_space *mapping; + struct cifs_aio_ctx *ctx; + enum writeback_sync_modes sync_mode; + bool uncached; + struct bio_vec *bv; }; =20 /* diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index e40ba6de0a28..73573dadf90e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -36,6 +36,321 @@ #include "fs_context.h" #include "cifs_ioctl.h" #include "cached_dir.h" +#include + +static int cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush); + +/* + * Prepare a subrequest to upload to the server. We need to allocate cred= its + * so that we know the maximum amount of data that we can include in it. + */ +static void cifs_prepare_write(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *wdata =3D + container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_io_request *req =3D wdata->req; + struct TCP_Server_Info *server; + struct cifsFileInfo *open_file =3D req->cfile; + size_t wsize =3D req->rreq.wsize; + int rc; + + if (!wdata->have_xid) { + wdata->xid =3D get_xid(); + wdata->have_xid =3D true; + } + + server =3D cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); + wdata->server =3D server; + +retry: + if (open_file->invalidHandle) { + rc =3D cifs_reopen_file(open_file, false); + if (rc < 0) { + if (rc =3D=3D -EAGAIN) + goto retry; + subreq->error =3D rc; + return netfs_prepare_write_failed(subreq); + } + } + + rc =3D server->ops->wait_mtu_credits(server, wsize, &wdata->subreq.max_le= n, + &wdata->credits); + if (rc < 0) { + subreq->error =3D rc; + return netfs_prepare_write_failed(subreq); + } + +#ifdef CONFIG_CIFS_SMB_DIRECT + if (server->smbd_conn) + subreq->max_nr_segs =3D server->smbd_conn->max_frmr_depth; +#endif +} + +/* + * Issue a subrequest to upload to the server. + */ +static void cifs_issue_write(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *wdata =3D + container_of(subreq, struct cifs_io_subrequest, subreq); + struct cifs_sb_info *sbi =3D CIFS_SB(subreq->rreq->inode->i_sb); + int rc; + + if (cifs_forced_shutdown(sbi)) { + rc =3D -EIO; + goto fail; + } + + rc =3D adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); + if (rc) + goto fail; + + rc =3D -EAGAIN; + if (wdata->req->cfile->invalidHandle) + goto fail; + + wdata->server->ops->async_writev(wdata); +out: + return; + +fail: + if (rc =3D=3D -EAGAIN) + trace_netfs_sreq(subreq, netfs_sreq_trace_retry); + else + trace_netfs_sreq(subreq, netfs_sreq_trace_fail); + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + netfs_write_subrequest_terminated(wdata, rc, false); + goto out; +} + +/* + * Split the read up according to how many credits we can get for each pie= ce. + * It's okay to sleep here if we need to wait for more credit to become + * available. + * + * We also choose the server and allocate an operation ID to be cleaned up + * later. + */ +static bool cifs_clamp_length(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *rreq =3D subreq->rreq; + struct TCP_Server_Info *server; + struct cifs_io_subrequest *rdata =3D container_of(subreq, struct cifs_io_= subrequest, subreq); + struct cifs_io_request *req =3D container_of(subreq->rreq, struct cifs_io= _request, rreq); + struct cifs_sb_info *cifs_sb =3D CIFS_SB(rreq->inode->i_sb); + size_t rsize =3D 0; + int rc; + + rdata->xid =3D get_xid(); + rdata->have_xid =3D true; + + server =3D cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses); + rdata->server =3D server; + + if (cifs_sb->ctx->rsize =3D=3D 0) + cifs_sb->ctx->rsize =3D + server->ops->negotiate_rsize(tlink_tcon(req->cfile->tlink), + cifs_sb->ctx); + + + rc =3D server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, &rsize, + &rdata->credits); + if (rc) { + subreq->error =3D rc; + return false; + } + + subreq->len =3D min_t(size_t, subreq->len, rsize); +#ifdef CONFIG_CIFS_SMB_DIRECT + if (server->smbd_conn) + subreq->max_nr_segs =3D server->smbd_conn->max_frmr_depth; +#endif + return true; +} + +/* + * Issue a read operation on behalf of the netfs helper functions. We're = asked + * to make a read of a certain size at a point in the file. We are permit= ted + * to only read a portion of that, but as long as we read something, the n= etfs + * helper will call us again so that we can issue another read. + */ +static void cifs_req_issue_read(struct netfs_io_subrequest *subreq) +{ + struct netfs_io_request *rreq =3D subreq->rreq; + struct cifs_io_subrequest *rdata =3D container_of(subreq, struct cifs_io_= subrequest, subreq); + struct cifs_io_request *req =3D container_of(subreq->rreq, struct cifs_io= _request, rreq); + struct cifs_sb_info *cifs_sb =3D CIFS_SB(rreq->inode->i_sb); + pid_t pid; + int rc =3D 0; + + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) + pid =3D req->cfile->pid; + else + pid =3D current->tgid; // Ummm... This may be a workqueue + + cifs_dbg(FYI, "%s: op=3D%08x[%x] mapping=3D%p len=3D%zu/%zu\n", + __func__, rreq->debug_id, subreq->debug_index, rreq->mapping, + subreq->transferred, subreq->len); + + if (req->cfile->invalidHandle) { + do { + rc =3D cifs_reopen_file(req->cfile, true); + } while (rc =3D=3D -EAGAIN); + if (rc) + goto out; + } + + __set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags); + rdata->pid =3D pid; + + rc =3D adjust_credits(rdata->server, &rdata->credits, rdata->subreq.len); + if (!rc) { + if (rdata->req->cfile->invalidHandle) + rc =3D -EAGAIN; + else + rc =3D rdata->server->ops->async_readv(rdata); + } + +out: + if (rc) + netfs_subreq_terminated(subreq, rc, false); +} + +/* + * Writeback calls this when it finds a folio that needs uploading. This = isn't + * called if writeback only has copy-to-cache to deal with. + */ +static void cifs_begin_writeback(struct netfs_io_request *wreq) +{ + struct cifs_io_request *req =3D container_of(wreq, struct cifs_io_request= , rreq); + int ret; + + ret =3D cifs_get_writable_file(CIFS_I(wreq->inode), FIND_WR_ANY, &req->cf= ile); + if (ret) { + cifs_dbg(VFS, "No writable handle in writepages ret=3D%d\n", ret); + return; + } + + wreq->io_streams[0].avail =3D true; +} + +/* + * Initialise a request. + */ +static int cifs_init_request(struct netfs_io_request *rreq, struct file *f= ile) +{ + struct cifs_io_request *req =3D container_of(rreq, struct cifs_io_request= , rreq); + struct cifs_sb_info *cifs_sb =3D CIFS_SB(rreq->inode->i_sb); + struct cifsFileInfo *open_file =3D NULL; + + rreq->rsize =3D cifs_sb->ctx->rsize; + rreq->wsize =3D cifs_sb->ctx->wsize; + + if (file) { + open_file =3D file->private_data; + rreq->netfs_priv =3D file->private_data; + req->cfile =3D cifsFileInfo_get(open_file); + } else if (rreq->origin !=3D NETFS_WRITEBACK) { + WARN_ON_ONCE(1); + return -EIO; + } + + return 0; +} + +/* + * Expand the size of a readahead to the size of the rsize, if at least as + * large as a page, allowing for the possibility that rsize is not pow-2 + * aligned. + */ +static void cifs_expand_readahead(struct netfs_io_request *rreq) +{ + unsigned int rsize =3D rreq->rsize; + loff_t misalignment, i_size =3D i_size_read(rreq->inode); + + if (rsize < PAGE_SIZE) + return; + + if (rsize < INT_MAX) + rsize =3D roundup_pow_of_two(rsize); + else + rsize =3D ((unsigned int)INT_MAX + 1) / 2; + + misalignment =3D rreq->start & (rsize - 1); + if (misalignment) { + rreq->start -=3D misalignment; + rreq->len +=3D misalignment; + } + + rreq->len =3D round_up(rreq->len, rsize); + if (rreq->start < i_size && rreq->len > i_size - rreq->start) + rreq->len =3D i_size - rreq->start; +} + +/* + * Completion of a request operation. + */ +static void cifs_rreq_done(struct netfs_io_request *rreq) +{ + struct timespec64 atime, mtime; + struct inode *inode =3D rreq->inode; + + /* we do not want atime to be less than mtime, it broke some apps */ + atime =3D inode_set_atime_to_ts(inode, current_time(inode)); + mtime =3D inode_get_mtime(inode); + if (timespec64_compare(&atime, &mtime)) + inode_set_atime_to_ts(inode, inode_get_mtime(inode)); +} + +static void cifs_post_modify(struct inode *inode) +{ + /* Indication to update ctime and mtime as close is deferred */ + set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); +} + +static void cifs_free_request(struct netfs_io_request *rreq) +{ + struct cifs_io_request *req =3D container_of(rreq, struct cifs_io_request= , rreq); + + if (req->cfile) + cifsFileInfo_put(req->cfile); +} + +static void cifs_free_subrequest(struct netfs_io_subrequest *subreq) +{ + struct cifs_io_subrequest *rdata =3D + container_of(subreq, struct cifs_io_subrequest, subreq); + int rc =3D subreq->error; + + if (rdata->subreq.source =3D=3D NETFS_DOWNLOAD_FROM_SERVER) { +#ifdef CONFIG_CIFS_SMB_DIRECT + if (rdata->mr) { + smbd_deregister_mr(rdata->mr); + rdata->mr =3D NULL; + } +#endif + } + + add_credits_and_wake_if(rdata->server, &rdata->credits, 0); + if (rdata->have_xid) + free_xid(rdata->xid); +} + +const struct netfs_request_ops cifs_req_ops =3D { + .request_pool =3D &cifs_io_request_pool, + .subrequest_pool =3D &cifs_io_subrequest_pool, + .init_request =3D cifs_init_request, + .free_request =3D cifs_free_request, + .free_subrequest =3D cifs_free_subrequest, + .expand_readahead =3D cifs_expand_readahead, + .clamp_length =3D cifs_clamp_length, + .issue_read =3D cifs_req_issue_read, + .done =3D cifs_rreq_done, + .post_modify =3D cifs_post_modify, + .begin_writeback =3D cifs_begin_writeback, + .prepare_write =3D cifs_prepare_write, + .issue_write =3D cifs_issue_write, +}; =20 /* * Remove the dirty flags from a span of pages. diff --git a/include/linux/netfs.h b/include/linux/netfs.h index 298552f5122c..f45d06284f2f 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -302,6 +302,7 @@ struct netfs_request_ops { =20 /* Modification handling */ void (*update_i_size)(struct inode *inode, loff_t i_size); + void (*post_modify)(struct inode *inode); =20 /* Write request handling */ void (*begin_writeback)(struct netfs_io_request *wreq); diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h index 4ba553a6d71b..da23484268df 100644 --- a/include/trace/events/netfs.h +++ b/include/trace/events/netfs.h @@ -112,6 +112,7 @@ #define netfs_sreq_ref_traces \ EM(netfs_sreq_trace_get_copy_to_cache, "GET COPY2C ") \ EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \ + EM(netfs_sreq_trace_get_submit, "GET SUBMIT") \ EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \ EM(netfs_sreq_trace_new, "NEW ") \ EM(netfs_sreq_trace_put_cancel, "PUT CANCEL ") \ From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 8CA24535CC for ; Thu, 28 Mar 2024 17:00:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645244; cv=none; b=ZnYS536snnLgW7aT03+T9sXX9VnTQwkU6dqRjfTZyWVjZ56FM1aVao60nB2g2iAZpIsPvYT/zOWkSQMAobaEs8bfBVkb95PMSycyJj1A4FP5SXuk5Ezj8pXbOTclpoik53WWDB1IinmqtCLKpG82++6ahGFKBaazufd1Cgb0CJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645244; c=relaxed/simple; bh=g4yynKT3J8Yz+2sacntBdvwuRHXdJWY2oSFL0jWSOKY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=el93Mhq/qp++9orj/t7AT4t3FhymcsI536KLHAZnh385FbtaIUKHBW70O1TGqc62j0arOVoLSXiXpySkQiNlKQJnplMwAREWf2ja89YB0xEjWZH3W7uNFssLpeNcqst8wazASMb05HNopKLjdNFNr+MBxL+ATDLzRb47LcsfXtQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=VF0+UorN; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="VF0+UorN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645239; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OTSLBmDT3ajEjbQN8Mhbrt3qwYOXMWxKvZgVJwWAFPE=; b=VF0+UorNrJfNd9TcmcGSzGA8b11Wb+NjXGaVDXd6tNrNkaYEQsFK86KnVeqpt/FrQSyrRB jzbAIAlmA+pLrptDZHbGgOYbfqk8LGpH0+AVz1ka2BR5wC2cUtf/Lt8ahOCFNfxTgEqcI3 kzfejoec3+OSNoQjvzfmRPqu/YIFXKM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-393-8zEC4T1bPh2F6CVGOhvMiQ-1; Thu, 28 Mar 2024 13:00:36 -0400 X-MC-Unique: 8zEC4T1bPh2F6CVGOhvMiQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E275E18F34A0; Thu, 28 Mar 2024 17:00:34 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id A927040C6CB1; Thu, 28 Mar 2024 17:00:32 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 11/15] cifs: When caching, try to open O_WRONLY file rdwr on server Date: Thu, 28 Mar 2024 16:58:02 +0000 Message-ID: <20240328165845.2782259-12-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.2 Content-Type: text/plain; charset="utf-8" When we're engaged in local caching of a cifs filesystem, we cannot perform caching of a partially written cache granule unless we can read the rest of the granule. To deal with this, if a file is opened O_WRONLY locally, but the mount was given the "-o fsc" flag, try first opening the remote file with GENERIC_READ|GENERIC_WRITE and if that returns -EACCES, try dropping the GENERIC_READ and doing the open again. If that last succeeds, invalidate the cache for that file as for O_DIRECT. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/dir.c | 15 ++++++++++++ fs/smb/client/file.c | 51 +++++++++++++++++++++++++++++++++-------- fs/smb/client/fscache.h | 6 +++++ 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c index 89333d9bce36..37897b919dd5 100644 --- a/fs/smb/client/dir.c +++ b/fs/smb/client/dir.c @@ -189,6 +189,7 @@ static int cifs_do_create(struct inode *inode, struct d= entry *direntry, unsigned int disposition; struct TCP_Server_Info *server =3D tcon->ses->server; struct cifs_open_parms oparms; + int rdwr_for_fscache =3D 0; =20 *oplock =3D 0; if (tcon->ses->server->oplocks) @@ -200,6 +201,10 @@ static int cifs_do_create(struct inode *inode, struct = dentry *direntry, unsigned return PTR_ERR(full_path); } =20 + /* If we're caching, we need to be able to fill in around partial writes.= */ + if (cifs_fscache_enabled(inode) && (oflags & O_ACCMODE) =3D=3D O_WRONLY) + rdwr_for_fscache =3D 1; + #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY if (tcon->unix_ext && cap_unix(tcon->ses) && !tcon->broken_posix_open && (CIFS_UNIX_POSIX_PATH_OPS_CAP & @@ -276,6 +281,8 @@ static int cifs_do_create(struct inode *inode, struct d= entry *direntry, unsigned desired_access |=3D GENERIC_READ; /* is this too little? */ if (OPEN_FMODE(oflags) & FMODE_WRITE) desired_access |=3D GENERIC_WRITE; + if (rdwr_for_fscache =3D=3D 1) + desired_access |=3D GENERIC_READ; =20 disposition =3D FILE_OVERWRITE_IF; if ((oflags & (O_CREAT | O_EXCL)) =3D=3D (O_CREAT | O_EXCL)) @@ -304,6 +311,7 @@ static int cifs_do_create(struct inode *inode, struct d= entry *direntry, unsigned if (!tcon->unix_ext && (mode & S_IWUGO) =3D=3D 0) create_options |=3D CREATE_OPTION_READONLY; =20 +retry_open: oparms =3D (struct cifs_open_parms) { .tcon =3D tcon, .cifs_sb =3D cifs_sb, @@ -317,8 +325,15 @@ static int cifs_do_create(struct inode *inode, struct = dentry *direntry, unsigned rc =3D server->ops->open(xid, &oparms, oplock, buf); if (rc) { cifs_dbg(FYI, "cifs_create returned 0x%x\n", rc); + if (rc =3D=3D -EACCES && rdwr_for_fscache =3D=3D 1) { + desired_access &=3D ~GENERIC_READ; + rdwr_for_fscache =3D 2; + goto retry_open; + } goto out; } + if (rdwr_for_fscache =3D=3D 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); =20 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY /* diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 73573dadf90e..761a80963f76 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -521,12 +521,12 @@ cifs_mark_open_files_invalid(struct cifs_tcon *tcon) */ } =20 -static inline int cifs_convert_flags(unsigned int flags) +static inline int cifs_convert_flags(unsigned int flags, int rdwr_for_fsca= che) { if ((flags & O_ACCMODE) =3D=3D O_RDONLY) return GENERIC_READ; else if ((flags & O_ACCMODE) =3D=3D O_WRONLY) - return GENERIC_WRITE; + return rdwr_for_fscache =3D=3D 1 ? (GENERIC_READ | GENERIC_WRITE) : GENE= RIC_WRITE; else if ((flags & O_ACCMODE) =3D=3D O_RDWR) { /* GENERIC_ALL is too much permission to request can cause unnecessary access denied on create */ @@ -663,11 +663,16 @@ static int cifs_nt_open(const char *full_path, struct= inode *inode, struct cifs_ int create_options =3D CREATE_NOT_DIR; struct TCP_Server_Info *server =3D tcon->ses->server; struct cifs_open_parms oparms; + int rdwr_for_fscache =3D 0; =20 if (!server->ops->open) return -ENOSYS; =20 - desired_access =3D cifs_convert_flags(f_flags); + /* If we're caching, we need to be able to fill in around partial writes.= */ + if (cifs_fscache_enabled(inode) && (f_flags & O_ACCMODE) =3D=3D O_WRONLY) + rdwr_for_fscache =3D 1; + + desired_access =3D cifs_convert_flags(f_flags, rdwr_for_fscache); =20 /********************************************************************* * open flag mapping table: @@ -704,6 +709,7 @@ static int cifs_nt_open(const char *full_path, struct i= node *inode, struct cifs_ if (f_flags & O_DIRECT) create_options |=3D CREATE_NO_BUFFER; =20 +retry_open: oparms =3D (struct cifs_open_parms) { .tcon =3D tcon, .cifs_sb =3D cifs_sb, @@ -715,8 +721,16 @@ static int cifs_nt_open(const char *full_path, struct = inode *inode, struct cifs_ }; =20 rc =3D server->ops->open(xid, &oparms, oplock, buf); - if (rc) + if (rc) { + if (rc =3D=3D -EACCES && rdwr_for_fscache =3D=3D 1) { + desired_access =3D cifs_convert_flags(f_flags, 0); + rdwr_for_fscache =3D 2; + goto retry_open; + } return rc; + } + if (rdwr_for_fscache =3D=3D 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); =20 /* TODO: Add support for calling posix query info but with passing in fid= */ if (tcon->unix_ext) @@ -1149,11 +1163,14 @@ int cifs_open(struct inode *inode, struct file *fil= e) use_cache: fscache_use_cookie(cifs_inode_cookie(file_inode(file)), file->f_mode & FMODE_WRITE); - if (file->f_flags & O_DIRECT && - (!((file->f_flags & O_ACCMODE) !=3D O_RDONLY) || - file->f_flags & O_APPEND)) - cifs_invalidate_cache(file_inode(file), - FSCACHE_INVAL_DIO_WRITE); + //if ((file->f_flags & O_ACCMODE) =3D=3D O_WRONLY) + // goto inval; + if (!(file->f_flags & O_DIRECT)) + goto out; + if ((file->f_flags & (O_ACCMODE | O_APPEND)) =3D=3D O_RDONLY) + goto out; +//inval: + cifs_invalidate_cache(file_inode(file), FSCACHE_INVAL_DIO_WRITE); =20 out: free_dentry_path(page); @@ -1218,6 +1235,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can= _flush) int disposition =3D FILE_OPEN; int create_options =3D CREATE_NOT_DIR; struct cifs_open_parms oparms; + int rdwr_for_fscache =3D 0; =20 xid =3D get_xid(); mutex_lock(&cfile->fh_mutex); @@ -1281,7 +1299,11 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool ca= n_flush) } #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ =20 - desired_access =3D cifs_convert_flags(cfile->f_flags); + /* If we're caching, we need to be able to fill in around partial writes.= */ + if (cifs_fscache_enabled(inode) && (cfile->f_flags & O_ACCMODE) =3D=3D O_= WRONLY) + rdwr_for_fscache =3D 1; + + desired_access =3D cifs_convert_flags(cfile->f_flags, rdwr_for_fscache); =20 /* O_SYNC also has bit for O_DSYNC so following check picks up either */ if (cfile->f_flags & O_SYNC) @@ -1293,6 +1315,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can= _flush) if (server->ops->get_lease_key) server->ops->get_lease_key(inode, &cfile->fid); =20 +retry_open: oparms =3D (struct cifs_open_parms) { .tcon =3D tcon, .cifs_sb =3D cifs_sb, @@ -1318,6 +1341,11 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool ca= n_flush) /* indicate that we need to relock the file */ oparms.reconnect =3D true; } + if (rc =3D=3D -EACCES && rdwr_for_fscache =3D=3D 1) { + desired_access =3D cifs_convert_flags(cfile->f_flags, 0); + rdwr_for_fscache =3D 2; + goto retry_open; + } =20 if (rc) { mutex_unlock(&cfile->fh_mutex); @@ -1326,6 +1354,9 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can= _flush) goto reopen_error_exit; } =20 + if (rdwr_for_fscache =3D=3D 2) + cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); + #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY reopen_success: #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index a3d73720914f..1f2ea9f5cc9a 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -109,6 +109,11 @@ static inline void cifs_readahead_to_fscache(struct in= ode *inode, __cifs_readahead_to_fscache(inode, pos, len); } =20 +static inline bool cifs_fscache_enabled(struct inode *inode) +{ + return fscache_cookie_enabled(cifs_inode_cookie(inode)); +} + #else /* CONFIG_CIFS_FSCACHE */ static inline void cifs_fscache_fill_coherency(struct inode *inode, @@ -124,6 +129,7 @@ static inline void cifs_fscache_release_inode_cookie(st= ruct inode *inode) {} static inline void cifs_fscache_unuse_inode_cookie(struct inode *inode, bo= ol update) {} static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode= ) { return NULL; } static inline void cifs_invalidate_cache(struct inode *inode, unsigned int= flags) {} +static inline bool cifs_fscache_enabled(struct inode *inode) { return fals= e; } =20 static inline int cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages, From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 EED2055E40 for ; Thu, 28 Mar 2024 17:00:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645253; cv=none; b=DywTFl4WyJh4WthyCmdxKDagQfbEGVWcISaaM6S2wYtHqc8L/Ui/csKRmroIgQ2Yt1j4trdOVy+u8KhdnJ+3cijh8UvYBLRjE3mhIHKZz5kB6y7D4viL1uYlf2+goHC93eH3XMQMzudbxQKjot6CYjYIP0Vv7KcCXHi7WCyv3c8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645253; c=relaxed/simple; bh=HawRWr07beLPCGHMjpsje4tHKhaL07gQelcLBrSsJCs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iQVW/MVUnbaozlfLJVS20XxsysZUEaJhQTsrnzxhrhrPo9fydK++OOshrKY6+DHttslZqDj2Ip2/CwXu4hf7rrjnxgtXHequ01xdpYhV68Xas5PdD+yb0sEedZRmczae+NZv4yySf3UX1b8t9IzU6YDxidQc+vL9pIq1mL3XwkM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=a8ySVy56; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="a8ySVy56" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645250; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xaPIr0T1gUAwsxNvXSdIHPNLn0LcZiBo/qheQN1QvHE=; b=a8ySVy56H0PfHTIPRNSw0mspQCWUC64vwESF6MY8yogeahXhruqAtY5SsvfNyPe2icXePz by0piv/hovWfdVEDOt7lVGBXg9yADUeJ3ncosFIM4NOtWT4UgAy8AeUjqsVnbAqW+rLQr7 ZLfnGyzzsZEIowqOk/f6ESXC9MObG8o= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-515-Mwsnz5F1Mk68N4rXo9sxSQ-1; Thu, 28 Mar 2024 13:00:44 -0400 X-MC-Unique: Mwsnz5F1Mk68N4rXo9sxSQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id D294B101A523; Thu, 28 Mar 2024 17:00:41 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id A6D7F1C060D0; Thu, 28 Mar 2024 17:00:39 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 12/15] cifs: Cut over to using netfslib Date: Thu, 28 Mar 2024 16:58:03 +0000 Message-ID: <20240328165845.2782259-13-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.7 Content-Type: text/plain; charset="utf-8" Make the cifs filesystem use netfslib to handle reading and writing on behalf of cifs. The changes include: (1) Various read_iter/write_iter type functions are turned into wrappers around netfslib API functions or are pointed directly at those functions: cifs_file_direct{,_nobrl}_ops switch to use netfs_unbuffered_read_iter and netfs_unbuffered_write_iter. Large pieces of code that will be removed are #if'd out and will be removed in subsequent patches. [?] Why does cifs mark the page dirty in the destination buffer of a DIO read? Should that happen automatically? Does netfs need to do that? Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/netfs/io.c | 7 +- fs/smb/client/cifsfs.c | 8 +- fs/smb/client/cifsfs.h | 7 -- fs/smb/client/cifsglob.h | 5 +- fs/smb/client/cifsproto.h | 8 +- fs/smb/client/cifssmb.c | 54 +++++++------ fs/smb/client/file.c | 161 ++++++++++++++++++++------------------ fs/smb/client/fscache.c | 2 + fs/smb/client/fscache.h | 4 + fs/smb/client/inode.c | 19 ++++- fs/smb/client/smb2pdu.c | 117 ++++++++++++++++----------- fs/smb/client/smb2proto.h | 2 +- fs/smb/client/trace.h | 144 +++++++++++++++++++++++++++++----- fs/smb/client/transport.c | 3 + 14 files changed, 361 insertions(+), 180 deletions(-) diff --git a/fs/netfs/io.c b/fs/netfs/io.c index 6cfecfcd02e1..c93851b98368 100644 --- a/fs/netfs/io.c +++ b/fs/netfs/io.c @@ -213,8 +213,13 @@ static void netfs_rreq_assess_dio(struct netfs_io_requ= est *rreq) unsigned int i; size_t transferred =3D 0; =20 - for (i =3D 0; i < rreq->direct_bv_count; i++) + for (i =3D 0; i < rreq->direct_bv_count; i++) { flush_dcache_page(rreq->direct_bv[i].bv_page); + // TODO: cifs marks pages in the destination buffer + // dirty under some circumstances after a read. Do we + // need to do that too? + set_page_dirty(rreq->direct_bv[i].bv_page); + } =20 list_for_each_entry(subreq, &rreq->subrequests, rreq_link) { if (subreq->error || subreq->transferred =3D=3D 0) diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 90801a0077da..5ce2f54cb086 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1518,8 +1518,8 @@ const struct file_operations cifs_file_strict_ops =3D= { }; =20 const struct file_operations cifs_file_direct_ops =3D { - .read_iter =3D cifs_direct_readv, - .write_iter =3D cifs_direct_writev, + .read_iter =3D netfs_unbuffered_read_iter, + .write_iter =3D netfs_file_write_iter, .open =3D cifs_open, .release =3D cifs_close, .lock =3D cifs_lock, @@ -1574,8 +1574,8 @@ const struct file_operations cifs_file_strict_nobrl_o= ps =3D { }; =20 const struct file_operations cifs_file_direct_nobrl_ops =3D { - .read_iter =3D cifs_direct_readv, - .write_iter =3D cifs_direct_writev, + .read_iter =3D netfs_unbuffered_read_iter, + .write_iter =3D netfs_file_write_iter, .open =3D cifs_open, .release =3D cifs_close, .fsync =3D cifs_fsync, diff --git a/fs/smb/client/cifsfs.h b/fs/smb/client/cifsfs.h index 922c10d7cfdd..87310f05d397 100644 --- a/fs/smb/client/cifsfs.h +++ b/fs/smb/client/cifsfs.h @@ -94,11 +94,7 @@ extern const struct file_operations cifs_file_strict_nob= rl_ops; extern int cifs_open(struct inode *inode, struct file *file); extern int cifs_close(struct inode *inode, struct file *file); extern int cifs_closedir(struct inode *inode, struct file *file); -extern ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to); -extern ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to); extern ssize_t cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to); -extern ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from); -extern ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *fro= m); extern ssize_t cifs_strict_writev(struct kiocb *iocb, struct iov_iter *fro= m); ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from); ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter); @@ -112,9 +108,6 @@ extern int cifs_file_strict_mmap(struct file *file, str= uct vm_area_struct *vma); extern const struct file_operations cifs_dir_ops; extern int cifs_dir_open(struct inode *inode, struct file *file); extern int cifs_readdir(struct file *file, struct dir_context *ctx); -extern void cifs_pages_written_back(struct inode *inode, loff_t start, uns= igned int len); -extern void cifs_pages_write_failed(struct inode *inode, loff_t start, uns= igned int len); -extern void cifs_pages_write_redirty(struct inode *inode, loff_t start, un= signed int len); =20 /* Functions related to dir entries */ extern const struct dentry_operations cifs_dentry_ops; diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 18a3babbe577..639cdeb3f77e 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -451,7 +451,7 @@ struct smb_version_operations { /* async read from the server */ int (*async_readv)(struct cifs_io_subrequest *); /* async write to the server */ - int (*async_writev)(struct cifs_io_subrequest *); + void (*async_writev)(struct cifs_io_subrequest *); /* sync read from the server */ int (*sync_read)(const unsigned int, struct cifs_fid *, struct cifs_io_parms *, unsigned int *, char **, @@ -1511,7 +1511,7 @@ struct cifs_io_subrequest { #endif struct cifs_credits credits; =20 - // TODO: Remove following elements +#if 0 // TODO: Remove following elements struct list_head list; struct completion done; struct work_struct work; @@ -1521,6 +1521,7 @@ struct cifs_io_subrequest { enum writeback_sync_modes sync_mode; bool uncached; struct bio_vec *bv; +#endif }; =20 /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index 95b5fa385196..e0ccf32d7ecd 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -148,6 +148,8 @@ extern bool is_size_safe_to_change(struct cifsInodeInfo= *cifsInode, __u64 eof, bool from_readdir); extern void cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, unsigned int bytes_written); +void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ss= ize_t result, + bool was_async); extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, int= ); extern int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags, @@ -598,6 +600,7 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *c= tx); =20 +#if 0 // TODO Remove void cifs_readdata_release(struct cifs_io_subrequest *rdata); static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) { @@ -608,11 +611,13 @@ static inline void cifs_put_readdata(struct cifs_io_s= ubrequest *rdata) if (refcount_dec_and_test(&rdata->subreq.ref)) cifs_readdata_release(rdata); } +#endif int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry = *mid); =20 -int cifs_async_writev(struct cifs_io_subrequest *wdata); +void cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); +#if 0 // TODO Remove struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); void cifs_writedata_release(struct cifs_io_subrequest *rdata); static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) @@ -624,6 +629,7 @@ static inline void cifs_put_writedata(struct cifs_io_su= brequest *wdata) if (refcount_dec_and_test(&wdata->subreq.ref)) cifs_writedata_release(wdata); } +#endif int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/cifssmb.c b/fs/smb/client/cifssmb.c index 72962985bac5..1b7f45ea3ec7 100644 --- a/fs/smb/client/cifssmb.c +++ b/fs/smb/client/cifssmb.c @@ -1265,7 +1265,7 @@ static void cifs_readv_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *rdata =3D mid->callback_data; - struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(rdata->req->cfile->tlink); struct TCP_Server_Info *server =3D tcon->ses->server; struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 2, @@ -1306,7 +1306,13 @@ cifs_readv_callback(struct mid_q_entry *mid) rdata->result =3D -EIO; } =20 - queue_work(cifsiod_wq, &rdata->work); + if (rdata->result =3D=3D 0 || rdata->result =3D=3D -EAGAIN) + iov_iter_advance(&rdata->subreq.io_iter, rdata->got_bytes); + rdata->credits.value =3D 0; + netfs_subreq_terminated(&rdata->subreq, + (rdata->result =3D=3D 0 || rdata->result =3D=3D -EAGAIN) ? + rdata->got_bytes : rdata->result, + false); release_mid(mid); add_credits(server, &credits, 0); } @@ -1318,7 +1324,7 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) int rc; READ_REQ *smb =3D NULL; int wct; - struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(rdata->req->cfile->tlink); struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 2 }; =20 @@ -1343,7 +1349,7 @@ cifs_async_readv(struct cifs_io_subrequest *rdata) smb->hdr.PidHigh =3D cpu_to_le16((__u16)(rdata->pid >> 16)); =20 smb->AndXCommand =3D 0xFF; /* none */ - smb->Fid =3D rdata->cfile->fid.netfid; + smb->Fid =3D rdata->req->cfile->fid.netfid; smb->OffsetLow =3D cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); if (wct =3D=3D 12) smb->OffsetHigh =3D cpu_to_le32(rdata->subreq.start >> 32); @@ -1613,15 +1619,16 @@ static void cifs_writev_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *wdata =3D mid->callback_data; - struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); - unsigned int written; + struct cifs_tcon *tcon =3D tlink_tcon(wdata->req->cfile->tlink); WRITE_RSP *smb =3D (WRITE_RSP *)mid->resp_buf; struct cifs_credits credits =3D { .value =3D 1, .instance =3D 0 }; + ssize_t result; + size_t written; =20 switch (mid->mid_state) { case MID_RESPONSE_RECEIVED: - wdata->result =3D cifs_check_receive(mid, tcon->ses->server, 0); - if (wdata->result !=3D 0) + result =3D cifs_check_receive(mid, tcon->ses->server, 0); + if (result !=3D 0) break; =20 written =3D le16_to_cpu(smb->CountHigh); @@ -1637,32 +1644,33 @@ cifs_writev_callback(struct mid_q_entry *mid) written &=3D 0xFFFF; =20 if (written < wdata->subreq.len) - wdata->result =3D -ENOSPC; + result =3D -ENOSPC; else - wdata->subreq.len =3D written; + result =3D written; break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: - wdata->result =3D -EAGAIN; + result =3D -EAGAIN; break; default: - wdata->result =3D -EIO; + result =3D -EIO; break; } =20 - queue_work(cifsiod_wq, &wdata->work); + wdata->credits.value =3D 0; + cifs_write_subrequest_terminated(wdata, result, true); release_mid(mid); add_credits(tcon->ses->server, &credits, 0); } =20 /* cifs_async_writev - send an async write, and set up mid to handle resul= t */ -int +void cifs_async_writev(struct cifs_io_subrequest *wdata) { int rc =3D -EACCES; WRITE_REQ *smb =3D NULL; int wct; - struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(wdata->req->cfile->tlink); struct kvec iov[2]; struct smb_rqst rqst =3D { }; =20 @@ -1672,7 +1680,8 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) wct =3D 12; if (wdata->subreq.start >> 32 > 0) { /* can not handle big offset for old srv */ - return -EIO; + rc =3D -EIO; + goto out; } } =20 @@ -1684,7 +1693,7 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) smb->hdr.PidHigh =3D cpu_to_le16((__u16)(wdata->pid >> 16)); =20 smb->AndXCommand =3D 0xFF; /* none */ - smb->Fid =3D wdata->cfile->fid.netfid; + smb->Fid =3D wdata->req->cfile->fid.netfid; smb->OffsetLow =3D cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); if (wct =3D=3D 14) smb->OffsetHigh =3D cpu_to_le32(wdata->subreq.start >> 32); @@ -1724,18 +1733,19 @@ cifs_async_writev(struct cifs_io_subrequest *wdata) iov[1].iov_len +=3D 4; /* pad bigger by four bytes */ } =20 - cifs_get_writedata(wdata); rc =3D cifs_call_async(tcon->ses->server, &rqst, NULL, cifs_writev_callback, NULL, wdata, 0, NULL); - + /* Can't touch wdata if rc =3D=3D 0 */ if (rc =3D=3D 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); - else - cifs_put_writedata(wdata); =20 async_writev_out: cifs_small_buf_release(smb); - return rc; +out: + if (rc) { + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + cifs_write_subrequest_terminated(wdata, rc, false); + } } =20 int diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 761a80963f76..c57a3638c51a 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -119,7 +119,7 @@ static void cifs_issue_write(struct netfs_io_subrequest= *subreq) else trace_netfs_sreq(subreq, netfs_sreq_trace_fail); add_credits_and_wake_if(wdata->server, &wdata->credits, 0); - netfs_write_subrequest_terminated(wdata, rc, false); + cifs_write_subrequest_terminated(wdata, rc, false); goto out; } =20 @@ -352,6 +352,7 @@ const struct netfs_request_ops cifs_req_ops =3D { .issue_write =3D cifs_issue_write, }; =20 +#if 0 // TODO remove 397 /* * Remove the dirty flags from a span of pages. */ @@ -476,6 +477,7 @@ void cifs_pages_write_redirty(struct inode *inode, loff= _t start, unsigned int le =20 rcu_read_unlock(); } +#endif // end netfslib remove 397 =20 /* * Mark as invalid, all open files on tree connections since they @@ -2474,20 +2476,23 @@ int cifs_lock(struct file *file, int cmd, struct fi= le_lock *flock) return rc; } =20 -/* - * update the file size (if needed) after a write. Should be called with - * the inode->i_lock held - */ -void -cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, - unsigned int bytes_written) +void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ss= ize_t result, + bool was_async) { - loff_t end_of_write =3D offset + bytes_written; + struct netfs_io_request *wreq =3D wdata->rreq; + loff_t new_server_eof; =20 - if (end_of_write > cifsi->netfs.remote_i_size) - netfs_resize_file(&cifsi->netfs, end_of_write, true); + if (result > 0) { + new_server_eof =3D wdata->subreq.start + wdata->subreq.transferred + res= ult; + + if (new_server_eof > netfs_inode(wreq->inode)->remote_i_size) + netfs_resize_file(netfs_inode(wreq->inode), new_server_eof, true); + } + + netfs_write_subrequest_terminated(&wdata->subreq, result, was_async); } =20 +#if 0 // TODO remove 2483 static ssize_t cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_da= ta, size_t write_size, loff_t *offset) @@ -2571,6 +2576,7 @@ cifs_write(struct cifsFileInfo *open_file, __u32 pid,= const char *write_data, free_xid(xid); return total_written; } +#endif // end netfslib remove 2483 =20 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) @@ -2776,6 +2782,7 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const = char *name, return -ENOENT; } =20 +#if 0 // TODO remove 2773 void cifs_writedata_release(struct cifs_io_subrequest *wdata) { @@ -3406,7 +3413,11 @@ static int cifs_write_end(struct file *file, struct = address_space *mapping, =20 return rc; } +#endif // End netfs removal 2773 =20 +/* + * Flush data on a strict file. + */ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, int datasync) { @@ -3461,6 +3472,9 @@ int cifs_strict_fsync(struct file *file, loff_t start= , loff_t end, return rc; } =20 +/* + * Flush data on a non-strict data. + */ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) { unsigned int xid; @@ -3527,6 +3541,7 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } =20 +#if 0 // TODO remove 3594 static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); =20 static void @@ -3989,6 +4004,7 @@ ssize_t cifs_user_writev(struct kiocb *iocb, struct i= ov_iter *from) { return __cifs_writev(iocb, from, false); } +#endif // TODO remove 3594 =20 static ssize_t cifs_writev(struct kiocb *iocb, struct iov_iter *from) @@ -4000,7 +4016,10 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *fro= m) struct TCP_Server_Info *server =3D tlink_tcon(cfile->tlink)->ses->server; ssize_t rc; =20 - inode_lock(inode); + rc =3D netfs_start_io_write(inode); + if (rc < 0) + return rc; + /* * We need to hold the sem to be sure nobody modifies lock list * with a brlock that prevents writing. @@ -4014,13 +4033,12 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *fr= om) if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), server->vals->exclusive_lock_type, 0, NULL, CIFS_WRITE_OP)) - rc =3D __generic_file_write_iter(iocb, from); + rc =3D netfs_buffered_write_iter_locked(iocb, from, NULL); else rc =3D -EACCES; out: up_read(&cinode->lock_sem); - inode_unlock(inode); - + netfs_end_io_write(inode); if (rc > 0) rc =3D generic_write_sync(iocb, rc); return rc; @@ -4043,9 +4061,9 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_ite= r *from) =20 if (CIFS_CACHE_WRITE(cinode)) { if (cap_unix(tcon->ses) && - (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) - && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) =3D=3D 0)) { - written =3D generic_file_write_iter(iocb, from); + (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && + ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) =3D=3D 0)) { + written =3D netfs_file_write_iter(iocb, from); goto out; } written =3D cifs_writev(iocb, from); @@ -4057,7 +4075,7 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_ite= r *from) * affected pages because it may cause a error with mandatory locks on * these pages but not on the region from pos to ppos+len-1. */ - written =3D cifs_user_writev(iocb, from); + written =3D netfs_file_write_iter(iocb, from); if (CIFS_CACHE_READ(cinode)) { /* * We have read level caching and we have just sent a write @@ -4076,6 +4094,7 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_ite= r *from) return written; } =20 +#if 0 // TODO remove 4143 static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) { struct cifs_io_subrequest *rdata; @@ -4515,7 +4534,9 @@ ssize_t cifs_direct_readv(struct kiocb *iocb, struct = iov_iter *to) ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) { return __cifs_readv(iocb, to, false); + } +#endif // end netfslib removal 4143 =20 ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) { @@ -4523,13 +4544,13 @@ ssize_t cifs_loose_read_iter(struct kiocb *iocb, st= ruct iov_iter *iter) struct inode *inode =3D file_inode(iocb->ki_filp); =20 if (iocb->ki_flags & IOCB_DIRECT) - return cifs_user_readv(iocb, iter); + return netfs_unbuffered_read_iter(iocb, iter); =20 rc =3D cifs_revalidate_mapping(inode); if (rc) return rc; =20 - return generic_file_read_iter(iocb, iter); + return netfs_file_read_iter(iocb, iter); } =20 ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) @@ -4540,7 +4561,7 @@ ssize_t cifs_file_write_iter(struct kiocb *iocb, stru= ct iov_iter *from) int rc; =20 if (iocb->ki_filp->f_flags & O_DIRECT) { - written =3D cifs_user_writev(iocb, from); + written =3D netfs_unbuffered_write_iter(iocb, from); if (written > 0 && CIFS_CACHE_READ(cinode)) { cifs_zap_mapping(inode); cifs_dbg(FYI, @@ -4555,17 +4576,15 @@ ssize_t cifs_file_write_iter(struct kiocb *iocb, st= ruct iov_iter *from) if (written) return written; =20 - written =3D generic_file_write_iter(iocb, from); - - if (CIFS_CACHE_WRITE(CIFS_I(inode))) - goto out; + written =3D netfs_file_write_iter(iocb, from); =20 - rc =3D filemap_fdatawrite(inode->i_mapping); - if (rc) - cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", - rc, inode); + if (!CIFS_CACHE_WRITE(CIFS_I(inode))) { + rc =3D filemap_fdatawrite(inode->i_mapping); + if (rc) + cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", + rc, inode); + } =20 -out: cifs_put_writer(cinode); return written; } @@ -4590,12 +4609,15 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_it= er *to) * pos+len-1. */ if (!CIFS_CACHE_READ(cinode)) - return cifs_user_readv(iocb, to); + return netfs_unbuffered_read_iter(iocb, to); =20 if (cap_unix(tcon->ses) && (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && - ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) =3D=3D 0)) - return generic_file_read_iter(iocb, to); + ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) =3D=3D 0)) { + if (iocb->ki_flags & IOCB_DIRECT) + return netfs_unbuffered_read_iter(iocb, to); + return netfs_buffered_read_iter(iocb, to); + } =20 /* * We need to hold the sem to be sure nobody modifies lock list @@ -4604,12 +4626,17 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_it= er *to) down_read(&cinode->lock_sem); if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(to), tcon->ses->server->vals->shared_lock_type, - 0, NULL, CIFS_READ_OP)) - rc =3D generic_file_read_iter(iocb, to); + 0, NULL, CIFS_READ_OP)) { + if (iocb->ki_flags & IOCB_DIRECT) + rc =3D netfs_unbuffered_read_iter(iocb, to); + else + rc =3D netfs_buffered_read_iter(iocb, to); + } up_read(&cinode->lock_sem); return rc; } =20 +#if 0 // TODO remove 4633 static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *of= fset) { @@ -4701,29 +4728,11 @@ cifs_read(struct file *file, char *read_data, size_= t read_size, loff_t *offset) free_xid(xid); return total_read; } +#endif // end netfslib remove 4633 =20 -/* - * If the page is mmap'ed into a process' page tables, then we need to make - * sure that it doesn't change while being written back. - */ static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { - struct folio *folio =3D page_folio(vmf->page); - - /* Wait for the folio to be written to the cache before we allow it to - * be modified. We then assume the entire folio will need writing back. - */ -#ifdef CONFIG_CIFS_FSCACHE - if (folio_test_private_2(folio) && /* [DEPRECATED] */ - folio_wait_private_2_killable(folio) < 0) - return VM_FAULT_RETRY; -#endif - - folio_wait_writeback(folio); - - if (folio_lock_killable(folio) < 0) - return VM_FAULT_RETRY; - return VM_FAULT_LOCKED; + return netfs_page_mkwrite(vmf, NULL); } =20 static const struct vm_operations_struct cifs_file_vm_ops =3D { @@ -4769,6 +4778,7 @@ int cifs_file_mmap(struct file *file, struct vm_area_= struct *vma) return rc; } =20 +#if 0 // TODO remove 4794 /* * Unlock a bunch of folios in the pagecache. */ @@ -5053,6 +5063,7 @@ static int cifs_read_folio(struct file *file, struct = folio *folio) free_xid(xid); return rc; } +#endif // end netfslib remove 4794 =20 static int is_inode_writable(struct cifsInodeInfo *cifs_inode) { @@ -5101,6 +5112,7 @@ bool is_size_safe_to_change(struct cifsInodeInfo *cif= sInode, __u64 end_of_file, return true; } =20 +#if 0 // TODO remove 5152 static int cifs_write_begin(struct file *file, struct address_space *mappi= ng, loff_t pos, unsigned len, struct page **pagep, void **fsdata) @@ -5196,6 +5208,7 @@ static void cifs_invalidate_folio(struct folio *folio= , size_t offset, { folio_wait_private_2(folio); /* [DEPRECATED] */ } +#endif // end netfslib remove 5152 =20 void cifs_oplock_break(struct work_struct *work) { @@ -5286,6 +5299,7 @@ void cifs_oplock_break(struct work_struct *work) cifs_done_oplock_break(cinode); } =20 +#if 0 // TODO remove 5333 /* * The presence of cifs_direct_io() in the address space ops vector * allowes open() O_DIRECT flags which would have failed otherwise. @@ -5304,6 +5318,7 @@ cifs_direct_io(struct kiocb *iocb, struct iov_iter *i= ter) */ return -EINVAL; } +#endif // netfs end remove 5333 =20 static int cifs_swap_activate(struct swap_info_struct *sis, struct file *swap_file, sector_t *span) @@ -5366,21 +5381,19 @@ static void cifs_swap_deactivate(struct file *file) } =20 const struct address_space_operations cifs_addr_ops =3D { - .read_folio =3D cifs_read_folio, - .readahead =3D cifs_readahead, - .writepages =3D cifs_writepages, - .write_begin =3D cifs_write_begin, - .write_end =3D cifs_write_end, - .dirty_folio =3D netfs_dirty_folio, - .release_folio =3D cifs_release_folio, - .direct_IO =3D cifs_direct_io, - .invalidate_folio =3D cifs_invalidate_folio, - .migrate_folio =3D filemap_migrate_folio, + .read_folio =3D netfs_read_folio, + .readahead =3D netfs_readahead, + .writepages =3D netfs_writepages, + .dirty_folio =3D netfs_dirty_folio, + .release_folio =3D netfs_release_folio, + .direct_IO =3D noop_direct_IO, + .invalidate_folio =3D netfs_invalidate_folio, + .migrate_folio =3D filemap_migrate_folio, /* * TODO: investigate and if useful we could add an is_dirty_writeback * helper if needed */ - .swap_activate =3D cifs_swap_activate, + .swap_activate =3D cifs_swap_activate, .swap_deactivate =3D cifs_swap_deactivate, }; =20 @@ -5390,12 +5403,10 @@ const struct address_space_operations cifs_addr_ops= =3D { * to leave cifs_readahead out of the address space operations. */ const struct address_space_operations cifs_addr_ops_smallbuf =3D { - .read_folio =3D cifs_read_folio, - .writepages =3D cifs_writepages, - .write_begin =3D cifs_write_begin, - .write_end =3D cifs_write_end, - .dirty_folio =3D netfs_dirty_folio, - .release_folio =3D cifs_release_folio, - .invalidate_folio =3D cifs_invalidate_folio, - .migrate_folio =3D filemap_migrate_folio, + .read_folio =3D netfs_read_folio, + .writepages =3D netfs_writepages, + .dirty_folio =3D netfs_dirty_folio, + .release_folio =3D netfs_release_folio, + .invalidate_folio =3D netfs_invalidate_folio, + .migrate_folio =3D filemap_migrate_folio, }; diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index 340efce8f052..7aa1d633c027 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -151,6 +151,7 @@ void cifs_fscache_release_inode_cookie(struct inode *in= ode) } } =20 +#if 0 // TODO remove /* * Fallback page reading interface. */ @@ -259,3 +260,4 @@ int __cifs_fscache_query_occupancy(struct inode *inode, fscache_end_operation(&cres); return ret; } +#endif diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index 1f2ea9f5cc9a..08b30f79d4cd 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -74,6 +74,7 @@ static inline void cifs_invalidate_cache(struct inode *in= ode, unsigned int flags i_size_read(inode), flags); } =20 +#if 0 // TODO remove extern int __cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages, pgoff_t *_data_first, @@ -108,6 +109,7 @@ static inline void cifs_readahead_to_fscache(struct ino= de *inode, if (cifs_inode_cookie(inode)) __cifs_readahead_to_fscache(inode, pos, len); } +#endif =20 static inline bool cifs_fscache_enabled(struct inode *inode) { @@ -131,6 +133,7 @@ static inline struct fscache_cookie *cifs_inode_cookie(= struct inode *inode) { re static inline void cifs_invalidate_cache(struct inode *inode, unsigned int= flags) {} static inline bool cifs_fscache_enabled(struct inode *inode) { return fals= e; } =20 +#if 0 // TODO remove static inline int cifs_fscache_query_occupancy(struct inode *inode, pgoff_t first, unsigned int nr_pages, pgoff_t *_data_first, @@ -149,6 +152,7 @@ cifs_readpage_from_fscache(struct inode *inode, struct = page *page) =20 static inline void cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len= ) {} +#endif =20 #endif /* CONFIG_CIFS_FSCACHE */ =20 diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 468ea2312a1a..f0f90c11ca66 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -28,14 +28,29 @@ #include "cached_dir.h" #include "reparse.h" =20 +/* + * Set parameters for the netfs library + */ +static void cifs_set_netfs_context(struct inode *inode) +{ + struct cifsInodeInfo *cifs_i =3D CIFS_I(inode); + struct cifs_sb_info *cifs_sb =3D CIFS_SB(inode->i_sb); + + netfs_inode_init(&cifs_i->netfs, &cifs_req_ops, true); + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) + __set_bit(NETFS_ICTX_WRITETHROUGH, &cifs_i->netfs.flags); +} + static void cifs_set_ops(struct inode *inode) { struct cifs_sb_info *cifs_sb =3D CIFS_SB(inode->i_sb); + struct netfs_inode *ictx =3D netfs_inode(inode); =20 switch (inode->i_mode & S_IFMT) { case S_IFREG: inode->i_op =3D &cifs_file_inode_ops; if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { + set_bit(NETFS_ICTX_UNBUFFERED, &ictx->flags); if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) inode->i_fop =3D &cifs_file_direct_nobrl_ops; else @@ -221,8 +236,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_f= attr *fattr, =20 if (fattr->cf_flags & CIFS_FATTR_JUNCTION) inode->i_flags |=3D S_AUTOMOUNT; - if (inode->i_state & I_NEW) + if (inode->i_state & I_NEW) { + cifs_set_netfs_context(inode); cifs_set_ops(inode); + } return 0; } =20 diff --git a/fs/smb/client/smb2pdu.c b/fs/smb/client/smb2pdu.c index 2e29c6c2dca6..96a23a26d205 100644 --- a/fs/smb/client/smb2pdu.c +++ b/fs/smb/client/smb2pdu.c @@ -4408,10 +4408,12 @@ smb2_new_read_req(void **buf, unsigned int *total_l= en, req->Length =3D cpu_to_le32(io_parms->length); req->Offset =3D cpu_to_le64(io_parms->offset); =20 - trace_smb3_read_enter(0 /* xid */, - io_parms->persistent_fid, - io_parms->tcon->tid, io_parms->tcon->ses->Suid, - io_parms->offset, io_parms->length); + trace_smb3_read_enter(rdata ? rdata->rreq->debug_id : 0, + rdata ? rdata->subreq.debug_index : 0, + rdata ? rdata->xid : 0, + io_parms->persistent_fid, + io_parms->tcon->tid, io_parms->tcon->ses->Suid, + io_parms->offset, io_parms->length); #ifdef CONFIG_CIFS_SMB_DIRECT /* * If we want to do a RDMA write, fill in and append @@ -4473,7 +4475,7 @@ static void smb2_readv_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *rdata =3D mid->callback_data; - struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(rdata->req->cfile->tlink); struct TCP_Server_Info *server =3D rdata->server; struct smb2_hdr *shdr =3D (struct smb2_hdr *)rdata->iov[0].iov_base; @@ -4501,7 +4503,6 @@ smb2_readv_callback(struct mid_q_entry *mid) if (server->sign && !mid->decrypted) { int rc; =20 - iov_iter_revert(&rqst.rq_iter, rdata->got_bytes); iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); rc =3D smb2_verify_signature(&rqst, server); if (rc) @@ -4542,17 +4543,33 @@ smb2_readv_callback(struct mid_q_entry *mid) #endif if (rdata->result && rdata->result !=3D -ENODATA) { cifs_stats_fail_inc(tcon, SMB2_READ_HE); - trace_smb3_read_err(0 /* xid */, - rdata->cfile->fid.persistent_fid, + trace_smb3_read_err(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, + rdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, rdata->subreq.start, rdata->subreq.len, rdata->result); } else - trace_smb3_read_done(0 /* xid */, - rdata->cfile->fid.persistent_fid, + trace_smb3_read_done(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, + rdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, rdata->subreq.start, rdata->got_bytes); =20 - queue_work(cifsiod_wq, &rdata->work); + if (rdata->result =3D=3D -ENODATA) { + /* We may have got an EOF error because fallocate + * failed to enlarge the file. + */ + if (rdata->subreq.start < rdata->subreq.rreq->i_size) + rdata->result =3D 0; + } + if (rdata->result =3D=3D 0 || rdata->result =3D=3D -EAGAIN) + iov_iter_advance(&rdata->subreq.io_iter, rdata->got_bytes); + rdata->credits.value =3D 0; + netfs_subreq_terminated(&rdata->subreq, + (rdata->result =3D=3D 0 || rdata->result =3D=3D -EAGAIN) ? + rdata->got_bytes : rdata->result, true); release_mid(mid); add_credits(server, &credits, 0); } @@ -4568,7 +4585,7 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) struct smb_rqst rqst =3D { .rq_iov =3D rdata->iov, .rq_nvec =3D 1 }; struct TCP_Server_Info *server; - struct cifs_tcon *tcon =3D tlink_tcon(rdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(rdata->req->cfile->tlink); unsigned int total_len; int credit_request; =20 @@ -4578,12 +4595,12 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) if (!rdata->server) rdata->server =3D cifs_pick_channel(tcon->ses); =20 - io_parms.tcon =3D tlink_tcon(rdata->cfile->tlink); + io_parms.tcon =3D tlink_tcon(rdata->req->cfile->tlink); io_parms.server =3D server =3D rdata->server; io_parms.offset =3D rdata->subreq.start; io_parms.length =3D rdata->subreq.len; - io_parms.persistent_fid =3D rdata->cfile->fid.persistent_fid; - io_parms.volatile_fid =3D rdata->cfile->fid.volatile_fid; + io_parms.persistent_fid =3D rdata->req->cfile->fid.persistent_fid; + io_parms.volatile_fid =3D rdata->req->cfile->fid.volatile_fid; io_parms.pid =3D rdata->pid; =20 rc =3D smb2_new_read_req( @@ -4617,15 +4634,15 @@ smb2_async_readv(struct cifs_io_subrequest *rdata) flags |=3D CIFS_HAS_CREDITS; } =20 - cifs_get_readdata(rdata); rc =3D cifs_call_async(server, &rqst, cifs_readv_receive, smb2_readv_callback, smb3_handle_read_data, rdata, flags, &rdata->credits); if (rc) { - cifs_put_readdata(rdata); cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); - trace_smb3_read_err(0 /* xid */, io_parms.persistent_fid, + trace_smb3_read_err(rdata->rreq->debug_id, + rdata->subreq.debug_index, + rdata->xid, io_parms.persistent_fid, io_parms.tcon->tid, io_parms.tcon->ses->Suid, io_parms.offset, io_parms.length, rc); @@ -4676,22 +4693,23 @@ SMB2_read(const unsigned int xid, struct cifs_io_pa= rms *io_parms, if (rc !=3D -ENODATA) { cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); cifs_dbg(VFS, "Send error in read =3D %d\n", rc); - trace_smb3_read_err(xid, + trace_smb3_read_err(0, 0, xid, req->PersistentFileId, io_parms->tcon->tid, ses->Suid, io_parms->offset, io_parms->length, rc); } else - trace_smb3_read_done(xid, req->PersistentFileId, io_parms->tcon->tid, + trace_smb3_read_done(0, 0, xid, + req->PersistentFileId, io_parms->tcon->tid, ses->Suid, io_parms->offset, 0); free_rsp_buf(resp_buftype, rsp_iov.iov_base); cifs_small_buf_release(req); return rc =3D=3D -ENODATA ? 0 : rc; } else - trace_smb3_read_done(xid, - req->PersistentFileId, - io_parms->tcon->tid, ses->Suid, - io_parms->offset, io_parms->length); + trace_smb3_read_done(0, 0, xid, + req->PersistentFileId, + io_parms->tcon->tid, ses->Suid, + io_parms->offset, io_parms->length); =20 cifs_small_buf_release(req); =20 @@ -4725,11 +4743,12 @@ static void smb2_writev_callback(struct mid_q_entry *mid) { struct cifs_io_subrequest *wdata =3D mid->callback_data; - struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(wdata->req->cfile->tlink); struct TCP_Server_Info *server =3D wdata->server; - unsigned int written; struct smb2_write_rsp *rsp =3D (struct smb2_write_rsp *)mid->resp_buf; struct cifs_credits credits =3D { .value =3D 0, .instance =3D 0 }; + ssize_t result =3D 0; + size_t written; =20 WARN_ONCE(wdata->server !=3D mid->server, "wdata server %p !=3D mid server %p", @@ -4739,8 +4758,8 @@ smb2_writev_callback(struct mid_q_entry *mid) case MID_RESPONSE_RECEIVED: credits.value =3D le16_to_cpu(rsp->hdr.CreditRequest); credits.instance =3D server->reconnect_instance; - wdata->result =3D smb2_check_receive(mid, server, 0); - if (wdata->result !=3D 0) + result =3D smb2_check_receive(mid, server, 0); + if (result !=3D 0) break; =20 written =3D le32_to_cpu(rsp->DataLength); @@ -4757,17 +4776,18 @@ smb2_writev_callback(struct mid_q_entry *mid) wdata->result =3D -ENOSPC; else wdata->subreq.len =3D written; + iov_iter_advance(&wdata->subreq.io_iter, written); break; case MID_REQUEST_SUBMITTED: case MID_RETRY_NEEDED: - wdata->result =3D -EAGAIN; + result =3D -EAGAIN; break; case MID_RESPONSE_MALFORMED: credits.value =3D le16_to_cpu(rsp->hdr.CreditRequest); credits.instance =3D server->reconnect_instance; fallthrough; default: - wdata->result =3D -EIO; + result =3D -EIO; break; } #ifdef CONFIG_CIFS_SMB_DIRECT @@ -4783,10 +4803,10 @@ smb2_writev_callback(struct mid_q_entry *mid) wdata->mr =3D NULL; } #endif - if (wdata->result) { + if (result) { cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); - trace_smb3_write_err(0 /* no xid */, - wdata->cfile->fid.persistent_fid, + trace_smb3_write_err(wdata->xid, + wdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, wdata->subreq.start, wdata->subreq.len, wdata->result); if (wdata->result =3D=3D -ENOSPC) @@ -4794,27 +4814,28 @@ smb2_writev_callback(struct mid_q_entry *mid) tcon->tree_name); } else trace_smb3_write_done(0 /* no xid */, - wdata->cfile->fid.persistent_fid, + wdata->req->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, wdata->subreq.start, wdata->subreq.len); =20 - queue_work(cifsiod_wq, &wdata->work); + wdata->credits.value =3D 0; + cifs_write_subrequest_terminated(wdata, result ?: written, true); release_mid(mid); add_credits(server, &credits, 0); } =20 /* smb2_async_writev - send an async write, and set up mid to handle resul= t */ -int +void smb2_async_writev(struct cifs_io_subrequest *wdata) { int rc =3D -EACCES, flags =3D 0; struct smb2_write_req *req =3D NULL; struct smb2_hdr *shdr; - struct cifs_tcon *tcon =3D tlink_tcon(wdata->cfile->tlink); + struct cifs_tcon *tcon =3D tlink_tcon(wdata->req->cfile->tlink); struct TCP_Server_Info *server =3D wdata->server; struct kvec iov[1]; struct smb_rqst rqst =3D { }; - unsigned int total_len; + unsigned int total_len, xid =3D wdata->xid; struct cifs_io_parms _io_parms; struct cifs_io_parms *io_parms =3D NULL; int credit_request; @@ -4831,8 +4852,8 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) .server =3D server, .offset =3D wdata->subreq.start, .length =3D wdata->subreq.len, - .persistent_fid =3D wdata->cfile->fid.persistent_fid, - .volatile_fid =3D wdata->cfile->fid.volatile_fid, + .persistent_fid =3D wdata->req->cfile->fid.persistent_fid, + .volatile_fid =3D wdata->req->cfile->fid.volatile_fid, .pid =3D wdata->pid, }; io_parms =3D &_io_parms; @@ -4840,7 +4861,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) rc =3D smb2_plain_req_init(SMB2_WRITE, tcon, server, (void **) &req, &total_len); if (rc) - return rc; + goto out; =20 if (smb3_encryption_required(tcon)) flags |=3D CIFS_TRANSFORM_REQ; @@ -4858,7 +4879,7 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) offsetof(struct smb2_write_req, Buffer)); req->RemainingBytes =3D 0; =20 - trace_smb3_write_enter(0 /* xid */, + trace_smb3_write_enter(wdata->xid, io_parms->persistent_fid, io_parms->tcon->tid, io_parms->tcon->ses->Suid, @@ -4939,25 +4960,27 @@ smb2_async_writev(struct cifs_io_subrequest *wdata) flags |=3D CIFS_HAS_CREDITS; } =20 - cifs_get_writedata(wdata); rc =3D cifs_call_async(server, &rqst, NULL, smb2_writev_callback, NULL, wdata, flags, &wdata->credits); - + /* Can't touch wdata if rc =3D=3D 0 */ if (rc) { - trace_smb3_write_err(0 /* no xid */, + trace_smb3_write_err(xid, io_parms->persistent_fid, io_parms->tcon->tid, io_parms->tcon->ses->Suid, io_parms->offset, io_parms->length, rc); - cifs_put_writedata(wdata); cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); } =20 async_writev_out: cifs_small_buf_release(req); - return rc; +out: + if (rc) { + add_credits_and_wake_if(wdata->server, &wdata->credits, 0); + cifs_write_subrequest_terminated(wdata, rc, true); + } } =20 /* diff --git a/fs/smb/client/smb2proto.h b/fs/smb/client/smb2proto.h index c781eaa0cba8..b208232b12a2 100644 --- a/fs/smb/client/smb2proto.h +++ b/fs/smb/client/smb2proto.h @@ -213,7 +213,7 @@ extern int SMB2_get_srv_num(const unsigned int xid, str= uct cifs_tcon *tcon, extern int smb2_async_readv(struct cifs_io_subrequest *rdata); extern int SMB2_read(const unsigned int xid, struct cifs_io_parms *io_parm= s, unsigned int *nbytes, char **buf, int *buf_type); -extern int smb2_async_writev(struct cifs_io_subrequest *wdata); +extern void smb2_async_writev(struct cifs_io_subrequest *wdata); extern int SMB2_write(const unsigned int xid, struct cifs_io_parms *io_par= ms, unsigned int *nbytes, struct kvec *iov, int n_vec); extern int SMB2_echo(struct TCP_Server_Info *server); diff --git a/fs/smb/client/trace.h b/fs/smb/client/trace.h index f9c1fd32d0b8..59f27ccad1cf 100644 --- a/fs/smb/client/trace.h +++ b/fs/smb/client/trace.h @@ -21,6 +21,62 @@ =20 /* For logging errors in read or write */ DECLARE_EVENT_CLASS(smb3_rw_err_class, + TP_PROTO(unsigned int rreq_debug_id, + unsigned int rreq_debug_index, + unsigned int xid, + __u64 fid, + __u32 tid, + __u64 sesid, + __u64 offset, + __u32 len, + int rc), + TP_ARGS(rreq_debug_id, rreq_debug_index, + xid, fid, tid, sesid, offset, len, rc), + TP_STRUCT__entry( + __field(unsigned int, rreq_debug_id) + __field(unsigned int, rreq_debug_index) + __field(unsigned int, xid) + __field(__u64, fid) + __field(__u32, tid) + __field(__u64, sesid) + __field(__u64, offset) + __field(__u32, len) + __field(int, rc) + ), + TP_fast_assign( + __entry->rreq_debug_id =3D rreq_debug_id; + __entry->rreq_debug_index =3D rreq_debug_index; + __entry->xid =3D xid; + __entry->fid =3D fid; + __entry->tid =3D tid; + __entry->sesid =3D sesid; + __entry->offset =3D offset; + __entry->len =3D len; + __entry->rc =3D rc; + ), + TP_printk("\tR=3D%08x[%x] xid=3D%u sid=3D0x%llx tid=3D0x%x fid=3D0x%llx o= ffset=3D0x%llx len=3D0x%x rc=3D%d", + __entry->rreq_debug_id, __entry->rreq_debug_index, + __entry->xid, __entry->sesid, __entry->tid, __entry->fid, + __entry->offset, __entry->len, __entry->rc) +) + +#define DEFINE_SMB3_RW_ERR_EVENT(name) \ +DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ + TP_PROTO(unsigned int rreq_debug_id, \ + unsigned int rreq_debug_index, \ + unsigned int xid, \ + __u64 fid, \ + __u32 tid, \ + __u64 sesid, \ + __u64 offset, \ + __u32 len, \ + int rc), \ + TP_ARGS(rreq_debug_id, rreq_debug_index, xid, fid, tid, sesid, offset, le= n, rc)) + +DEFINE_SMB3_RW_ERR_EVENT(read_err); + +/* For logging errors in other file I/O ops */ +DECLARE_EVENT_CLASS(smb3_other_err_class, TP_PROTO(unsigned int xid, __u64 fid, __u32 tid, @@ -52,8 +108,8 @@ DECLARE_EVENT_CLASS(smb3_rw_err_class, __entry->offset, __entry->len, __entry->rc) ) =20 -#define DEFINE_SMB3_RW_ERR_EVENT(name) \ -DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ +#define DEFINE_SMB3_OTHER_ERR_EVENT(name) \ +DEFINE_EVENT(smb3_other_err_class, smb3_##name, \ TP_PROTO(unsigned int xid, \ __u64 fid, \ __u32 tid, \ @@ -63,15 +119,67 @@ DEFINE_EVENT(smb3_rw_err_class, smb3_##name, \ int rc), \ TP_ARGS(xid, fid, tid, sesid, offset, len, rc)) =20 -DEFINE_SMB3_RW_ERR_EVENT(write_err); -DEFINE_SMB3_RW_ERR_EVENT(read_err); -DEFINE_SMB3_RW_ERR_EVENT(query_dir_err); -DEFINE_SMB3_RW_ERR_EVENT(zero_err); -DEFINE_SMB3_RW_ERR_EVENT(falloc_err); +DEFINE_SMB3_OTHER_ERR_EVENT(write_err); +DEFINE_SMB3_OTHER_ERR_EVENT(query_dir_err); +DEFINE_SMB3_OTHER_ERR_EVENT(zero_err); +DEFINE_SMB3_OTHER_ERR_EVENT(falloc_err); =20 =20 /* For logging successful read or write */ DECLARE_EVENT_CLASS(smb3_rw_done_class, + TP_PROTO(unsigned int rreq_debug_id, + unsigned int rreq_debug_index, + unsigned int xid, + __u64 fid, + __u32 tid, + __u64 sesid, + __u64 offset, + __u32 len), + TP_ARGS(rreq_debug_id, rreq_debug_index, + xid, fid, tid, sesid, offset, len), + TP_STRUCT__entry( + __field(unsigned int, rreq_debug_id) + __field(unsigned int, rreq_debug_index) + __field(unsigned int, xid) + __field(__u64, fid) + __field(__u32, tid) + __field(__u64, sesid) + __field(__u64, offset) + __field(__u32, len) + ), + TP_fast_assign( + __entry->rreq_debug_id =3D rreq_debug_id; + __entry->rreq_debug_index =3D rreq_debug_index; + __entry->xid =3D xid; + __entry->fid =3D fid; + __entry->tid =3D tid; + __entry->sesid =3D sesid; + __entry->offset =3D offset; + __entry->len =3D len; + ), + TP_printk("R=3D%08x[%x] xid=3D%u sid=3D0x%llx tid=3D0x%x fid=3D0x%llx off= set=3D0x%llx len=3D0x%x", + __entry->rreq_debug_id, __entry->rreq_debug_index, + __entry->xid, __entry->sesid, __entry->tid, __entry->fid, + __entry->offset, __entry->len) +) + +#define DEFINE_SMB3_RW_DONE_EVENT(name) \ +DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ + TP_PROTO(unsigned int rreq_debug_id, \ + unsigned int rreq_debug_index, \ + unsigned int xid, \ + __u64 fid, \ + __u32 tid, \ + __u64 sesid, \ + __u64 offset, \ + __u32 len), \ + TP_ARGS(rreq_debug_id, rreq_debug_index, xid, fid, tid, sesid, offset, le= n)) + +DEFINE_SMB3_RW_DONE_EVENT(read_enter); +DEFINE_SMB3_RW_DONE_EVENT(read_done); + +/* For logging successful other op */ +DECLARE_EVENT_CLASS(smb3_other_done_class, TP_PROTO(unsigned int xid, __u64 fid, __u32 tid, @@ -100,8 +208,8 @@ DECLARE_EVENT_CLASS(smb3_rw_done_class, __entry->offset, __entry->len) ) =20 -#define DEFINE_SMB3_RW_DONE_EVENT(name) \ -DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ +#define DEFINE_SMB3_OTHER_DONE_EVENT(name) \ +DEFINE_EVENT(smb3_other_done_class, smb3_##name, \ TP_PROTO(unsigned int xid, \ __u64 fid, \ __u32 tid, \ @@ -110,16 +218,14 @@ DEFINE_EVENT(smb3_rw_done_class, smb3_##name, \ __u32 len), \ TP_ARGS(xid, fid, tid, sesid, offset, len)) =20 -DEFINE_SMB3_RW_DONE_EVENT(write_enter); -DEFINE_SMB3_RW_DONE_EVENT(read_enter); -DEFINE_SMB3_RW_DONE_EVENT(query_dir_enter); -DEFINE_SMB3_RW_DONE_EVENT(zero_enter); -DEFINE_SMB3_RW_DONE_EVENT(falloc_enter); -DEFINE_SMB3_RW_DONE_EVENT(write_done); -DEFINE_SMB3_RW_DONE_EVENT(read_done); -DEFINE_SMB3_RW_DONE_EVENT(query_dir_done); -DEFINE_SMB3_RW_DONE_EVENT(zero_done); -DEFINE_SMB3_RW_DONE_EVENT(falloc_done); +DEFINE_SMB3_OTHER_DONE_EVENT(write_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(query_dir_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(zero_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(falloc_enter); +DEFINE_SMB3_OTHER_DONE_EVENT(write_done); +DEFINE_SMB3_OTHER_DONE_EVENT(query_dir_done); +DEFINE_SMB3_OTHER_DONE_EVENT(zero_done); +DEFINE_SMB3_OTHER_DONE_EVENT(falloc_done); =20 /* For logging successful set EOF (truncate) */ DECLARE_EVENT_CLASS(smb3_eof_class, diff --git a/fs/smb/client/transport.c b/fs/smb/client/transport.c index 5a69a7430ffa..4bf8b2ff26f5 100644 --- a/fs/smb/client/transport.c +++ b/fs/smb/client/transport.c @@ -1808,8 +1808,11 @@ cifs_readv_receive(struct TCP_Server_Info *server, s= truct mid_q_entry *mid) length =3D data_len; /* An RDMA read is already done. */ else #endif + { length =3D cifs_read_iter_from_socket(server, &rdata->subreq.io_iter, data_len); + iov_iter_revert(&rdata->subreq.io_iter, data_len); + } if (length > 0) rdata->got_bytes +=3D length; server->total_read +=3D length; From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 067D755C3C for ; Thu, 28 Mar 2024 17:01:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645264; cv=none; b=j10egy1sthPXVEimpNGCT8acfeb/RkQzRRz7sxbZiqZCfKsFA+LjbAcel25+V/IGeoJBO50Qfmzb3p+z7Kn1rNBOQH0h8UMG/ItZ/avhuy+h7lUex7d7OHaxiV7/EajsnPmFi5K0yG6vEH7+d0SSMn2ONUtQIGWwTgJM9bkugQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645264; c=relaxed/simple; bh=CmTTK7HFGgYFFuroMtDM0/JKDC+CR+S23MJygU3KW/g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cMooeihaOnzqmta5HxTLajqERQ16fyT86zrFrvunsl4iK7xgCu4avAf/tD3fLc5QMksJ0qClRsQPtGVczHB7oYfzKBLcrMCBnJvSfG07ygMMGGfXcBaVcTo6EEdzvlK8Mw4ceQEdwDpd0u4xBPqokx05CBtcNxpFxPDJkqd5dT8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=PBoUfRiY; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="PBoUfRiY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645260; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pCk0xvNNC/cDWa5a0Gq+9m+mlK9VugFvWwvpGVmIniA=; b=PBoUfRiYXVG1+ZLhDKCt9ZobZW8tGd6Y8aIMZZoGtxf8pxx9uRkErAzfnGsg4F8QtsKfY5 ccpQJEvkgRencCBpiXJymtQTB1tTPuzmj8qnMevzGrty44MkXzQPQtvKANsAanqLYvlA7b U6ZOtPNqg6QMFmPDfLLrDi6Cr7bruKU= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-686-X4ktYkjNPpWfSF0KSyLSgw-1; Thu, 28 Mar 2024 13:00:54 -0400 X-MC-Unique: X4ktYkjNPpWfSF0KSyLSgw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A81A929AC03A; Thu, 28 Mar 2024 17:00:48 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8F3811121306; Thu, 28 Mar 2024 17:00:46 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 13/15] cifs: Remove some code that's no longer used, part 1 Date: Thu, 28 Mar 2024 16:58:04 +0000 Message-ID: <20240328165845.2782259-14-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.3 Content-Type: text/plain; charset="utf-8" Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/cifsglob.h | 12 - fs/smb/client/cifsproto.h | 25 -- fs/smb/client/file.c | 619 -------------------------------------- fs/smb/client/fscache.c | 111 ------- fs/smb/client/fscache.h | 58 ---- 5 files changed, 825 deletions(-) diff --git a/fs/smb/client/cifsglob.h b/fs/smb/client/cifsglob.h index 639cdeb3f77e..94885bf86ff2 100644 --- a/fs/smb/client/cifsglob.h +++ b/fs/smb/client/cifsglob.h @@ -1510,18 +1510,6 @@ struct cifs_io_subrequest { struct smbd_mr *mr; #endif struct cifs_credits credits; - -#if 0 // TODO: Remove following elements - struct list_head list; - struct completion done; - struct work_struct work; - struct cifsFileInfo *cfile; - struct address_space *mapping; - struct cifs_aio_ctx *ctx; - enum writeback_sync_modes sync_mode; - bool uncached; - struct bio_vec *bv; -#endif }; =20 /* diff --git a/fs/smb/client/cifsproto.h b/fs/smb/client/cifsproto.h index e0ccf32d7ecd..57ec67cdc31e 100644 --- a/fs/smb/client/cifsproto.h +++ b/fs/smb/client/cifsproto.h @@ -600,36 +600,11 @@ void __cifs_put_smb_ses(struct cifs_ses *ses); extern struct cifs_ses * cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *c= tx); =20 -#if 0 // TODO Remove -void cifs_readdata_release(struct cifs_io_subrequest *rdata); -static inline void cifs_get_readdata(struct cifs_io_subrequest *rdata) -{ - refcount_inc(&rdata->subreq.ref); -} -static inline void cifs_put_readdata(struct cifs_io_subrequest *rdata) -{ - if (refcount_dec_and_test(&rdata->subreq.ref)) - cifs_readdata_release(rdata); -} -#endif int cifs_async_readv(struct cifs_io_subrequest *rdata); int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry = *mid); =20 void cifs_async_writev(struct cifs_io_subrequest *wdata); void cifs_writev_complete(struct work_struct *work); -#if 0 // TODO Remove -struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete); -void cifs_writedata_release(struct cifs_io_subrequest *rdata); -static inline void cifs_get_writedata(struct cifs_io_subrequest *wdata) -{ - refcount_inc(&wdata->subreq.ref); -} -static inline void cifs_put_writedata(struct cifs_io_subrequest *wdata) -{ - if (refcount_dec_and_test(&wdata->subreq.ref)) - cifs_writedata_release(wdata); -} -#endif int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const unsigned char *path, char *pbuf, diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index c57a3638c51a..265d96f663d7 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -352,133 +352,6 @@ const struct netfs_request_ops cifs_req_ops =3D { .issue_write =3D cifs_issue_write, }; =20 -#if 0 // TODO remove 397 -/* - * Remove the dirty flags from a span of pages. - */ -static void cifs_undirty_folios(struct inode *inode, loff_t start, unsigne= d int len) -{ - struct address_space *mapping =3D inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - rcu_read_lock(); - - end =3D (start + len - 1) / PAGE_SIZE; - xas_for_each_marked(&xas, folio, end, PAGECACHE_TAG_DIRTY) { - if (xas_retry(&xas, folio)) - continue; - xas_pause(&xas); - rcu_read_unlock(); - folio_lock(folio); - folio_clear_dirty_for_io(folio); - folio_unlock(folio); - rcu_read_lock(); - } - - rcu_read_unlock(); -} - -/* - * Completion of write to server. - */ -void cifs_pages_written_back(struct inode *inode, loff_t start, unsigned i= nt len) -{ - struct address_space *mapping =3D inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end =3D (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (xas_retry(&xas, folio)) - continue; - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - folio_detach_private(folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} - -/* - * Failure of write to server. - */ -void cifs_pages_write_failed(struct inode *inode, loff_t start, unsigned i= nt len) -{ - struct address_space *mapping =3D inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end =3D (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (xas_retry(&xas, folio)) - continue; - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - folio_set_error(folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} - -/* - * Redirty pages after a temporary failure. - */ -void cifs_pages_write_redirty(struct inode *inode, loff_t start, unsigned = int len) -{ - struct address_space *mapping =3D inode->i_mapping; - struct folio *folio; - pgoff_t end; - - XA_STATE(xas, &mapping->i_pages, start / PAGE_SIZE); - - if (!len) - return; - - rcu_read_lock(); - - end =3D (start + len - 1) / PAGE_SIZE; - xas_for_each(&xas, folio, end) { - if (!folio_test_writeback(folio)) { - WARN_ONCE(1, "bad %x @%llx page %lx %lx\n", - len, start, folio->index, end); - continue; - } - - filemap_dirty_folio(folio->mapping, folio); - folio_end_writeback(folio); - } - - rcu_read_unlock(); -} -#endif // end netfslib remove 397 - /* * Mark as invalid, all open files on tree connections since they * were closed when session to server was lost. @@ -2492,92 +2365,6 @@ void cifs_write_subrequest_terminated(struct cifs_io= _subrequest *wdata, ssize_t netfs_write_subrequest_terminated(&wdata->subreq, result, was_async); } =20 -#if 0 // TODO remove 2483 -static ssize_t -cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_da= ta, - size_t write_size, loff_t *offset) -{ - int rc =3D 0; - unsigned int bytes_written =3D 0; - unsigned int total_written; - struct cifs_tcon *tcon; - struct TCP_Server_Info *server; - unsigned int xid; - struct dentry *dentry =3D open_file->dentry; - struct cifsInodeInfo *cifsi =3D CIFS_I(d_inode(dentry)); - struct cifs_io_parms io_parms =3D {0}; - - cifs_dbg(FYI, "write %zd bytes to offset %lld of %pd\n", - write_size, *offset, dentry); - - tcon =3D tlink_tcon(open_file->tlink); - server =3D tcon->ses->server; - - if (!server->ops->sync_write) - return -ENOSYS; - - xid =3D get_xid(); - - for (total_written =3D 0; write_size > total_written; - total_written +=3D bytes_written) { - rc =3D -EAGAIN; - while (rc =3D=3D -EAGAIN) { - struct kvec iov[2]; - unsigned int len; - - if (open_file->invalidHandle) { - /* we could deadlock if we called - filemap_fdatawait from here so tell - reopen_file not to flush data to - server now */ - rc =3D cifs_reopen_file(open_file, false); - if (rc !=3D 0) - break; - } - - len =3D min(server->ops->wp_retry_size(d_inode(dentry)), - (unsigned int)write_size - total_written); - /* iov[0] is reserved for smb header */ - iov[1].iov_base =3D (char *)write_data + total_written; - iov[1].iov_len =3D len; - io_parms.pid =3D pid; - io_parms.tcon =3D tcon; - io_parms.offset =3D *offset; - io_parms.length =3D len; - rc =3D server->ops->sync_write(xid, &open_file->fid, - &io_parms, &bytes_written, iov, 1); - } - if (rc || (bytes_written =3D=3D 0)) { - if (total_written) - break; - else { - free_xid(xid); - return rc; - } - } else { - spin_lock(&d_inode(dentry)->i_lock); - cifs_update_eof(cifsi, *offset, bytes_written); - spin_unlock(&d_inode(dentry)->i_lock); - *offset +=3D bytes_written; - } - } - - cifs_stats_bytes_written(tcon, total_written); - - if (total_written > 0) { - spin_lock(&d_inode(dentry)->i_lock); - if (*offset > d_inode(dentry)->i_size) { - i_size_write(d_inode(dentry), *offset); - d_inode(dentry)->i_blocks =3D (512 - 1 + *offset) >> 9; - } - spin_unlock(&d_inode(dentry)->i_lock); - } - mark_inode_dirty_sync(d_inode(dentry)); - free_xid(xid); - return total_written; -} -#endif // end netfslib remove 2483 - struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) { @@ -4778,293 +4565,6 @@ int cifs_file_mmap(struct file *file, struct vm_are= a_struct *vma) return rc; } =20 -#if 0 // TODO remove 4794 -/* - * Unlock a bunch of folios in the pagecache. - */ -static void cifs_unlock_folios(struct address_space *mapping, pgoff_t firs= t, pgoff_t last) -{ - struct folio *folio; - XA_STATE(xas, &mapping->i_pages, first); - - rcu_read_lock(); - xas_for_each(&xas, folio, last) { - folio_unlock(folio); - } - rcu_read_unlock(); -} - -static void cifs_readahead_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *rdata =3D container_of(work, - struct cifs_io_subrequest, work); - struct folio *folio; - pgoff_t last; - bool good =3D rdata->result =3D=3D 0 || (rdata->result =3D=3D -EAGAIN && = rdata->got_bytes); - - XA_STATE(xas, &rdata->mapping->i_pages, rdata->subreq.start / PAGE_SIZE); - - if (good) - cifs_readahead_to_fscache(rdata->mapping->host, - rdata->subreq.start, rdata->subreq.len); - - if (iov_iter_count(&rdata->subreq.io_iter) > 0) - iov_iter_zero(iov_iter_count(&rdata->subreq.io_iter), &rdata->subreq.io_= iter); - - last =3D (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE; - - rcu_read_lock(); - xas_for_each(&xas, folio, last) { - if (good) { - flush_dcache_folio(folio); - folio_mark_uptodate(folio); - } - folio_unlock(folio); - } - rcu_read_unlock(); - - cifs_put_readdata(rdata); -} - -static void cifs_readahead(struct readahead_control *ractl) -{ - struct cifsFileInfo *open_file =3D ractl->file->private_data; - struct cifs_sb_info *cifs_sb =3D CIFS_FILE_SB(ractl->file); - struct TCP_Server_Info *server; - unsigned int xid, nr_pages, cache_nr_pages =3D 0; - unsigned int ra_pages; - pgoff_t next_cached =3D ULONG_MAX, ra_index; - bool caching =3D fscache_cookie_enabled(cifs_inode_cookie(ractl->mapping-= >host)) && - cifs_inode_cookie(ractl->mapping->host)->cache_priv; - bool check_cache =3D caching; - pid_t pid; - int rc =3D 0; - - /* Note that readahead_count() lags behind our dequeuing of pages from - * the ractl, wo we have to keep track for ourselves. - */ - ra_pages =3D readahead_count(ractl); - ra_index =3D readahead_index(ractl); - - xid =3D get_xid(); - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid =3D open_file->pid; - else - pid =3D current->tgid; - - server =3D cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - - cifs_dbg(FYI, "%s: file=3D%p mapping=3D%p num_pages=3D%u\n", - __func__, ractl->file, ractl->mapping, ra_pages); - - /* - * Chop the readahead request up into rsize-sized read requests. - */ - while ((nr_pages =3D ra_pages)) { - unsigned int i; - struct cifs_io_subrequest *rdata; - struct cifs_credits credits_on_stack; - struct cifs_credits *credits =3D &credits_on_stack; - struct folio *folio; - pgoff_t fsize; - size_t rsize; - - /* - * Find out if we have anything cached in the range of - * interest, and if so, where the next chunk of cached data is. - */ - if (caching) { - if (check_cache) { - rc =3D cifs_fscache_query_occupancy( - ractl->mapping->host, ra_index, nr_pages, - &next_cached, &cache_nr_pages); - if (rc < 0) - caching =3D false; - check_cache =3D false; - } - - if (ra_index =3D=3D next_cached) { - /* - * TODO: Send a whole batch of pages to be read - * by the cache. - */ - folio =3D readahead_folio(ractl); - fsize =3D folio_nr_pages(folio); - ra_pages -=3D fsize; - ra_index +=3D fsize; - if (cifs_readpage_from_fscache(ractl->mapping->host, - &folio->page) < 0) { - /* - * TODO: Deal with cache read failure - * here, but for the moment, delegate - * that to readpage. - */ - caching =3D false; - } - folio_unlock(folio); - next_cached +=3D fsize; - cache_nr_pages -=3D fsize; - if (cache_nr_pages =3D=3D 0) - check_cache =3D true; - continue; - } - } - - if (open_file->invalidHandle) { - rc =3D cifs_reopen_file(open_file, true); - if (rc) { - if (rc =3D=3D -EAGAIN) - continue; - break; - } - } - - if (cifs_sb->ctx->rsize =3D=3D 0) - cifs_sb->ctx->rsize =3D - server->ops->negotiate_rsize(tlink_tcon(open_file->tlink), - cifs_sb->ctx); - - rc =3D server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, - &rsize, credits); - if (rc) - break; - nr_pages =3D min_t(size_t, rsize / PAGE_SIZE, ra_pages); - if (next_cached !=3D ULONG_MAX) - nr_pages =3D min_t(size_t, nr_pages, next_cached - ra_index); - - /* - * Give up immediately if rsize is too small to read an entire - * page. The VFS will fall back to readpage. We should never - * reach this point however since we set ra_pages to 0 when the - * rsize is smaller than a cache page. - */ - if (unlikely(!nr_pages)) { - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata =3D cifs_readdata_alloc(cifs_readahead_complete); - if (!rdata) { - /* best to give up if we're out of mem */ - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata->subreq.start =3D ra_index * PAGE_SIZE; - rdata->subreq.len =3D nr_pages * PAGE_SIZE; - rdata->cfile =3D cifsFileInfo_get(open_file); - rdata->server =3D server; - rdata->mapping =3D ractl->mapping; - rdata->pid =3D pid; - rdata->credits =3D credits_on_stack; - - for (i =3D 0; i < nr_pages; i++) { - if (!readahead_folio(ractl)) - WARN_ON(1); - } - ra_pages -=3D nr_pages; - ra_index +=3D nr_pages; - - iov_iter_xarray(&rdata->subreq.io_iter, ITER_DEST, &rdata->mapping->i_pa= ges, - rdata->subreq.start, rdata->subreq.len); - - rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); - if (!rc) { - if (rdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else - rc =3D server->ops->async_readv(rdata); - } - - if (rc) { - add_credits_and_wake_if(server, &rdata->credits, 0); - cifs_unlock_folios(rdata->mapping, - rdata->subreq.start / PAGE_SIZE, - (rdata->subreq.start + rdata->subreq.len - 1) / PAGE_SIZE); - /* Fallback to the readpage in error/reconnect cases */ - cifs_put_readdata(rdata); - break; - } - - cifs_put_readdata(rdata); - } - - free_xid(xid); -} - -/* - * cifs_readpage_worker must be called with the page pinned - */ -static int cifs_readpage_worker(struct file *file, struct page *page, - loff_t *poffset) -{ - struct inode *inode =3D file_inode(file); - struct timespec64 atime, mtime; - char *read_data; - int rc; - - /* Is the page cached? */ - rc =3D cifs_readpage_from_fscache(inode, page); - if (rc =3D=3D 0) - goto read_complete; - - read_data =3D kmap(page); - /* for reads over a certain size could initiate async read ahead */ - - rc =3D cifs_read(file, read_data, PAGE_SIZE, poffset); - - if (rc < 0) - goto io_error; - else - cifs_dbg(FYI, "Bytes read %d\n", rc); - - /* we do not want atime to be less than mtime, it broke some apps */ - atime =3D inode_set_atime_to_ts(inode, current_time(inode)); - mtime =3D inode_get_mtime(inode); - if (timespec64_compare(&atime, &mtime) < 0) - inode_set_atime_to_ts(inode, inode_get_mtime(inode)); - - if (PAGE_SIZE > rc) - memset(read_data + rc, 0, PAGE_SIZE - rc); - - flush_dcache_page(page); - SetPageUptodate(page); - rc =3D 0; - -io_error: - kunmap(page); - -read_complete: - unlock_page(page); - return rc; -} - -static int cifs_read_folio(struct file *file, struct folio *folio) -{ - struct page *page =3D &folio->page; - loff_t offset =3D page_file_offset(page); - int rc =3D -EACCES; - unsigned int xid; - - xid =3D get_xid(); - - if (file->private_data =3D=3D NULL) { - rc =3D -EBADF; - free_xid(xid); - return rc; - } - - cifs_dbg(FYI, "read_folio %p at offset %d 0x%x\n", - page, (int)offset, (int)offset); - - rc =3D cifs_readpage_worker(file, page, &offset); - - free_xid(xid); - return rc; -} -#endif // end netfslib remove 4794 - static int is_inode_writable(struct cifsInodeInfo *cifs_inode) { struct cifsFileInfo *open_file; @@ -5112,104 +4612,6 @@ bool is_size_safe_to_change(struct cifsInodeInfo *c= ifsInode, __u64 end_of_file, return true; } =20 -#if 0 // TODO remove 5152 -static int cifs_write_begin(struct file *file, struct address_space *mappi= ng, - loff_t pos, unsigned len, - struct page **pagep, void **fsdata) -{ - int oncethru =3D 0; - pgoff_t index =3D pos >> PAGE_SHIFT; - loff_t offset =3D pos & (PAGE_SIZE - 1); - loff_t page_start =3D pos & PAGE_MASK; - loff_t i_size; - struct page *page; - int rc =3D 0; - - cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len); - -start: - page =3D grab_cache_page_write_begin(mapping, index); - if (!page) { - rc =3D -ENOMEM; - goto out; - } - - if (PageUptodate(page)) - goto out; - - /* - * If we write a full page it will be up to date, no need to read from - * the server. If the write is short, we'll end up doing a sync write - * instead. - */ - if (len =3D=3D PAGE_SIZE) - goto out; - - /* - * optimize away the read when we have an oplock, and we're not - * expecting to use any of the data we'd be reading in. That - * is, when the page lies beyond the EOF, or straddles the EOF - * and the write will cover all of the existing data. - */ - if (CIFS_CACHE_READ(CIFS_I(mapping->host))) { - i_size =3D i_size_read(mapping->host); - if (page_start >=3D i_size || - (offset =3D=3D 0 && (pos + len) >=3D i_size)) { - zero_user_segments(page, 0, offset, - offset + len, - PAGE_SIZE); - /* - * PageChecked means that the parts of the page - * to which we're not writing are considered up - * to date. Once the data is copied to the - * page, it can be set uptodate. - */ - SetPageChecked(page); - goto out; - } - } - - if ((file->f_flags & O_ACCMODE) !=3D O_WRONLY && !oncethru) { - /* - * might as well read a page, it is fast enough. If we get - * an error, we don't need to return it. cifs_write_end will - * do a sync write instead since PG_uptodate isn't set. - */ - cifs_readpage_worker(file, page, &page_start); - put_page(page); - oncethru =3D 1; - goto start; - } else { - /* we could try using another file handle if there is one - - but how would we lock it to prevent close of that handle - racing with this read? In any case - this will be written out by write_end so is fine */ - } -out: - *pagep =3D page; - return rc; -} - -static bool cifs_release_folio(struct folio *folio, gfp_t gfp) -{ - if (folio_test_private(folio)) - return 0; - if (folio_test_private_2(folio)) { /* [DEPRECATED] */ - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_private_2(folio); - } - fscache_note_page_release(cifs_inode_cookie(folio->mapping->host)); - return true; -} - -static void cifs_invalidate_folio(struct folio *folio, size_t offset, - size_t length) -{ - folio_wait_private_2(folio); /* [DEPRECATED] */ -} -#endif // end netfslib remove 5152 - void cifs_oplock_break(struct work_struct *work) { struct cifsFileInfo *cfile =3D container_of(work, struct cifsFileInfo, @@ -5299,27 +4701,6 @@ void cifs_oplock_break(struct work_struct *work) cifs_done_oplock_break(cinode); } =20 -#if 0 // TODO remove 5333 -/* - * The presence of cifs_direct_io() in the address space ops vector - * allowes open() O_DIRECT flags which would have failed otherwise. - * - * In the non-cached mode (mount with cache=3Dnone), we shunt off direct r= ead and write requests - * so this method should never be called. - * - * Direct IO is not yet supported in the cached mode. - */ -static ssize_t -cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter) -{ - /* - * FIXME - * Eventually need to support direct IO for non forcedirectio moun= ts - */ - return -EINVAL; -} -#endif // netfs end remove 5333 - static int cifs_swap_activate(struct swap_info_struct *sis, struct file *swap_file, sector_t *span) { diff --git a/fs/smb/client/fscache.c b/fs/smb/client/fscache.c index 7aa1d633c027..147e8cd38fe1 100644 --- a/fs/smb/client/fscache.c +++ b/fs/smb/client/fscache.c @@ -150,114 +150,3 @@ void cifs_fscache_release_inode_cookie(struct inode *= inode) cifsi->netfs.cache =3D NULL; } } - -#if 0 // TODO remove -/* - * Fallback page reading interface. - */ -static int fscache_fallback_read_page(struct inode *inode, struct page *pa= ge) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie =3D cifs_inode_cookie(inode); - struct iov_iter iter; - struct bio_vec bvec; - int ret; - - memset(&cres, 0, sizeof(cres)); - bvec_set_page(&bvec, page, PAGE_SIZE, 0); - iov_iter_bvec(&iter, ITER_DEST, &bvec, 1, PAGE_SIZE); - - ret =3D fscache_begin_read_operation(&cres, cookie); - if (ret < 0) - return ret; - - ret =3D fscache_read(&cres, page_offset(page), &iter, NETFS_READ_HOLE_FAI= L, - NULL, NULL); - fscache_end_operation(&cres); - return ret; -} - -/* - * Fallback page writing interface. - */ -static int fscache_fallback_write_pages(struct inode *inode, loff_t start,= size_t len, - bool no_space_allocated_yet) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie =3D cifs_inode_cookie(inode); - struct iov_iter iter; - int ret; - - memset(&cres, 0, sizeof(cres)); - iov_iter_xarray(&iter, ITER_SOURCE, &inode->i_mapping->i_pages, start, le= n); - - ret =3D fscache_begin_write_operation(&cres, cookie); - if (ret < 0) - return ret; - - ret =3D cres.ops->prepare_write(&cres, &start, &len, len, i_size_read(ino= de), - no_space_allocated_yet); - if (ret =3D=3D 0) - ret =3D fscache_write(&cres, start, &iter, NULL, NULL); - fscache_end_operation(&cres); - return ret; -} - -/* - * Retrieve a page from FS-Cache - */ -int __cifs_readpage_from_fscache(struct inode *inode, struct page *page) -{ - int ret; - - cifs_dbg(FYI, "%s: (fsc:%p, p:%p, i:0x%p\n", - __func__, cifs_inode_cookie(inode), page, inode); - - ret =3D fscache_fallback_read_page(inode, page); - if (ret < 0) - return ret; - - /* Read completed synchronously */ - SetPageUptodate(page); - return 0; -} - -void __cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t l= en) -{ - cifs_dbg(FYI, "%s: (fsc: %p, p: %llx, l: %zx, i: %p)\n", - __func__, cifs_inode_cookie(inode), pos, len, inode); - - fscache_fallback_write_pages(inode, pos, len, true); -} - -/* - * Query the cache occupancy. - */ -int __cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - struct netfs_cache_resources cres; - struct fscache_cookie *cookie =3D cifs_inode_cookie(inode); - loff_t start, data_start; - size_t len, data_len; - int ret; - - ret =3D fscache_begin_read_operation(&cres, cookie); - if (ret < 0) - return ret; - - start =3D first * PAGE_SIZE; - len =3D nr_pages * PAGE_SIZE; - ret =3D cres.ops->query_occupancy(&cres, start, len, PAGE_SIZE, - &data_start, &data_len); - if (ret =3D=3D 0) { - *_data_first =3D data_start / PAGE_SIZE; - *_data_nr_pages =3D len / PAGE_SIZE; - } - - fscache_end_operation(&cres); - return ret; -} -#endif diff --git a/fs/smb/client/fscache.h b/fs/smb/client/fscache.h index 08b30f79d4cd..f06cb24f5f3c 100644 --- a/fs/smb/client/fscache.h +++ b/fs/smb/client/fscache.h @@ -74,43 +74,6 @@ static inline void cifs_invalidate_cache(struct inode *i= node, unsigned int flags i_size_read(inode), flags); } =20 -#if 0 // TODO remove -extern int __cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages); - -static inline int cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - if (!cifs_inode_cookie(inode)) - return -ENOBUFS; - return __cifs_fscache_query_occupancy(inode, first, nr_pages, - _data_first, _data_nr_pages); -} - -extern int __cifs_readpage_from_fscache(struct inode *pinode, struct page = *ppage); -extern void __cifs_readahead_to_fscache(struct inode *pinode, loff_t pos, = size_t len); - - -static inline int cifs_readpage_from_fscache(struct inode *inode, - struct page *page) -{ - if (cifs_inode_cookie(inode)) - return __cifs_readpage_from_fscache(inode, page); - return -ENOBUFS; -} - -static inline void cifs_readahead_to_fscache(struct inode *inode, - loff_t pos, size_t len) -{ - if (cifs_inode_cookie(inode)) - __cifs_readahead_to_fscache(inode, pos, len); -} -#endif - static inline bool cifs_fscache_enabled(struct inode *inode) { return fscache_cookie_enabled(cifs_inode_cookie(inode)); @@ -133,27 +96,6 @@ static inline struct fscache_cookie *cifs_inode_cookie(= struct inode *inode) { re static inline void cifs_invalidate_cache(struct inode *inode, unsigned int= flags) {} static inline bool cifs_fscache_enabled(struct inode *inode) { return fals= e; } =20 -#if 0 // TODO remove -static inline int cifs_fscache_query_occupancy(struct inode *inode, - pgoff_t first, unsigned int nr_pages, - pgoff_t *_data_first, - unsigned int *_data_nr_pages) -{ - *_data_first =3D ULONG_MAX; - *_data_nr_pages =3D 0; - return -ENOBUFS; -} - -static inline int -cifs_readpage_from_fscache(struct inode *inode, struct page *page) -{ - return -ENOBUFS; -} - -static inline -void cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len= ) {} -#endif - #endif /* CONFIG_CIFS_FSCACHE */ =20 #endif /* _CIFS_FSCACHE_H */ From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 6757712F397 for ; Thu, 28 Mar 2024 17:00:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645261; cv=none; b=NSbr/hjrMGH1KxVAJw5dYjbkcw8PMAIwSQLI8oVxvXugN/dD4ScpsS8H4nL8uYK2idAaFpUGuB65NtdB+5naOXhfHD5CIP9+LrYM6Su2TMdqSPl6HDaGcDbDl0mf8meYeHxiz5avaivrkR6/bpdao02C2IWl+RvwnkD4c+yyhTw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645261; c=relaxed/simple; bh=XFDza5oM3WqDd2pWmoZL1oJgsBI07i6RvS39pePp1hM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OPTeTA7LMy7EGQSiim51xvvYfgrMi7+o3hY9H8RjzgDVNfbHV6vpKg704PFLDD9n48CdU2zCHJ3vLbnnkgF/CUf6EyRLLIka7mnN+HpPJpaQY5G1dFLxcX4FaAOVawixVxcZRWFhq6T1VgkFSF8jg1cvf2wSZyIQGdBWlI0wsC4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Np5NPjJZ; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Np5NPjJZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645258; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RZ3qln56R8gz/TyHMxIA9wp5yFVEOQhmfIt5qbtPW8s=; b=Np5NPjJZc1o/pJTHbhq5gMSa+WtCFnyQ/1Mdp4luaAeDJpC+0jsgZfr483J53nWlG9lQPz lFBbnN1AkrOIjDSxbjTlmva4B4AehskaQRRPJjnOY/m0PckAIgHtxPpQwtEW2o+Pwh68K5 XpBB2vdCQ7rjXTAxdIiBdXAyPVDv6kE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-671-XwmHA-YGNhOtYolac14NJQ-1; Thu, 28 Mar 2024 13:00:56 -0400 X-MC-Unique: XwmHA-YGNhOtYolac14NJQ-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 667E2101CC6D; Thu, 28 Mar 2024 17:00:55 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 69129200A384; Thu, 28 Mar 2024 17:00:53 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 14/15] cifs: Remove some code that's no longer used, part 2 Date: Thu, 28 Mar 2024 16:58:05 +0000 Message-ID: <20240328165845.2782259-15-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.4 Content-Type: text/plain; charset="utf-8" Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 634 +------------------------------------------ 1 file changed, 1 insertion(+), 633 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 265d96f663d7..f45a830154d5 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2569,639 +2569,6 @@ cifs_get_readable_path(struct cifs_tcon *tcon, cons= t char *name, return -ENOENT; } =20 -#if 0 // TODO remove 2773 -void -cifs_writedata_release(struct cifs_io_subrequest *wdata) -{ - if (wdata->uncached) - kref_put(&wdata->ctx->refcount, cifs_aio_ctx_release); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (wdata->mr) { - smbd_deregister_mr(wdata->mr); - wdata->mr =3D NULL; - } -#endif - - if (wdata->cfile) - cifsFileInfo_put(wdata->cfile); - - kfree(wdata); -} - -/* - * Write failed with a retryable error. Resend the write request. It's also - * possible that the page was redirtied so re-clean the page. - */ -static void -cifs_writev_requeue(struct cifs_io_subrequest *wdata) -{ - int rc =3D 0; - struct inode *inode =3D d_inode(wdata->cfile->dentry); - struct TCP_Server_Info *server; - unsigned int rest_len =3D wdata->subreq.len; - loff_t fpos =3D wdata->subreq.start; - - server =3D tlink_tcon(wdata->cfile->tlink)->ses->server; - do { - struct cifs_io_subrequest *wdata2; - unsigned int wsize, cur_len; - - wsize =3D server->ops->wp_retry_size(inode); - if (wsize < rest_len) { - if (wsize < PAGE_SIZE) { - rc =3D -EOPNOTSUPP; - break; - } - cur_len =3D min(round_down(wsize, PAGE_SIZE), rest_len); - } else { - cur_len =3D rest_len; - } - - wdata2 =3D cifs_writedata_alloc(cifs_writev_complete); - if (!wdata2) { - rc =3D -ENOMEM; - break; - } - - wdata2->sync_mode =3D wdata->sync_mode; - wdata2->subreq.start =3D fpos; - wdata2->subreq.len =3D cur_len; - wdata2->subreq.io_iter =3D wdata->subreq.io_iter; - - iov_iter_advance(&wdata2->subreq.io_iter, fpos - wdata->subreq.start); - iov_iter_truncate(&wdata2->subreq.io_iter, wdata2->subreq.len); - - if (iov_iter_is_xarray(&wdata2->subreq.io_iter)) - /* Check for pages having been redirtied and clean - * them. We can do this by walking the xarray. If - * it's not an xarray, then it's a DIO and we shouldn't - * be mucking around with the page bits. - */ - cifs_undirty_folios(inode, fpos, cur_len); - - rc =3D cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, - &wdata2->cfile); - if (!wdata2->cfile) { - cifs_dbg(VFS, "No writable handle to retry writepages rc=3D%d\n", - rc); - if (!is_retryable_error(rc)) - rc =3D -EBADF; - } else { - wdata2->pid =3D wdata2->cfile->pid; - rc =3D server->ops->async_writev(wdata2); - } - - cifs_put_writedata(wdata2); - if (rc) { - if (is_retryable_error(rc)) - continue; - fpos +=3D cur_len; - rest_len -=3D cur_len; - break; - } - - fpos +=3D cur_len; - rest_len -=3D cur_len; - } while (rest_len > 0); - - /* Clean up remaining pages from the original wdata */ - if (iov_iter_is_xarray(&wdata->subreq.io_iter)) - cifs_pages_write_failed(inode, fpos, rest_len); - - if (rc !=3D 0 && !is_retryable_error(rc)) - mapping_set_error(inode->i_mapping, rc); - cifs_put_writedata(wdata); -} - -void -cifs_writev_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *wdata =3D container_of(work, - struct cifs_io_subrequest, work); - struct inode *inode =3D d_inode(wdata->cfile->dentry); - - if (wdata->result =3D=3D 0) { - spin_lock(&inode->i_lock); - cifs_update_eof(CIFS_I(inode), wdata->subreq.start, wdata->subreq.len); - spin_unlock(&inode->i_lock); - cifs_stats_bytes_written(tlink_tcon(wdata->cfile->tlink), - wdata->subreq.len); - } else if (wdata->sync_mode =3D=3D WB_SYNC_ALL && wdata->result =3D=3D -E= AGAIN) - return cifs_writev_requeue(wdata); - - if (wdata->result =3D=3D -EAGAIN) - cifs_pages_write_redirty(inode, wdata->subreq.start, wdata->subreq.len); - else if (wdata->result < 0) - cifs_pages_write_failed(inode, wdata->subreq.start, wdata->subreq.len); - else - cifs_pages_written_back(inode, wdata->subreq.start, wdata->subreq.len); - - if (wdata->result !=3D -EAGAIN) - mapping_set_error(inode->i_mapping, wdata->result); - cifs_put_writedata(wdata); -} - -struct cifs_io_subrequest *cifs_writedata_alloc(work_func_t complete) -{ - struct cifs_io_subrequest *wdata; - - wdata =3D kzalloc(sizeof(*wdata), GFP_NOFS); - if (wdata !=3D NULL) { - refcount_set(&wdata->subreq.ref, 1); - INIT_LIST_HEAD(&wdata->list); - init_completion(&wdata->done); - INIT_WORK(&wdata->work, complete); - } - return wdata; -} - -/* - * Extend the region to be written back to include subsequent contiguously - * dirty pages if possible, but don't sleep while doing so. - */ -static void cifs_extend_writeback(struct address_space *mapping, - struct xa_state *xas, - long *_count, - loff_t start, - int max_pages, - loff_t max_len, - size_t *_len) -{ - struct folio_batch batch; - struct folio *folio; - unsigned int nr_pages; - pgoff_t index =3D (start + *_len) / PAGE_SIZE; - size_t len; - bool stop =3D true; - unsigned int i; - - folio_batch_init(&batch); - - do { - /* Firstly, we gather up a batch of contiguous dirty pages - * under the RCU read lock - but we can't clear the dirty flags - * there if any of those pages are mapped. - */ - rcu_read_lock(); - - xas_for_each(xas, folio, ULONG_MAX) { - stop =3D true; - if (xas_retry(xas, folio)) - continue; - if (xa_is_value(folio)) - break; - if (folio->index !=3D index) { - xas_reset(xas); - break; - } - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - nr_pages =3D folio_nr_pages(folio); - if (nr_pages > max_pages) { - xas_reset(xas); - break; - } - - /* Has the page moved or been split? */ - if (unlikely(folio !=3D xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - break; - } - - if (!folio_trylock(folio)) { - folio_put(folio); - xas_reset(xas); - break; - } - if (!folio_test_dirty(folio) || - folio_test_writeback(folio)) { - folio_unlock(folio); - folio_put(folio); - xas_reset(xas); - break; - } - - max_pages -=3D nr_pages; - len =3D folio_size(folio); - stop =3D false; - - index +=3D nr_pages; - *_count -=3D nr_pages; - *_len +=3D len; - if (max_pages <=3D 0 || *_len >=3D max_len || *_count <=3D 0) - stop =3D true; - - if (!folio_batch_add(&batch, folio)) - break; - if (stop) - break; - } - - xas_pause(xas); - rcu_read_unlock(); - - /* Now, if we obtained any pages, we can shift them to being - * writable and mark them for caching. - */ - if (!folio_batch_count(&batch)) - break; - - for (i =3D 0; i < folio_batch_count(&batch); i++) { - folio =3D batch.folios[i]; - /* The folio should be locked, dirty and not undergoing - * writeback from the loop above. - */ - if (!folio_clear_dirty_for_io(folio)) - WARN_ON(1); - folio_start_writeback(folio); - folio_unlock(folio); - } - - folio_batch_release(&batch); - cond_resched(); - } while (!stop); -} - -/* - * Write back the locked page and any subsequent non-locked dirty pages. - */ -static ssize_t cifs_write_back_from_locked_folio(struct address_space *map= ping, - struct writeback_control *wbc, - struct xa_state *xas, - struct folio *folio, - unsigned long long start, - unsigned long long end) -{ - struct inode *inode =3D mapping->host; - struct TCP_Server_Info *server; - struct cifs_io_subrequest *wdata; - struct cifs_sb_info *cifs_sb =3D CIFS_SB(inode->i_sb); - struct cifs_credits credits_on_stack; - struct cifs_credits *credits =3D &credits_on_stack; - struct cifsFileInfo *cfile =3D NULL; - unsigned long long i_size =3D i_size_read(inode), max_len; - unsigned int xid; - size_t wsize; - size_t len =3D folio_size(folio); - long count =3D wbc->nr_to_write; - int rc; - - /* The folio should be locked, dirty and not undergoing writeback. */ - if (!folio_clear_dirty_for_io(folio)) - WARN_ON_ONCE(1); - folio_start_writeback(folio); - - count -=3D folio_nr_pages(folio); - - xid =3D get_xid(); - server =3D cifs_pick_channel(cifs_sb_master_tcon(cifs_sb)->ses); - - rc =3D cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, &cfile); - if (rc) { - cifs_dbg(VFS, "No writable handle in writepages rc=3D%d\n", rc); - goto err_xid; - } - - rc =3D server->ops->wait_mtu_credits(server, cifs_sb->ctx->wsize, - &wsize, credits); - if (rc !=3D 0) - goto err_close; - - wdata =3D cifs_writedata_alloc(cifs_writev_complete); - if (!wdata) { - rc =3D -ENOMEM; - goto err_uncredit; - } - - wdata->sync_mode =3D wbc->sync_mode; - wdata->subreq.start =3D folio_pos(folio); - wdata->pid =3D cfile->pid; - wdata->credits =3D credits_on_stack; - wdata->cfile =3D cfile; - wdata->server =3D server; - cfile =3D NULL; - - /* Find all consecutive lockable dirty pages that have contiguous - * written regions, stopping when we find a page that is not - * immediately lockable, is not dirty or is missing, or we reach the - * end of the range. - */ - if (start < i_size) { - /* Trim the write to the EOF; the extra data is ignored. Also - * put an upper limit on the size of a single storedata op. - */ - max_len =3D wsize; - max_len =3D min_t(unsigned long long, max_len, end - start + 1); - max_len =3D min_t(unsigned long long, max_len, i_size - start); - - if (len < max_len) { - int max_pages =3D INT_MAX; - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_pages =3D server->smbd_conn->max_frmr_depth; -#endif - max_pages -=3D folio_nr_pages(folio); - - if (max_pages > 0) - cifs_extend_writeback(mapping, xas, &count, start, - max_pages, max_len, &len); - } - } - len =3D min_t(unsigned long long, len, i_size - start); - - /* We now have a contiguous set of dirty pages, each with writeback - * set; the first page is still locked at this point, but all the rest - * have been unlocked. - */ - folio_unlock(folio); - wdata->subreq.len =3D len; - - if (start < i_size) { - iov_iter_xarray(&wdata->subreq.io_iter, ITER_SOURCE, &mapping->i_pages, - start, len); - - rc =3D adjust_credits(wdata->server, &wdata->credits, wdata->subreq.len); - if (rc) - goto err_wdata; - - if (wdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else - rc =3D wdata->server->ops->async_writev(wdata); - if (rc >=3D 0) { - cifs_put_writedata(wdata); - goto err_close; - } - } else { - /* The dirty region was entirely beyond the EOF. */ - cifs_pages_written_back(inode, start, len); - rc =3D 0; - } - -err_wdata: - cifs_put_writedata(wdata); -err_uncredit: - add_credits_and_wake_if(server, credits, 0); -err_close: - if (cfile) - cifsFileInfo_put(cfile); -err_xid: - free_xid(xid); - if (rc =3D=3D 0) { - wbc->nr_to_write =3D count; - rc =3D len; - } else if (is_retryable_error(rc)) { - cifs_pages_write_redirty(inode, start, len); - } else { - cifs_pages_write_failed(inode, start, len); - mapping_set_error(mapping, rc); - } - /* Indication to update ctime and mtime as close is deferred */ - set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); - return rc; -} - -/* - * write a region of pages back to the server - */ -static ssize_t cifs_writepages_begin(struct address_space *mapping, - struct writeback_control *wbc, - struct xa_state *xas, - unsigned long long *_start, - unsigned long long end) -{ - struct folio *folio; - unsigned long long start =3D *_start; - ssize_t ret; - int skips =3D 0; - -search_again: - /* Find the first dirty page. */ - rcu_read_lock(); - - for (;;) { - folio =3D xas_find_marked(xas, end / PAGE_SIZE, PAGECACHE_TAG_DIRTY); - if (xas_retry(xas, folio) || xa_is_value(folio)) - continue; - if (!folio) - break; - - if (!folio_try_get_rcu(folio)) { - xas_reset(xas); - continue; - } - - if (unlikely(folio !=3D xas_reload(xas))) { - folio_put(folio); - xas_reset(xas); - continue; - } - - xas_pause(xas); - break; - } - rcu_read_unlock(); - if (!folio) - return 0; - - start =3D folio_pos(folio); /* May regress with THPs */ - - /* At this point we hold neither the i_pages lock nor the page lock: - * the page may be truncated or invalidated (changing page->mapping to - * NULL), or even swizzled back from swapper_space to tmpfs file - * mapping - */ -lock_again: - if (wbc->sync_mode !=3D WB_SYNC_NONE) { - ret =3D folio_lock_killable(folio); - if (ret < 0) - return ret; - } else { - if (!folio_trylock(folio)) - goto search_again; - } - - if (folio->mapping !=3D mapping || - !folio_test_dirty(folio)) { - start +=3D folio_size(folio); - folio_unlock(folio); - goto search_again; - } - - if (folio_test_writeback(folio) || - folio_test_private_2(folio)) { /* [DEPRECATED] */ - folio_unlock(folio); - if (wbc->sync_mode !=3D WB_SYNC_NONE) { - folio_wait_writeback(folio); -#ifdef CONFIG_CIFS_FSCACHE - folio_wait_private_2(folio); -#endif - goto lock_again; - } - - start +=3D folio_size(folio); - if (wbc->sync_mode =3D=3D WB_SYNC_NONE) { - if (skips >=3D 5 || need_resched()) { - ret =3D 0; - goto out; - } - skips++; - } - goto search_again; - } - - ret =3D cifs_write_back_from_locked_folio(mapping, wbc, xas, folio, start= , end); -out: - if (ret > 0) - *_start =3D start + ret; - return ret; -} - -/* - * Write a region of pages back to the server - */ -static int cifs_writepages_region(struct address_space *mapping, - struct writeback_control *wbc, - unsigned long long *_start, - unsigned long long end) -{ - ssize_t ret; - - XA_STATE(xas, &mapping->i_pages, *_start / PAGE_SIZE); - - do { - ret =3D cifs_writepages_begin(mapping, wbc, &xas, _start, end); - if (ret > 0 && wbc->nr_to_write > 0) - cond_resched(); - } while (ret > 0 && wbc->nr_to_write > 0); - - return ret > 0 ? 0 : ret; -} - -/* - * Write some of the pending data back to the server - */ -static int cifs_writepages(struct address_space *mapping, - struct writeback_control *wbc) -{ - loff_t start, end; - int ret; - - /* We have to be careful as we can end up racing with setattr() - * truncating the pagecache since the caller doesn't take a lock here - * to prevent it. - */ - - if (wbc->range_cyclic && mapping->writeback_index) { - start =3D mapping->writeback_index * PAGE_SIZE; - ret =3D cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); - if (ret < 0) - goto out; - - if (wbc->nr_to_write <=3D 0) { - mapping->writeback_index =3D start / PAGE_SIZE; - goto out; - } - - start =3D 0; - end =3D mapping->writeback_index * PAGE_SIZE; - mapping->writeback_index =3D 0; - ret =3D cifs_writepages_region(mapping, wbc, &start, end); - if (ret =3D=3D 0) - mapping->writeback_index =3D start / PAGE_SIZE; - } else if (wbc->range_start =3D=3D 0 && wbc->range_end =3D=3D LLONG_MAX) { - start =3D 0; - ret =3D cifs_writepages_region(mapping, wbc, &start, LLONG_MAX); - if (wbc->nr_to_write > 0 && ret =3D=3D 0) - mapping->writeback_index =3D start / PAGE_SIZE; - } else { - start =3D wbc->range_start; - ret =3D cifs_writepages_region(mapping, wbc, &start, wbc->range_end); - } - -out: - return ret; -} - -static int cifs_write_end(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, unsigned copied, - struct page *page, void *fsdata) -{ - int rc; - struct inode *inode =3D mapping->host; - struct cifsFileInfo *cfile =3D file->private_data; - struct cifs_sb_info *cifs_sb =3D CIFS_SB(cfile->dentry->d_sb); - struct folio *folio =3D page_folio(page); - __u32 pid; - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid =3D cfile->pid; - else - pid =3D current->tgid; - - cifs_dbg(FYI, "write_end for page %p from pos %lld with %d bytes\n", - page, pos, copied); - - if (folio_test_checked(folio)) { - if (copied =3D=3D len) - folio_mark_uptodate(folio); - folio_clear_checked(folio); - } else if (!folio_test_uptodate(folio) && copied =3D=3D PAGE_SIZE) - folio_mark_uptodate(folio); - - if (!folio_test_uptodate(folio)) { - char *page_data; - unsigned offset =3D pos & (PAGE_SIZE - 1); - unsigned int xid; - - xid =3D get_xid(); - /* this is probably better than directly calling - partialpage_write since in this function the file handle is - known which we might as well leverage */ - /* BB check if anything else missing out of ppw - such as updating last write time */ - page_data =3D kmap(page); - rc =3D cifs_write(cfile, pid, page_data + offset, copied, &pos); - /* if (rc < 0) should we set writebehind rc? */ - kunmap(page); - - free_xid(xid); - } else { - rc =3D copied; - pos +=3D copied; - set_page_dirty(page); - } - - if (rc > 0) { - spin_lock(&inode->i_lock); - if (pos > inode->i_size) { - loff_t additional_blocks =3D (512 - 1 + copied) >> 9; - - i_size_write(inode, pos); - /* - * Estimate new allocation size based on the amount written. - * This will be updated from server on close (and on queryinfo) - */ - inode->i_blocks =3D min_t(blkcnt_t, (512 - 1 + pos) >> 9, - inode->i_blocks + additional_blocks); - } - spin_unlock(&inode->i_lock); - } - - unlock_page(page); - put_page(page); - /* Indication to update ctime and mtime as close is deferred */ - set_bit(CIFS_INO_MODIFIED_ATTR, &CIFS_I(inode)->flags); - - return rc; -} -#endif // End netfs removal 2773 - /* * Flush data on a strict file. */ @@ -4517,6 +3884,7 @@ cifs_read(struct file *file, char *read_data, size_t = read_size, loff_t *offset) } #endif // end netfslib remove 4633 =20 + static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { return netfs_page_mkwrite(vmf, NULL); From nobody Sun Feb 8 21:27:35 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 5E56855E40 for ; Thu, 28 Mar 2024 17:01:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645271; cv=none; b=hG182r7u0+ISRuOcgDyr3xt9aOo6y3IrUnmQ2H/7FHeSa8napOe7g4vcA3cc26X1hRvDl4q5jmb+ir+LbjXnhqpMVJ3h8HAYFLTWQ79wj/Ab2KGLg37MkcRAOmHrHybhgtexVtBYIijp1xAq2poapKw5xBKqgISnP7rRDdyksxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711645271; c=relaxed/simple; bh=VGs8ja5GwjxmZ5EVi44FlS6TBLZZNOUfZ6RA35KHVV8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UV8QcwcwNw8jrYzzPOEggRrrlORVAYotRr+yfWppAAZ7XqOyilYAvqIZQ4YGhT6LMMIgd5kUELVWLqXQBhYK6lEs+y/U+M8nZXDL6tBs4QMD7IHjfiBEdDc2nDqbAzXJXXocVa4Oar/YpZqAwSGu8FwmTkbW4QA8YTSrCYQNEu4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=BcEZ6GzQ; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BcEZ6GzQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1711645268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jo7uYCFZb0k9CRxsF6IJiNp1HzqNyAx2CaunUXnKfyQ=; b=BcEZ6GzQ60z5OO0bLJY6HQ0172/PSNmwmW+Rb7Rujmt4yjYWG+s2Ts6P63aRs6TlVirkpe S/HHpuYamzKoEzOR7EdMgX8Nia1C1mjeXc9HD45WL2C9dIQjXIXujFYaNnrmUBg0zSYBOW pqBLgbRUH3OBiEd8ngZhFf2z8v/G2fs= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-641-O1K_Lw_WOpC6SLdlZzga_A-1; Thu, 28 Mar 2024 13:01:03 -0400 X-MC-Unique: O1K_Lw_WOpC6SLdlZzga_A-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 41C483815EF7; Thu, 28 Mar 2024 17:01:02 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.146]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2460CC4C7A6; Thu, 28 Mar 2024 17:01:00 +0000 (UTC) From: David Howells To: Steve French Cc: David Howells , Jeff Layton , Matthew Wilcox , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Christian Brauner , netfs@lists.linux.dev, linux-cifs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Steve French , Shyam Prasad N , Rohith Surabattula Subject: [PATCH v6 15/15] cifs: Remove some code that's no longer used, part 3 Date: Thu, 28 Mar 2024 16:58:06 +0000 Message-ID: <20240328165845.2782259-16-dhowells@redhat.com> In-Reply-To: <20240328165845.2782259-1-dhowells@redhat.com> References: <20240328165845.2782259-1-dhowells@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 Content-Type: text/plain; charset="utf-8" Remove some code that was #if'd out with the netfslib conversion. This is split into parts for file.c as the diff generator otherwise produces a hard to read diff for part of it where a big chunk is cut out. Signed-off-by: David Howells cc: Steve French cc: Shyam Prasad N cc: Rohith Surabattula cc: Jeff Layton cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org --- fs/smb/client/file.c | 1004 ------------------------------------------ 1 file changed, 1004 deletions(-) diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index f45a830154d5..0b43fae0a96e 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -2695,471 +2695,6 @@ int cifs_flush(struct file *file, fl_owner_t id) return rc; } =20 -#if 0 // TODO remove 3594 -static void collect_uncached_write_data(struct cifs_aio_ctx *ctx); - -static void -cifs_uncached_writev_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *wdata =3D container_of(work, - struct cifs_io_subrequest, work); - struct inode *inode =3D d_inode(wdata->cfile->dentry); - struct cifsInodeInfo *cifsi =3D CIFS_I(inode); - - spin_lock(&inode->i_lock); - cifs_update_eof(cifsi, wdata->subreq.start, wdata->subreq.len); - if (cifsi->netfs.remote_i_size > inode->i_size) - i_size_write(inode, cifsi->netfs.remote_i_size); - spin_unlock(&inode->i_lock); - - complete(&wdata->done); - collect_uncached_write_data(wdata->ctx); - /* the below call can possibly free the last ref to aio ctx */ - cifs_put_writedata(wdata); -} - -static int -cifs_resend_wdata(struct cifs_io_subrequest *wdata, struct list_head *wdat= a_list, - struct cifs_aio_ctx *ctx) -{ - size_t wsize; - struct cifs_credits credits; - int rc; - struct TCP_Server_Info *server =3D wdata->server; - - do { - if (wdata->cfile->invalidHandle) { - rc =3D cifs_reopen_file(wdata->cfile, false); - if (rc =3D=3D -EAGAIN) - continue; - else if (rc) - break; - } - - - /* - * Wait for credits to resend this wdata. - * Note: we are attempting to resend the whole wdata not in - * segments - */ - do { - rc =3D server->ops->wait_mtu_credits(server, wdata->subreq.len, - &wsize, &credits); - if (rc) - goto fail; - - if (wsize < wdata->subreq.len) { - add_credits_and_wake_if(server, &credits, 0); - msleep(1000); - } - } while (wsize < wdata->subreq.len); - wdata->credits =3D credits; - - rc =3D adjust_credits(server, &wdata->credits, wdata->subreq.len); - - if (!rc) { - if (wdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else { - set_bit(NETFS_SREQ_RETRYING, &wdata->subreq.flags); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (wdata->mr) { - wdata->mr->need_invalidate =3D true; - smbd_deregister_mr(wdata->mr); - wdata->mr =3D NULL; - } -#endif - rc =3D server->ops->async_writev(wdata); - } - } - - /* If the write was successfully sent, we are done */ - if (!rc) { - list_add_tail(&wdata->list, wdata_list); - return 0; - } - - /* Roll back credits and retry if needed */ - add_credits_and_wake_if(server, &wdata->credits, 0); - } while (rc =3D=3D -EAGAIN); - -fail: - cifs_put_writedata(wdata); - return rc; -} - -/* - * Select span of a bvec iterator we're going to use. Limit it by both ma= ximum - * size and maximum number of segments. - */ -static size_t cifs_limit_bvec_subset(const struct iov_iter *iter, size_t m= ax_size, - size_t max_segs, unsigned int *_nsegs) -{ - const struct bio_vec *bvecs =3D iter->bvec; - unsigned int nbv =3D iter->nr_segs, ix =3D 0, nsegs =3D 0; - size_t len, span =3D 0, n =3D iter->count; - size_t skip =3D iter->iov_offset; - - if (WARN_ON(!iov_iter_is_bvec(iter)) || n =3D=3D 0) - return 0; - - while (n && ix < nbv && skip) { - len =3D bvecs[ix].bv_len; - if (skip < len) - break; - skip -=3D len; - n -=3D len; - ix++; - } - - while (n && ix < nbv) { - len =3D min3(n, bvecs[ix].bv_len - skip, max_size); - span +=3D len; - max_size -=3D len; - nsegs++; - ix++; - if (max_size =3D=3D 0 || nsegs >=3D max_segs) - break; - skip =3D 0; - n -=3D len; - } - - *_nsegs =3D nsegs; - return span; -} - -static int -cifs_write_from_iter(loff_t fpos, size_t len, struct iov_iter *from, - struct cifsFileInfo *open_file, - struct cifs_sb_info *cifs_sb, struct list_head *wdata_list, - struct cifs_aio_ctx *ctx) -{ - int rc =3D 0; - size_t cur_len, max_len; - struct cifs_io_subrequest *wdata; - pid_t pid; - struct TCP_Server_Info *server; - unsigned int xid, max_segs =3D INT_MAX; - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid =3D open_file->pid; - else - pid =3D current->tgid; - - server =3D cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - xid =3D get_xid(); - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_segs =3D server->smbd_conn->max_frmr_depth; -#endif - - do { - struct cifs_credits credits_on_stack; - struct cifs_credits *credits =3D &credits_on_stack; - unsigned int nsegs =3D 0; - size_t wsize; - - if (signal_pending(current)) { - rc =3D -EINTR; - break; - } - - if (open_file->invalidHandle) { - rc =3D cifs_reopen_file(open_file, false); - if (rc =3D=3D -EAGAIN) - continue; - else if (rc) - break; - } - - rc =3D server->ops->wait_mtu_credits(server, cifs_sb->ctx->wsize, - &wsize, credits); - if (rc) - break; - - max_len =3D min_t(const size_t, len, wsize); - if (!max_len) { - rc =3D -EAGAIN; - add_credits_and_wake_if(server, credits, 0); - break; - } - - cur_len =3D cifs_limit_bvec_subset(from, max_len, max_segs, &nsegs); - cifs_dbg(FYI, "write_from_iter len=3D%zx/%zx nsegs=3D%u/%lu/%u\n", - cur_len, max_len, nsegs, from->nr_segs, max_segs); - if (cur_len =3D=3D 0) { - rc =3D -EIO; - add_credits_and_wake_if(server, credits, 0); - break; - } - - wdata =3D cifs_writedata_alloc(cifs_uncached_writev_complete); - if (!wdata) { - rc =3D -ENOMEM; - add_credits_and_wake_if(server, credits, 0); - break; - } - - wdata->uncached =3D true; - wdata->sync_mode =3D WB_SYNC_ALL; - wdata->subreq.start =3D (__u64)fpos; - wdata->cfile =3D cifsFileInfo_get(open_file); - wdata->server =3D server; - wdata->pid =3D pid; - wdata->subreq.len =3D cur_len; - wdata->credits =3D credits_on_stack; - wdata->subreq.io_iter =3D *from; - wdata->ctx =3D ctx; - kref_get(&ctx->refcount); - - iov_iter_truncate(&wdata->subreq.io_iter, cur_len); - - rc =3D adjust_credits(server, &wdata->credits, wdata->subreq.len); - - if (!rc) { - if (wdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else - rc =3D server->ops->async_writev(wdata); - } - - if (rc) { - add_credits_and_wake_if(server, &wdata->credits, 0); - cifs_put_writedata(wdata); - if (rc =3D=3D -EAGAIN) - continue; - break; - } - - list_add_tail(&wdata->list, wdata_list); - iov_iter_advance(from, cur_len); - fpos +=3D cur_len; - len -=3D cur_len; - } while (len > 0); - - free_xid(xid); - return rc; -} - -static void collect_uncached_write_data(struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *wdata, *tmp; - struct cifs_tcon *tcon; - struct cifs_sb_info *cifs_sb; - struct dentry *dentry =3D ctx->cfile->dentry; - ssize_t rc; - - tcon =3D tlink_tcon(ctx->cfile->tlink); - cifs_sb =3D CIFS_SB(dentry->d_sb); - - mutex_lock(&ctx->aio_mutex); - - if (list_empty(&ctx->list)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - rc =3D ctx->rc; - /* - * Wait for and collect replies for any successful sends in order of - * increasing offset. Once an error is hit, then return without waiting - * for any more replies. - */ -restart_loop: - list_for_each_entry_safe(wdata, tmp, &ctx->list, list) { - if (!rc) { - if (!try_wait_for_completion(&wdata->done)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - if (wdata->result) - rc =3D wdata->result; - else - ctx->total_len +=3D wdata->subreq.len; - - /* resend call if it's a retryable error */ - if (rc =3D=3D -EAGAIN) { - struct list_head tmp_list; - struct iov_iter tmp_from =3D ctx->iter; - - INIT_LIST_HEAD(&tmp_list); - list_del_init(&wdata->list); - - if (ctx->direct_io) - rc =3D cifs_resend_wdata( - wdata, &tmp_list, ctx); - else { - iov_iter_advance(&tmp_from, - wdata->subreq.start - ctx->pos); - - rc =3D cifs_write_from_iter(wdata->subreq.start, - wdata->subreq.len, &tmp_from, - ctx->cfile, cifs_sb, &tmp_list, - ctx); - - cifs_put_writedata(wdata); - } - - list_splice(&tmp_list, &ctx->list); - goto restart_loop; - } - } - list_del_init(&wdata->list); - cifs_put_writedata(wdata); - } - - cifs_stats_bytes_written(tcon, ctx->total_len); - set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(dentry->d_inode)->flags); - - ctx->rc =3D (rc =3D=3D 0) ? ctx->total_len : rc; - - mutex_unlock(&ctx->aio_mutex); - - if (ctx->iocb && ctx->iocb->ki_complete) - ctx->iocb->ki_complete(ctx->iocb, ctx->rc); - else - complete(&ctx->done); -} - -static ssize_t __cifs_writev( - struct kiocb *iocb, struct iov_iter *from, bool direct) -{ - struct file *file =3D iocb->ki_filp; - ssize_t total_written =3D 0; - struct cifsFileInfo *cfile; - struct cifs_tcon *tcon; - struct cifs_sb_info *cifs_sb; - struct cifs_aio_ctx *ctx; - int rc; - - rc =3D generic_write_checks(iocb, from); - if (rc <=3D 0) - return rc; - - cifs_sb =3D CIFS_FILE_SB(file); - cfile =3D file->private_data; - tcon =3D tlink_tcon(cfile->tlink); - - if (!tcon->ses->server->ops->async_writev) - return -ENOSYS; - - ctx =3D cifs_aio_ctx_alloc(); - if (!ctx) - return -ENOMEM; - - ctx->cfile =3D cifsFileInfo_get(cfile); - - if (!is_sync_kiocb(iocb)) - ctx->iocb =3D iocb; - - ctx->pos =3D iocb->ki_pos; - ctx->direct_io =3D direct; - ctx->nr_pinned_pages =3D 0; - - if (user_backed_iter(from)) { - /* - * Extract IOVEC/UBUF-type iterators to a BVEC-type iterator as - * they contain references to the calling process's virtual - * memory layout which won't be available in an async worker - * thread. This also takes a pin on every folio involved. - */ - rc =3D netfs_extract_user_iter(from, iov_iter_count(from), - &ctx->iter, 0); - if (rc < 0) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - ctx->nr_pinned_pages =3D rc; - ctx->bv =3D (void *)ctx->iter.bvec; - ctx->bv_need_unpin =3D iov_iter_extract_will_pin(from); - } else if ((iov_iter_is_bvec(from) || iov_iter_is_kvec(from)) && - !is_sync_kiocb(iocb)) { - /* - * If the op is asynchronous, we need to copy the list attached - * to a BVEC/KVEC-type iterator, but we assume that the storage - * will be pinned by the caller; in any case, we may or may not - * be able to pin the pages, so we don't try. - */ - ctx->bv =3D (void *)dup_iter(&ctx->iter, from, GFP_KERNEL); - if (!ctx->bv) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -ENOMEM; - } - } else { - /* - * Otherwise, we just pass the iterator down as-is and rely on - * the caller to make sure the pages referred to by the - * iterator don't evaporate. - */ - ctx->iter =3D *from; - } - - ctx->len =3D iov_iter_count(&ctx->iter); - - /* grab a lock here due to read response handlers can access ctx */ - mutex_lock(&ctx->aio_mutex); - - rc =3D cifs_write_from_iter(iocb->ki_pos, ctx->len, &ctx->iter, - cfile, cifs_sb, &ctx->list, ctx); - - /* - * If at least one write was successfully sent, then discard any rc - * value from the later writes. If the other write succeeds, then - * we'll end up returning whatever was written. If it fails, then - * we'll get a new rc value from that. - */ - if (!list_empty(&ctx->list)) - rc =3D 0; - - mutex_unlock(&ctx->aio_mutex); - - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - if (!is_sync_kiocb(iocb)) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EIOCBQUEUED; - } - - rc =3D wait_for_completion_killable(&ctx->done); - if (rc) { - mutex_lock(&ctx->aio_mutex); - ctx->rc =3D rc =3D -EINTR; - total_written =3D ctx->total_len; - mutex_unlock(&ctx->aio_mutex); - } else { - rc =3D ctx->rc; - total_written =3D ctx->total_len; - } - - kref_put(&ctx->refcount, cifs_aio_ctx_release); - - if (unlikely(!total_written)) - return rc; - - iocb->ki_pos +=3D total_written; - return total_written; -} - -ssize_t cifs_direct_writev(struct kiocb *iocb, struct iov_iter *from) -{ - struct file *file =3D iocb->ki_filp; - - cifs_revalidate_mapping(file->f_inode); - return __cifs_writev(iocb, from, true); -} - -ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) -{ - return __cifs_writev(iocb, from, false); -} -#endif // TODO remove 3594 - static ssize_t cifs_writev(struct kiocb *iocb, struct iov_iter *from) { @@ -3248,450 +2783,6 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_i= ter *from) return written; } =20 -#if 0 // TODO remove 4143 -static struct cifs_io_subrequest *cifs_readdata_alloc(work_func_t complete) -{ - struct cifs_io_subrequest *rdata; - - rdata =3D kzalloc(sizeof(*rdata), GFP_KERNEL); - if (rdata) { - refcount_set(&rdata->subreq.ref, 1); - INIT_LIST_HEAD(&rdata->list); - init_completion(&rdata->done); - INIT_WORK(&rdata->work, complete); - } - - return rdata; -} - -void -cifs_readdata_release(struct cifs_io_subrequest *rdata) -{ - if (rdata->ctx) - kref_put(&rdata->ctx->refcount, cifs_aio_ctx_release); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (rdata->mr) { - smbd_deregister_mr(rdata->mr); - rdata->mr =3D NULL; - } -#endif - if (rdata->cfile) - cifsFileInfo_put(rdata->cfile); - - kfree(rdata); -} - -static void collect_uncached_read_data(struct cifs_aio_ctx *ctx); - -static void -cifs_uncached_readv_complete(struct work_struct *work) -{ - struct cifs_io_subrequest *rdata =3D - container_of(work, struct cifs_io_subrequest, work); - - complete(&rdata->done); - collect_uncached_read_data(rdata->ctx); - /* the below call can possibly free the last ref to aio ctx */ - cifs_put_readdata(rdata); -} - -static int cifs_resend_rdata(struct cifs_io_subrequest *rdata, - struct list_head *rdata_list, - struct cifs_aio_ctx *ctx) -{ - size_t rsize; - struct cifs_credits credits; - int rc; - struct TCP_Server_Info *server; - - /* XXX: should we pick a new channel here? */ - server =3D rdata->server; - - do { - if (rdata->cfile->invalidHandle) { - rc =3D cifs_reopen_file(rdata->cfile, true); - if (rc =3D=3D -EAGAIN) - continue; - else if (rc) - break; - } - - /* - * Wait for credits to resend this rdata. - * Note: we are attempting to resend the whole rdata not in - * segments - */ - do { - rc =3D server->ops->wait_mtu_credits(server, rdata->subreq.len, - &rsize, &credits); - - if (rc) - goto fail; - - if (rsize < rdata->subreq.len) { - add_credits_and_wake_if(server, &credits, 0); - msleep(1000); - } - } while (rsize < rdata->subreq.len); - rdata->credits =3D credits; - - rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); - if (!rc) { - if (rdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else { -#ifdef CONFIG_CIFS_SMB_DIRECT - if (rdata->mr) { - rdata->mr->need_invalidate =3D true; - smbd_deregister_mr(rdata->mr); - rdata->mr =3D NULL; - } -#endif - rc =3D server->ops->async_readv(rdata); - } - } - - /* If the read was successfully sent, we are done */ - if (!rc) { - /* Add to aio pending list */ - list_add_tail(&rdata->list, rdata_list); - return 0; - } - - /* Roll back credits and retry if needed */ - add_credits_and_wake_if(server, &rdata->credits, 0); - } while (rc =3D=3D -EAGAIN); - -fail: - cifs_put_readdata(rdata); - return rc; -} - -static int -cifs_send_async_read(loff_t fpos, size_t len, struct cifsFileInfo *open_fi= le, - struct cifs_sb_info *cifs_sb, struct list_head *rdata_list, - struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *rdata; - unsigned int nsegs, max_segs =3D INT_MAX; - struct cifs_credits credits_on_stack; - struct cifs_credits *credits =3D &credits_on_stack; - size_t cur_len, max_len, rsize; - int rc; - pid_t pid; - struct TCP_Server_Info *server; - - server =3D cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); - -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->smbd_conn) - max_segs =3D server->smbd_conn->max_frmr_depth; -#endif - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid =3D open_file->pid; - else - pid =3D current->tgid; - - do { - if (open_file->invalidHandle) { - rc =3D cifs_reopen_file(open_file, true); - if (rc =3D=3D -EAGAIN) - continue; - else if (rc) - break; - } - - if (cifs_sb->ctx->rsize =3D=3D 0) - cifs_sb->ctx->rsize =3D - server->ops->negotiate_rsize(tlink_tcon(open_file->tlink), - cifs_sb->ctx); - - rc =3D server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, - &rsize, credits); - if (rc) - break; - - max_len =3D min_t(size_t, len, rsize); - - cur_len =3D cifs_limit_bvec_subset(&ctx->iter, max_len, - max_segs, &nsegs); - cifs_dbg(FYI, "read-to-iter len=3D%zx/%zx nsegs=3D%u/%lu/%u\n", - cur_len, max_len, nsegs, ctx->iter.nr_segs, max_segs); - if (cur_len =3D=3D 0) { - rc =3D -EIO; - add_credits_and_wake_if(server, credits, 0); - break; - } - - rdata =3D cifs_readdata_alloc(cifs_uncached_readv_complete); - if (!rdata) { - add_credits_and_wake_if(server, credits, 0); - rc =3D -ENOMEM; - break; - } - - rdata->server =3D server; - rdata->cfile =3D cifsFileInfo_get(open_file); - rdata->subreq.start =3D fpos; - rdata->subreq.len =3D cur_len; - rdata->pid =3D pid; - rdata->credits =3D credits_on_stack; - rdata->ctx =3D ctx; - kref_get(&ctx->refcount); - - rdata->subreq.io_iter =3D ctx->iter; - iov_iter_truncate(&rdata->subreq.io_iter, cur_len); - - rc =3D adjust_credits(server, &rdata->credits, rdata->subreq.len); - - if (!rc) { - if (rdata->cfile->invalidHandle) - rc =3D -EAGAIN; - else - rc =3D server->ops->async_readv(rdata); - } - - if (rc) { - add_credits_and_wake_if(server, &rdata->credits, 0); - cifs_put_readdata(rdata); - if (rc =3D=3D -EAGAIN) - continue; - break; - } - - list_add_tail(&rdata->list, rdata_list); - iov_iter_advance(&ctx->iter, cur_len); - fpos +=3D cur_len; - len -=3D cur_len; - } while (len > 0); - - return rc; -} - -static void -collect_uncached_read_data(struct cifs_aio_ctx *ctx) -{ - struct cifs_io_subrequest *rdata, *tmp; - struct cifs_sb_info *cifs_sb; - int rc; - - cifs_sb =3D CIFS_SB(ctx->cfile->dentry->d_sb); - - mutex_lock(&ctx->aio_mutex); - - if (list_empty(&ctx->list)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - rc =3D ctx->rc; - /* the loop below should proceed in the order of increasing offsets */ -again: - list_for_each_entry_safe(rdata, tmp, &ctx->list, list) { - if (!rc) { - if (!try_wait_for_completion(&rdata->done)) { - mutex_unlock(&ctx->aio_mutex); - return; - } - - if (rdata->result =3D=3D -EAGAIN) { - /* resend call if it's a retryable error */ - struct list_head tmp_list; - unsigned int got_bytes =3D rdata->got_bytes; - - list_del_init(&rdata->list); - INIT_LIST_HEAD(&tmp_list); - - if (ctx->direct_io) { - /* - * Re-use rdata as this is a - * direct I/O - */ - rc =3D cifs_resend_rdata( - rdata, - &tmp_list, ctx); - } else { - rc =3D cifs_send_async_read( - rdata->subreq.start + got_bytes, - rdata->subreq.len - got_bytes, - rdata->cfile, cifs_sb, - &tmp_list, ctx); - - cifs_put_readdata(rdata); - } - - list_splice(&tmp_list, &ctx->list); - - goto again; - } else if (rdata->result) - rc =3D rdata->result; - - /* if there was a short read -- discard anything left */ - if (rdata->got_bytes && rdata->got_bytes < rdata->subreq.len) - rc =3D -ENODATA; - - ctx->total_len +=3D rdata->got_bytes; - } - list_del_init(&rdata->list); - cifs_put_readdata(rdata); - } - - /* mask nodata case */ - if (rc =3D=3D -ENODATA) - rc =3D 0; - - ctx->rc =3D (rc =3D=3D 0) ? (ssize_t)ctx->total_len : rc; - - mutex_unlock(&ctx->aio_mutex); - - if (ctx->iocb && ctx->iocb->ki_complete) - ctx->iocb->ki_complete(ctx->iocb, ctx->rc); - else - complete(&ctx->done); -} - -static ssize_t __cifs_readv( - struct kiocb *iocb, struct iov_iter *to, bool direct) -{ - size_t len; - struct file *file =3D iocb->ki_filp; - struct cifs_sb_info *cifs_sb; - struct cifsFileInfo *cfile; - struct cifs_tcon *tcon; - ssize_t rc, total_read =3D 0; - loff_t offset =3D iocb->ki_pos; - struct cifs_aio_ctx *ctx; - - len =3D iov_iter_count(to); - if (!len) - return 0; - - cifs_sb =3D CIFS_FILE_SB(file); - cfile =3D file->private_data; - tcon =3D tlink_tcon(cfile->tlink); - - if (!tcon->ses->server->ops->async_readv) - return -ENOSYS; - - if ((file->f_flags & O_ACCMODE) =3D=3D O_WRONLY) - cifs_dbg(FYI, "attempting read on write only file instance\n"); - - ctx =3D cifs_aio_ctx_alloc(); - if (!ctx) - return -ENOMEM; - - ctx->pos =3D offset; - ctx->direct_io =3D direct; - ctx->len =3D len; - ctx->cfile =3D cifsFileInfo_get(cfile); - ctx->nr_pinned_pages =3D 0; - - if (!is_sync_kiocb(iocb)) - ctx->iocb =3D iocb; - - if (user_backed_iter(to)) { - /* - * Extract IOVEC/UBUF-type iterators to a BVEC-type iterator as - * they contain references to the calling process's virtual - * memory layout which won't be available in an async worker - * thread. This also takes a pin on every folio involved. - */ - rc =3D netfs_extract_user_iter(to, iov_iter_count(to), - &ctx->iter, 0); - if (rc < 0) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - ctx->nr_pinned_pages =3D rc; - ctx->bv =3D (void *)ctx->iter.bvec; - ctx->bv_need_unpin =3D iov_iter_extract_will_pin(to); - ctx->should_dirty =3D true; - } else if ((iov_iter_is_bvec(to) || iov_iter_is_kvec(to)) && - !is_sync_kiocb(iocb)) { - /* - * If the op is asynchronous, we need to copy the list attached - * to a BVEC/KVEC-type iterator, but we assume that the storage - * will be retained by the caller; in any case, we may or may - * not be able to pin the pages, so we don't try. - */ - ctx->bv =3D (void *)dup_iter(&ctx->iter, to, GFP_KERNEL); - if (!ctx->bv) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -ENOMEM; - } - } else { - /* - * Otherwise, we just pass the iterator down as-is and rely on - * the caller to make sure the pages referred to by the - * iterator don't evaporate. - */ - ctx->iter =3D *to; - } - - if (direct) { - rc =3D filemap_write_and_wait_range(file->f_inode->i_mapping, - offset, offset + len - 1); - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EAGAIN; - } - } - - /* grab a lock here due to read response handlers can access ctx */ - mutex_lock(&ctx->aio_mutex); - - rc =3D cifs_send_async_read(offset, len, cfile, cifs_sb, &ctx->list, ctx); - - /* if at least one read request send succeeded, then reset rc */ - if (!list_empty(&ctx->list)) - rc =3D 0; - - mutex_unlock(&ctx->aio_mutex); - - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return rc; - } - - if (!is_sync_kiocb(iocb)) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EIOCBQUEUED; - } - - rc =3D wait_for_completion_killable(&ctx->done); - if (rc) { - mutex_lock(&ctx->aio_mutex); - ctx->rc =3D rc =3D -EINTR; - total_read =3D ctx->total_len; - mutex_unlock(&ctx->aio_mutex); - } else { - rc =3D ctx->rc; - total_read =3D ctx->total_len; - } - - kref_put(&ctx->refcount, cifs_aio_ctx_release); - - if (total_read) { - iocb->ki_pos +=3D total_read; - return total_read; - } - return rc; -} - -ssize_t cifs_direct_readv(struct kiocb *iocb, struct iov_iter *to) -{ - return __cifs_readv(iocb, to, true); -} - -ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to) -{ - return __cifs_readv(iocb, to, false); - -} -#endif // end netfslib removal 4143 - ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) { ssize_t rc; @@ -3790,101 +2881,6 @@ cifs_strict_readv(struct kiocb *iocb, struct iov_it= er *to) return rc; } =20 -#if 0 // TODO remove 4633 -static ssize_t -cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *of= fset) -{ - int rc =3D -EACCES; - unsigned int bytes_read =3D 0; - unsigned int total_read; - unsigned int current_read_size; - unsigned int rsize; - struct cifs_sb_info *cifs_sb; - struct cifs_tcon *tcon; - struct TCP_Server_Info *server; - unsigned int xid; - char *cur_offset; - struct cifsFileInfo *open_file; - struct cifs_io_parms io_parms =3D {0}; - int buf_type =3D CIFS_NO_BUFFER; - __u32 pid; - - xid =3D get_xid(); - cifs_sb =3D CIFS_FILE_SB(file); - - /* FIXME: set up handlers for larger reads and/or convert to async */ - rsize =3D min_t(unsigned int, cifs_sb->ctx->rsize, CIFSMaxBufSize); - - if (file->private_data =3D=3D NULL) { - rc =3D -EBADF; - free_xid(xid); - return rc; - } - open_file =3D file->private_data; - tcon =3D tlink_tcon(open_file->tlink); - server =3D cifs_pick_channel(tcon->ses); - - if (!server->ops->sync_read) { - free_xid(xid); - return -ENOSYS; - } - - if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD) - pid =3D open_file->pid; - else - pid =3D current->tgid; - - if ((file->f_flags & O_ACCMODE) =3D=3D O_WRONLY) - cifs_dbg(FYI, "attempting read on write only file instance\n"); - - for (total_read =3D 0, cur_offset =3D read_data; read_size > total_read; - total_read +=3D bytes_read, cur_offset +=3D bytes_read) { - do { - current_read_size =3D min_t(uint, read_size - total_read, - rsize); - /* - * For windows me and 9x we do not want to request more - * than it negotiated since it will refuse the read - * then. - */ - if (!(tcon->ses->capabilities & - tcon->ses->server->vals->cap_large_files)) { - current_read_size =3D min_t(uint, - current_read_size, CIFSMaxBufSize); - } - if (open_file->invalidHandle) { - rc =3D cifs_reopen_file(open_file, true); - if (rc !=3D 0) - break; - } - io_parms.pid =3D pid; - io_parms.tcon =3D tcon; - io_parms.offset =3D *offset; - io_parms.length =3D current_read_size; - io_parms.server =3D server; - rc =3D server->ops->sync_read(xid, &open_file->fid, &io_parms, - &bytes_read, &cur_offset, - &buf_type); - } while (rc =3D=3D -EAGAIN); - - if (rc || (bytes_read =3D=3D 0)) { - if (total_read) { - break; - } else { - free_xid(xid); - return rc; - } - } else { - cifs_stats_bytes_read(tcon, total_read); - *offset +=3D bytes_read; - } - } - free_xid(xid); - return total_read; -} -#endif // end netfslib remove 4633 - - static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) { return netfs_page_mkwrite(vmf, NULL);