IWPM_REG_CLIENT and IWPM_PREV_REG_CLIENT are added:

IWPM_REG_CLIENT is a client, registered with the user
space port mapper daemon, available at the time of the
client register pid request.
IWPM_PREV_REG_CLIENT is a client, which has been IWPM_REG_CLIENT
before the user space port mapper daemon is stopped.
After restarting the port mapper, IWPM_PREV_REG_CLIENTs provide
their mapping info to the port mapper daemon and
they are allowed to send remove mapping requests aftewards.

Signed-off-by: Tatyana Nikolova <[email protected]>
---
 drivers/infiniband/core/iwpm_msg.c  |   13 +++++++------
 drivers/infiniband/core/iwpm_util.c |    1 +
 drivers/infiniband/core/iwpm_util.h |    3 +++
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/infiniband/core/iwpm_msg.c 
b/drivers/infiniband/core/iwpm_msg.c
index ab08170..2aca295 100644
--- a/drivers/infiniband/core/iwpm_msg.c
+++ b/drivers/infiniband/core/iwpm_msg.c
@@ -67,7 +67,9 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 
nl_client)
                err_str = "Invalid port mapper client";
                goto pid_query_error;
        }
-       if (iwpm_registered_client(nl_client))
+       if (iwpm_registered_client(nl_client) == IWPM_REG_CLIENT)
+               return 0;
+       if (iwpm_user_pid == IWPM_PID_UNAVAILABLE)
                return 0;
        skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client);
        if (!skb) {
@@ -106,7 +108,6 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 
nl_client)
        ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL);
        if (ret) {
                skb = NULL; /* skb is freed in the netlink send-op handling */
-               iwpm_set_registered(nl_client, 1);
                iwpm_user_pid = IWPM_PID_UNAVAILABLE;
                err_str = "Unable to send a nlmsg";
                goto pid_query_error;
@@ -144,7 +145,7 @@ int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 
nl_client)
                err_str = "Invalid port mapper client";
                goto add_mapping_error;
        }
-       if (!iwpm_registered_client(nl_client)) {
+       if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) {
                err_str = "Unregistered port mapper client";
                goto add_mapping_error;
        }
@@ -214,7 +215,7 @@ int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, 
u8 nl_client)
                err_str = "Invalid port mapper client";
                goto query_mapping_error;
        }
-       if (!iwpm_registered_client(nl_client)) {
+       if (iwpm_registered_client(nl_client) != IWPM_REG_CLIENT) {
                err_str = "Unregistered port mapper client";
                goto query_mapping_error;
        }
@@ -388,7 +389,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct 
netlink_callback *cb)
        pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n",
                        __func__, iwpm_user_pid);
        if (iwpm_valid_client(nl_client))
-               iwpm_set_registered(nl_client, 1);
+               iwpm_set_registered(nl_client, IWPM_REG_CLIENT);
 register_pid_response_exit:
        nlmsg_request->request_done = 1;
        /* always for found nlmsg_request */
@@ -669,7 +670,7 @@ int iwpm_mapping_info_cb(struct sk_buff *skb, struct 
netlink_callback *cb)
                                __func__, nl_client);
                return ret;
        }
-       iwpm_set_registered(nl_client, 0);
+       iwpm_set_registered(nl_client, IWPM_PREV_REG_CLIENT);
        atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq);
        if (!iwpm_mapinfo_available())
                return 0;
diff --git a/drivers/infiniband/core/iwpm_util.c 
b/drivers/infiniband/core/iwpm_util.c
index a626795..7a20a1b 100644
--- a/drivers/infiniband/core/iwpm_util.c
+++ b/drivers/infiniband/core/iwpm_util.c
@@ -106,6 +106,7 @@ int iwpm_exit(u8 nl_client)
        }
        mutex_unlock(&iwpm_admin_lock);
        iwpm_set_valid(nl_client, 0);
+       iwpm_set_registered(nl_client, 0);
        return 0;
 }
 EXPORT_SYMBOL(iwpm_exit);
diff --git a/drivers/infiniband/core/iwpm_util.h 
b/drivers/infiniband/core/iwpm_util.h
index ee2d9ff..b1dfd1a 100644
--- a/drivers/infiniband/core/iwpm_util.h
+++ b/drivers/infiniband/core/iwpm_util.h
@@ -58,6 +58,9 @@
 #define IWPM_PID_UNDEFINED     -1
 #define IWPM_PID_UNAVAILABLE   -2
 
+#define IWPM_REG_CLIENT         1
+#define IWPM_PREV_REG_CLIENT    2
+
 struct iwpm_nlmsg_request {
        struct list_head    inprocess_list;
        __u32               nlmsg_seq;
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to