Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp3494606pxx; Mon, 2 Nov 2020 10:19:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJw59STgH4zgjl8jpArPUcgAL2RnUurLosSCc8Jjm3hx2QioMp/MRx5B9tFK8w1kyyPNEWBf X-Received: by 2002:a17:906:383:: with SMTP id b3mr16026639eja.351.1604341171023; Mon, 02 Nov 2020 10:19:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604341171; cv=none; d=google.com; s=arc-20160816; b=FabiNVyFKKnr3MSjjvmTUfy1bkRz/FpQdv2YwuFV/TuFGKi7b9y/M7SjLugngwyMp+ scQURnGF9w5L7RpNwMbjbEfT00/lkrRM5T3TZR7qncUrtmDTPLk7cNlhegYYTS2bAxB2 imgAqfxFR3P5QgQl9OM/OO9FZArhrJbMGY+3X1o7Ie1JoRh3+S5a2hGxlleqGLv6eNem reKifvHJjCWTqQW49i5qmZHptM4J+dLjBf8JiCet6syJl2gY3OVzoO31UW56CfpPUE9U NVlY7gteKgmZwYeVg4XP0w5KfeUc0krSehhUBUco2N/I76R3JWmTs9ZvRoiA9UfE6v3s BVkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=Za2MbFKOf0ZIVMwa6n7rZb8vFe0Gn0ItEgc063hxwd8=; b=ADcAOhZxgRk53HfV/3R3e87jMox8U1aqHxXPWKjRIryCrqDInWcn9HrhqdUoAaNjbu rQGq/L55N1xFLJujrpa+GaQ4p3YV1OICpbh7NXG2n4pEKPzgUz2UZaw4U9svZtSLeH8T +tq9eS17dlInFRgGCoYbfFWBlEkdLkXy61F2Qe5Cq42tDq0PFwz1z8ono4W9IX4vqQhh Pq5tZEhnmJbF7AWAxSDbN658fu7D6UpK4w34lPqmzkc5k3Trbp45TrUN1NgO+qbWJ6zU KsZPv4sZNGa0IFgUepHgjCTVH5QM56U4sSAFtLaqBP7La8Lhhih3OiyRvuXn6wYFGuII 0Gtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HqZ1Isul; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j19si3308235ejs.634.2020.11.02.10.19.08; Mon, 02 Nov 2020 10:19:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HqZ1Isul; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726255AbgKBSRW (ORCPT + 99 others); Mon, 2 Nov 2020 13:17:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:40854 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726114AbgKBSRW (ORCPT ); Mon, 2 Nov 2020 13:17:22 -0500 Received: from localhost.localdomain (c-68-36-133-222.hsd1.mi.comcast.net [68.36.133.222]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1EBA520731 for ; Mon, 2 Nov 2020 18:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1604341041; bh=qPfAPw7196hQ8nsK5eADV/nGuxh7pKO4LF0CbGIaxT8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=HqZ1Isuluyntnf6/Hut58x0daOf5zs3gi6EutrVlbQ9nqERG8w6otCDLhdWwLI6lD XZtBb3GywMS2T/2xwv7Xzp/u6+0GoTYPjuFdavLcrOL77tyJqvpYnsFsUo2eKKeh5o K9hcVNJ/aTM+S8N7rsMyZ6QhbSQyaJsH6QCtbbPc= From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH 02/12] NFS: Clean up readdir struct nfs_cache_array Date: Mon, 2 Nov 2020 13:06:48 -0500 Message-Id: <20201102180658.6218-3-trondmy@kernel.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201102180658.6218-2-trondmy@kernel.org> References: <20201102180658.6218-1-trondmy@kernel.org> <20201102180658.6218-2-trondmy@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Trond Myklebust Since the 'eof_index' is only ever used as a flag, make it so. Also add a flag to detect if the page has been completely filled. Signed-off-by: Trond Myklebust --- fs/nfs/dir.c | 66 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 67d8595cd6e5..604ebe015387 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -138,9 +138,10 @@ struct nfs_cache_array_entry { }; struct nfs_cache_array { - int size; - int eof_index; u64 last_cookie; + unsigned int size; + unsigned char page_full : 1, + page_is_eof : 1; struct nfs_cache_array_entry array[]; }; @@ -172,7 +173,6 @@ void nfs_readdir_init_array(struct page *page) array = kmap_atomic(page); memset(array, 0, sizeof(struct nfs_cache_array)); - array->eof_index = -1; kunmap_atomic(array); } @@ -192,6 +192,17 @@ void nfs_readdir_clear_array(struct page *page) kunmap_atomic(array); } +static void nfs_readdir_array_set_eof(struct nfs_cache_array *array) +{ + array->page_is_eof = 1; + array->page_full = 1; +} + +static bool nfs_readdir_array_is_full(struct nfs_cache_array *array) +{ + return array->page_full; +} + /* * the caller is responsible for freeing qstr.name * when called by nfs_readdir_add_to_array, the strings will be freed in @@ -213,6 +224,23 @@ int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int le return 0; } +/* + * Check that the next array entry lies entirely within the page bounds + */ +static int nfs_readdir_array_can_expand(struct nfs_cache_array *array) +{ + struct nfs_cache_array_entry *cache_entry; + + if (array->page_full) + return -ENOSPC; + cache_entry = &array->array[array->size + 1]; + if ((char *)cache_entry - (char *)array > PAGE_SIZE) { + array->page_full = 1; + return -ENOSPC; + } + return 0; +} + static int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) { @@ -220,13 +248,11 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) struct nfs_cache_array_entry *cache_entry; int ret; - cache_entry = &array->array[array->size]; - - /* Check that this entry lies within the page bounds */ - ret = -ENOSPC; - if ((char *)&cache_entry[1] - (char *)page_address(page) > PAGE_SIZE) + ret = nfs_readdir_array_can_expand(array); + if (ret) goto out; + cache_entry = &array->array[array->size]; cache_entry->cookie = entry->prev_cookie; cache_entry->ino = entry->ino; cache_entry->d_type = entry->d_type; @@ -236,12 +262,21 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) array->last_cookie = entry->cookie; array->size++; if (entry->eof != 0) - array->eof_index = array->size; + nfs_readdir_array_set_eof(array); out: kunmap(page); return ret; } +static void nfs_readdir_page_set_eof(struct page *page) +{ + struct nfs_cache_array *array; + + array = kmap_atomic(page); + nfs_readdir_array_set_eof(array); + kunmap_atomic(array); +} + static inline int is_32bit_api(void) { @@ -270,7 +305,7 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri if (diff < 0) goto out_eof; if (diff >= array->size) { - if (array->eof_index >= 0) + if (array->page_is_eof) goto out_eof; return -EAGAIN; } @@ -334,7 +369,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des return 0; } } - if (array->eof_index >= 0) { + if (array->page_is_eof) { status = -EBADCOOKIE; if (desc->dir_cookie == array->last_cookie) desc->eof = true; @@ -566,7 +601,6 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en struct xdr_stream stream; struct xdr_buf buf; struct page *scratch; - struct nfs_cache_array *array; unsigned int count = 0; int status; @@ -604,10 +638,8 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en out_nopages: if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) { - array = kmap(page); - array->eof_index = array->size; + nfs_readdir_page_set_eof(page); status = 0; - kunmap(page); } put_page(scratch); @@ -689,7 +721,7 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, status = 0; break; } - } while (array->eof_index < 0); + } while (!nfs_readdir_array_is_full(array)); nfs_readdir_free_pages(pages, array_size); out_release_array: @@ -825,7 +857,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc) if (desc->duped != 0) desc->duped = 1; } - if (array->eof_index >= 0) + if (array->page_is_eof) desc->eof = true; kunmap(desc->page); -- 2.28.0