- struct page *page;
- unsigned long index = 0;
- int err = 0;
-
- ENTRY;
- CDEBUG(D_INODE, "src: ino %Ld blocks %Ld, size %Ld, dst: ino %Ld\n",
- src->o_id, src->o_blocks, src->o_size, dst->o_id);
- page = alloc_page(GFP_USER);
- if ( !page ) {
- EXIT;
- return -ENOMEM;
- }
-
- lck_page(page);
-
- while (index < ((src->o_size + PAGE_SIZE - 1) >> PAGE_SHIFT)) {
- obd_size brw_count;
-
- brw_count = PAGE_SIZE;
-
- page->index = index;
- err = OBP(src_conn->oc_dev, brw)
- (READ, src_conn, src, (char *)page_address(page),
- &brw_count, (page->index) << PAGE_SHIFT, 0);
-
- if ( err ) {
- EXIT;
- break;
- }
- CDEBUG(D_INODE, "Read page %ld ...\n", page->index);
-
- err = OBP(dst_conn->oc_dev, brw)
- (WRITE, dst_conn, dst, (char *)page_address(page),
- &brw_count, (page->index) << PAGE_SHIFT, 1);
-
- /* XXX should handle dst->o_size, dst->o_blocks here */
- if ( err ) {
- EXIT;
- break;
- }
-
- CDEBUG(D_INODE, "Wrote page %ld ...\n", page->index);
-
- index++;
- }
- dst->o_size = src->o_size;
- dst->o_blocks = src->o_blocks;
- dst->o_valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);
- UnlockPage(page);
- __free_page(page);
-
- EXIT;
- return err;
+ int i;
+
+ for (i = 0; i < obddev->obd_multi_count; i++) {
+ int rc;
+ struct obd_device *obd = class_conn2obd(&obddev->obd_multi_conn[i]);
+
+ if (!obd) {
+ CERROR("no such device [i %d]\n", i);
+ RETURN(-EINVAL);
+ }
+
+ rc = obd_disconnect(&obddev->obd_multi_conn[i]);
+ if (rc)
+ CERROR("disconnect failure %d\n", obd->obd_minor);
+ }
+ return 0;