Whamcloud - gitweb
LU-1303 lod: transfer default striping from parent/fs
[fs/lustre-release.git] / lustre / ptlrpc / target.c
index 9791941..d0e99de 100644 (file)
@@ -527,7 +527,8 @@ void lut_cb_last_committed(struct lu_env *env, struct thandle *th,
 
         ccb = container_of0(cb, struct lut_last_committed_callback, llcc_cb);
 
-        LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_lut->lut_obd);
+       LASSERT(ccb->llcc_lut != NULL);
+       LASSERT(ccb->llcc_exp->exp_obd == ccb->llcc_lut->lut_obd);
 
         cfs_spin_lock(&ccb->llcc_lut->lut_translock);
         if (ccb->llcc_transno > ccb->llcc_lut->lut_obd->obd_last_committed)
@@ -545,32 +546,41 @@ void lut_cb_last_committed(struct lu_env *env, struct thandle *th,
         if (ccb->llcc_transno)
                 CDEBUG(D_HA, "%s: transno "LPD64" is committed\n",
                        ccb->llcc_lut->lut_obd->obd_name, ccb->llcc_transno);
-        cfs_list_del(&ccb->llcc_cb.dcb_linkage);
         OBD_FREE_PTR(ccb);
 }
 
 int lut_last_commit_cb_add(struct thandle *th, struct lu_target *lut,
                            struct obd_export *exp, __u64 transno)
 {
-        struct lut_last_committed_callback *ccb;
-        int rc;
+       struct lut_last_committed_callback *ccb;
+       struct dt_txn_commit_cb            *dcb;
+       int                                rc;
 
-        OBD_ALLOC_PTR(ccb);
-        if (ccb == NULL)
-                return -ENOMEM;
+       OBD_ALLOC_PTR(ccb);
+       if (ccb == NULL)
+               return -ENOMEM;
 
-        ccb->llcc_cb.dcb_func = lut_cb_last_committed;
-        CFS_INIT_LIST_HEAD(&ccb->llcc_cb.dcb_linkage);
-        ccb->llcc_lut = lut;
-        ccb->llcc_exp = class_export_cb_get(exp);
-        ccb->llcc_transno = transno;
+       ccb->llcc_lut     = lut;
+       ccb->llcc_exp     = class_export_cb_get(exp);
+       ccb->llcc_transno = transno;
 
-        rc = dt_trans_cb_add(th, &ccb->llcc_cb);
-        if (rc) {
-                class_export_cb_put(exp);
-                OBD_FREE_PTR(ccb);
-        }
-        return rc;
+       dcb            = &ccb->llcc_cb;
+       dcb->dcb_func  = lut_cb_last_committed;
+       CFS_INIT_LIST_HEAD(&dcb->dcb_linkage);
+       strncpy(dcb->dcb_name, "lut_cb_last_committed", MAX_COMMIT_CB_STR_LEN);
+       dcb->dcb_name[MAX_COMMIT_CB_STR_LEN - 1] = '\0';
+
+       rc = dt_trans_cb_add(th, dcb);
+       if (rc) {
+               class_export_cb_put(exp);
+               OBD_FREE_PTR(ccb);
+       }
+
+       if ((exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0)
+               /* report failure to force synchronous operation */
+               return -EPERM;
+
+       return rc;
 }
 EXPORT_SYMBOL(lut_last_commit_cb_add);
 
@@ -597,29 +607,33 @@ void lut_cb_new_client(struct lu_env *env, struct thandle *th,
         cfs_spin_unlock(&ccb->lncc_exp->exp_lock);
         class_export_cb_put(ccb->lncc_exp);
 
-        cfs_list_del(&ccb->lncc_cb.dcb_linkage);
         OBD_FREE_PTR(ccb);
 }
 
 int lut_new_client_cb_add(struct thandle *th, struct obd_export *exp)
 {
-        struct lut_new_client_callback *ccb;
-        int rc;
+       struct lut_new_client_callback *ccb;
+       struct dt_txn_commit_cb        *dcb;
+       int                            rc;
 
-        OBD_ALLOC_PTR(ccb);
-        if (ccb == NULL)
-                return -ENOMEM;
+       OBD_ALLOC_PTR(ccb);
+       if (ccb == NULL)
+               return -ENOMEM;
 
-        ccb->lncc_cb.dcb_func = lut_cb_new_client;
-        CFS_INIT_LIST_HEAD(&ccb->lncc_cb.dcb_linkage);
-        ccb->lncc_exp = class_export_cb_get(exp);
+       ccb->lncc_exp  = class_export_cb_get(exp);
 
-        rc = dt_trans_cb_add(th, &ccb->lncc_cb);
-        if (rc) {
-                class_export_cb_put(exp);
-                OBD_FREE_PTR(ccb);
-        }
-        return rc;
+       dcb            = &ccb->lncc_cb;
+       dcb->dcb_func  = lut_cb_new_client;
+       CFS_INIT_LIST_HEAD(&dcb->dcb_linkage);
+       strncpy(dcb->dcb_name, "lut_cb_new_client", MAX_COMMIT_CB_STR_LEN);
+       dcb->dcb_name[MAX_COMMIT_CB_STR_LEN - 1] = '\0';
+
+       rc = dt_trans_cb_add(th, dcb);
+       if (rc) {
+               class_export_cb_put(exp);
+               OBD_FREE_PTR(ccb);
+       }
+       return rc;
 }
 
 /**
@@ -640,6 +654,11 @@ int lut_client_new(const struct lu_env *env, struct obd_export *exp)
        if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid))
                RETURN(0);
 
+       cfs_mutex_init(&ted->ted_lcd_lock);
+
+       if ((exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0)
+               RETURN(0);
+
        /* the bitmap operations can handle cl_idx > sizeof(long) * 8, so
         * there's no need for extra complication here
         */
@@ -664,8 +683,6 @@ repeat:
        ted->ted_lr_off = tg->lut_lsd.lsd_client_start +
                          idx * tg->lut_lsd.lsd_client_size;
 
-       cfs_mutex_init(&ted->ted_lcd_lock);
-
        LASSERTF(ted->ted_lr_off > 0, "ted_lr_off = %llu\n", ted->ted_lr_off);
 
        CDEBUG(D_INFO, "%s: new client at index %d (%llu) with UUID '%s'\n",
@@ -702,7 +719,8 @@ int lut_client_add(const struct lu_env *env,  struct obd_export *exp, int idx)
        LASSERT(tg->lut_client_bitmap != NULL);
        LASSERTF(idx >= 0, "%d\n", idx);
 
-       if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid))
+       if (!strcmp(ted->ted_lcd->lcd_uuid, tg->lut_obd->obd_uuid.uuid) ||
+           (exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0)
                RETURN(0);
 
        if (cfs_test_and_set_bit(idx, tg->lut_client_bitmap)) {
@@ -738,7 +756,8 @@ int lut_client_del(const struct lu_env *env, struct obd_export *exp)
 
        /* XXX if lcd_uuid were a real obd_uuid, I could use obd_uuid_equals */
        if (!strcmp((char *)ted->ted_lcd->lcd_uuid,
-                   (char *)tg->lut_obd->obd_uuid.uuid))
+                   (char *)tg->lut_obd->obd_uuid.uuid) ||
+           (exp->exp_connect_flags & OBD_CONNECT_LIGHTWEIGHT) != 0)
                RETURN(0);
 
        CDEBUG(D_INFO, "%s: del client at idx %u, off %lld, UUID '%s'\n",