From patchwork Sun Feb 5 13:40:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kinglong Mee X-Patchwork-Id: 9556071 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 73DCE602B1 for ; Sun, 5 Feb 2017 13:42:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A41C26785 for ; Sun, 5 Feb 2017 13:42:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4BE6826E82; Sun, 5 Feb 2017 13:42:03 +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=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 EFC5626785 for ; Sun, 5 Feb 2017 13:42:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751213AbdBENl7 (ORCPT ); Sun, 5 Feb 2017 08:41:59 -0500 Received: from mail-it0-f65.google.com ([209.85.214.65]:34090 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751101AbdBENl7 (ORCPT ); Sun, 5 Feb 2017 08:41:59 -0500 Received: by mail-it0-f65.google.com with SMTP id o185so5949958itb.1 for ; Sun, 05 Feb 2017 05:41:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:cc:from:subject:message-id:date:user-agent:mime-version :content-transfer-encoding; bh=tDU+JIeGzeMruQwCHk/V5DL/ZXiVzKUz4r/cLY8hKLo=; b=kw0MP07KRFja0QAb5mPUsVNNNsAcb328yjWfsRs1969F5qMEUqKMuUi/TF99Bo0+Za QHmUqCR/GuhzFGrNmtY6Bq5fNu52bMfRJumKtXrLqEmV6/c4QP1ShjOSGdLsERMfD6ae /YxQw8ognVo4bK/jaQX2AeGlh8T5seig2OZZ9bsZS62c9V2U9dmp8iisciE0oFEcCZAR LTuysll9ehkkUTzj4f4HMgfxUICOTolgzvvxiVTncYbSN73nykdNT3dH+jhIaOU+IDAB qvX/CPeII74KmeewCF7WZJKOEA1MJuRwxKmZh2hdxQJThkyiPvpiEfhxtc3abm8qJY88 EvWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-transfer-encoding; bh=tDU+JIeGzeMruQwCHk/V5DL/ZXiVzKUz4r/cLY8hKLo=; b=ObGWM71ea0qcuQ75vMSeroOP8lrvNFDGDSSSkaD3+XaDc2PlPYdhZMwnjbcp1M2xEM DDgUaVOFM/jFrUXuP/47GyrW2hHY1wPQR4pvbPq73InN3dHHJk8OuThOLni/EiCP9lD9 LKRN93Ihr5PPBNoHBIK1/mk8H5f8ZBosMy0jdXZJ3SDB0CklglcbhAcKWk+x+g3YCGQx y9hQ4RMJfFFp0xfMWAo1XaxdMCwyjFlg3hJDEz/T0kxrbBClqqpn7vvqqiOQsqrtnk+n e1sxSfyYF9/FZkAy7aWPlbBW9jzUOVS1tUCyZOKi7cgVFAxOMYdc4OJy7B1VFX0f8MMZ L7Ag== X-Gm-Message-State: AIkVDXJ7JR041aFPTh+0iKhKbeUUdcj/sPAw7CaQqCHaJQhgqgwN1i0N4SEi/M29uBKOzA== X-Received: by 10.36.6.211 with SMTP id 202mr4066943itv.54.1486302118274; Sun, 05 Feb 2017 05:41:58 -0800 (PST) Received: from [192.168.0.107] ([182.139.117.200]) by smtp.gmail.com with ESMTPSA id a129sm6075702ioe.15.2017.02.05.05.41.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 05 Feb 2017 05:41:57 -0800 (PST) To: "J. Bruce Fields" , linux-nfs@vger.kernel.org Cc: Kinglong Mee From: Kinglong Mee Subject: [PATCH] SUNRPC: Drop all entries left in cache_detail when destroy Message-ID: <81c44c62-fa78-de51-faee-994f5592ff7b@gmail.com> Date: Sun, 5 Feb 2017 21:40:57 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 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 User always free the cache_detail after sunrpc_destroy_cache_detail(), so, it must cleanup up entries that left in the cache_detail, otherwise, NULL reference may be caused when using the left entries. Signed-off-by: Kinglong Mee --- net/sunrpc/cache.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 8147e8d..a2c6fec 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -359,14 +359,28 @@ EXPORT_SYMBOL_GPL(sunrpc_init_cache_detail); void sunrpc_destroy_cache_detail(struct cache_detail *cd) { + struct cache_head *ch = NULL; + struct hlist_head *head = NULL; + struct hlist_node *tmp = NULL; + int i = 0; + cache_purge(cd); spin_lock(&cache_list_lock); write_lock(&cd->hash_lock); + if (cd->entries) { - write_unlock(&cd->hash_lock); - spin_unlock(&cache_list_lock); - goto out; + printk(KERN_ERR "RPC: %d entries left in %s cache\n", cd->name); + for (i = 0; i < cd->hash_size; i++) { + head = &cd->hash_table[i]; + hlist_for_each_entry_safe(ch, tmp, head, cache_list) { + hlist_del_init(&ch->cache_list); + set_bit(CACHE_CLEANED, &ch->flags); + cache_fresh_unlocked(ch, cd); + cache_put(ch, cd); + } + } } + if (current_detail == cd) current_detail = NULL; list_del_init(&cd->others); @@ -376,9 +390,6 @@ void sunrpc_destroy_cache_detail(struct cache_detail *cd) /* module must be being unloaded so its safe to kill the worker */ cancel_delayed_work_sync(&cache_cleaner); } - return; -out: - printk(KERN_ERR "RPC: failed to unregister %s cache\n", cd->name); } EXPORT_SYMBOL_GPL(sunrpc_destroy_cache_detail);