lkml.org 
[lkml]   [2013]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 06/12] VFS hot tracking, seq_file: introduce one set of rcu seq_list interfaces
    Date
    From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

    The patch will introduce one set of rcu interface for seq_list.

    Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>
    Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
    ---
    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


    \
     
     \ /
      Last update: 2013-05-14 03:21    [W:3.018 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site