From patchwork Mon Aug 17 16:53:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718959 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 775EE14F6 for ; Mon, 17 Aug 2020 17:33:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5DF0A2063A for ; Mon, 17 Aug 2020 17:33:31 +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="hIrYT2wc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389173AbgHQRd1 (ORCPT ); Mon, 17 Aug 2020 13:33:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46816 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389118AbgHQQxr (ORCPT ); Mon, 17 Aug 2020 12:53:47 -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 DA156C06134C for ; Mon, 17 Aug 2020 09:53:30 -0700 (PDT) Received: by mail-io1-xd42.google.com with SMTP id g14so18395540iom.0 for ; Mon, 17 Aug 2020 09:53:30 -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=yIJ1AoId/iaH9uX+tiP3R4juFL9vJPxpeCdCSjsOFHw=; b=hIrYT2wcbwDRZRDEKO7xEanYpmsQibj04HCDulj2CEXm0ZfjG6A+drNfykW7wG52Vz dUyw7sMqIadhtkdenDGeW1OlqYPyoPmXRGtnbvD5l+ur/c5MO+PvXFwFG6ov89jcZ4Gk ErXYcVyY/QAqZ5G+210SFMY8G0bP0zyFPulytodVJ9iNSp54bV6Hq4IDC504VUVI9kdo ri/0tCgQcLy6O+Cy95gsVRO5b0s5Q4b1DJtkdZLyoRy0HdF3vKY+BdMwNHizlogKjPPi JeXZ2Ii+kkFh1q6sLmZs6IBsB5zLH1fsdf16tGrx4NJZTGIo3iGUBC6uJ07wLw3X7ilx ng8A== 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=yIJ1AoId/iaH9uX+tiP3R4juFL9vJPxpeCdCSjsOFHw=; b=kl4FS8R55sjClH3H9CsBduX0mIhNo66BUS1s7zKYAdLDgtbH6/JyJX006Z+shDwe8S NsEEaklR21uuwHmhGdEh0gOcRQN/hAL4PNuud72Em7cY+sJGJpXE3rqPXUzxi7klzBBx pTaP3i0TAyT/aR2z1XGetL5tfofj1AVh67EcN6iZLpiYU62kUSmnXKLxnoJjaDjxT4AY bwBKh9WH+321TXbAmS+zZNslM2Lok9nRBdznj+axLUfzKD5yoi99n6dzdYC/fABDAy/Y 9hddcmseejNg97seAnRWa2sXlJYuBnkaWmXtbmGCDLszYTyPEEU8F1YYGjHUKZ4S3XsS YXzg== X-Gm-Message-State: AOAM532wMqAcAswLIXBVerCBkGnDMEmWxlsBcRa34Vuf5VUCvE1Dy304 YE300dZYCBL7TUTJN3ZBJrGvKB0IBTI= X-Google-Smtp-Source: ABdhPJx3zB2ZNxMF0tlb/2pcwOsfE8Y/ct0NFGCsEQuT7INzGWGA+R9wVAw1UgMqNw/9M5QHwP2a9g== X-Received: by 2002:a05:6638:2515:: with SMTP id v21mr15169379jat.109.1597683210029; Mon, 17 Aug 2020 09:53:30 -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 a16sm7413106ilc.7.2020.08.17.09.53.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:29 -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 v4 01/10] SUNRPC: Split out a function for setting current page Date: Mon, 17 Aug 2020 12:53:18 -0400 Message-Id: <20200817165327.354181-2-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718957 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 40B5514F6 for ; Mon, 17 Aug 2020 17:33:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 25C712063A for ; Mon, 17 Aug 2020 17:33:28 +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="OoZABf41" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389022AbgHQRdZ (ORCPT ); Mon, 17 Aug 2020 13:33:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46818 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389120AbgHQQxr (ORCPT ); Mon, 17 Aug 2020 12:53:47 -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 AAA89C06134D for ; Mon, 17 Aug 2020 09:53:31 -0700 (PDT) Received: by mail-io1-xd42.google.com with SMTP id t15so18363907iob.3 for ; Mon, 17 Aug 2020 09:53:31 -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=rl61QeYwzZvkWuvjGsNCF767mJbnp0XaPTQFoI5ixVE=; b=OoZABf416jDKy3MmHgrCrU/87PnzHqvajj5g9mBLounwTOfjIG4SIuxhMGAU7/2upo YW3dHNL2pVe7DdyW5+kcsMVTGNM7REJHXiyIPXJswhQS5bzemSm6du+aDPs+6NDbikFi qpIUyGaXgsiZ4M8h3AD+iIyufSsZuv0bcNRaOFYfusxwvGMNc80mGH0+dHSJS7WV+GtV lqLtPnEA6AqDynYf1Rc0roXGBv7scu5KGDscb5/WTN4cbSy2koyRVrXCtiqa6h2vRzEd vnM2q+PFH0zw+tjogNNEBsKE2is97vU9rbz49Ejd4/sX7Xi9a4tFqXsyuZtEyzQ9hUwD guNQ== 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=rl61QeYwzZvkWuvjGsNCF767mJbnp0XaPTQFoI5ixVE=; b=esMxn7dhnKGt1ZwrNCs3purrmyXtuuZZru153OsdKEekXzoBTAVB5hDMewYGqTaTXK 0OkFhn8J9eKEfRvKiI6+Hw/HjfvBizU5zlIz/g1QJC70+pTixpdcg3fusYvXXl2ASpxZ 3TtOJ7vcON7AKanZX0wqomOoMKwkis0bMxBDvbC+e5hRYdlzs9XvxAbtJr9wFBGZV8yF HubvQfWR3+LP6soFRfMIyZnDyCl6UyRfcu11AL21g1vzCMpsO5yKtCijoLI7aqtfahdZ ji3kfJtXfjux728lAg9Saz/DZw/+/o41qxTaX+DNt27nFsS82CJi+1i9xaHBSxl9g8El 2BNw== X-Gm-Message-State: AOAM533fNxVrqFn1u5iLQJ8OOpRB60W989Z9rmakW2mwcTJ8Yx0CoLq7 r5GKLNNFkAAy1nD99Z3GRPnSOUHOecs= X-Google-Smtp-Source: ABdhPJyVS67fqs3C7mxsbggP/7iU8j/Apgrof79/ePvtfJ2GT9WHAVrYtcnXvTUv/pgg3LeJSYt6Ig== X-Received: by 2002:a05:6638:d12:: with SMTP id q18mr15604100jaj.5.1597683210862; Mon, 17 Aug 2020 09:53:30 -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 a16sm7413106ilc.7.2020.08.17.09.53.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:30 -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 v4 02/10] SUNRPC: Implement a xdr_page_pos() function Date: Mon, 17 Aug 2020 12:53:19 -0400 Message-Id: <20200817165327.354181-3-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718833 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 1FE8116B1 for ; Mon, 17 Aug 2020 16:54:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 062A620729 for ; Mon, 17 Aug 2020 16:54:28 +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="GRstMKD8" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389080AbgHQQy0 (ORCPT ); Mon, 17 Aug 2020 12:54:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46820 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389121AbgHQQxr (ORCPT ); Mon, 17 Aug 2020 12:53:47 -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 BD5EAC061389 for ; Mon, 17 Aug 2020 09:53:32 -0700 (PDT) Received: by mail-il1-x143.google.com with SMTP id j9so15080122ilc.11 for ; Mon, 17 Aug 2020 09:53:32 -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=13EkI7FH7EOEPP7S5oqrHiGwS8jiaTI8LAHREatvZvs=; b=GRstMKD8jf06ye5RK0LLhX3X1p/p2jOEROhPz7SUrYoA60zkbfESx+XNxaXvm9+t+h f0/8JGNYJCx3FMTrh4rH+q5YNkh/8bDyEr53jeqPaL0lgf+2F4f1KPlhTk1McGP7rHmF 8oqKeRE6S+XBCk4Ls1K0PpNILTq5wWmpO4+LEXWlfAiXp0gbAjhm2dBmldIZifoc1brS kLBDT0J63k4J1znH51HcljZG3ArZOSdaaVFJSHqORvMuWwQZj9126f2Ag/L9pG0mgj4o iNddJ+5p/+l5XHuVCl07XocGBa+KfxCFFNXafdtvv7auXhnPWW21s2EXEe/cSL9dmwwF 6lHA== 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=13EkI7FH7EOEPP7S5oqrHiGwS8jiaTI8LAHREatvZvs=; b=M1LzBNM6i1EDbw9gmq5jn4+eyYcHj0xPzHC/kFZevngZO4aHIHjTnFJTn7KqvhCaSJ 67aCC+pupxB9dcvS4juFIoaib4dclc+oxJ76y2QQix1geJdq/3cyec8rVtQYQ2/QTpaf 9Q81zIvoi3YwECeW46pDvaoHwIppzRAscs9cHH2KTRuVOVyqrDNhMgeR6ZvTwRur1141 JxSS7v4e4Zic4/vE7WvXdUO++xhHg8GV1FBMLyuzRsjpPdkVpLMk4hzxE2wZYdfKN0NO xuBx1QM7CA1AIgPhSMoZ74DIrJA1k/XrU2g1ypE+fGHPWGNCTZ+0GBkUpyHZMs4VTTr0 1vBQ== X-Gm-Message-State: AOAM532obhYnUCMIxEtUKpQ4u6hpVOfksblOhz1K8sqbTEQEQJqluoKj XfrnA25NIQy7v0i8yGOb8RPzHFUjIQA= X-Google-Smtp-Source: ABdhPJyei7g5X/2C0HFNQua7SPQ0UT4CgKgwPxN9elyVMc4dQ7y2ov+RB5QbmxWH2rMu5ooIAXAeOw== X-Received: by 2002:a92:6a07:: with SMTP id f7mr14754550ilc.163.1597683211842; Mon, 17 Aug 2020 09:53:31 -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 a16sm7413106ilc.7.2020.08.17.09.53.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:31 -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 v4 03/10] NFS: Use xdr_page_pos() in NFSv4 decode_getacl() Date: Mon, 17 Aug 2020 12:53:20 -0400 Message-Id: <20200817165327.354181-4-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718835 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 6008A138C for ; Mon, 17 Aug 2020 16:54:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3B0B92072E for ; Mon, 17 Aug 2020 16:54:29 +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="Po5yALYH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388246AbgHQQy1 (ORCPT ); Mon, 17 Aug 2020 12:54:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46822 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388918AbgHQQxs (ORCPT ); Mon, 17 Aug 2020 12:53:48 -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 C7720C06134E for ; Mon, 17 Aug 2020 09:53:33 -0700 (PDT) Received: by mail-io1-xd42.google.com with SMTP id s1so5195442iot.10 for ; Mon, 17 Aug 2020 09:53:33 -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=l+ZGO2nOKVIaedpt0/2dNjU3KSqG+FvsHd7B5cxb/64=; b=Po5yALYHMWbphOJTxIoojx9cm+Crb21vlE9A4VZF5qfhZ+eKB8fy2VUdB131cBkq3f 7MFq7yU65I9GbgEErMNUhrDs6gxuW2Tl36ZTybCeYa/2Wa4qR8tV0n9BJf4aRpHUVxtm wB5FjbiuMroA8WyNfNwYb+pGmw1Dpj/4MsgfMkYQGOH9Jp5HTit0P2Dzl9M3PnMoKx3E doh3ysj/oUmTB1jyKJ15Ie6VQN5sOCUAygH7E1atJ/FJPmHS7nOAabcBNOi+Xr/rzRMm vGS0tnThwPApADDKgoufdEofaiYHZ64R1TAYLK1smQ4qaYF6X8OFXBipvxjyxDt5ngkQ Jzbg== 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=l+ZGO2nOKVIaedpt0/2dNjU3KSqG+FvsHd7B5cxb/64=; b=jXxYjt/MAqJa08bEaKfxh8yM2hyBCZrgleCbiQzAHktcQwu0/dp0l/A59Mn9agxNvW /Qvv/FW7+m/+gs6iLTCorg4A6oBqsvtHCr41azEIMUc+4vfWk4yms8tDRcISPG1YAyIy maaVHhT7Z9djNK82lvEXDC3V3q9/zXe5qeL+YNfRgjm+gKxI1LNo+iJW/q9miBPZ4DsR rGt9cx3G11qocbdH4G+dkJbZmCdhvbBePbwsNGqo7QW7eEJw9i/iTsBgKA/ErYZMMFwJ 0vYyscK9wRimuMp0TIWZZgjRIivTGSUpYjIbLUv2nMk17MyMweGgEFLLvZDRwya3LMGb xQ7g== X-Gm-Message-State: AOAM5303SiR+6kDjfm0Y1AHusVn0l+LhijrutCKIkA1dqfotaMsiG0ZX jn7qIFjTPl19vkwhQO5VatXBYJFLR3s= X-Google-Smtp-Source: ABdhPJyHr7esTL58DPBRuzBiUqWTEmTY5mWFtKEhiqKXbbgvuw6MQyvKV9EjTIvzZ/CxvHpuYyQ0yQ== X-Received: by 2002:a05:6638:2595:: with SMTP id s21mr15124991jat.12.1597683212702; Mon, 17 Aug 2020 09:53:32 -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 a16sm7413106ilc.7.2020.08.17.09.53.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:32 -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 v4 04/10] NFS: Add READ_PLUS data segment support Date: Mon, 17 Aug 2020 12:53:21 -0400 Message-Id: <20200817165327.354181-5-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 | 141 ++++++++++++++++++++++++++++++++++++++ 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, 185 insertions(+), 5 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index c03f3246d6c5..055a944d043d 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,71 @@ 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); + res->count += recvd; + + if (count > recvd) { + dprintk("NFS: server cheating in read reply: " + "count %u > recvd %u\n", count, recvd); + *eof = 0; + return 1; + } + + 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 +984,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 17 16:53:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718955 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 2190915E4 for ; Mon, 17 Aug 2020 17:33:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 07A2A2063A for ; Mon, 17 Aug 2020 17:33:28 +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="Ro8IoZMr" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389090AbgHQRdX (ORCPT ); Mon, 17 Aug 2020 13:33:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389022AbgHQQxs (ORCPT ); Mon, 17 Aug 2020 12:53:48 -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 EF87DC06134F for ; Mon, 17 Aug 2020 09:53:34 -0700 (PDT) Received: by mail-io1-xd43.google.com with SMTP id z6so18302801iow.6 for ; Mon, 17 Aug 2020 09:53:34 -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=sDycQp4p8QqjhUNfybr06rjLzMrYS09sHrxbwDXOUcI=; b=Ro8IoZMrcIOtejypptmqXkVsHoRbdE7L+5BTIGTpY7fto2LLM08U0zj1H8pO940mSK UIl7EiXhWxrAjx6yKRT4wEVlLUCG5MmlKHypgzHt8OBf8kR7nTBxgWAZiL7Ch90n1AYG tvJifIRnBKyBjuDy2r/5if75Efj2wksflHpqCwYir8Mulp0i09oRbrmzKXGXiK7uAHLl JT9Pe/Xe8CXv4eNEZQXh45mOoowI+uVg4cUJ+L8H+6kECa+udJrHgjOToyv6PIRpwPGY hAVIEAHDD8ORbVzBdKY6to1/Nqhs5ytUdq6WNXf1rWxkvpQXDJYZbfKFm91JXw1KfVBI QHqg== 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=sDycQp4p8QqjhUNfybr06rjLzMrYS09sHrxbwDXOUcI=; b=pEX7pP4hcF0Z6QLPq699lNHY594HATddL7bAGVkdtZM4DTU1pF8Pqu5J6Lgnwj5U2s 28T6og5klA/F6mFTvjLmdur7dGoseVLRVItCx2WKT3MrgrIj/4+QGuwRfhvvd59PLpt2 gUwqBMeHlCi0jnBYXFWvvSFxPjNXmYUyKy9f8v13FK0E/HV2ZxnROIMWIhij2xF9ODn5 JZQH+BiwLjbBKo2PxjS1SKwcCPs9XYRFlgWOVji3h5Q6VFop/o+ZEpBg18k8TGlIFt3g VJNJJBjkpZPTRkhJYT64Nbqya2yVYIT2yZELV+ED+4FiVu47IblJoBbFN8lE5LH4JfYY lRUw== X-Gm-Message-State: AOAM5315pFgQFUPtKejUp0AAEzGTlMEwZFI5oCAKv+uPjnsz9Ev9xJ7w I/p5leoD4WSdku+WxizFxqgrUVUAb2c= X-Google-Smtp-Source: ABdhPJyrGUT0zlGOUBj05W41D3H85vHoJClDyT8/Jt4d8wd9bszbNH27aSehrviY1OJFtQHxYZx9Tg== X-Received: by 2002:a02:3f0d:: with SMTP id d13mr14908711jaa.99.1597683213863; Mon, 17 Aug 2020 09:53:33 -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 a16sm7413106ilc.7.2020.08.17.09.53.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:33 -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 v4 05/10] SUNRPC: Split out xdr_realign_pages() from xdr_align_pages() Date: Mon, 17 Aug 2020 12:53:22 -0400 Message-Id: <20200817165327.354181-6-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718949 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 F122E14F6 for ; Mon, 17 Aug 2020 17:33:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CD83020716 for ; Mon, 17 Aug 2020 17:33: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="l6tJiV94" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389111AbgHQRdT (ORCPT ); Mon, 17 Aug 2020 13:33:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46766 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389031AbgHQQx7 (ORCPT ); Mon, 17 Aug 2020 12:53:59 -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 0405BC061350 for ; Mon, 17 Aug 2020 09:53:36 -0700 (PDT) Received: by mail-io1-xd44.google.com with SMTP id s189so18342886iod.2 for ; Mon, 17 Aug 2020 09:53:35 -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=igtPl6C6Gfbp4gxTezXs9k9ZWoIUbuf9BiavER35twk=; b=l6tJiV94mBsIvprRfO5B9/2n2RdWmhvF/tW70Z8gHF/htpDCDydIKo9MxYmAeumGAW ziCAnHKVorsee0OpROsctkVp2Y3J5NH+yhkXTenvQKWRXO2oPLu4zO48c5inZAZMfxtC OujirCLAbXOo9D+tEbuStlebnJ9RqjPgL8gjJmNblUwkUG9rs1oAwmctW4aWWd6WKjXr KgNdDeF6TT7GoAMSvYlUs7QcXFrAqkoi5mpSRgF0VgWXL8ufvr9fJ9Qzf+hIeoWHZOhH J7Hk9m67qMDLryDg2aNJJQpXC6lJtYI2IS7ShOQYBNba5MTRaneZS8sYxTSES/HTVAt3 qnqA== 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=igtPl6C6Gfbp4gxTezXs9k9ZWoIUbuf9BiavER35twk=; b=l06RNM5NShdMBRodeaZSDZBgc+DakMGxWLvkGK6jRbWZMCETptm41hgjuhrliQ5KF3 2v+B6KB85YFLCg3n7fQQ0xJrTcECTNmoFNIOE1klEzjwJ5ua2RpH5UL/UIwfYpU0ErTr Z83ZvLGt/g22rNnQfuJRMRiV4JQbE7/RkPeVObHyUGzIxGmPQbldfA7eqq3OBM7YK9qR OT67eST+5j35HY9dYT33SPODPIVw3BWUoPO3Z03YizRHhAnrPiyi3nDKpR9fx6DEWqTG nUJPoi25EOK4AyuzmfszW8cb8WeDqq8Q8JmTiKKBZR3Q0LjPUPrV8c+hRSq0OdNW9X5x k0Xw== X-Gm-Message-State: AOAM53221pLzkkyfDTgEkmaygQkZKwzCGXRs3PbqujSKhcqmFc0zPXGM URsH/829m72Z9RUZXIG9KhrBIwrxMuk= X-Google-Smtp-Source: ABdhPJy82GHzJpiF4tn0GQZGqhMUSBTsVgp5E43qh2oxwvrHEqUTav8Y7d1Y9CYxQHf6hD8Lgy4DGg== X-Received: by 2002:a05:6638:1a7:: with SMTP id b7mr15156618jaq.1.1597683215032; Mon, 17 Aug 2020 09:53:35 -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 a16sm7413106ilc.7.2020.08.17.09.53.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:34 -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 v4 06/10] SUNRPC: Split out _shift_data_right_tail() Date: Mon, 17 Aug 2020 12:53:23 -0400 Message-Id: <20200817165327.354181-7-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718951 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 630C31744 for ; Mon, 17 Aug 2020 17:33:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 46ACB20716 for ; Mon, 17 Aug 2020 17:33: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="d26zxZat" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388979AbgHQRdW (ORCPT ); Mon, 17 Aug 2020 13:33:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389126AbgHQQx6 (ORCPT ); Mon, 17 Aug 2020 12:53:58 -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 73FC0C061344 for ; Mon, 17 Aug 2020 09:53:37 -0700 (PDT) Received: by mail-il1-x142.google.com with SMTP id p13so15123597ilh.4 for ; Mon, 17 Aug 2020 09:53:37 -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=FfSVVvxhUmot5fhlVdNxRiIJLr9/EUy1AHdjap9t+i4=; b=d26zxZateQB2RVC312wHuitgCHtdQIPkcsIqNFxMnibbvAfezlJIyFhXNmZoZWg8so lhH/hc5yFxGe6uXz5UisRT3likZy8jU0vJ9pQrJ1w+tPNQ3Zrk9Ahaz6MamsY9Ecycua X4ymxA7cFfTWDZSuCb1V9jdHfhsaF/1zpsb+ycenkvNYqcK4OX9wGZVmCFqTV3WwAW1l BktyifZr35H0icq+Y6wSyZavbdLNmtAiWP2L1ZhT1CssZNTr4t3hdbAD/v2GhwX9cDWq sHcIsZWS7ErtYgi+8T3l6f5vHBIfhcu/mIDE75Pf9i1l6o01KsJPJ7A3uUxTmhZYIibV q+ew== 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=FfSVVvxhUmot5fhlVdNxRiIJLr9/EUy1AHdjap9t+i4=; b=Dm+OvozlRCE9Ayqqc+Qdfe5OXNsZE7CMoNj7rThCJH6fP986QbMxfeErbOcRKejPhg 5qAc3wIT8X2zcIHS5TUmdb/AQVVjUnNjAjKhYm81+ClvFiaIQKO4veFdbMGE63QiN9/P SZw1Mj2nblQnANDJCKawqzyO7pBRMEMhKi8iWHDqMqftGGcpENz+Gg0OtpBWY9EriNsj hr+3FbVFeXY1XF/rFc5IIZ7qTtOXbEwKjNgnRSCWOY8xe3Mg/gJ+8uHsDQpsUcUFy4fo Npimo9nzmsv311pBFMBHq8nn+MuBo52A34JUh1mm6q65Zu7ED6ABuSmG/jfXxMc/6tOZ Mj8w== X-Gm-Message-State: AOAM530QgW+tcx/DaEmlW82yGA18nq9jKpgdwwXg3RhrZLJrTd1Hv9FJ LWfg2O/hzfpoorW7CbdPGqzliSNBNyw= X-Google-Smtp-Source: ABdhPJw4Jvy6sh2hXTXBpTlJ/ATPqKRfb/UivFSHk5QUMkMNnE2trxSrX9VdX1prPmBJQ/vLljVnQg== X-Received: by 2002:a92:c90c:: with SMTP id t12mr14601679ilp.7.1597683216486; Mon, 17 Aug 2020 09:53:36 -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 a16sm7413106ilc.7.2020.08.17.09.53.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:35 -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 v4 07/10] SUNRPC: Add the ability to expand holes in data pages Date: Mon, 17 Aug 2020 12:53:24 -0400 Message-Id: <20200817165327.354181-8-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 17 16:53:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718953 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 062B515E4 for ; Mon, 17 Aug 2020 17:33:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DE92F20716 for ; Mon, 17 Aug 2020 17:33:24 +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="PKCmSD0u" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389051AbgHQRdX (ORCPT ); Mon, 17 Aug 2020 13:33:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46768 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389125AbgHQQx6 (ORCPT ); Mon, 17 Aug 2020 12:53:58 -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 52453C061357 for ; Mon, 17 Aug 2020 09:53:38 -0700 (PDT) Received: by mail-io1-xd41.google.com with SMTP id g14so18395976iom.0 for ; Mon, 17 Aug 2020 09:53:38 -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=jiNvJbnLFGgDOvphREdkVCoh+Aoc1PwcHuuikbxvtvM=; b=PKCmSD0u+1OB7yGIvhgxaoAXWcCXHciNbRUTA50UZEgU9T842djtrj0kR9AceStDO8 cCh6G1OaC0qqbtQXH1ILkd69C3Eu/tX7exWx/Ahthsi847sPivZQN+21tAsU4unE2nJ3 QfNNlfet7XKDDsCpB/aRAE9/xea9RSmXOnrHGfdJOXNxLc7dViwUZVXprLySdTx329B5 mQPhmmobm+zcSYMFJKWUo+L7ecJ+TTXxHrugyulHcrbwzarYjjKyMSZjXuFnLM7hzgXe vZqGUcLuiCsvlR4OzuxjZZd3B4SEUgmZsxM0cTx7UrPCcCgwoepTrX/ONpN4vTCvRWTn qV6g== 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=jiNvJbnLFGgDOvphREdkVCoh+Aoc1PwcHuuikbxvtvM=; b=Xha01SLaDfoF7UzslyPvGh+8Tg08hyZsVVRnYdME9Z/EohK6VgF0jU4R2PXa8fNnDh dsWp25xj/AISAaLm6DURhaGj4lT6dKZyZbLBJSloEB0Ukx9/Rt/el5QI9Dp2ctxART4B SQMhxRJJQzpc/E5aPWhox8KWCQMA5Rygv2L0OrraAmC1KbBgMOTXSfD7dPvMJV7z0Rif Kb/64sG0OyUHul+wL6dDCCEmsRza3+KVpq40xX1fF5rS2xBUdKyEHBLHi7Y9yHW/ZWeF sdUNgqvUBYdV2CX3r7S2w+YYgRokxeiR2BBEZFxxktBDBXSOK7L2A+LusKDxsUkOsozZ TeOw== X-Gm-Message-State: AOAM530pNQ6VbD2rdt4bf5ocRzK+0+uojBLGrA6uGzmOcxFO3B5LcToh 4iKWR+nk675+bDLlgLo/MbH35hKW8vU= X-Google-Smtp-Source: ABdhPJw1jUBAHMMkuLCEweP3RqdPV0wVdHk614L8Rak/fPmR2ZKtHTWOMr60mciCyQNctL8RRnRjcw== X-Received: by 2002:a5d:9701:: with SMTP id h1mr12963037iol.36.1597683217412; Mon, 17 Aug 2020 09:53:37 -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 a16sm7413106ilc.7.2020.08.17.09.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:36 -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 v4 08/10] NFS: Add READ_PLUS hole segment decoding Date: Mon, 17 Aug 2020 12:53:25 -0400 Message-Id: <20200817165327.354181-9-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 055a944d043d..90f415944b90 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 */ + \ @@ -769,6 +769,28 @@ 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); + res->count += recvd; + + if (recvd < length) { + *eof = 0; + return 1; + } + return 0; +} + static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) { uint32_t eof, segments, type; @@ -795,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 17 16:53:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718947 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 C4D8B15E6 for ; Mon, 17 Aug 2020 17:33:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A377920716 for ; Mon, 17 Aug 2020 17:33: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="PN5P6AB0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389031AbgHQRdW (ORCPT ); Mon, 17 Aug 2020 13:33:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46858 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389129AbgHQQx6 (ORCPT ); Mon, 17 Aug 2020 12:53:58 -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 66F62C061358 for ; Mon, 17 Aug 2020 09:53:39 -0700 (PDT) Received: by mail-io1-xd41.google.com with SMTP id q75so18382919iod.1 for ; Mon, 17 Aug 2020 09:53:39 -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=iSA+I1IfovndRT2XBz1ym8iSfL6HDjmiNoR/Lk3EjV4=; b=PN5P6AB03jEHFaL0dGfWzy1+1saqTf01y+MBz9OYRRwGTXgCbNY5haMKP2pMW9u8xD 1AYk0SGgGnHYxrVseAtO7EEllR67nsQdjUrwy4Xc6RwY7BXjKe2/D+IPbZqDtDpcWum8 Cajcve5gc4GZtM0Tlre0nbp/a4hlBoh0eiHIWhNRfqH/x8E+1rXfQQFn4TGpmTZ2T2Er 8v/pXFI4mk/42rrnURzml1UlqGoKIOizj8E9TGB9/NBytPcRj5fD2low2zWPu03pRS6j LAiUD7dWeQwFqKuHbv/8+vnBmaJbvaUT+AmSaGfjCjWSRmNyAEr6nJZuDkVPUJ1N6/3v JlxA== 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=iSA+I1IfovndRT2XBz1ym8iSfL6HDjmiNoR/Lk3EjV4=; b=PMwUV0CnsVHB8tjxDY3FfDczsTImQLkgmxlAqQnqCR/PsLnsd2Q/t0xksldPnyHiun r1so2rZU4/w2ZGV9oE/VdTS85qu21FFeEFfgnU1zIxNjOAf6iPBA36F5VLTGYvgLu+Qo 6ExZFPv/1XXiXGt5tJa4tENqVhEuHKIlNiEJUmc7efMeP0Q/JrvMN7VilT2H7flNcCno WXdHoPYZw0hRBYbxqjWNT6NvMmm6XpVCSirfbyRH5iFy5l48r8TPTSh1XWQjl9zcmtYB HZIt75jms56/65N9X+l77+TvbjgbYbLHAkfTLVFapRUO+fk80r5Z7DmJyY7n5AGw6QHm 10qw== X-Gm-Message-State: AOAM533Ig+A2wm+uieo7Srdpuc1ukbS5pOCdZr6biv7Ye9ShIB8I+T0A xarOIxhTUpKM/KjKsDEfFS9VkKFDxfs= X-Google-Smtp-Source: ABdhPJz6QGyNayiwXUedBu0WuxpN9pZ3w3owRDwfZ/kSLtYJq8CZeZcdfUuLOwvtHwXHnKDrU39vSA== X-Received: by 2002:a02:9247:: with SMTP id y7mr14757885jag.140.1597683218335; Mon, 17 Aug 2020 09:53:38 -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 a16sm7413106ilc.7.2020.08.17.09.53.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:37 -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 v4 09/10] SUNRPC: Add an xdr_align_data() function Date: Mon, 17 Aug 2020 12:53:26 -0400 Message-Id: <20200817165327.354181-10-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 | 1 + net/sunrpc/xdr.c | 121 +++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index de1f301f4864..ebfc562f07a1 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_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..e799cbfe6b5a 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -19,6 +19,9 @@ #include #include +static void _copy_to_pages(struct page **, size_t, const char *, size_t); + + /* * XDR functions for basic NFS types */ @@ -201,6 +204,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. @@ -1177,6 +1262,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 17 16:53:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 11718945 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 49A4A15E4 for ; Mon, 17 Aug 2020 17:33:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2C34820716 for ; Mon, 17 Aug 2020 17:33: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="tTyADODw" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389262AbgHQRdS (ORCPT ); Mon, 17 Aug 2020 13:33:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46780 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389111AbgHQQyE (ORCPT ); Mon, 17 Aug 2020 12:54:04 -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 72ABDC061359 for ; Mon, 17 Aug 2020 09:53:40 -0700 (PDT) Received: by mail-io1-xd43.google.com with SMTP id b17so18284048ion.7 for ; Mon, 17 Aug 2020 09:53:40 -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=3AsGc/1Xpo40vE8L6nCtW9cEOngIRVeMlkrIMYelAG0=; b=tTyADODwhitY6QSkseippOl+P33mGViQEjaKKMStcePMPz7jf5GaDHFm3Ws1GJhsAX HCmACL3w7VdqC2YOBVuXUriwPWLRnFkF6HFbqeJBKacIgl12TYSbNi3IprXCBS8TqeMm 8BlBVHu9AFn1bqeixAeETq9DHlbp1OigEAXS45nEXgHlwLSi6HddYiceansuVHj0G1BR TcneAeZr3i9aUWjpXsv973ZISXDPY8bBzvBoLhVmoZpG1wqMx+Mek+dF6mFtbQAdmnUQ TYg/QfALludTLOnrlVkbWQ6vrraaojSanknpwNNRLnUujMTEnFcepoa31fnNKCZHJ5S0 SNFQ== 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=3AsGc/1Xpo40vE8L6nCtW9cEOngIRVeMlkrIMYelAG0=; b=iEd0hgrxHhkMBUe0Gm3qBAZFzn0C0qJrX8ykSlbIozLVVp4+EetZLK00Rt3M0eKi/h K62Pz0tjJtmjFQVZRO1j1vCKENgOuxF3HVnO3vR4f2Rkk8LeQUabD1dq19XZ+YSQKQOm EzLR68E1vrJI93IzOUmsxi/+VeTYrRj9nIfVNk9irkvvzrUihu7cXLhbvVa2T1WKToyO l7htskD9UTTwlrwHAsDVsj0dI9KeHWgmGBPkulIi3xmCQeiXhL4wlDxv9ssM4SZeyyqp 6V2gsfTIDoQhutuBMec8wFCtZIqCzwfJBpcb5YUFZ1yrlqslwDkbGzYl1vt5rfR/I0ba gziQ== X-Gm-Message-State: AOAM531sFbIfgLuLm8LGVsG0NnxUiHeA1S0MzppN33RPPT5BQW6jJvj/ MU5PgZi9TM0wFbnZvR9rdLdIvY3Hciw= X-Google-Smtp-Source: ABdhPJxr708I75qwmNW82UJJrmhpisVBSup1kIgHot/yT3arhPoTZFPDwAJsr99COffOFXlODV1Y/Q== X-Received: by 2002:a5d:91d4:: with SMTP id k20mr13399540ior.9.1597683219549; Mon, 17 Aug 2020 09:53:39 -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 a16sm7413106ilc.7.2020.08.17.09.53.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2020 09:53:38 -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 v4 10/10] NFS: Decode a full READ_PLUS reply Date: Mon, 17 Aug 2020 12:53:27 -0400 Message-Id: <20200817165327.354181-11-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200817165327.354181-1-Anna.Schumaker@Netapp.com> References: <20200817165327.354181-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 | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 90f415944b90..ffaa7ae9304a 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -756,7 +756,7 @@ 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); res->count += recvd; if (count > recvd) { @@ -781,7 +781,7 @@ 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); + recvd = xdr_expand_hole(xdr, res->count, length); res->count += recvd; if (recvd < length) { @@ -794,7 +794,7 @@ static int decode_read_plus_hole(struct xdr_stream *xdr, struct nfs_pgio_res *re 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 +810,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;