Whamcloud - gitweb
LU-8922 lod: check master stripes properly
[fs/lustre-release.git] / lustre / obdclass / kernelcomm.c
index f9763f1..cb52660 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -102,7 +102,7 @@ struct kkuc_reg {
        struct list_head kr_chain;
        int              kr_uid;
        struct file     *kr_fp;
-       void            *kr_data;
+       char             kr_data[0];
 };
 
 static struct list_head kkuc_groups[KUC_GRP_MAX+1] = {};
@@ -115,7 +115,8 @@ static DECLARE_RWSEM(kg_sem);
  * @param group group number
  * @param data user data
  */
-int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data)
+int libcfs_kkuc_group_add(struct file *filp, int uid, int group,
+                         void *data, size_t data_len)
 {
        struct kkuc_reg *reg;
 
@@ -129,13 +130,13 @@ int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data)
                return -EBADF;
 
        /* freed in group_rem */
-       reg = kmalloc(sizeof(*reg), 0);
+       reg = kmalloc(sizeof(*reg) + data_len, 0);
        if (reg == NULL)
                return -ENOMEM;
 
        reg->kr_fp = filp;
        reg->kr_uid = uid;
-       reg->kr_data = data;
+       memcpy(reg->kr_data, data, data_len);
 
        down_write(&kg_sem);
        if (kkuc_groups[group].next == NULL)
@@ -149,7 +150,7 @@ int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data)
 }
 EXPORT_SYMBOL(libcfs_kkuc_group_add);
 
-int libcfs_kkuc_group_rem(int uid, int group, void **pdata)
+int libcfs_kkuc_group_rem(int uid, int group)
 {
        struct kkuc_reg *reg, *next;
        ENTRY;
@@ -176,8 +177,6 @@ int libcfs_kkuc_group_rem(int uid, int group, void **pdata)
                                reg->kr_uid, reg->kr_fp, group);
                        if (reg->kr_fp != NULL)
                                fput(reg->kr_fp);
-                       if (pdata != NULL)
-                               *pdata = reg->kr_data;
                        kfree(reg);
                }
        }
@@ -195,6 +194,14 @@ int libcfs_kkuc_group_put(int group, void *payload)
        ENTRY;
 
        down_write(&kg_sem);
+
+       if (unlikely(kkuc_groups[group].next == NULL) ||
+           unlikely(OBD_FAIL_CHECK(OBD_FAIL_MDS_HSM_CT_REGISTER_NET))) {
+               /* no agent have fully registered, CDT will retry */
+               up_write(&kg_sem);
+               RETURN(-EAGAIN);
+       }
+
        list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
                if (reg->kr_fp != NULL) {
                        rc = libcfs_kkuc_msg_put(reg->kr_fp, payload);