+ int count, rc;
+ char *p;
+ ENTRY;
+
+ for (p = data, count = 0; p < (char *)data + len; count++) {
+ char *end;
+ int tmp = simple_strtoul(p, &end, 0);
+
+ if (p == end) {
+ CERROR("invalid device ID starting at: %s\n", p);
+ GOTO(err_disconnect, rc = -EINVAL);
+ }
+
+ if (tmp < 0 || tmp >= MAX_OBD_DEVICES) {
+ CERROR("Trying to sub dev %d - dev no too large\n",
+ tmp);
+ GOTO(err_disconnect, rc = -EINVAL);
+ }
+
+ rc = obd_connect(&obddev->obd_multi_conn[count], &obd_dev[tmp]);
+ if (rc) {
+ CERROR("cannot connect to device %d: rc = %d\n", tmp,
+ rc);
+ GOTO(err_disconnect, rc);
+ }
+
+ CDEBUG(D_INFO, "target OBD %d is of type %s\n", count,
+ obd_dev[tmp].obd_type->typ_name);
+
+ p = end + 1;
+ }
+
+ obddev->obd_multi_count = count;
+
+ RETURN(0);
+
+ err_disconnect:
+ for (count--; count >= 0; count--)
+ obd_disconnect(&obddev->obd_multi_conn[count]);
+ return rc;