From patchwork Fri Feb 22 21:59:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827023 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2BD0D17E9 for ; Fri, 22 Feb 2019 21:59:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 19E6D29A6B for ; Fri, 22 Feb 2019 21:59:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0DFA532A89; Fri, 22 Feb 2019 21:59:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B497229A6B for ; Fri, 22 Feb 2019 21:59:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725980AbfBVV7W (ORCPT ); Fri, 22 Feb 2019 16:59:22 -0500 Received: from mail-it1-f195.google.com ([209.85.166.195]:37587 "EHLO mail-it1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725811AbfBVV7W (ORCPT ); Fri, 22 Feb 2019 16:59:22 -0500 Received: by mail-it1-f195.google.com with SMTP id z124so5473617itc.2 for ; Fri, 22 Feb 2019 13:59:21 -0800 (PST) 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=j9tlMpBtp9gDs6lVOYg/yJOuvnSiUE8uqzXngwi0XZ4=; b=BiF2D6Sauk6Yn1ZiOaGCqrUcGfdUd0XfRpcMVCuVhSWcCiKeh5mag2zh1O7TjpOmY1 3sM3m8HeSsSVHIT9xBbQ4fz4mgjQRk/xzVU4g1SHES+5cFinoaWon4zDead2j3sAOI+c 0yRtGwvPgA3EyWNYlRzWSmYT75mS5VC2s8XirJQoJgnZPvtfW1Ig0bDXNy6jELSrxtXS vPEY6CvqM0XQK04tdfvh/Cfn1Eog40laIQeNxB8+9QEW+3/2LWImAekMzdb8fyBma1nw WfeiSfx/ESa5+Y9dVh8JvXc7IH4kJuqq51wP9eXDq6igVQBTh2aJGOGlKM5felk/mfgN AeBg== 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=j9tlMpBtp9gDs6lVOYg/yJOuvnSiUE8uqzXngwi0XZ4=; b=BcldYSz0hDCVRyGG35pq1XPRWGkpx54VzhPjMGW3Mds0wQQLd8MRp05b3NlR7t2pii GWQkt6DDZN9kRTxa7b7dbuOA6+6lmLbHjfDHqLAOLlbnelzSUdzwh46wOz+8fjw9/om7 8V/rkhKFwBp+4iPy0n6Aur/oSwdCtJvScNwJ0icRLQ6M1gOneCI9Fe6XTsfwSqpp1VqT qNv8mpyePDM0sUCm+UHkMtMkiewZQYRLSC2yF/to3+lMalS/n278dienuUVDp0RgrGcA 2AAq1mso8Q2J2z4tlg+o1wQiSwB3FZwg1rSUKhzGSd1r9Q+t/3oWXrcCEUL8FbsKlg0Q dSfA== X-Gm-Message-State: AHQUAuY372ooleyKkCgoswwQNh2gcUKlpETbW9NRqkzi73wYcHGXQq8+ of/ffe00uFquimmCWl76pZr02MIYfx4= X-Google-Smtp-Source: AHgI3IbH8x9i+KBqUS3lVkBTuVJ/YzWa8UV0tboCpNkZz8l9ImnVapHNjJPwFtHlWhmMaDVEHXZbcQ== X-Received: by 2002:a24:2b4c:: with SMTP id h73mr3897888ita.159.1550872760990; Fri, 22 Feb 2019 13:59:20 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:19 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 1/6] SUNRPC: Split out a function for setting current page Date: Fri, 22 Feb 2019 16:59:13 -0500 Message-Id: <20190222215918.20647-2-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP 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 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index f302c6eb8779..0fb9bbd2f3c7 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -792,6 +792,12 @@ static int xdr_set_page_base(struct xdr_stream *xdr, return 0; } +static void xdr_set_page(struct xdr_stream *xdr, unsigned int base) +{ + if (xdr_set_page_base(xdr, base, PAGE_SIZE) < 0) + xdr_set_iov(xdr, xdr->buf->tail, xdr->nwords << 2); +} + static void xdr_set_next_page(struct xdr_stream *xdr) { unsigned int newbase; @@ -799,8 +805,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); } static bool xdr_set_next_buffer(struct xdr_stream *xdr) From patchwork Fri Feb 22 21:59:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827025 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CCE941575 for ; Fri, 22 Feb 2019 21:59:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B843C29A6B for ; Fri, 22 Feb 2019 21:59:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AC6E832A8A; Fri, 22 Feb 2019 21:59:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 360D729A6B for ; Fri, 22 Feb 2019 21:59:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726117AbfBVV7X (ORCPT ); Fri, 22 Feb 2019 16:59:23 -0500 Received: from mail-io1-f65.google.com ([209.85.166.65]:41232 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725811AbfBVV7X (ORCPT ); Fri, 22 Feb 2019 16:59:23 -0500 Received: by mail-io1-f65.google.com with SMTP id i5so2991804ioq.8 for ; Fri, 22 Feb 2019 13:59:22 -0800 (PST) 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=ls6fCUTM8OmztX/B8symO/Y6xvSVuhS732vdLknYC4w=; b=O2XbpfaphZVNdt5i+dy9GwNINtP5gWKzAlaI9MONklNuFEZgQ5TzQTGrCc8lpm6inT Klvd1vmTtFABIrJszE7ewdJunqYQxRULLwDqelbB9Hgb+Uo6owgB33BMS81QdVHa9i2x GH25Oz7BbuBlX342IhU4MQIVAXA6V8zvmUC/dcEQWojduh4KuabzWxco061ykEE2YbYz csExiAEyvneLKlUdaOlZO6fBe+OAxiS+4aSCV1vaChB9I1YFjxQWt8CWG7SiD2o3IiRN GT3nN7k+wN36ZrcnF6wPlXTdDyGj2kuXpq5yIF4u+YYUrHdJ9FZJ7cEgvw5U/yGm5koJ GEcg== 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=ls6fCUTM8OmztX/B8symO/Y6xvSVuhS732vdLknYC4w=; b=FxjzkKjVcchmZ4TSlCTAwJJ37vucyAjx8gWte4zJAXRkk2MrErahGvVpRJWWOJg1PP 6C8YGk/OqsOjIX8raWtUFJyIrEu0Qm+bZCMscj07lvLWk4sQig2hPl0qmuf6wjLXVap/ eDUSNOXn0RrphGk4OgVB2UosV/vXxvw4WwbnNR0zidkOJeqneYjyUA7LudpCVwPovJnZ 3hCJ8CM50zJN793pms35MSWNoLTUpvIGEP1zi7MQNyB4Q3c40QsWckyJKChFd8rFGhCB nViNbYHILyPQva9r1j7cyInU0mJTUAtLQ+KcSAOiX+aHke3Fplgw/jUc0j2RfuswkuWx ZE6A== X-Gm-Message-State: AHQUAuYRs1aXLRxE11KD94dBcEGVt3NmrEqoeC5B4KevZjIgcIxMcklY X8wa3/sflh+DbMj5cLnCYlw= X-Google-Smtp-Source: AHgI3IaCdM2F/u9vuH04chaF9RrMrKiR2AJUR1m3OEJL6zF1VAlt2TgnT/QMU8vk1Z6pdwgPwJS0Bg== X-Received: by 2002:a5d:9157:: with SMTP id y23mr3509463ioq.115.1550872762038; Fri, 22 Feb 2019 13:59:22 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:21 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 2/6] SUNRPC: Add the ability to expand holes in data pages Date: Fri, 22 Feb 2019 16:59:14 -0500 Message-Id: <20190222215918.20647-3-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP 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 | 100 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 2ec128060239..47e2d1fff59a 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -243,6 +243,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 size_t xdr_expand_hole(struct xdr_stream *, size_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 0fb9bbd2f3c7..27dd3a507ef6 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -253,6 +253,40 @@ _shift_data_right_pages(struct page **pages, size_t pgto_base, } while ((len -= copy) != 0); } +static void +_shift_data_right_tail(struct xdr_buf *buf, size_t pgfrom_base, size_t len) +{ + struct kvec *tail = buf->tail; + + /* Make room for new data. */ + if (tail->iov_len > 0) + memmove((char *)tail->iov_base + len, tail->iov_base, len); + + _copy_from_pages((char *)tail->iov_base, + buf->pages, + buf->page_base + pgfrom_base, + len); + + tail->iov_len += len; +} + +static void +_shift_data_right(struct xdr_buf *buf, size_t to, size_t from, size_t len) +{ + size_t shift = len; + + if ((to + len) > buf->page_len) { + shift = (to + len) - buf->page_len; + _shift_data_right_tail(buf, (from + len) - shift, shift); + shift = len - shift; + } + + _shift_data_right_pages(buf->pages, + buf->page_base + to, + buf->page_base + from, + shift); +} + /** * _copy_to_pages * @pages: array of pages @@ -337,6 +371,33 @@ _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len) } EXPORT_SYMBOL_GPL(_copy_from_pages); +/** + * _zero_data_pages + * @pages: array of pages + * @pgbase: beginning page vector address + * @len: length + */ +static void +_zero_data_pages(struct page **pages, size_t pgbase, size_t len) +{ + struct page **page; + size_t zero; + + page = pages + (pgbase >> PAGE_SHIFT); + pgbase &= ~PAGE_MASK; + + do { + zero = len; + if (pgbase + zero > PAGE_SIZE) + zero = PAGE_SIZE - pgbase; + + zero_user_segment(*page, pgbase, pgbase + zero); + page++; + pgbase = 0; + + } while ((len -= zero) != 0); +} + /** * xdr_shrink_bufhead * @buf: xdr_buf @@ -478,6 +539,24 @@ 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->buf->pages + * @xdr: pointer to struct xdr_stream + */ +static size_t xdr_page_pos(const struct xdr_stream *xdr) +{ + unsigned int offset; + unsigned int base = xdr->buf->page_len; + void *kaddr = xdr->buf->tail->iov_base;; + + if (xdr->page_ptr) { + base = (xdr->page_ptr - xdr->buf->pages) * PAGE_SIZE; + kaddr = page_address(*xdr->page_ptr); + } + offset = xdr->p - (__be32 *)kaddr; + return base + (offset * sizeof(__be32)); +} + /** * xdr_init_encode - Initialize a struct xdr_stream for sending data. * @xdr: pointer to xdr_stream struct @@ -1014,6 +1093,27 @@ unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len) } EXPORT_SYMBOL_GPL(xdr_read_pages); +size_t xdr_expand_hole(struct xdr_stream *xdr, size_t offset, uint64_t length) +{ + struct xdr_buf *buf = xdr->buf; + size_t from = 0; + + if ((offset + length) < offset || + (offset + length) > buf->page_len) + length = buf->page_len - offset; + + if (offset == 0) + xdr_align_pages(xdr, xdr->nwords << 2); + else + from = xdr_page_pos(xdr); + + _shift_data_right(buf, offset + length, from, xdr->nwords << 2); + _zero_data_pages(buf->pages, buf->page_base + offset, length); + xdr_set_page(xdr, offset + length); + 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 Fri Feb 22 21:59:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827027 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9F5371390 for ; Fri, 22 Feb 2019 21:59:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8A42329A6B for ; Fri, 22 Feb 2019 21:59:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7D54D32D17; Fri, 22 Feb 2019 21:59:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EB2AA29A6B for ; Fri, 22 Feb 2019 21:59:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726237AbfBVV7Z (ORCPT ); Fri, 22 Feb 2019 16:59:25 -0500 Received: from mail-io1-f66.google.com ([209.85.166.66]:33331 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726116AbfBVV7Y (ORCPT ); Fri, 22 Feb 2019 16:59:24 -0500 Received: by mail-io1-f66.google.com with SMTP id e186so3029569ioa.0 for ; Fri, 22 Feb 2019 13:59:23 -0800 (PST) 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=LP2hmCdYU9qGVvtw/7cjfUxsP7LOVY3WvPuMkrzMq+Y=; b=HnmrPu8271roe/fxC1e39/xpzgyomO2/7a4h3f3HEdvFiMeGr9wuzl3c1igD4Pu97G 7HOQv0pTjglGdwO2NO6rTRl8xGnRX6LBDAP2U1bA6NR6FfVzyiK0YoG07QZybrNj3l5o jxgljTyhogkjFXzdtJH38jkAfrrDbVZpQ3wpbRv+2moCa5Qiq//DhMsIrodsz7sQnqq3 9pvK630Z3C6pNQro/sM7JC3oAfIl2m6samkMeijyU9n8hcz0Tf4dN0jFJNvr5sYzKWlH Ji+jWB/c54KzhpONP/jWOrdbyPpfEtXV17ChAJNdyGIb1E2Siagtw+EYDGE/km/q7lhu ttPw== 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=LP2hmCdYU9qGVvtw/7cjfUxsP7LOVY3WvPuMkrzMq+Y=; b=m8kNGa+NVyjzkrSoKm11YznA2MRQYXa1KDbCuJyeCmk8YDlKte8wStfKhoUCpvzRP7 8T0yxtEOsm/b63IVvoZDq2KnuBGeXVOVMt54krGo085NGCqnH0TWoI+b8i3ynrgcz9ne H0Cmi4nGO7tXNoLiXZW3vToN/N4fL+lzzFh4pa22vStPRcZjmqwBTmMqHV9tNw14sAvY q8hZiIhUJW4BchV3LpbfvyD8SiPZ7RLZ+NG2X/cWI6UWzhYcNv11ExgqyqlVFoqPyDyn SvqoS8sRxy8reIaStW/FH+ByfexsePynmYoJPBWlCTyW7g0fT5lz+t6S9V5TV02r9oQw fSpg== X-Gm-Message-State: AHQUAuZOcGcSVbdqu2UNLh5X5LaBZF5yTSs0B7+ybNg3NsDfucaaLvdn 6ilWpUbR9G7Xb3u8gVP11dI= X-Google-Smtp-Source: AHgI3IZn10uf4VH2PtpEN1MwVOwoeaNa5iVKr8jHQUisZHX+rhcbv0qe67Jvkp3hdlNZTWAKZO0olw== X-Received: by 2002:a5d:8494:: with SMTP id t20mr3685312iom.232.1550872763074; Fri, 22 Feb 2019 13:59:23 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:22 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 3/6] SUNRPC: Add the ability to shift data to a specific offset Date: Fri, 22 Feb 2019 16:59:15 -0500 Message-Id: <20190222215918.20647-4-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP From: Anna Schumaker Expanding holes tends to put the data content a few bytes to the right of where we want it. This patch implements a left-shift operation to line everything up properly. Signed-off-by: Anna Schumaker --- include/linux/sunrpc/xdr.h | 1 + net/sunrpc/xdr.c | 135 +++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 47e2d1fff59a..c7e49dc06b0b 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -244,6 +244,7 @@ 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 size_t xdr_expand_hole(struct xdr_stream *, size_t, uint64_t); +extern uint64_t xdr_align_data(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 27dd3a507ef6..f85f83da663c 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -17,6 +17,9 @@ #include #include +static void _copy_to_pages(struct page **, size_t, const char *, size_t); + + /* * XDR functions for basic NFS types */ @@ -287,6 +290,117 @@ _shift_data_right(struct xdr_buf *buf, size_t to, size_t from, size_t len) shift); } + +/** + * _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 = pgto_base % PAGE_SIZE; + pgfrom_base = pgfrom_base % PAGE_SIZE; + + 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; + + if (pgto_base == 131056) + break; + + 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, size_t pgto_base, + size_t tail_from, size_t len) +{ + struct kvec *tail = buf->tail; + size_t shift = len; + + if (len == 0) + return; + if (pgto_base + len > buf->page_len) + shift = buf->page_len - pgto_base; + + _copy_to_pages(buf->pages, + buf->page_base + pgto_base, + (char *)(tail->iov_base + tail_from), + shift); + + memmove((char *)tail->iov_base, tail->iov_base + tail_from + shift, shift); + tail->iov_len -= (tail_from + shift); +} + +static void +_shift_data_left(struct xdr_buf *buf, size_t to, size_t from, size_t len) +{ + size_t shift = len; + + if (from < buf->page_len) { + shift = min(len, buf->page_len - from); + _shift_data_left_pages(buf->pages, + buf->page_base + to, + buf->page_base + from, + shift); + to += shift; + from += shift; + shift = len - shift; + } + + if (shift == 0) + return; + if (from >= buf->page_len) + from -= buf->page_len; + + _shift_data_left_tail(buf, to, from, shift); +} + /** * _copy_to_pages * @pages: array of pages @@ -1114,6 +1228,27 @@ size_t xdr_expand_hole(struct xdr_stream *xdr, size_t offset, uint64_t length) } EXPORT_SYMBOL_GPL(xdr_expand_hole); +uint64_t xdr_align_data(struct xdr_stream *xdr, uint64_t offset, uint64_t length) +{ + struct xdr_buf *buf = xdr->buf; + size_t from = offset; + + if (offset + length > buf->page_len) + length = buf->page_len - offset; + + if (offset == 0) + xdr_align_pages(xdr, xdr->nwords << 2); + else { + from = xdr_page_pos(xdr); + _shift_data_left(buf, offset, from, length); + } + + xdr->nwords -= XDR_QUADLEN(length); + xdr_set_page(xdr, from + length); + return length; +} +EXPORT_SYMBOL_GPL(xdr_align_data); + /** * xdr_enter_page - decode data from the XDR page * @xdr: pointer to xdr_stream struct From patchwork Fri Feb 22 21:59:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827031 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9D5941575 for ; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8973D32D17 for ; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E0A532D2E; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE85729A6B for ; Fri, 22 Feb 2019 21:59:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726239AbfBVV70 (ORCPT ); Fri, 22 Feb 2019 16:59:26 -0500 Received: from mail-io1-f66.google.com ([209.85.166.66]:33903 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726080AbfBVV7Z (ORCPT ); Fri, 22 Feb 2019 16:59:25 -0500 Received: by mail-io1-f66.google.com with SMTP id e1so3028244iok.1 for ; Fri, 22 Feb 2019 13:59:24 -0800 (PST) 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=Ia7aST5lPiAEQVsVWLwzrWewgh95bZPNwt/gEeGIXvc=; b=oumKCo5y6WnousE+ihR6Ap8QTWIhh5II8ZoQJ+It007PAp5ohra4LUo1rn2T/omlO8 TlOBwcmHOdipbhu8u9W2CVdxqd36JCs52e9PAI9IMVn5BV1W7xamU+rIhczPGFLBh8QQ kUnZixD/i9Dz6xqbIuOvQ0gv4FRE1Hd5ZlPdzmCt0Hz0KuiwWj+M/KB8iS3/sWwLKA3X N7sYHbnPVDlAQ179/CwIOyF8mU6iECfJKlZXQBNhTQhaqH6X4HDY2ktltVOKZ0NTU7SG WCI0ixUpnWiOL2N4gVoImJJjKWOIrZ/i3V+ai80QrkuttWGrVOH5nqSSoZKSWB1Y22JL pyYg== 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=Ia7aST5lPiAEQVsVWLwzrWewgh95bZPNwt/gEeGIXvc=; b=IzcnGz9U1mB7L2IM5InRCYZjRfjp4BgdHX/gx3+e+nOKpS1FCoAQCLDi1akjYHQvPM vfQDJmqS1d3m6ItsjIzsePRBZeI+A3bxtyCbPd1xzziPEfMuYD0xZXMiDCznLg3ReYAf TQN/XVdnseAKvhP7+k064hX6AufBiPBtNDfhPEqIx3PQiJgQFCqmollU/rnFw9Vw8Zpn qcx4O2JTXLCC7oLwaoDDJ9uBPBuS/KIPvu4/+1KVJzMjKXLiKhXdL7yZ+5HXuUlLdBlA WenuYGk1FKaC4o4dGckYnueKWST6EVDnLaeAP0VLEunV+zvxK9JJagSihLGGM8oSGNe3 jvZQ== X-Gm-Message-State: AHQUAuaEaqBZDCLygf7DFPZ1uXibQC5W4NK3cawOj3VgOlCef66FnKZa uFsvV6cwpb/p1/RWWg+kP2PyifxzhNk= X-Google-Smtp-Source: AHgI3Iaa+366gmgGFl2MmtGEVSVfVC2oBpzBU9kiB7nQSSN00UxFQh2yHSdY5ePmqh17Uka2lyVFDg== X-Received: by 2002:a6b:e219:: with SMTP id z25mr3426271ioc.116.1550872764201; Fri, 22 Feb 2019 13:59:24 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:23 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 4/6] NFS: Add basic READ_PLUS support Date: Fri, 22 Feb 2019 16:59:16 -0500 Message-Id: <20190222215918.20647-5-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP From: Anna Schumaker This patch adds support for decoding a single NFS4_CONTENT_DATA or NFS4_CONTENT_HOLE segment returned by the server. This gives a simple implementation that does not need to spent a lot of time shifting data arount. Signed-off-by: Anna Schumaker --- fs/nfs/nfs42xdr.c | 160 ++++++++++++++++++++++++++++++++++++++ fs/nfs/nfs4proc.c | 32 +++++++- fs/nfs/nfs4xdr.c | 1 + include/linux/nfs4.h | 1 + include/linux/nfs_fs_sb.h | 1 + include/linux/nfs_xdr.h | 2 +- 6 files changed, 193 insertions(+), 4 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 69f72ed2bf87..57ec9c0fc00a 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -32,6 +32,14 @@ #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 decode_read_plus_maxsz (op_decode_hdr_maxsz + \ + 1 /* rpr_eof */ + \ + 1 /* rpr_contents count */ + \ + 1 /* data_content4 */ + \ + 2 /* data_info4.di_offset */ + \ + 2 /* data_info4.di_length */) #define encode_seek_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + \ 2 /* offset */ + \ @@ -92,6 +100,12 @@ decode_putfh_maxsz + \ decode_deallocate_maxsz + \ decode_getattr_maxsz) +#define NFS4_enc_read_plus_sz (compound_encode_hdr_maxsz + \ + encode_putfh_maxsz + \ + encode_read_plus_maxsz) +#define NFS4_dec_read_plus_sz (compound_decode_hdr_maxsz + \ + decode_putfh_maxsz + \ + decode_read_plus_maxsz) #define NFS4_enc_seek_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_seek_maxsz) @@ -170,6 +184,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) @@ -317,6 +341,29 @@ 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); + + xdr_inline_pages(&req->rq_rcv_buf, hdr.replen << 2, + args->pages, args->pgbase, args->count); + req->rq_rcv_buf.flags |= XDRBUF_READ; + encode_nops(&hdr); +} + /* * Encode SEEK request */ @@ -463,6 +510,92 @@ 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) +{ + __be32 *p; + uint32_t count, recvd; + uint64_t offset; + + p = xdr_inline_decode(xdr, 8 + 4); + if (unlikely(!p)) + goto out_overflow; + + p = xdr_decode_hyper(p, &offset); + count = be32_to_cpup(p); + + recvd = xdr_read_pages(xdr, count); + if (recvd < count) + res->eof = 0; + + res->count = recvd; + return 0; +out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; +} + +static int decode_read_plus_hole(struct xdr_stream *xdr, struct nfs_pgio_res *res) +{ + __be32 *p; + uint64_t offset, length; + size_t recvd; + + p = xdr_inline_decode(xdr, 8 + 8); + if (unlikely(!p)) + goto out_overflow; + + p = xdr_decode_hyper(p, &offset); + p = xdr_decode_hyper(p, &length); + + recvd = xdr_expand_hole(xdr, 0, length); + if (recvd < length) + res->eof = 0; + + res->count = recvd; + return 0; +out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; +} + +static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) +{ + __be32 *p; + int status, type; + uint32_t segments; + + status = decode_op_hdr(xdr, OP_READ_PLUS); + if (status) + return status; + + p = xdr_inline_decode(xdr, 4 + 4); + if (unlikely(!p)) + goto out_overflow; + + res->count = 0; + res->eof = be32_to_cpup(p++); + segments = be32_to_cpup(p++); + if (segments == 0) + return 0; + + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + goto out_overflow; + + type = be32_to_cpup(p++); + if (type == NFS4_CONTENT_DATA) + status = decode_read_plus_data(xdr, res); + else + status = decode_read_plus_hole(xdr, res); + + if (segments > 1) + res->eof = 0; + return status; +out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; +} + static int decode_seek(struct xdr_stream *xdr, struct nfs42_seek_res *res) { int status; @@ -612,6 +745,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 557a5d636183..0aabddc900e0 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 @@ -5007,9 +5011,15 @@ static bool nfs4_read_stateid_changed(struct rpc_task *task, static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr) { - + struct nfs_server *server = NFS_SERVER(hdr->inode); dprintk("--> %s\n", __func__); + if ((server->caps & NFS_CAP_READ_PLUS) && (task->tk_status == -ENOTSUPP)) { + server->caps &= ~NFS_CAP_READ_PLUS; + if (rpc_restart_call_prepare(task)) + task->tk_status = 0; + return -EAGAIN; + } if (!nfs4_sequence_done(task, &hdr->res.seq_res)) return -EAGAIN; if (nfs4_read_stateid_changed(task, &hdr->args)) @@ -5020,13 +5030,28 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *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); } @@ -9691,7 +9716,8 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { | NFS_CAP_DEALLOCATE | NFS_CAP_SEEK | NFS_CAP_LAYOUTSTATS - | NFS_CAP_CLONE, + | NFS_CAP_CLONE + | 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 2fc8f6fa25e4..b18a0143a4af 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -7790,6 +7790,7 @@ const struct rpc_procinfo nfs4_procedures[] = { PROC42(CLONE, enc_clone, dec_clone), PROC42(COPY, enc_copy, dec_copy), PROC42(OFFLOAD_CANCEL, enc_offload_cancel, dec_offload_cancel), + PROC42(READ_PLUS, enc_read_plus, dec_read_plus), PROC(LOOKUPP, enc_lookupp, dec_lookupp), }; diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 1b06f0b28453..db465ad6659b 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -536,6 +536,7 @@ enum { NFSPROC4_CLNT_CLONE, NFSPROC4_CLNT_COPY, NFSPROC4_CLNT_OFFLOAD_CANCEL, + NFSPROC4_CLNT_READ_PLUS, NFSPROC4_CLNT_LOOKUPP, }; diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 6aa8cc83c3b6..e431c2a7affd 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -261,5 +261,6 @@ struct nfs_server { #define NFS_CAP_CLONE (1U << 23) #define NFS_CAP_COPY (1U << 24) #define NFS_CAP_OFFLOAD_CANCEL (1U << 25) +#define NFS_CAP_READ_PLUS (1U << 26) #endif diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 441a93ebcac0..4fb9b9d11685 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -620,7 +620,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 Fri Feb 22 21:59:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827029 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 864C41390 for ; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 73EF632D16 for ; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6873D32D28; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0844932D16 for ; Fri, 22 Feb 2019 21:59:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726080AbfBVV70 (ORCPT ); Fri, 22 Feb 2019 16:59:26 -0500 Received: from mail-it1-f196.google.com ([209.85.166.196]:51264 "EHLO mail-it1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726116AbfBVV70 (ORCPT ); Fri, 22 Feb 2019 16:59:26 -0500 Received: by mail-it1-f196.google.com with SMTP id e24so5198146itl.1 for ; Fri, 22 Feb 2019 13:59:25 -0800 (PST) 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=qMztH1Z/ISVDK8syfUI8w3o74RPBKZoQXBT47BWAYBc=; b=WuOebTDUVX9yD9O1W/+YAA3JItxtDt2GIJwIoOqf6mvr+ddfpEaWf9j0LjLvbu8/uh kAa8UVJxPMV0yE3MMaFjFmrwOir3cKV30dxwvKZKwBgCBXB5YEt7KCuE+NNSGd2/W4NV c9V/H2C4lJ2XOD5MraS6iBRvLYc3vlxFrrGV+YOl6asGwz8rNrl45HBV9mmdQN2CTOEq Q/vKLAk4UKkX9XkMgtANlYzEmKiVigsXFgdp2xHT8q147WcI1deIGReMgns/O0Zp4nUx bJtfJ/Yoq+qJkSAMu0rzRgxK0GVf4x6hhg/Xd2xubF1sU/3melVQWAqrVMru7up05jAJ ivug== 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=qMztH1Z/ISVDK8syfUI8w3o74RPBKZoQXBT47BWAYBc=; b=ewxtTFonBywcMzhAGVeUU+ZygCbucYs9b7j5eHRIC3sZ0PiSRnttq1JwRPja1MQsWD ATVsf4Bb+cF92xr7vjW431RhKsoW3PhueuWNlFdnFwWTMiF+uGBad+M+sxvHcQqot5KE 5RCBfBR/qH/51xakDeEM2Ry7mfiMLhKS7VVwZzA8VV6l7Eg2MtGQ3KnlzBR3+zK+t3BR k87KTtKXRBX8PHJ/9K1+oVK8PtgwTm5GOJ1zOPJHnMmfKC0qLaSGHkxzMIryNFnC7Ij5 cs/UPiNfEU6WWHYeYSvo9C8NWOkhpHKlNpQFUjqUO2sy4oY3pdAodiPD0nGBZItO9hsb OCWA== X-Gm-Message-State: AHQUAuZUbn7h9noq60a/++mKTWGFc+DzhzmONOvG+n3AKuev5S6mp7qw z9c4/i0FZEXaxDu2GkQ5CsU= X-Google-Smtp-Source: AHgI3IZHjaVU855kwvV1orSGvKNIvSDIRco53cbiPzmNd4IIxrirxFRVxYj6ZcItF0TTX4rPZMDiqA== X-Received: by 2002:a24:57cf:: with SMTP id u198mr3518276ita.160.1550872765159; Fri, 22 Feb 2019 13:59:25 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:24 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 5/6] NFS: Add support for decoding multiple segments Date: Fri, 22 Feb 2019 16:59:17 -0500 Message-Id: <20190222215918.20647-6-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP From: Anna Schumaker We now have everything we need to read holes and then shift data to where it's supposed to be. Signed-off-by: Anna Schumaker --- fs/nfs/nfs42xdr.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 57ec9c0fc00a..2b8b3a2524c4 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -523,11 +523,11 @@ 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 (recvd < count) res->eof = 0; - res->count = recvd; + res->count += recvd; return 0; out_overflow: print_overflow_msg(__func__, xdr); @@ -547,11 +547,11 @@ 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); if (recvd < length) res->eof = 0; - res->count = recvd; + res->count += recvd; return 0; out_overflow: print_overflow_msg(__func__, xdr); @@ -562,7 +562,7 @@ static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) { __be32 *p; int status, type; - uint32_t segments; + uint32_t i, segments; status = decode_op_hdr(xdr, OP_READ_PLUS); if (status) @@ -575,20 +575,24 @@ static int decode_read_plus(struct xdr_stream *xdr, struct nfs_pgio_res *res) res->count = 0; res->eof = be32_to_cpup(p++); segments = be32_to_cpup(p++); - if (segments == 0) - return 0; - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) - goto out_overflow; + for (i = 0; i < segments; i++) { + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + goto out_overflow; - type = be32_to_cpup(p++); - if (type == NFS4_CONTENT_DATA) - status = decode_read_plus_data(xdr, res); - else - status = decode_read_plus_hole(xdr, res); + type = be32_to_cpup(p); + if (type == NFS4_CONTENT_DATA) + status = decode_read_plus_data(xdr, res); + else + status = decode_read_plus_hole(xdr, res); + if (status) + break; + if (res->count == xdr->buf->page_len) + break; + } - if (segments > 1) + if (i < segments) res->eof = 0; return status; out_overflow: From patchwork Fri Feb 22 21:59:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anna Schumaker X-Patchwork-Id: 10827033 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DD02517E9 for ; Fri, 22 Feb 2019 21:59:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C87B832D16 for ; Fri, 22 Feb 2019 21:59:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BCDBA32D23; Fri, 22 Feb 2019 21:59:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4A7C032D17 for ; Fri, 22 Feb 2019 21:59:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726278AbfBVV71 (ORCPT ); Fri, 22 Feb 2019 16:59:27 -0500 Received: from mail-it1-f195.google.com ([209.85.166.195]:51266 "EHLO mail-it1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726019AbfBVV71 (ORCPT ); Fri, 22 Feb 2019 16:59:27 -0500 Received: by mail-it1-f195.google.com with SMTP id e24so5198230itl.1 for ; Fri, 22 Feb 2019 13:59:26 -0800 (PST) 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=aIyIGu4ERhN//EmGKkvvhxCX02bNotYS23nfuZugKxI=; b=eTaVm1NpJz0RSlIpy7SbTEP+6eRo0cUtPVZm0oGJwnTsawfeOgvcfUsDbrhUslCcms 5Uuszjm+LHp4Ce4Er7VWx4V3QgbuzUVKXAeLDmFKjbZoHOrsTqwvENMoBRD9mhn3YM3S ibv5nW01SVEp3oOBgLkqGmOcRpjT+1cHRhfPqNnbfNTzs19Z3hnofeLG2PGnqZoGVtK5 vBnanjBZ7KSdCZxlTPlvJuM+b7wiWnj68ZoW0tbjdiWZnAQh9H/EvXq7vFzhYpwUkFF3 0yWi1V0r+JMLmhLRXEPC0GKlCe+pyDg/hwrIuByf496lcwG6np3ztZH3CRDWVawPu9ja yhtg== 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=aIyIGu4ERhN//EmGKkvvhxCX02bNotYS23nfuZugKxI=; b=DAO859wvEpa4jYKtvdADey440LDtuuPr99jIVo+bfArAOSeQ44sk02VCbCOpWpfDEe StO/6XocIxBkn2KB/MEmGr+cszKSrlpSGNnOO0om7nmKajRAv798tBLosrBpnBlzIm/q UOInol3O4a8qXpacBLqf85R7JE30JFiKh0jytgfdBpQZvYnVO6zxcyjELlrvwPpqwrmj J3YtrxJz56XBCnhch5DwSLXOuz4JUsq1Gr+PWISKSWwOG9sLyO+wb3P0OGTq3hNOw4dH k9u+b1YN1qSxaMngVk6wK+JNOFZq4C9Onk+hfB8xwtrzeSk53t2s3bzhs49h4zk8ON+l 0eKQ== X-Gm-Message-State: AHQUAuY/d7fvMmC6Hhdhezo+QKn+0hAvKNosTszgYntqdfJvfLg+/0Pc cDJIMWi4sdzNCaQf8SktBOs= X-Google-Smtp-Source: AHgI3IZChmphYpitPF7ml5XTvtBl+/lS3SlG/gtdmRJ+aESQoL7sqlpUsd0l+QfqlQ5ZhkS9HeyI+w== X-Received: by 2002:a24:6c46:: with SMTP id w67mr3446060itb.13.1550872766185; Fri, 22 Feb 2019 13:59:26 -0800 (PST) Received: from gouda.nowheycreamery.com.nowheycreamery.com (d28-23-121-75.dim.wideopenwest.com. [23.28.75.121]) by smtp.gmail.com with ESMTPSA id f13sm998171iol.82.2019.02.22.13.59.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Feb 2019 13:59:25 -0800 (PST) From: schumaker.anna@gmail.com X-Google-Original-From: Anna.Schumaker@Netapp.com To: Trond.Myklebust@hammerspace.com, linux-nfs@vger.kernel.org Cc: Anna.Schumaker@Netapp.com Subject: [PATCH 6/6] NFS: Add a mount option for READ_PLUS Date: Fri, 22 Feb 2019 16:59:18 -0500 Message-Id: <20190222215918.20647-7-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190222215918.20647-1-Anna.Schumaker@Netapp.com> References: <20190222215918.20647-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 X-Virus-Scanned: ClamAV using ClamSMTP From: Anna Schumaker There are some workloads where READ_PLUS might end up hurting performance, so let's be nice to users and provide a way to disable this operation similar to how READDIR_PLUS can be disabled. Signed-off-by: Anna Schumaker --- fs/nfs/nfs4client.c | 3 +++ fs/nfs/super.c | 21 +++++++++++++++++++++ include/linux/nfs4.h | 4 ++-- include/linux/nfs_fs_sb.h | 1 + 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 2548405da1f7..2bb603d1a80f 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -998,6 +998,9 @@ static int nfs4_server_common_setup(struct nfs_server *server, server->caps |= server->nfs_client->cl_mvops->init_caps; if (server->flags & NFS_MOUNT_NORDIRPLUS) server->caps &= ~NFS_CAP_READDIRPLUS; + if (server->options & NFS_OPTION_NO_READ_PLUS) + server->caps &= ~NFS_CAP_READ_PLUS; + /* * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower * authentication. diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 0570391eaa16..5b8701fca5b9 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -90,6 +90,7 @@ enum { Opt_resvport, Opt_noresvport, Opt_fscache, Opt_nofscache, Opt_migration, Opt_nomigration, + Opt_readplus, Opt_noreadplus, /* Mount options that take integer arguments */ Opt_port, @@ -151,6 +152,8 @@ static const match_table_t nfs_mount_option_tokens = { { Opt_nofscache, "nofsc" }, { Opt_migration, "migration" }, { Opt_nomigration, "nomigration" }, + { Opt_readplus, "readplus" }, + { Opt_noreadplus, "noreadplus" }, { Opt_port, "port=%s" }, { Opt_rsize, "rsize=%s" }, @@ -690,6 +693,11 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, if (nfss->options & NFS_OPTION_MIGRATION) seq_printf(m, ",migration"); + if (nfss->options & NFS_OPTION_NO_READ_PLUS) + seq_printf(m,",noreadplus"); + else + seq_printf(m,",readplus"); + if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) { if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) seq_printf(m, ",lookupcache=none"); @@ -1324,6 +1332,12 @@ static int nfs_parse_mount_options(char *raw, case Opt_nomigration: mnt->options &= ~NFS_OPTION_MIGRATION; break; + case Opt_readplus: + mnt->options &= ~NFS_OPTION_NO_READ_PLUS; + break; + case Opt_noreadplus: + mnt->options |= NFS_OPTION_NO_READ_PLUS; + break; /* * options that take numeric values @@ -1626,6 +1640,9 @@ static int nfs_parse_mount_options(char *raw, if (mnt->options & NFS_OPTION_MIGRATION && (mnt->version != 4 || mnt->minorversion != 0)) goto out_migration_misuse; + if (mnt->options & NFS_OPTION_NO_READ_PLUS && + (mnt->version != 4 || mnt->minorversion < 2)) + goto out_noreadplus_misuse; /* * verify that any proto=/mountproto= options match the address @@ -1668,6 +1685,10 @@ static int nfs_parse_mount_options(char *raw, printk(KERN_INFO "NFS: 'migration' not supported for this NFS version\n"); return 0; +out_noreadplus_misuse: + printk(KERN_INFO + "NFS: 'noreadplus' not supported for this NFS version\n"); + return 0; out_nomem: printk(KERN_INFO "NFS: not enough memory to parse option\n"); return 0; diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index db465ad6659b..2fd3cf2061c2 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -535,10 +535,10 @@ enum { NFSPROC4_CLNT_LAYOUTSTATS, NFSPROC4_CLNT_CLONE, NFSPROC4_CLNT_COPY, - NFSPROC4_CLNT_OFFLOAD_CANCEL, - NFSPROC4_CLNT_READ_PLUS, NFSPROC4_CLNT_LOOKUPP, + NFSPROC4_CLNT_OFFLOAD_CANCEL, + NFSPROC4_CLNT_READ_PLUS, }; /* nfs41 types */ diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index e431c2a7affd..c95be09b84f1 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -157,6 +157,7 @@ struct nfs_server { unsigned int clone_blksize; /* granularity of a CLONE operation */ #define NFS_OPTION_FSCACHE 0x00000001 /* - local caching enabled */ #define NFS_OPTION_MIGRATION 0x00000002 /* - NFSv4 migration enabled */ +#define NFS_OPTION_NO_READ_PLUS 0x00000004 /* - NFSv4.2 READ_PLUS enabled */ struct nfs_fsid fsid; __u64 maxfilesize; /* maximum file size */