From patchwork Mon Aug 3 17:00:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698447 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8AF7314DD for ; Mon, 3 Aug 2020 17:00:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7322E20A8B for ; Mon, 3 Aug 2020 17:00:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="H2Y17dPu" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727088AbgHCRAS (ORCPT ); Mon, 3 Aug 2020 13:00:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56474 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726802AbgHCRAR (ORCPT ); Mon, 3 Aug 2020 13:00:17 -0400 Received: from mail-io1-xd42.google.com (mail-io1-xd42.google.com [IPv6:2607:f8b0:4864:20::d42]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FE87C06174A for ; Mon, 3 Aug 2020 10:00:17 -0700 (PDT) Received: by mail-io1-xd42.google.com with SMTP id w12so25634985iom.4 for ; Mon, 03 Aug 2020 10:00:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ewpr7C8nUE1GUfbEkZpsIogGbR/+S4RvmagXfpj3OZk=; b=H2Y17dPuU52KEH4r/nNQd3o7ScCthv+G6hu8rAf2H7ludPaUuYhe6RTvI1RSXInZjr q5Y/kEFhtdNLzLsTpJNbDFqOeH17LhfKjtm+/uo//DHfJqRZDV229jCzwL7UO4AmS36v aif3CnMAEox/Yd8bksRK1s4n3OStpjsZlsg3Ub0RAebenvViRxhIsbvE3hZ8VPsjOJGf Ni5WEoA0HFJDTWRuLX/ln1QfAiVOjayhLgyrwe7K6t5HJQFun3eHBAThIb5zP4cJoikK spQ3dPjh5219hU5pNYBWpXdrXIAx2DjX0Un15J7M8NwfBORPN42Ytkul7xhejaX2onFq nntA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=ewpr7C8nUE1GUfbEkZpsIogGbR/+S4RvmagXfpj3OZk=; b=XEXfZKcBShQLIOztodH3jeNKtNp5fFRWgepfCMykHVXkBjpz6363k+vTRYOaur5I7i eFol6qhxplYTVxz2kriYTujHmlzqklt6Yhs71tPxYRUXYlrmXv6dBwt3sSvBWrg2tYNE dOxSVSF4ym62jsODwMoQ6zsAg1QnDf+uwZVTC9jeYWVUUeMTOK9dl0qBwD6t0CSrWysB YzjCMVZ3trt7+nQl/Mr0uyN7uoPjZq71khA+/agP0Cy4Khn7bogHheu9JFWwtEKJMTJP j4oC+69BCNyCcXrAYXjOcR3+0Z94IH5v832yeGBYsmIQtM/DR7XDViavoKZVYZCM0WYH WUCg== X-Gm-Message-State: AOAM532hdeH9klhjznTr9wi1RvICS37u28y3/hgvedUv2/V3iZ7TlqN9 HoLbiOWaKR0tDmZVlrPCUIMzOiTx X-Google-Smtp-Source: ABdhPJxg8lsMrN0oW1Tpyj5bmXPe12ilZQo9r2w0UCGkT1hGNRdV8yMt4oVemzSFp3C0UU2hpLyfSg== X-Received: by 2002:a02:70c3:: with SMTP id f186mr656932jac.118.1596474016484; Mon, 03 Aug 2020 10:00:16 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:15 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 01/10] SUNRPC: Split out a function for setting current page Date: Mon, 3 Aug 2020 13:00:04 -0400 Message-Id: <20200803170013.1348350-2-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker I'm going to need this bit of code in a few places for READ_PLUS decoding, so let's make it a helper function. Signed-off-by: Anna Schumaker --- net/sunrpc/xdr.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 6dfe5dc8b35f..c62b0882c0d8 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -870,6 +870,13 @@ static int xdr_set_page_base(struct xdr_stream *xdr, return 0; } +static void xdr_set_page(struct xdr_stream *xdr, unsigned int base, + unsigned int len) +{ + if (xdr_set_page_base(xdr, base, len) < 0) + xdr_set_iov(xdr, xdr->buf->tail, xdr->nwords << 2); +} + static void xdr_set_next_page(struct xdr_stream *xdr) { unsigned int newbase; @@ -877,8 +884,7 @@ static void xdr_set_next_page(struct xdr_stream *xdr) newbase = (1 + xdr->page_ptr - xdr->buf->pages) << PAGE_SHIFT; newbase -= xdr->buf->page_base; - if (xdr_set_page_base(xdr, newbase, PAGE_SIZE) < 0) - xdr_set_iov(xdr, xdr->buf->tail, xdr->nwords << 2); + xdr_set_page(xdr, newbase, PAGE_SIZE); } static bool xdr_set_next_buffer(struct xdr_stream *xdr) @@ -886,8 +892,7 @@ static bool xdr_set_next_buffer(struct xdr_stream *xdr) if (xdr->page_ptr != NULL) xdr_set_next_page(xdr); else if (xdr->iov == xdr->buf->head) { - if (xdr_set_page_base(xdr, 0, PAGE_SIZE) < 0) - xdr_set_iov(xdr, xdr->buf->tail, xdr->nwords << 2); + xdr_set_page(xdr, 0, PAGE_SIZE); } return xdr->p != xdr->end; } From patchwork Mon Aug 3 17:00:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698449 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2457113B1 for ; Mon, 3 Aug 2020 17:00:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0CCD520792 for ; Mon, 3 Aug 2020 17:00:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D2XjCbUL" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728147AbgHCRAT (ORCPT ); Mon, 3 Aug 2020 13:00:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56476 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726802AbgHCRAS (ORCPT ); Mon, 3 Aug 2020 13:00:18 -0400 Received: from mail-il1-x141.google.com (mail-il1-x141.google.com [IPv6:2607:f8b0:4864:20::141]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69E33C06174A for ; Mon, 3 Aug 2020 10:00:18 -0700 (PDT) Received: by mail-il1-x141.google.com with SMTP id z3so21489623ilh.3 for ; Mon, 03 Aug 2020 10:00:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=V20Cu/t2uiQPOxahL/wJ2ptpkQOkYsv7J8Dr+lPXmTA=; b=D2XjCbULq5phGzXdQG8jSB8QCEOvbUF0HxgTFPNqjkB7JwzymWCYmK5anYk83x3NPe yWz/CxFIiZvvxp1SY6OYu8/iVBWr97iV4Yrwkvd/kKca+vfarkDWNrC3Abjup+A7LMwx T+4oQPNG9adKtO4rgL2NU3djz+ZZO7tTA3RBjpXJb7jp2h61bGBdJleltiEP1WyCX4vi Mg7hQ1LGfr/0L52W8/APZmzN7HlpzBGl9KAZMc+Z/pFO3gbiC8pP4jOZKGLouP3buJ+u BifjZnCyRbLx1Gi1deSfQFi+Z0hlVpNY1YE7M8qOyJDPg4CtpgXmCityHhE34ac87UbL GwSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=V20Cu/t2uiQPOxahL/wJ2ptpkQOkYsv7J8Dr+lPXmTA=; b=jecel3+ZL1VQdtj9t8isiPyhU5qR7arM65dOBZNWk5wjs42c/pw7G0cMw/Dq9EUCwT rh0DtpyaamBhCzJgplMegN563VqbJGuBIQxdhd3NVPqxxPCUS/XvMtFihhgI2BeTXmbi MWM14WpEn7wBZ6uNZHMQNFHxWdI6yx9KdQdV2B/MskQYsGiGQ80sp6hMmlKMal+ZZMPI DtCZSM8LGZ5327DEP4yf8uH9m/wI+fnm13fJmVFPm5S5gR759Wljd1N/2Xj8NzOGJzXW kUzZbO3ZzXXiEL3/mf2hkOdqvuW0kHJiKTEE1S8+Z7J+tHAYX+6cP3QKuhBdZ+zk+Bbk vNOw== X-Gm-Message-State: AOAM5324LzZhuVlKgNBuwsj1xewrywA8ieqPju0EZtVb5HyuFfcK8u25 M5sn1q2ORO9GeBGFDm/2lu/y4yc7 X-Google-Smtp-Source: ABdhPJwevi+JMoMTajEAF5E3+lGTVjL7W1usRxU6RIgOQJNYLASdzskqNRk6xXeIAvS+pCXJF4gljw== X-Received: by 2002:a05:6e02:e82:: with SMTP id t2mr297880ilj.161.1596474017525; Mon, 03 Aug 2020 10:00:17 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:16 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 02/10] SUNRPC: Implement a xdr_page_pos() function Date: Mon, 3 Aug 2020 13:00:05 -0400 Message-Id: <20200803170013.1348350-3-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker I'll need this for READ_PLUS to help figure out the offset where page data is stored at, but it might also be useful for other things. Signed-off-by: Anna Schumaker --- include/linux/sunrpc/xdr.h | 1 + net/sunrpc/xdr.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index bac459584dd0..40318ff97c83 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -242,6 +242,7 @@ extern int xdr_restrict_buflen(struct xdr_stream *xdr, int newbuflen); extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int base, unsigned int len); extern unsigned int xdr_stream_pos(const struct xdr_stream *xdr); +extern unsigned int xdr_page_pos(const struct xdr_stream *xdr); extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p, struct rpc_rqst *rqst); extern void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf, diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index c62b0882c0d8..8d29450fdce5 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -505,6 +505,19 @@ unsigned int xdr_stream_pos(const struct xdr_stream *xdr) } EXPORT_SYMBOL_GPL(xdr_stream_pos); +/** + * xdr_page_pos - Return the current offset from the start of the xdr pages + * @xdr: pointer to struct xdr_stream + */ +unsigned int xdr_page_pos(const struct xdr_stream *xdr) +{ + unsigned int pos = xdr_stream_pos(xdr); + + WARN_ON(pos < xdr->buf->head[0].iov_len); + return pos - xdr->buf->head[0].iov_len; +} +EXPORT_SYMBOL_GPL(xdr_page_pos); + /** * xdr_init_encode - Initialize a struct xdr_stream for sending data. * @xdr: pointer to xdr_stream struct From patchwork Mon Aug 3 17:00:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698451 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B50E01731 for ; Mon, 3 Aug 2020 17:00:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9D53E20792 for ; Mon, 3 Aug 2020 17:00:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cKl8Rk+4" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726802AbgHCRAU (ORCPT ); Mon, 3 Aug 2020 13:00:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56482 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbgHCRAT (ORCPT ); Mon, 3 Aug 2020 13:00:19 -0400 Received: from mail-il1-x144.google.com (mail-il1-x144.google.com [IPv6:2607:f8b0:4864:20::144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5FD74C06174A for ; Mon, 3 Aug 2020 10:00:19 -0700 (PDT) Received: by mail-il1-x144.google.com with SMTP id c16so19896756ils.8 for ; Mon, 03 Aug 2020 10:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TPVjLWkHWk0AYBeQ8gyCJuqxE5qMckHU/9X8Fc5Z/6Y=; b=cKl8Rk+4dkSa/OzwrYjhUWyzLCvQhwG/KXhdapsZJrIEzkm8LPCHZHOEzsmgDF5kr5 hBBH1BRcRF4nSRnAA4Uy8hr6cPjqMW6AHRPLJWtKqDLW1+nO33Yber5CwVqSrAoBNECm gmD/xl4XmXp6IDvQ6AzHNXPt7CrYP3RzkA+AYMyiTSZsGm/+eyen4TB3Br2pSV4dWmh6 Vsl7eY+AijcfOGQXf3vSrniO0rpQoxS+sm0BkkuxEr/R7Cmk1VALJpal+pQI0a3MoPxy CZ7uqWqmFZ7EVBG8S0nOhZdvMYNLpKEiek0OeQ/fY0dVDlTWY27bpqxChYBRLuhpS8F/ MwrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=TPVjLWkHWk0AYBeQ8gyCJuqxE5qMckHU/9X8Fc5Z/6Y=; b=G4BvLdpkmLhXIsYZxw7/DThFgBb8Ixk0LKdUlNvVecrOSTC7wUXQp0V5yy68A3/Zih aX/vO9aVaSDO4CakQNEtMJJwKTJyp0TnfWilckbqNL+BB7pzl49cRJeRylF9VzL5DctD +7c0gg0M6/EafeOC96J1AeAsflDS+T58c2pV36Il0udefuK2FgFAqmvQMICMejlJg0QU e4pqnx19HFqP31kIq26HpikGZLJy22IBQuKYK6H74xH599vHcxE5M+Lvv2C1vN4P2EXq 4QEHm2zDAL4XoEUvh4vzFAhjFOgo2OG8PzUlNKkBxLIldVuQNFSpj2xx+rep32XwORmP 0Geg== X-Gm-Message-State: AOAM533eq8hnzGwAVgf20DvA9nbrqr4kx1wBjyeIx2kxhTV/9FXEyTUH 7z7VwKOH3mrWz7E/f4fxy7dCzlDn X-Google-Smtp-Source: ABdhPJzZiKxHF7iDQLqNEgBolB987DI6ZK0g8Qsuffx+VX7ox9fyuTpzjUwnDMMZVp4h9Xzv+BwtHA== X-Received: by 2002:a92:1f0f:: with SMTP id i15mr293027ile.237.1596474018494; Mon, 03 Aug 2020 10:00:18 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:17 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 03/10] NFS: Use xdr_page_pos() in NFSv4 decode_getacl() Date: Mon, 3 Aug 2020 13:00:06 -0400 Message-Id: <20200803170013.1348350-4-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker Signed-off-by: Anna Schumaker --- fs/nfs/nfs4xdr.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 47817ef0aadb..6742646d4feb 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -5279,7 +5279,6 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req, uint32_t attrlen, bitmap[3] = {0}; int status; - unsigned int pg_offset; res->acl_len = 0; if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0) @@ -5287,9 +5286,6 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req, xdr_enter_page(xdr, xdr->buf->page_len); - /* Calculate the offset of the page data */ - pg_offset = xdr->buf->head[0].iov_len; - if ((status = decode_attr_bitmap(xdr, bitmap)) != 0) goto out; if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0) @@ -5302,7 +5298,7 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req, /* The bitmap (xdr len + bitmaps) and the attr xdr len words * are stored with the acl data to handle the problem of * variable length bitmaps.*/ - res->acl_data_offset = xdr_stream_pos(xdr) - pg_offset; + res->acl_data_offset = xdr_page_pos(xdr); res->acl_len = attrlen; /* Check for receive buffer overflow */ From patchwork Mon Aug 3 17:00:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698453 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 376D6138A for ; Mon, 3 Aug 2020 17:00:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1572420792 for ; Mon, 3 Aug 2020 17:00:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WrjLjcXm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727768AbgHCRAV (ORCPT ); Mon, 3 Aug 2020 13:00:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbgHCRAU (ORCPT ); Mon, 3 Aug 2020 13:00:20 -0400 Received: from mail-il1-x142.google.com (mail-il1-x142.google.com [IPv6:2607:f8b0:4864:20::142]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 68C40C06174A for ; Mon, 3 Aug 2020 10:00:20 -0700 (PDT) Received: by mail-il1-x142.google.com with SMTP id p16so20919804ile.0 for ; Mon, 03 Aug 2020 10:00:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SqrIKFKArlFgakLk7PZTdk3/K8f7ykmJ3escxfEQuww=; b=WrjLjcXmV8E8dsu9fJy94ZUIHnXbR3LlinlLSYVXvJZntTgbpRitAjL+ol/ounRyha dZni2ZqTBdslT++ZYyGGAQ3XCo6RysOPS9ItPvieRfKKSPOF76VQ0Bi1nbnlRM912mil jAA17DMh13ac/UtJwVeVZjdWce/lAw5tkL9u55ZuorUhuX1zOWbSBGEsys2MS/+0VN4z nvoF8C/JtTidWNBU3YA2TuTQQUknmvrQ2W1fN0qArsq1E/XthaQOjm2h1TsWGM++SPeB 74c+VnZjfBCQnO/C0F4hv9VThwkIP1OE+aqMZobn41KnxPV1CbtH+KLwYneqEeoYihA5 IdJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=SqrIKFKArlFgakLk7PZTdk3/K8f7ykmJ3escxfEQuww=; b=VUnY0+Qy93qzFirxjqajrxxuOJs/V21/0ZL6q9rFVG091ii2FF7j2la+jiFnE+TA2b jndOmYW5VNElf/ngsQG06MKqg0d4A4zES8cTRDtwRP+MHx2mbz7cu4rcdFsdBn8jXb+T rSUcehGl+baXMyWUhL1tYtNjFQfUZXEtNhs0RJdl4lSlcZu3EObnAq+iNdRdfIQ3DYWo pPwNo3IpCJpzxg89oJnhKD6neowbV3ji2r1sPb6Jk0wCLzrQwprXugQ5P0hn2XkXiZJ2 M6+b3AYpzNfsSnGz2uZ/78p/p7yKfP5HFiULw7s8n7OgtafrdGmgxFabmHMzlssSmygk VW6A== X-Gm-Message-State: AOAM530wifs0dkpaxKtVtorb4I5NDEjijjMRexw2Vuo3+o/VKaBvNpxc PD1cygv8rLnvI1qy2F+Xr66WGDKC X-Google-Smtp-Source: ABdhPJwqz60lnMYJMQpGHoTi8iwQeNOUgrQQtXST13T5YVed303XZ3bcoQMukc6Km5n9KDlrG4OG1A== X-Received: by 2002:a92:1f4f:: with SMTP id i76mr326150ile.226.1596474019376; Mon, 03 Aug 2020 10:00:19 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:18 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 04/10] NFS: Add READ_PLUS data segment support Date: Mon, 3 Aug 2020 13:00:07 -0400 Message-Id: <20200803170013.1348350-5-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker This patch adds client support for decoding a single NFS4_CONTENT_DATA segment returned by the server. This is the simplest implementation possible, since it does not account for any hole segments in the reply. Signed-off-by: Anna Schumaker --- fs/nfs/nfs42xdr.c | 140 ++++++++++++++++++++++++++++++++++++++ fs/nfs/nfs4proc.c | 43 +++++++++++- fs/nfs/nfs4xdr.c | 1 + include/linux/nfs4.h | 2 +- include/linux/nfs_fs_sb.h | 1 + include/linux/nfs_xdr.h | 2 +- 6 files changed, 184 insertions(+), 5 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index c03f3246d6c5..9a1e18295e55 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -45,6 +45,15 @@ #define encode_deallocate_maxsz (op_encode_hdr_maxsz + \ encode_fallocate_maxsz) #define decode_deallocate_maxsz (op_decode_hdr_maxsz) +#define encode_read_plus_maxsz (op_encode_hdr_maxsz + \ + encode_stateid_maxsz + 3) +#define NFS42_READ_PLUS_SEGMENT_SIZE (1 /* data_content4 */ + \ + 2 /* data_info4.di_offset */ + \ + 2 /* data_info4.di_length */) +#define decode_read_plus_maxsz (op_decode_hdr_maxsz + \ + 1 /* rpr_eof */ + \ + 1 /* rpr_contents count */ + \ + NFS42_READ_PLUS_SEGMENT_SIZE) #define encode_seek_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + \ 2 /* offset */ + \ @@ -128,6 +137,14 @@ decode_putfh_maxsz + \ decode_deallocate_maxsz + \ decode_getattr_maxsz) +#define NFS4_enc_read_plus_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ + encode_putfh_maxsz + \ + encode_read_plus_maxsz) +#define NFS4_dec_read_plus_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ + decode_putfh_maxsz + \ + decode_read_plus_maxsz) #define NFS4_enc_seek_sz (compound_encode_hdr_maxsz + \ encode_sequence_maxsz + \ encode_putfh_maxsz + \ @@ -252,6 +269,16 @@ static void encode_deallocate(struct xdr_stream *xdr, encode_fallocate(xdr, args); } +static void encode_read_plus(struct xdr_stream *xdr, + const struct nfs_pgio_args *args, + struct compound_hdr *hdr) +{ + encode_op_hdr(xdr, OP_READ_PLUS, decode_read_plus_maxsz, hdr); + encode_nfs4_stateid(xdr, &args->stateid); + encode_uint64(xdr, args->offset); + encode_uint32(xdr, args->count); +} + static void encode_seek(struct xdr_stream *xdr, const struct nfs42_seek_args *args, struct compound_hdr *hdr) @@ -446,6 +473,28 @@ static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, encode_nops(&hdr); } +/* + * Encode READ_PLUS request + */ +static void nfs4_xdr_enc_read_plus(struct rpc_rqst *req, + struct xdr_stream *xdr, + const void *data) +{ + const struct nfs_pgio_args *args = data; + struct compound_hdr hdr = { + .minorversion = nfs4_xdr_minorversion(&args->seq_args), + }; + + encode_compound_hdr(xdr, req, &hdr); + encode_sequence(xdr, &args->seq_args, &hdr); + encode_putfh(xdr, args->fh, &hdr); + encode_read_plus(xdr, args, &hdr); + + rpc_prepare_reply_pages(req, args->pages, args->pgbase, + args->count, hdr.replen); + encode_nops(&hdr); +} + /* * Encode SEEK request */ @@ -694,6 +743,70 @@ static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *re return decode_op_hdr(xdr, OP_DEALLOCATE); } +static int decode_read_plus_data(struct xdr_stream *xdr, struct nfs_pgio_res *res, + uint32_t *eof) +{ + uint32_t count, recvd; + uint64_t offset; + __be32 *p; + + p = xdr_inline_decode(xdr, 8 + 4); + if (unlikely(!p)) + return -EIO; + + p = xdr_decode_hyper(p, &offset); + count = be32_to_cpup(p); + recvd = xdr_read_pages(xdr, count); + if (count > recvd) { + dprintk("NFS: server cheating in read reply: " + "count %u > recvd %u\n", count, recvd); + count = recvd; + *eof = 0; + } + + res->count += count; + return 0; +} + +static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) +{ + uint32_t eof, segments, type; + int status; + __be32 *p; + + status = decode_op_hdr(xdr, OP_READ_PLUS); + if (status) + return status; + + p = xdr_inline_decode(xdr, 4 + 4); + if (unlikely(!p)) + return -EIO; + + eof = be32_to_cpup(p++); + segments = be32_to_cpup(p++); + if (segments == 0) + goto out; + + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + return -EIO; + + type = be32_to_cpup(p++); + if (type == NFS4_CONTENT_DATA) + status = decode_read_plus_data(xdr, res, &eof); + else + return -EINVAL; + + if (status) + return status; + if (segments > 1) + eof = 0; + +out: + res->eof = eof; + return 0; +} + static int decode_seek(struct xdr_stream *xdr, struct nfs42_seek_res *res) { int status; @@ -870,6 +983,33 @@ static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp, return status; } +/* + * Decode READ_PLUS request + */ +static int nfs4_xdr_dec_read_plus(struct rpc_rqst *rqstp, + struct xdr_stream *xdr, + void *data) +{ + struct nfs_pgio_res *res = data; + struct compound_hdr hdr; + int status; + + status = decode_compound_hdr(xdr, &hdr); + if (status) + goto out; + status = decode_sequence(xdr, &res->seq_res, rqstp); + if (status) + goto out; + status = decode_putfh(xdr); + if (status) + goto out; + status = decode_read_plus(xdr, res); + if (!status) + status = res->count; +out: + return status; +} + /* * Decode SEEK request */ diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 2e2dac29a9e9..509198eb968e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -69,6 +69,10 @@ #include "nfs4trace.h" +#ifdef CONFIG_NFS_V4_2 +#include "nfs42.h" +#endif /* CONFIG_NFS_V4_2 */ + #define NFSDBG_FACILITY NFSDBG_PROC #define NFS4_BITMASK_SZ 3 @@ -5226,28 +5230,60 @@ static bool nfs4_read_stateid_changed(struct rpc_task *task, return true; } +static bool nfs4_read_plus_not_supported(struct rpc_task *task, + struct nfs_pgio_header *hdr) +{ + struct nfs_server *server = NFS_SERVER(hdr->inode); + struct rpc_message *msg = &task->tk_msg; + + if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS] && + server->caps & NFS_CAP_READ_PLUS && task->tk_status == -ENOTSUPP) { + server->caps &= ~NFS_CAP_READ_PLUS; + msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; + rpc_restart_call_prepare(task); + return true; + } + return false; +} + static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr) { - dprintk("--> %s\n", __func__); if (!nfs4_sequence_done(task, &hdr->res.seq_res)) return -EAGAIN; if (nfs4_read_stateid_changed(task, &hdr->args)) return -EAGAIN; + if (nfs4_read_plus_not_supported(task, hdr)) + return -EAGAIN; if (task->tk_status > 0) nfs_invalidate_atime(hdr->inode); return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) : nfs4_read_done_cb(task, hdr); } +#ifdef CONFIG_NFS_V4_2 +static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg) +{ + if (server->caps & NFS_CAP_READ_PLUS) + msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS]; + else + msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; +} +#else +static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg) +{ + msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; +} +#endif /* CONFIG_NFS_V4_2 */ + static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr, struct rpc_message *msg) { hdr->timestamp = jiffies; if (!hdr->pgio_done_cb) hdr->pgio_done_cb = nfs4_read_done_cb; - msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; + nfs42_read_plus_support(NFS_SERVER(hdr->inode), msg); nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0); } @@ -10006,7 +10042,8 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { | NFS_CAP_SEEK | NFS_CAP_LAYOUTSTATS | NFS_CAP_CLONE - | NFS_CAP_LAYOUTERROR, + | NFS_CAP_LAYOUTERROR + | NFS_CAP_READ_PLUS, .init_client = nfs41_init_client, .shutdown_client = nfs41_shutdown_client, .match_stateid = nfs41_match_stateid, diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 6742646d4feb..80d9d55a48c2 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -7580,6 +7580,7 @@ const struct rpc_procinfo nfs4_procedures[] = { PROC42(COPY_NOTIFY, enc_copy_notify, dec_copy_notify), PROC(LOOKUPP, enc_lookupp, dec_lookupp), PROC42(LAYOUTERROR, enc_layouterror, dec_layouterror), + PROC42(READ_PLUS, enc_read_plus, dec_read_plus), }; static unsigned int nfs_version4_counts[ARRAY_SIZE(nfs4_procedures)]; diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 4dba3c948932..4bf75b56758c 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -540,8 +540,8 @@ enum { NFSPROC4_CLNT_LOOKUPP, NFSPROC4_CLNT_LAYOUTERROR, - NFSPROC4_CLNT_COPY_NOTIFY, + NFSPROC4_CLNT_READ_PLUS, }; /* nfs41 types */ diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 465fa98258a3..11248c5a7b24 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -281,5 +281,6 @@ struct nfs_server { #define NFS_CAP_OFFLOAD_CANCEL (1U << 25) #define NFS_CAP_LAYOUTERROR (1U << 26) #define NFS_CAP_COPY_NOTIFY (1U << 27) +#define NFS_CAP_READ_PLUS (1U << 28) #endif diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 5fd0a9ef425f..6da54d010421 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -656,7 +656,7 @@ struct nfs_pgio_args { struct nfs_pgio_res { struct nfs4_sequence_res seq_res; struct nfs_fattr * fattr; - __u32 count; + __u64 count; __u32 op_status; union { struct { From patchwork Mon Aug 3 17:00:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698455 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8D927138A for ; Mon, 3 Aug 2020 17:00:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 75E8920678 for ; Mon, 3 Aug 2020 17:00:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="I5KKBU9b" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728152AbgHCRAW (ORCPT ); Mon, 3 Aug 2020 13:00:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbgHCRAV (ORCPT ); Mon, 3 Aug 2020 13:00:21 -0400 Received: from mail-il1-x144.google.com (mail-il1-x144.google.com [IPv6:2607:f8b0:4864:20::144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77EEFC06174A for ; Mon, 3 Aug 2020 10:00:21 -0700 (PDT) Received: by mail-il1-x144.google.com with SMTP id t4so31686402iln.1 for ; Mon, 03 Aug 2020 10:00:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AWE2v2TtY926P32fJL/hsJ0GYyCK7TK30XUImatQbe8=; b=I5KKBU9bUJNQDtsNrSVYO3tOetfZpOuB2YHhH7k4Kn9L49+VnT4A/UWweWsL6x6SnH bx0fJnS/WpNphxdumJTSFBugqIDb/MC6dtut3oNzSgpHLOdOABXxL2OXyGobxq64JdLN w6Gao/ASv2NZt17l9oqYk+uMstyVuHc3gNlaa1B8HAci7KwyTR2lWydZ70kDrVIWBn4h lyu1qi0iGzLppGI8RayxGd33nwGyfN3gzhhrqe3t3XudJl0bCIW+7iPm25ChuP7HBYuY JDwk2O9o05CXP9pj4ndPuGMoxhd3jJRFkyvPPi+4humpZXB91sbw9UM3l1DUPWpmXLvL W9PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=AWE2v2TtY926P32fJL/hsJ0GYyCK7TK30XUImatQbe8=; b=NXVzSOzdNHK8zQr0Y0MGsm+wjM/34Co7JwYNOs8xqcXE5cdYShktDceDzKYFGrjGf6 uw2oacZIs8ErjlEl04NBH/i+3KGSRYw98zIu4UkNKASSilu+oDxaCAhpDvgMXqnhfHJn 8GpyVaDokPs+yr8WhuQ24dF6LN7AIezrBUO/iiPvDgWSb1li3Rg7ecvVVM5u6woVqCLs PURzklhA08ehIwNS7+AK3vkWnuKynwQYtSnzz7IyqmmG644rwiF/+rjIwQmvkQK38mF6 DjKIpCFJamIKCU+o6+orIo6jIn4uKIneL4xjaqP2x+1XedtXG/h91iO9E/w8ZBAeiRme u0Fg== X-Gm-Message-State: AOAM533Yzgx46Fh78EZcSUjH0pns+40YiCSYtshTeJCluOVuyK4YSaZR 7zUNKYhsqlqwapPHYkYKU9N0cbyv X-Google-Smtp-Source: ABdhPJxPQQ9mdg1sd0xAUiJR7U4hIPdOX85hB3AT8Kd5x972tfsOsrooJGvHXnIdwDZ5aGC3r0CDYg== X-Received: by 2002:a05:6e02:e10:: with SMTP id a16mr332165ilk.204.1596474020559; Mon, 03 Aug 2020 10:00:20 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:19 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 05/10] SUNRPC: Split out xdr_realign_pages() from xdr_align_pages() Date: Mon, 3 Aug 2020 13:00:08 -0400 Message-Id: <20200803170013.1348350-6-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker I don't need the entire align pages code for READ_PLUS, so split out the part I do need so I don't need to reimplement anything. Signed-off-by: Anna Schumaker --- net/sunrpc/xdr.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 8d29450fdce5..70efb35c119e 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -1042,26 +1042,33 @@ __be32 * xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes) } EXPORT_SYMBOL_GPL(xdr_inline_decode); -static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len) +static void xdr_realign_pages(struct xdr_stream *xdr) { struct xdr_buf *buf = xdr->buf; - struct kvec *iov; - unsigned int nwords = XDR_QUADLEN(len); + struct kvec *iov = buf->head; unsigned int cur = xdr_stream_pos(xdr); unsigned int copied, offset; - if (xdr->nwords == 0) - return 0; - /* Realign pages to current pointer position */ - iov = buf->head; if (iov->iov_len > cur) { offset = iov->iov_len - cur; copied = xdr_shrink_bufhead(buf, offset); trace_rpc_xdr_alignment(xdr, offset, copied); xdr->nwords = XDR_QUADLEN(buf->len - cur); } +} +static unsigned int xdr_align_pages(struct xdr_stream *xdr, unsigned int len) +{ + struct xdr_buf *buf = xdr->buf; + unsigned int nwords = XDR_QUADLEN(len); + unsigned int cur = xdr_stream_pos(xdr); + unsigned int copied, offset; + + if (xdr->nwords == 0) + return 0; + + xdr_realign_pages(xdr); if (nwords > xdr->nwords) { nwords = xdr->nwords; len = nwords << 2; From patchwork Mon Aug 3 17:00:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698457 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 78341138A for ; Mon, 3 Aug 2020 17:00:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 60EE522B45 for ; Mon, 3 Aug 2020 17:00:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kbiY+Oif" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728158AbgHCRAX (ORCPT ); Mon, 3 Aug 2020 13:00:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbgHCRAW (ORCPT ); Mon, 3 Aug 2020 13:00:22 -0400 Received: from mail-il1-x141.google.com (mail-il1-x141.google.com [IPv6:2607:f8b0:4864:20::141]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F4FCC06174A for ; Mon, 3 Aug 2020 10:00:22 -0700 (PDT) Received: by mail-il1-x141.google.com with SMTP id l17so21493689ilq.13 for ; Mon, 03 Aug 2020 10:00:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FcJit/hiUG/fNeS1TuFDMVteA3MrVX7lYqy+y8dtUCs=; b=kbiY+Oif8u2zJTQ1eEheAQ76n3pLlLGniCytei543TFctArLNSLb8L3UfFFYZOnzA1 dXacct2yTHR3vBrbJ/yDudnLdV/CnJ+XdfLAduJJIU4lwkN7Rf+lQJ/fz+PFfGRlN7eC A2HJO8fQY7tYY1RGe07Jil7/kGrrCPkGq+GWuRJOiGGaNeImFQsZaFnOY8lLhD0bPbBy ntsdhtrfpRCN+tI+13UyenF4j+U8fm4Xef3GJctkzutmL22tRwfSzJFA9Jv3ak8loMb8 cqHa4S5+NHFh4OO4R2raE/WA/99Anx7sn/1qLpfZRY/jUQIFOH2qOegmS8rpzk2UfePx TxkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=FcJit/hiUG/fNeS1TuFDMVteA3MrVX7lYqy+y8dtUCs=; b=odthLQqE9kBov1BKZ2QsPZXSvh+PCx/TfSk9XiVSqJy+eNZh7k8E18UYaaaDa6vZKE Mxd7JxmBjV4N7/eV/rPmTxeEMJZceCP5WaBV52P1FP0uDuoLsiQvkm+Z9a+BFw4nJhF7 Cs4g8Wa9+DGj3+Dj6hHSlrEbI3x3NlWvgJKLNu8Nw1b2QXdseXd0yrYWUZB4750hcVgc aJWIeYuhe9isgOI0ftc+PgWMyfU24m0p/YltOv0xOgR35XWbIvOL0HL5wDWRV/FOPC1L 5vX2S1QB/RZiDEh82erpfZtT2P8TlV+WOz7YZFGWYzRoWcUZqRhHaHJsH6k1YNmdCi9W eptg== X-Gm-Message-State: AOAM533zZKvrIBJUkRVp04etzTNE1fB1pv6ZBgU3CnmYVlQnHNAkmLkd X4a3KwSUzW5SHTSEsEoXAFUaGc+2 X-Google-Smtp-Source: ABdhPJyd6THXr25Z3vf0QnbsOMJL1/OxIpDrdtDwJnfWKd/vO6yBye9lwZdlyAufUrIYZUEiPD970w== X-Received: by 2002:a05:6e02:f07:: with SMTP id x7mr363117ilj.40.1596474021510; Mon, 03 Aug 2020 10:00:21 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:20 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 06/10] SUNRPC: Split out _shift_data_right_tail() Date: Mon, 3 Aug 2020 13:00:09 -0400 Message-Id: <20200803170013.1348350-7-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker xdr_shrink_pagelen() is very similar to what we need for hole expansion, so split out the common code into its own function that can be used by both functions. Signed-off-by: Anna Schumaker --- net/sunrpc/xdr.c | 68 +++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 70efb35c119e..d8c9555c6f2b 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -266,6 +266,46 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base, } while ((len -= copy) != 0); } +static unsigned int +_shift_data_right_tail(struct xdr_buf *buf, unsigned int pgfrom, size_t len) +{ + struct kvec *tail = buf->tail; + unsigned int tailbuf_len; + unsigned int result = 0; + size_t copy; + + tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len; + + /* Shift the tail first */ + if (tailbuf_len != 0) { + unsigned int free_space = tailbuf_len - tail->iov_len; + + if (len < free_space) + free_space = len; + if (len > free_space) + len = free_space; + + tail->iov_len += free_space; + copy = len; + + if (tail->iov_len > len) { + char *p = (char *)tail->iov_base + len; + memmove(p, tail->iov_base, tail->iov_len - free_space); + result += tail->iov_len - free_space; + } else + copy = tail->iov_len; + + /* Copy from the inlined pages into the tail */ + _copy_from_pages((char *)tail->iov_base, + buf->pages, + buf->page_base + pgfrom, + copy); + result += copy; + } + + return result; +} + /** * _copy_to_pages * @pages: array of pages @@ -446,39 +486,13 @@ xdr_shrink_bufhead(struct xdr_buf *buf, size_t len) static unsigned int xdr_shrink_pagelen(struct xdr_buf *buf, size_t len) { - struct kvec *tail; - size_t copy; unsigned int pglen = buf->page_len; - unsigned int tailbuf_len; unsigned int result; - result = 0; - tail = buf->tail; if (len > buf->page_len) len = buf-> page_len; - tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len; - /* Shift the tail first */ - if (tailbuf_len != 0) { - unsigned int free_space = tailbuf_len - tail->iov_len; - - if (len < free_space) - free_space = len; - tail->iov_len += free_space; - - copy = len; - if (tail->iov_len > len) { - char *p = (char *)tail->iov_base + len; - memmove(p, tail->iov_base, tail->iov_len - len); - result += tail->iov_len - len; - } else - copy = tail->iov_len; - /* Copy from the inlined pages into the tail */ - _copy_from_pages((char *)tail->iov_base, - buf->pages, buf->page_base + pglen - len, - copy); - result += copy; - } + result = _shift_data_right_tail(buf, pglen - len, len); buf->page_len -= len; buf->buflen -= len; /* Have we truncated the message? */ From patchwork Mon Aug 3 17:00:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698459 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DDECF13B1 for ; Mon, 3 Aug 2020 17:00:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C66FF20792 for ; Mon, 3 Aug 2020 17:00:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WeYrAbpg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728150AbgHCRAY (ORCPT ); Mon, 3 Aug 2020 13:00:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56500 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728156AbgHCRAX (ORCPT ); Mon, 3 Aug 2020 13:00:23 -0400 Received: from mail-il1-x143.google.com (mail-il1-x143.google.com [IPv6:2607:f8b0:4864:20::143]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6AA6EC061756 for ; Mon, 3 Aug 2020 10:00:23 -0700 (PDT) Received: by mail-il1-x143.google.com with SMTP id c16so19897002ils.8 for ; Mon, 03 Aug 2020 10:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TbZF6jnu0ZG8YLg6LT7LD13tiLDKfqf0DCerycyJsGI=; b=WeYrAbpgBQQsvTGxBCFLOHE9j3kiWJh3qI8tFpxvtVPCfu2ughPT6a8h92oyYyfxFi COl0blyXcR8QTzmEwE+nLiVxag2VBfA351KGw+umng539EtqsOZLIJdUF0M7EfAq6kGR bh/kv+b5aqQP69n/Q4ZPKAYa42rRUyuPOpF9ENPflpHjMWXK00n9h+ejcDsP3WbERyaY OFWmdRdGK++skhsGsA1/8U+E/MNEbKhGpTDtAaIB1s3iUjfxqFdfv9pYSOcT05s0GYo5 ONUvnTSifTERbCuEkTROkOIfGHvB6ioubAfx8EOmUo7M0uT9A3l5aRV6xL1Xnavs5kv0 XNIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=TbZF6jnu0ZG8YLg6LT7LD13tiLDKfqf0DCerycyJsGI=; b=JRCPzD6E7w0p3JRsN85TAVmClH4l+wid7j8lC5ihEUBnevMFJhLVVoJr0o/tjb2Xw4 bOk+ZXMF4dR/GIQ8sZS4dPvMpf54oh9VtzL9yx5CYqu3qKl50bwx0DPgUlS5opwpxtT7 YB7T59FrKaLd6vAhoj8GQrGBOhPntI8Yip0qllUodmjtRDaljLcJfru3P6Z0wubqfzoy d8Itx6Q8GdnKrb2iFs3lN9GrrapFGpdKvI7FdtxqCDQh/hmR/nAJWMSFNTRAOPqDa1hU jXQ8k5s/HhZbkSp6Ftu7dAtsJx38W46mLT3iSgZO3YSxc/CGKbS2FZlEafpOFBBzs0wJ 1W+A== X-Gm-Message-State: AOAM530CvkthINBEE07CUZ/bVJktDc//9UeypvzZvRvoJ3mN1CjkIzyU m4yjkMOgUaKhAvMlNUYC+WQyVHst X-Google-Smtp-Source: ABdhPJxNcCUY7VUuzXMKCsssFZQaNz2n21uRp5qjMPDMv43lgvoepBHNpK6Yva9TQuZtZ7z0uYt+PA== X-Received: by 2002:a92:d5ca:: with SMTP id d10mr314123ilq.216.1596474022493; Mon, 03 Aug 2020 10:00:22 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:21 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 07/10] SUNRPC: Add the ability to expand holes in data pages Date: Mon, 3 Aug 2020 13:00:10 -0400 Message-Id: <20200803170013.1348350-8-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker This patch adds the ability to "read a hole" into a set of XDR data pages by taking the following steps: 1) Shift all data after the current xdr->p to the right, possibly into the tail, 2) Zero the specified range, and 3) Update xdr->p to point beyond the hole. Signed-off-by: Anna Schumaker --- include/linux/sunrpc/xdr.h | 1 + net/sunrpc/xdr.c | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 40318ff97c83..de1f301f4864 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -252,6 +252,7 @@ extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); extern unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len); extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); extern int xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, int (*actor)(struct scatterlist *, void *), void *data); +extern uint64_t xdr_expand_hole(struct xdr_stream *, uint64_t, uint64_t); /** * xdr_stream_remaining - Return the number of bytes remaining in the stream diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index d8c9555c6f2b..24baf052e6e6 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -390,6 +390,42 @@ _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len) } EXPORT_SYMBOL_GPL(_copy_from_pages); +/** + * _zero_pages + * @pages: array of pages + * @pgbase: beginning page vector address + * @len: length + */ +static void +_zero_pages(struct page **pages, size_t pgbase, size_t len) +{ + struct page **page; + char *vpage; + size_t zero; + + page = pages + (pgbase >> PAGE_SHIFT); + pgbase &= ~PAGE_MASK; + + do { + zero = PAGE_SIZE - pgbase; + if (zero > len) + zero = len; + + vpage = kmap_atomic(*page); + memset(vpage + pgbase, 0, zero); + kunmap_atomic(vpage); + + pgbase += zero; + if (pgbase == PAGE_SIZE) { + flush_dcache_page(*page); + pgbase = 0; + page++; + } + + } while ((len -= zero) != 0); + flush_dcache_page(*page); +} + /** * xdr_shrink_bufhead * @buf: xdr_buf @@ -1141,6 +1177,43 @@ unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) } EXPORT_SYMBOL_GPL(xdr_read_pages); +uint64_t xdr_expand_hole(struct xdr_stream *xdr, uint64_t offset, uint64_t length) +{ + struct xdr_buf *buf = xdr->buf; + unsigned int bytes; + unsigned int from; + unsigned int truncated = 0; + + if ((offset + length) < offset || + (offset + length) > buf->page_len) + length = buf->page_len - offset; + + xdr_realign_pages(xdr); + from = xdr_page_pos(xdr); + bytes = xdr->nwords << 2; + + if (offset + length + bytes > buf->page_len) { + unsigned int shift = (offset + length + bytes) - buf->page_len; + unsigned int res = _shift_data_right_tail(buf, from + bytes - shift, shift); + truncated = shift - res; + xdr->nwords -= XDR_QUADLEN(truncated); + bytes -= shift; + } + + /* Now move the page data over and zero pages */ + if (bytes > 0) + _shift_data_right_pages(buf->pages, + buf->page_base + offset + length, + buf->page_base + from, + bytes); + _zero_pages(buf->pages, buf->page_base + offset, length); + + buf->len += length - (from - offset) - truncated; + xdr_set_page(xdr, offset + length, PAGE_SIZE); + return length; +} +EXPORT_SYMBOL_GPL(xdr_expand_hole); + /** * xdr_enter_page - decode data from the XDR page * @xdr: pointer to xdr_stream struct From patchwork Mon Aug 3 17:00:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698461 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D8C84138A for ; Mon, 3 Aug 2020 17:00:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BF9DF20792 for ; Mon, 3 Aug 2020 17:00:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EsJnnXbN" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728156AbgHCRAZ (ORCPT ); Mon, 3 Aug 2020 13:00:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56504 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgHCRAY (ORCPT ); Mon, 3 Aug 2020 13:00:24 -0400 Received: from mail-io1-xd44.google.com (mail-io1-xd44.google.com [IPv6:2607:f8b0:4864:20::d44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59500C06174A for ; Mon, 3 Aug 2020 10:00:24 -0700 (PDT) Received: by mail-io1-xd44.google.com with SMTP id t15so30319296iob.3 for ; Mon, 03 Aug 2020 10:00:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3XKKgP0H0vf+KZtXz13oZQXMZRxws2V9QHF/uSVmIjA=; b=EsJnnXbNOatiZBi1Z7DIp4IYrYgDQ/9O6ADdLFsh3IjIZIdpyvzcnU0jQxcU5astmW jVBIUy7XYnPZDGvlE4XSg58dav63awhr0ADTHwkQSM0UBVa0goBVddhipmRcO2qx+nPK xdSlNPA3P0D3G3ZWzcpx68S8DN/uhCXozC0e8aZqV1+i0rv3R/jIyQIcoYo2HElURWwj S61AUELtFPRktPOtv835WgBfmJB/8EBYOKgpM7jSZmVnVjpwiKuQafC041DgwP+/RlLM x7Ewf79Y9nNT43ZnQwEUnyucs9FoFEdyKZGUn1ohKNFDRvIaeuNhEmZCz5W8GPWtdzja OGpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=3XKKgP0H0vf+KZtXz13oZQXMZRxws2V9QHF/uSVmIjA=; b=WuwPda5YNAnkV3UICjkya8eM0b2KPTMo6hXqOAdjLupGZCGVxJnmt7S78b2cGoLa7h +9PFBSnHoWc8b1Osjsdu7mfnvOvyo83PHdQbvEu9NzgrlJI6yCn3gdGDs0dI07PajvUP e8irqnA5qo2HwG+W//HanGeunTHxXjQFTKC5hc5i6pxy8nadAmwcEBwx2o2rUojNcZq4 M39C4vLid+sWhLzp2K/W3CZPlVbpnXVPqwKXV2hISB8p6uWgHkv0kz6e1QyOkTz/TXV/ 5g1E3L+SaRPNlRK6JQ5z67FhZDV4fsXbu6oqxSnIQuv37MumhmeF119wM7LGkulSpJn4 XB2w== X-Gm-Message-State: AOAM530wXiWtpS4ri9qssd8Ctg/5QZxwVSNoaLNXsGfhGxlf6iZUAjmj 6Wo6KodQUgNM/HpYhlOZuHqYCt4c X-Google-Smtp-Source: ABdhPJyf1ACQRf/PP2RyJ0Lqp0pQNC6kzldKP9ZXsIYAXz7kJVB22jbxAhq1eVN3EERh9OZJAEO0ag== X-Received: by 2002:a5e:8408:: with SMTP id h8mr757269ioj.137.1596474023466; Mon, 03 Aug 2020 10:00:23 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:22 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 08/10] NFS: Add READ_PLUS hole segment decoding Date: Mon, 3 Aug 2020 13:00:11 -0400 Message-Id: <20200803170013.1348350-9-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker We keep things simple for now by only decoding a single hole or data segment returned by the server, even if they returned more to us. Signed-off-by: Anna Schumaker --- fs/nfs/nfs42xdr.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 9a1e18295e55..791e90353bc2 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -53,7 +53,7 @@ #define decode_read_plus_maxsz (op_decode_hdr_maxsz + \ 1 /* rpr_eof */ + \ 1 /* rpr_contents count */ + \ - NFS42_READ_PLUS_SEGMENT_SIZE) + 2 * NFS42_READ_PLUS_SEGMENT_SIZE) #define encode_seek_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + \ 2 /* offset */ + \ @@ -768,6 +768,29 @@ static int decode_read_plus_data(struct xdr_stream *xdr, struct nfs_pgio_res *re return 0; } +static int decode_read_plus_hole(struct xdr_stream *xdr, struct nfs_pgio_res *res, + uint32_t *eof) +{ + uint64_t offset, length, recvd; + __be32 *p; + + p = xdr_inline_decode(xdr, 8 + 8); + if (unlikely(!p)) + return -EIO; + + p = xdr_decode_hyper(p, &offset); + p = xdr_decode_hyper(p, &length); + + recvd = xdr_expand_hole(xdr, 0, length); + if (recvd < length) { + *eof = 0; + length = recvd; + } + + res->count += length; + return 0; +} + static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) { uint32_t eof, segments, type; @@ -794,6 +817,8 @@ static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) type = be32_to_cpup(p++); if (type == NFS4_CONTENT_DATA) status = decode_read_plus_data(xdr, res, &eof); + else if (type == NFS4_CONTENT_HOLE) + status = decode_read_plus_hole(xdr, res, &eof); else return -EINVAL; From patchwork Mon Aug 3 17:00:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698463 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B4C73138A for ; Mon, 3 Aug 2020 17:00:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9D61A20792 for ; Mon, 3 Aug 2020 17:00:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="r2NE3TEH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728163AbgHCRA1 (ORCPT ); Mon, 3 Aug 2020 13:00:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56510 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728157AbgHCRA0 (ORCPT ); Mon, 3 Aug 2020 13:00:26 -0400 Received: from mail-io1-xd43.google.com (mail-io1-xd43.google.com [IPv6:2607:f8b0:4864:20::d43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B88CC06174A for ; Mon, 3 Aug 2020 10:00:25 -0700 (PDT) Received: by mail-io1-xd43.google.com with SMTP id v6so23994925iow.11 for ; Mon, 03 Aug 2020 10:00:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kCXOKz0tAEqxCMTQI43XB3ts+zVQF3aRh9mgqDaMXZY=; b=r2NE3TEHsdr6mCfICLRLfMPtyVGX03+7mzpahYQZJnZ1tkbLcipo5FtJvHs0tYmHZ1 5rxr//kR8H4egsasyF+7iAYIYUMRw7tkHru9d+2KaeBLY9HXImoNkQurovpb+IncbPLO UZQ9KoF0/iOffbASG14dy/AKZddi4XDpHEdUaQHqJdB1WWvZV0/3DY+J0BnenoTbA+YP mKWOXxX4A2nqB0Ep6nwjWVg4o2Z5uskbfu6HQdbHsAkTs40kfDHSaSc+NHzVfdStZvev G3EdT2Ih65BjX6e5ZlAEF9YyTslEY4K3bLxs4eqMLC/RR90XbO+8yesTVLthb2BlW0UV TiXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=kCXOKz0tAEqxCMTQI43XB3ts+zVQF3aRh9mgqDaMXZY=; b=nlLr2Q6ol+wd1S2byUc3hloPNPLM8Ak7A7Z1IXK4f7+Abs5BG4Kv9bFMIlYnhBIxnV ShgwiP6/dZeKcdMV0ulxfiZC8jcHco5v2S7tQOmUzwtJ0OI969Hi4ov48EqQs+JCQJvf 7ZQt2Azn+xgnqnshe1qJU4pOkSSGZL3E0f0f0nUi4qaxZRZ6XCHsGfwP9n+5/0xQpNTM YKBXsNh9+QxVu3THZzB4jqF1MqQrlUVOdqUMgjVpc4R+X4g+J5U71LM6DibrNTQGffl9 H0huT7FJe2JDn7MNedY2ez3qqQg3h0sJbLloh8UomWc0spPv9zDndTSHYfpoyeI2PL+h OKCg== X-Gm-Message-State: AOAM532a0MESdzqnc/CWP1qCK+EbIOh2KGq2647tpNHT5Re98QZMb87o ZJ/U4T+CVENXcCGcO33dQl+tASaI X-Google-Smtp-Source: ABdhPJyoaCLiAFgQsOCYbToAkPQf2a60+2atxCSfrDMPXtDLZiNKVX9cJlzgQXGSwwhjTAxXoiW1Zg== X-Received: by 2002:a05:6602:2515:: with SMTP id i21mr800974ioe.120.1596474024483; Mon, 03 Aug 2020 10:00:24 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:23 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 09/10] SUNRPC: Add an xdr_align_data() function Date: Mon, 3 Aug 2020 13:00:12 -0400 Message-Id: <20200803170013.1348350-10-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker For now, this function simply aligns the data at the beginning of the pages. This can eventually be expanded to shift data to the correct offsets when we're ready. Signed-off-by: Anna Schumaker --- include/linux/sunrpc/xdr.h | 3 + net/sunrpc/xdr.c | 120 ++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 1 deletion(-) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index de1f301f4864..b05a2d6611c5 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -206,6 +206,8 @@ extern int xdr_encode_array2(struct xdr_buf *buf, unsigned int base, struct xdr_array2_desc *desc); extern void _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len); +extern void _copy_to_pages(struct page **pages, size_t pgbase, const char *p, + size_t len); /* * Provide some simple tools for XDR buffer overflow-checking etc. @@ -252,6 +254,7 @@ extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes); extern unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len); extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); extern int xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, int (*actor)(struct scatterlist *, void *), void *data); +extern uint64_t xdr_align_data(struct xdr_stream *, uint64_t, uint32_t); extern uint64_t xdr_expand_hole(struct xdr_stream *, uint64_t, uint64_t); /** diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 24baf052e6e6..f42da5051f36 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -201,6 +201,88 @@ EXPORT_SYMBOL_GPL(xdr_inline_pages); * Helper routines for doing 'memmove' like operations on a struct xdr_buf */ +/** + * _shift_data_left_pages + * @pages: vector of pages containing both the source and dest memory area. + * @pgto_base: page vector address of destination + * @pgfrom_base: page vector address of source + * @len: number of bytes to copy + * + * Note: the addresses pgto_base and pgfrom_base are both calculated in + * the same way: + * if a memory area starts at byte 'base' in page 'pages[i]', + * then its address is given as (i << PAGE_CACHE_SHIFT) + base + * Alse note: pgto_base must be < pgfrom_base, but the memory areas + * they point to may overlap. + */ +static void +_shift_data_left_pages(struct page **pages, size_t pgto_base, + size_t pgfrom_base, size_t len) +{ + struct page **pgfrom, **pgto; + char *vfrom, *vto; + size_t copy; + + BUG_ON(pgfrom_base <= pgto_base); + + pgto = pages + (pgto_base >> PAGE_SHIFT); + pgfrom = pages + (pgfrom_base >> PAGE_SHIFT); + + pgto_base &= ~PAGE_MASK; + pgfrom_base &= ~PAGE_MASK; + + do { + if (pgto_base >= PAGE_SIZE) { + pgto_base = 0; + pgto++; + } + if (pgfrom_base >= PAGE_SIZE){ + pgfrom_base = 0; + pgfrom++; + } + + copy = len; + if (copy > (PAGE_SIZE - pgto_base)) + copy = PAGE_SIZE - pgto_base; + if (copy > (PAGE_SIZE - pgfrom_base)) + copy = PAGE_SIZE - pgfrom_base; + + vto = kmap_atomic(*pgto); + if (*pgto != *pgfrom) { + vfrom = kmap_atomic(*pgfrom); + memcpy(vto + pgto_base, vfrom + pgfrom_base, copy); + kunmap_atomic(vfrom); + } else + memmove(vto + pgto_base, vto + pgfrom_base, copy); + flush_dcache_page(*pgto); + kunmap_atomic(vto); + + pgto_base += copy; + pgfrom_base += copy; + + } while ((len -= copy) != 0); +} + +static void +_shift_data_left_tail(struct xdr_buf *buf, unsigned int pgto, size_t len) +{ + struct kvec *tail = buf->tail; + + if (len > tail->iov_len) + len = tail->iov_len; + + _copy_to_pages(buf->pages, + buf->page_base + pgto, + (char *)tail->iov_base, + len); + tail->iov_len -= len; + + if (tail->iov_len > 0) + memmove((char *)tail->iov_base, + tail->iov_base + len, + tail->iov_len); +} + /** * _shift_data_right_pages * @pages: vector of pages containing both the source and dest memory area. @@ -316,7 +398,7 @@ _shift_data_right_tail(struct xdr_buf *buf, unsigned int pgfrom, size_t len) * Copies data from an arbitrary memory location into an array of pages * The copy is assumed to be non-overlapping. */ -static void +void _copy_to_pages(struct page **pages, size_t pgbase, const char *p, size_t len) { struct page **pgto; @@ -1177,6 +1259,42 @@ unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) } EXPORT_SYMBOL_GPL(xdr_read_pages); +uint64_t xdr_align_data(struct xdr_stream *xdr, uint64_t offset, uint32_t length) +{ + struct xdr_buf *buf = xdr->buf; + unsigned int from, bytes; + unsigned int shift = 0; + + if ((offset + length) < offset || + (offset + length) > buf->page_len) + length = buf->page_len - offset; + + xdr_realign_pages(xdr); + from = xdr_page_pos(xdr); + bytes = xdr->nwords << 2; + if (length < bytes) + bytes = length; + + /* Move page data to the left */ + if (from > offset) { + shift = min_t(unsigned int, bytes, buf->page_len - from); + _shift_data_left_pages(buf->pages, + buf->page_base + offset, + buf->page_base + from, + shift); + bytes -= shift; + + /* Move tail data into the pages, if necessary */ + if (bytes > 0) + _shift_data_left_tail(buf, offset + shift, bytes); + } + + xdr->nwords -= XDR_QUADLEN(length); + xdr_set_page(xdr, from + length, PAGE_SIZE); + return length; +} +EXPORT_SYMBOL_GPL(xdr_align_data); + uint64_t xdr_expand_hole(struct xdr_stream *xdr, uint64_t offset, uint64_t length) { struct xdr_buf *buf = xdr->buf; From patchwork Mon Aug 3 17:00:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11698465 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D1A6813B1 for ; Mon, 3 Aug 2020 17:00:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B9D8B20792 for ; Mon, 3 Aug 2020 17:00:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="uDrVzWZk" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728157AbgHCRA1 (ORCPT ); Mon, 3 Aug 2020 13:00:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgHCRA0 (ORCPT ); Mon, 3 Aug 2020 13:00:26 -0400 Received: from mail-io1-xd41.google.com (mail-io1-xd41.google.com [IPv6:2607:f8b0:4864:20::d41]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE6F3C06174A for ; Mon, 3 Aug 2020 10:00:26 -0700 (PDT) Received: by mail-io1-xd41.google.com with SMTP id q75so31088142iod.1 for ; Mon, 03 Aug 2020 10:00:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bGONlmzroZFZ4wFhQmr90OCGCMV8PUtcRW90Y70RUIw=; b=uDrVzWZkLEeyPlRHoKQQGMHu2QPBeYqSHF8W0c96t+x0W7MswhzAffs3L6d97UZefl tTt6w8Xr56Hdq114LRLDXidkrKC7AYkNAZXuSD4pmWXO2vfs58Wgh3aKmZEkeAYFnYQM nmYiY3i17RaJPcuaUNAyU0DLvDZ37jGpXKNHRc8+sl222jpIp3dSTw+6ceSQcAg62Z9M oBxXFhB43wUg4tB90dK+6ii8fAhczE3HeczlvHTmrqpDY5lVgqtr2O+KVIv9QuCbhlpS jFO0JfZOpO/FNedC+4Z1rJXnnyP7aEb3B/i1GgTDHVBJT3Tk3UlYWtwFCad+yPpeaJnw 3lcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=bGONlmzroZFZ4wFhQmr90OCGCMV8PUtcRW90Y70RUIw=; b=eQF3Q1ROiNYJGV1rI2hsDk2HXE1skRGwd7j2Zq52nHpqgnwa4xNafS71g0XAaXIOiO zfwpWa1FVnld02GarfqiDdxHPB6dNlOQMxb2VOGg5U2EdcqqhGaoX11VMUrGXDX3/Sv/ Au57q5vVVDgpfkQByEcMmbeNtHcxoJsQUjRiPmrKoXDAdyZGcXCmivwNqJXT0/enx/To DtIObDZzfWC8TVxy7Eq0UTDiM7yNeocCZChJLFj5wptN5YzPpl4QHI8jURjrRxQM0g4P xWE2JFR/7UYfv2xlAupPNzK1mrf5ZYDHTz5qR0BjbGnKAsOGK5IvxK+lll27qjtWkWCR 7VnA== X-Gm-Message-State: AOAM530UX+c7YdxnYZz4RuFE8nKFEC+AdNvZ4i+XrGNN7d7MXNzA9Jbt 3XSSWgjGbuIPLb7MpRf3p+DCuKTt X-Google-Smtp-Source: ABdhPJx6Ytiki2aRrjq0dG5uDZR0aUzRQz2FajmgWy2m3sOzRNkQFEsR3tfa6iRKmoQ4txuQSOtI4g== X-Received: by 2002:a05:6602:2503:: with SMTP id i3mr758016ioe.165.1596474025678; Mon, 03 Aug 2020 10:00:25 -0700 (PDT) Received: from gouda.nowheycreamery.com (c-68-32-74-190.hsd1.mi.comcast.net. [68.32.74.190]) by smtp.gmail.com with ESMTPSA id a6sm10498040ioo.44.2020.08.03.10.00.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2020 10:00:24 -0700 (PDT) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH v3 10/10] NFS: Decode a full READ_PLUS reply Date: Mon, 3 Aug 2020 13:00:13 -0400 Message-Id: <20200803170013.1348350-11-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> References: <20200803170013.1348350-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Anna Schumaker Decode multiple hole and data segments sent by the server, placing everything directly where they need to go in the xdr pages. Signed-off-by: Anna Schumaker --- fs/nfs/nfs42xdr.c | 50 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 791e90353bc2..c31c6fadee19 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -756,16 +756,15 @@ static int decode_read_plus_data(struct xdr_stream *xdr, struct nfs_pgio_res *re p = xdr_decode_hyper(p, &offset); count = be32_to_cpup(p); - recvd = xdr_read_pages(xdr, count); + recvd = xdr_align_data(xdr, res->count, count); if (count > recvd) { dprintk("NFS: server cheating in read reply: " "count %u > recvd %u\n", count, recvd); - count = recvd; *eof = 0; } - res->count += count; - return 0; + res->count += recvd; + return count - recvd; } static int decode_read_plus_hole(struct xdr_stream *xdr, struct nfs_pgio_res *res, @@ -780,21 +779,18 @@ static int decode_read_plus_hole(struct xdr_stream *xdr, struct nfs_pgio_res *re p = xdr_decode_hyper(p, &offset); p = xdr_decode_hyper(p, &length); - - recvd = xdr_expand_hole(xdr, 0, length); - if (recvd < length) { + recvd = xdr_expand_hole(xdr, res->count, length); + if (recvd < length) *eof = 0; - length = recvd; - } - res->count += length; - return 0; + res->count += recvd; + return length - recvd; } static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) { uint32_t eof, segments, type; - int status; + int status, i; __be32 *p; status = decode_op_hdr(xdr, OP_READ_PLUS); @@ -810,22 +806,24 @@ static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) if (segments == 0) goto out; - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) - return -EIO; + for (i = 0; i < segments; i++) { + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + return -EIO; - type = be32_to_cpup(p++); - if (type == NFS4_CONTENT_DATA) - status = decode_read_plus_data(xdr, res, &eof); - else if (type == NFS4_CONTENT_HOLE) - status = decode_read_plus_hole(xdr, res, &eof); - else - return -EINVAL; + type = be32_to_cpup(p++); + if (type == NFS4_CONTENT_DATA) + status = decode_read_plus_data(xdr, res, &eof); + else if (type == NFS4_CONTENT_HOLE) + status = decode_read_plus_hole(xdr, res, &eof); + else + return -EINVAL; - if (status) - return status; - if (segments > 1) - eof = 0; + if (status < 0) + return status; + if (status > 0) + break; + } out: res->eof = eof;