From mboxrd@z Thu Jan 1 00:00:00 1970 From: zwu.kernel@gmail.com Subject: [PATCH v3 06/13] VFS hot tracking, seq_file: add seq_list rcu interfaces Date: Fri, 21 Jun 2013 20:17:15 +0800 Message-ID: <1371817042-8556-7-git-send-email-zwu.kernel@gmail.com> References: <1371817042-8556-1-git-send-email-zwu.kernel@gmail.com> Cc: viro@zeniv.linux.org.uk, sekharan@us.ibm.com, linuxram@us.ibm.com, david@fromorbit.com, chris.mason@fusionio.com, jbacik@fusionio.com, Zhi Yong Wu To: linux-fsdevel@vger.kernel.org Return-path: Received: from e9.ny.us.ibm.com ([32.97.182.139]:33474 "EHLO e9.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161045Ab3FUMSn (ORCPT ); Fri, 21 Jun 2013 08:18:43 -0400 Received: from /spool/local by e9.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 21 Jun 2013 08:18:42 -0400 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 996B2C90041 for ; Fri, 21 Jun 2013 08:18:38 -0400 (EDT) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r5LCIdxi296738 for ; Fri, 21 Jun 2013 08:18:39 -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 r5LCIccx004090 for ; Fri, 21 Jun 2013 09:18:39 -0300 In-Reply-To: <1371817042-8556-1-git-send-email-zwu.kernel@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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 */ -- 1.7.11.7