From patchwork Tue May 14 00:59:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhiyong Wu X-Patchwork-Id: 2561611 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 57535DF2E5 for ; Tue, 14 May 2013 01:01:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755945Ab3ENA7b (ORCPT ); Mon, 13 May 2013 20:59:31 -0400 Received: from e7.ny.us.ibm.com ([32.97.182.137]:54971 "EHLO e7.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755936Ab3ENA72 (ORCPT ); Mon, 13 May 2013 20:59:28 -0400 Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 13 May 2013 20:59:28 -0400 Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 13 May 2013 20:59:24 -0400 Received: from d01relay06.pok.ibm.com (d01relay06.pok.ibm.com [9.56.227.116]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 7A9B0C90046; Mon, 13 May 2013 20:59:23 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay06.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r4E0xNSd42270770; Mon, 13 May 2013 20:59:23 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r4E0xMND030423; Mon, 13 May 2013 21:59:23 -0300 Received: from us.ibm.com (f17.cn.ibm.com [9.115.122.140]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id r4E0xHZ0030159; Mon, 13 May 2013 21:59:18 -0300 Received: by us.ibm.com (sSMTP sendmail emulation); Tue, 14 May 2013 09:00:18 +0800 From: zwu.kernel@gmail.com To: viro@zeniv.linux.org.uk Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-btrfs@vger.kernel.org, sekharan@us.ibm.com, linuxram@us.ibm.com, david@fromorbit.com, dsterba@suse.cz, gregkh@linuxfoundation.org, paulmck@linux.vnet.ibm.com, chris.mason@fusionio.com, Zhi Yong Wu Subject: [PATCH v2 06/12] VFS hot tracking, seq_file: introduce one set of rcu seq_list interfaces Date: Tue, 14 May 2013 08:59:38 +0800 Message-Id: <1368493184-5939-7-git-send-email-zwu.kernel@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1368493184-5939-1-git-send-email-zwu.kernel@gmail.com> References: <1368493184-5939-1-git-send-email-zwu.kernel@gmail.com> X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13051400-5806-0000-0000-0000211EB36C Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Zhi Yong Wu The patch will introduce one set of rcu interface for seq_list. Signed-off-by: Chandra Seetharaman Signed-off-by: Zhi Yong Wu --- fs/seq_file.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/seq_file.h | 7 +++++++ 2 files changed, 44 insertions(+) diff --git a/fs/seq_file.c b/fs/seq_file.c index 774c1eb..301caa7 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -795,6 +795,43 @@ struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) } EXPORT_SYMBOL(seq_list_next); +struct list_head *seq_list_start_rcu(struct list_head *head, loff_t pos) +{ + struct list_head *lh; + + __list_for_each_rcu(lh, head) + if (pos-- == 0) + return lh; + + return NULL; +} +EXPORT_SYMBOL(seq_list_start_rcu); + +struct list_head *seq_list_start_head_rcu(struct list_head *head, loff_t pos) +{ + if (!pos) + return head; + + return seq_list_start_rcu(head, pos - 1); +} +EXPORT_SYMBOL(seq_list_start_head_rcu); + +struct list_head *seq_list_next_rcu(void *v, struct list_head *head, + loff_t *ppos) +{ + struct list_head *lh; + + ++*ppos; + rcu_read_lock(); + lh = rcu_dereference(((struct list_head *)v)->next); + if (lh == head) + lh = NULL; + rcu_read_unlock(); + + return lh; +} +EXPORT_SYMBOL(seq_list_next_rcu); + /** * seq_hlist_start - start an iteration of a hlist * @head: the head of the hlist diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 2da29ac..7e391c9 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -155,6 +155,13 @@ extern struct list_head *seq_list_start_head(struct list_head *head, extern struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos); +extern struct list_head *seq_list_start_rcu(struct list_head *head, + loff_t pos); +extern struct list_head *seq_list_start_head_rcu(struct list_head *head, + loff_t pos); +extern struct list_head *seq_list_next_rcu(void *v, struct list_head *head, + loff_t *ppos); + /* * Helpers for iteration over hlist_head-s in seq_files */