Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / net / tipc / name_table.c
index 1e0518da19da577fd9cf01c53e33492870146b8c..010f24a59da2666e0d2f08b3288f4db173a5d65b 100644 (file)
@@ -56,7 +56,6 @@ static int tipc_nametbl_size = 1024;          /* must be a power of 2 */
  *       publications of the associated name sequence belong to it.
  *       (The cluster and node lists may be empty.)
  */
-
 struct name_info {
        struct list_head node_list;
        struct list_head cluster_list;
@@ -72,7 +71,6 @@ struct name_info {
  * @upper: name sequence upper bound
  * @info: pointer to name sequence publication info
  */
-
 struct sub_seq {
        u32 lower;
        u32 upper;
@@ -90,7 +88,6 @@ struct sub_seq {
  * @subscriptions: list of subscriptions for this 'type'
  * @lock: spinlock controlling access to publication lists of all sub-sequences
  */
-
 struct name_seq {
        u32 type;
        struct sub_seq *sseqs;
@@ -107,7 +104,6 @@ struct name_seq {
  *         accessed via hashing on 'type'; name sequence lists are *not* sorted
  * @local_publ_count: number of publications issued by this node
  */
-
 struct name_table {
        struct hlist_head *types;
        u32 local_publ_count;
@@ -124,7 +120,6 @@ static int hash(int x)
 /**
  * publ_create - create a publication structure
  */
-
 static struct publication *publ_create(u32 type, u32 lower, u32 upper,
                                       u32 scope, u32 node, u32 port_ref,
                                       u32 key)
@@ -151,7 +146,6 @@ static struct publication *publ_create(u32 type, u32 lower, u32 upper,
 /**
  * tipc_subseq_alloc - allocate a specified number of sub-sequence structures
  */
-
 static struct sub_seq *tipc_subseq_alloc(u32 cnt)
 {
        struct sub_seq *sseq = kcalloc(cnt, sizeof(struct sub_seq), GFP_ATOMIC);
@@ -163,7 +157,6 @@ static struct sub_seq *tipc_subseq_alloc(u32 cnt)
  *
  * Allocates a single sub-sequence structure and sets it to all 0's.
  */
-
 static struct name_seq *tipc_nameseq_create(u32 type, struct hlist_head *seq_head)
 {
        struct name_seq *nseq = kzalloc(sizeof(*nseq), GFP_ATOMIC);
@@ -186,12 +179,23 @@ static struct name_seq *tipc_nameseq_create(u32 type, struct hlist_head *seq_hea
        return nseq;
 }
 
-/**
+/*
+ * nameseq_delete_empty - deletes a name sequence structure if now unused
+ */
+static void nameseq_delete_empty(struct name_seq *seq)
+{
+       if (!seq->first_free && list_empty(&seq->subscriptions)) {
+               hlist_del_init(&seq->ns_list);
+               kfree(seq->sseqs);
+               kfree(seq);
+       }
+}
+
+/*
  * nameseq_find_subseq - find sub-sequence (if any) matching a name instance
  *
  * Very time-critical, so binary searches through sub-sequence array.
  */
-
 static struct sub_seq *nameseq_find_subseq(struct name_seq *nseq,
                                           u32 instance)
 {
@@ -221,7 +225,6 @@ static struct sub_seq *nameseq_find_subseq(struct name_seq *nseq,
  *
  * Note: Similar to binary search code for locating a sub-sequence.
  */
-
 static u32 nameseq_locate_subseq(struct name_seq *nseq, u32 instance)
 {
        struct sub_seq *sseqs = nseq->sseqs;
@@ -242,9 +245,8 @@ static u32 nameseq_locate_subseq(struct name_seq *nseq, u32 instance)
 }
 
 /**
- * tipc_nameseq_insert_publ -
+ * tipc_nameseq_insert_publ
  */
-
 static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                                                    u32 type, u32 lower, u32 upper,
                                                    u32 scope, u32 node, u32 port, u32 key)
@@ -260,7 +262,6 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
        if (sseq) {
 
                /* Lower end overlaps existing entry => need an exact match */
-
                if ((sseq->lower != lower) || (sseq->upper != upper)) {
                        warn("Cannot publish {%u,%u,%u}, overlap error\n",
                             type, lower, upper);
@@ -280,11 +281,9 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                struct sub_seq *freesseq;
 
                /* Find where lower end should be inserted */
-
                inspos = nameseq_locate_subseq(nseq, lower);
 
                /* Fail if upper end overlaps into an existing entry */
-
                if ((inspos < nseq->first_free) &&
                    (upper >= nseq->sseqs[inspos].lower)) {
                        warn("Cannot publish {%u,%u,%u}, overlap error\n",
@@ -293,7 +292,6 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                }
 
                /* Ensure there is space for new sub-sequence */
-
                if (nseq->first_free == nseq->alloc) {
                        struct sub_seq *sseqs = tipc_subseq_alloc(nseq->alloc * 2);
 
@@ -321,7 +319,6 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                INIT_LIST_HEAD(&info->zone_list);
 
                /* Insert new sub-sequence */
-
                sseq = &nseq->sseqs[inspos];
                freesseq = &nseq->sseqs[nseq->first_free];
                memmove(sseq + 1, sseq, (freesseq - sseq) * sizeof(*sseq));
@@ -333,8 +330,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                created_subseq = 1;
        }
 
-       /* Insert a publication: */
-
+       /* Insert a publication */
        publ = publ_create(type, lower, upper, scope, node, port, key);
        if (!publ)
                return NULL;
@@ -342,19 +338,17 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
        list_add(&publ->zone_list, &info->zone_list);
        info->zone_list_size++;
 
-       if (in_own_cluster_exact(node)) {
+       if (in_own_cluster(node)) {
                list_add(&publ->cluster_list, &info->cluster_list);
                info->cluster_list_size++;
        }
 
-       if (node == tipc_own_addr) {
+       if (in_own_node(node)) {
                list_add(&publ->node_list, &info->node_list);
                info->node_list_size++;
        }
 
-       /*
-        * Any subscriptions waiting for notification?
-        */
+       /* Any subscriptions waiting for notification?  */
        list_for_each_entry_safe(s, st, &nseq->subscriptions, nameseq_list) {
                tipc_subscr_report_overlap(s,
                                           publ->lower,
@@ -368,7 +362,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
 }
 
 /**
- * tipc_nameseq_remove_publ -
+ * tipc_nameseq_remove_publ
  *
  * NOTE: There may be cases where TIPC is asked to remove a publication
  * that is not in the name table.  For example, if another node issues a
@@ -378,7 +372,6 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
  * A failed withdraw request simply returns a failure indication and lets the
  * caller issue any error or warning messages associated with such a problem.
  */
-
 static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 inst,
                                                    u32 node, u32 ref, u32 key)
 {
@@ -395,7 +388,6 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
        info = sseq->info;
 
        /* Locate publication, if it exists */
-
        list_for_each_entry(publ, &info->zone_list, zone_list) {
                if ((publ->key == key) && (publ->ref == ref) &&
                    (!publ->node || (publ->node == node)))
@@ -405,26 +397,22 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
 
 found:
        /* Remove publication from zone scope list */
-
        list_del(&publ->zone_list);
        info->zone_list_size--;
 
        /* Remove publication from cluster scope list, if present */
-
-       if (in_own_cluster_exact(node)) {
+       if (in_own_cluster(node)) {
                list_del(&publ->cluster_list);
                info->cluster_list_size--;
        }
 
        /* Remove publication from node scope list, if present */
-
-       if (node == tipc_own_addr) {
+       if (in_own_node(node)) {
                list_del(&publ->node_list);
                info->node_list_size--;
        }
 
        /* Contract subseq list if no more publications for that subseq */
-
        if (list_empty(&info->zone_list)) {
                kfree(info);
                free = &nseq->sseqs[nseq->first_free--];
@@ -433,7 +421,6 @@ found:
        }
 
        /* Notify any waiting subscriptions */
-
        list_for_each_entry_safe(s, st, &nseq->subscriptions, nameseq_list) {
                tipc_subscr_report_overlap(s,
                                           publ->lower,
@@ -452,7 +439,6 @@ found:
  * the prescribed number of events if there is any sub-
  * sequence overlapping with the requested sequence
  */
-
 static void tipc_nameseq_subscribe(struct name_seq *nseq,
                                        struct tipc_subscription *s)
 {
@@ -504,9 +490,10 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper,
 {
        struct name_seq *seq = nametbl_find_seq(type);
 
-       if (lower > upper) {
-               warn("Failed to publish illegal {%u,%u,%u}\n",
-                    type, lower, upper);
+       if ((scope < TIPC_ZONE_SCOPE) || (scope > TIPC_NODE_SCOPE) ||
+           (lower > upper)) {
+               dbg("Failed to publish illegal {%u,%u,%u} with scope %u\n",
+                    type, lower, upper, scope);
                return NULL;
        }
 
@@ -529,12 +516,7 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
                return NULL;
 
        publ = tipc_nameseq_remove_publ(seq, lower, node, ref, key);
-
-       if (!seq->first_free && list_empty(&seq->subscriptions)) {
-               hlist_del_init(&seq->ns_list);
-               kfree(seq->sseqs);
-               kfree(seq);
-       }
+       nameseq_delete_empty(seq);
        return publ;
 }
 
@@ -551,7 +533,6 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
  * - if name translation is attempted and fails, sets 'destnode' to 0
  *   and returns 0
  */
-
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
 {
        struct sub_seq *sseq;
@@ -574,7 +555,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
        spin_lock_bh(&seq->lock);
        info = sseq->info;
 
-       /* Closest-First Algorithm: */
+       /* Closest-First Algorithm */
        if (likely(!*destnode)) {
                if (!list_empty(&info->node_list)) {
                        publ = list_first_entry(&info->node_list,
@@ -597,7 +578,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
                }
        }
 
-       /* Round-Robin Algorithm: */
+       /* Round-Robin Algorithm */
        else if (*destnode == tipc_own_addr) {
                if (list_empty(&info->node_list))
                        goto no_match;
@@ -638,7 +619,6 @@ not_found:
  *
  * Returns non-zero if any off-node ports overlap
  */
-
 int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
                              struct tipc_port_list *dports)
 {
@@ -682,7 +662,6 @@ exit:
 /*
  * tipc_nametbl_publish - add name publication to network name tables
  */
-
 struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                                    u32 scope, u32 port_ref, u32 key)
 {
@@ -708,7 +687,6 @@ struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
 /**
  * tipc_nametbl_withdraw - withdraw name publication from network name tables
  */
-
 int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key)
 {
        struct publication *publ;
@@ -733,7 +711,6 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key)
 /**
  * tipc_nametbl_subscribe - add a subscription object to the name table
  */
-
 void tipc_nametbl_subscribe(struct tipc_subscription *s)
 {
        u32 type = s->seq.type;
@@ -757,7 +734,6 @@ void tipc_nametbl_subscribe(struct tipc_subscription *s)
 /**
  * tipc_nametbl_unsubscribe - remove a subscription object from name table
  */
-
 void tipc_nametbl_unsubscribe(struct tipc_subscription *s)
 {
        struct name_seq *seq;
@@ -768,11 +744,7 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription *s)
                spin_lock_bh(&seq->lock);
                list_del_init(&s->nameseq_list);
                spin_unlock_bh(&seq->lock);
-               if ((seq->first_free == 0) && list_empty(&seq->subscriptions)) {
-                       hlist_del_init(&seq->ns_list);
-                       kfree(seq->sseqs);
-                       kfree(seq);
-               }
+               nameseq_delete_empty(seq);
        }
        write_unlock_bh(&tipc_nametbl_lock);
 }
@@ -781,7 +753,6 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription *s)
 /**
  * subseq_list: print specified sub-sequence contents into the given buffer
  */
-
 static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth,
                        u32 index)
 {
@@ -818,7 +789,6 @@ static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth,
 /**
  * nameseq_list: print specified name sequence contents into the given buffer
  */
-
 static void nameseq_list(struct name_seq *seq, struct print_buf *buf, u32 depth,
                         u32 type, u32 lowbound, u32 upbound, u32 index)
 {
@@ -849,7 +819,6 @@ static void nameseq_list(struct name_seq *seq, struct print_buf *buf, u32 depth,
 /**
  * nametbl_header - print name table header into the given buffer
  */
-
 static void nametbl_header(struct print_buf *buf, u32 depth)
 {
        const char *header[] = {
@@ -871,7 +840,6 @@ static void nametbl_header(struct print_buf *buf, u32 depth)
 /**
  * nametbl_list - print specified name table contents into the given buffer
  */
-
 static void nametbl_list(struct print_buf *buf, u32 depth_info,
                         u32 type, u32 lowbound, u32 upbound)
 {
@@ -970,7 +938,6 @@ void tipc_nametbl_stop(void)
                return;
 
        /* Verify name table is empty, then release it */
-
        write_lock_bh(&tipc_nametbl_lock);
        for (i = 0; i < tipc_nametbl_size; i++) {
                if (!hlist_empty(&table.types[i]))
@@ -980,4 +947,3 @@ void tipc_nametbl_stop(void)
        table.types = NULL;
        write_unlock_bh(&tipc_nametbl_lock);
 }
-