|
@@ -566,23 +566,17 @@ static void *smk_seq_start(struct seq_file *s, loff_t *pos,
|
|
|
struct list_head *head)
|
|
|
{
|
|
|
struct list_head *list;
|
|
|
+ int i = *pos;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ for (list = rcu_dereference(list_next_rcu(head));
|
|
|
+ list != head;
|
|
|
+ list = rcu_dereference(list_next_rcu(list))) {
|
|
|
+ if (i-- == 0)
|
|
|
+ return list;
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- * This is 0 the first time through.
|
|
|
- */
|
|
|
- if (s->index == 0)
|
|
|
- s->private = head;
|
|
|
-
|
|
|
- if (s->private == NULL)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- list = s->private;
|
|
|
- if (list_empty(list))
|
|
|
- return NULL;
|
|
|
-
|
|
|
- if (s->index == 0)
|
|
|
- return list->next;
|
|
|
- return list;
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos,
|
|
@@ -590,17 +584,15 @@ static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos,
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
|
|
|
- if (list_is_last(list, head)) {
|
|
|
- s->private = NULL;
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- s->private = list->next;
|
|
|
- return list->next;
|
|
|
+ ++*pos;
|
|
|
+ list = rcu_dereference(list_next_rcu(list));
|
|
|
+
|
|
|
+ return (list == head) ? NULL : list;
|
|
|
}
|
|
|
|
|
|
static void smk_seq_stop(struct seq_file *s, void *v)
|
|
|
{
|
|
|
- /* No-op */
|
|
|
+ rcu_read_unlock();
|
|
|
}
|
|
|
|
|
|
static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
|
|
@@ -660,7 +652,7 @@ static int load_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_master_list *smlp =
|
|
|
- list_entry(list, struct smack_master_list, list);
|
|
|
+ list_entry_rcu(list, struct smack_master_list, list);
|
|
|
|
|
|
smk_rule_show(s, smlp->smk_rule, SMK_LABELLEN);
|
|
|
|
|
@@ -808,7 +800,7 @@ static int cipso_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_known *skp =
|
|
|
- list_entry(list, struct smack_known, list);
|
|
|
+ list_entry_rcu(list, struct smack_known, list);
|
|
|
struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
|
|
|
char sep = '/';
|
|
|
int i;
|
|
@@ -999,7 +991,7 @@ static int cipso2_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_known *skp =
|
|
|
- list_entry(list, struct smack_known, list);
|
|
|
+ list_entry_rcu(list, struct smack_known, list);
|
|
|
struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
|
|
|
char sep = '/';
|
|
|
int i;
|
|
@@ -1083,7 +1075,7 @@ static int netlbladdr_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smk_netlbladdr *skp =
|
|
|
- list_entry(list, struct smk_netlbladdr, list);
|
|
|
+ list_entry_rcu(list, struct smk_netlbladdr, list);
|
|
|
unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr;
|
|
|
int maskn;
|
|
|
u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr);
|
|
@@ -1917,7 +1909,7 @@ static int load_self_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_rule *srp =
|
|
|
- list_entry(list, struct smack_rule, list);
|
|
|
+ list_entry_rcu(list, struct smack_rule, list);
|
|
|
|
|
|
smk_rule_show(s, srp, SMK_LABELLEN);
|
|
|
|
|
@@ -2046,7 +2038,7 @@ static int load2_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_master_list *smlp =
|
|
|
- list_entry(list, struct smack_master_list, list);
|
|
|
+ list_entry_rcu(list, struct smack_master_list, list);
|
|
|
|
|
|
smk_rule_show(s, smlp->smk_rule, SMK_LONGLABEL);
|
|
|
|
|
@@ -2123,7 +2115,7 @@ static int load_self2_seq_show(struct seq_file *s, void *v)
|
|
|
{
|
|
|
struct list_head *list = v;
|
|
|
struct smack_rule *srp =
|
|
|
- list_entry(list, struct smack_rule, list);
|
|
|
+ list_entry_rcu(list, struct smack_rule, list);
|
|
|
|
|
|
smk_rule_show(s, srp, SMK_LONGLABEL);
|
|
|
|