Whamcloud - gitweb
LU-10114 hsm: increase upper limit of maximum HSM backends registered with MDT
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index 329965e..e785fd9 100644 (file)
@@ -800,23 +800,42 @@ static int lmv_hsm_ct_register(struct obd_device *obd, unsigned int cmd,
                               void __user *uarg)
 {
        struct lmv_obd *lmv = &obd->u.lmv;
-       struct file             *filp;
-       __u32                    i, j;
-       int                      err;
-       bool                     any_set = false;
-       struct kkuc_ct_data      kcd = {
-               .kcd_magic   = KKUC_CT_DATA_MAGIC,
-               .kcd_archive = lk->lk_data,
-       };
-       int                      rc = 0;
+       struct file *filp;
+       __u32 i, j;
+       int err;
+       bool any_set = false;
+       struct kkuc_ct_data *kcd;
+       size_t kcd_size;
+       int rc = 0;
        ENTRY;
 
        filp = fget(lk->lk_wfd);
        if (!filp)
                RETURN(-EBADF);
 
+       if (lk->lk_flags & LK_FLG_DATANR)
+               kcd_size = offsetof(struct kkuc_ct_data,
+                                   kcd_archives[lk->lk_data_count]);
+       else
+               kcd_size = sizeof(*kcd);
+
+       OBD_ALLOC(kcd, kcd_size);
+       if (kcd == NULL)
+               GOTO(err_fput, rc = -ENOMEM);
+
+       kcd->kcd_nr_archives = lk->lk_data_count;
+       if (lk->lk_flags & LK_FLG_DATANR) {
+               kcd->kcd_magic = KKUC_CT_DATA_ARRAY_MAGIC;
+               if (lk->lk_data_count > 0)
+                       memcpy(kcd->kcd_archives, lk->lk_data,
+                              sizeof(*kcd->kcd_archives) * lk->lk_data_count);
+       } else {
+               kcd->kcd_magic = KKUC_CT_DATA_BITMAP_MAGIC;
+       }
+
        rc = libcfs_kkuc_group_add(filp, &obd->obd_uuid, lk->lk_uid,
-                                  lk->lk_group, &kcd, sizeof(kcd));
+                                  lk->lk_group, kcd, kcd_size);
+       OBD_FREE(kcd, kcd_size);
        if (rc)
                GOTO(err_fput, rc);