4469 vfs_root_redev(vfs_t *vfsp, dev_t ndev, int fstype)
4470 {
4471         vfs_list_lock();
4472 
4473         vfs_hash_remove(vfsp);
4474 
4475         vfsp->vfs_dev = ndev;
4476         vfs_make_fsid(&vfsp->vfs_fsid, ndev, fstype);
4477 
4478         vfs_hash_add(vfsp, 1);
4479 
4480         vfs_list_unlock();
4481 }
4482 
4483 #else /* x86 NEWBOOT */
4484 
4485 #if defined(__x86)
4486 extern int hvmboot_rootconf();
4487 #endif /* __x86 */
4488 
4489 extern ib_boot_prop_t *iscsiboot_prop;
4490 
4491 int
4492 rootconf()
4493 {
4494         int error;
4495         struct vfssw *vsw;
4496         extern void pm_init();
4497         char *fstyp, *fsmod;
4498         int ret = -1;
4499 
4500         getrootfs(&fstyp, &fsmod);
4501 
4502 #if defined(__x86)
4503         /*
4504          * hvmboot_rootconf() is defined in the hvm_bootstrap misc module,
4505          * which lives in /platform/i86hvm, and hence is only available when
4506          * booted in an x86 hvm environment.  If the hvm_bootstrap misc module
4507          * is not available then the modstub for this function will return 0.
4508          * If the hvm_bootstrap misc module is available it will be loaded
 
4511         if (error = hvmboot_rootconf())
4512                 return (error);
4513 #endif /* __x86 */
4514 
4515         if (error = clboot_rootconf())
4516                 return (error);
4517 
4518         if (modload("fs", fsmod) == -1)
4519                 panic("Cannot _init %s module", fsmod);
4520 
4521         RLOCK_VFSSW();
4522         vsw = vfs_getvfsswbyname(fstyp);
4523         RUNLOCK_VFSSW();
4524         if (vsw == NULL) {
4525                 cmn_err(CE_CONT, "Cannot find %s filesystem\n", fstyp);
4526                 return (ENXIO);
4527         }
4528         VFS_INIT(rootvfs, &vsw->vsw_vfsops, 0);
4529         VFS_HOLD(rootvfs);
4530 
4531         /* always mount readonly first */
4532         rootvfs->vfs_flag |= VFS_RDONLY;
4533 
4534         pm_init();
4535 
4536         if (netboot && iscsiboot_prop) {
4537                 cmn_err(CE_WARN, "NFS boot and iSCSI boot"
4538                     " shouldn't happen in the same time");
4539                 return (EINVAL);
4540         }
4541 
4542         if (netboot || iscsiboot_prop) {
4543                 ret = strplumb();
4544                 if (ret != 0) {
4545                         cmn_err(CE_WARN, "Cannot plumb network device %d", ret);
4546                         return (EFAULT);
4547                 }
4548         }
4549 
4550         if ((ret == 0) && iscsiboot_prop) {
4551                 ret = modload("drv", "iscsi");
4552                 /* -1 indicates fail */
4553                 if (ret == -1) {
4554                         cmn_err(CE_WARN, "Failed to load iscsi module");
4555                         iscsi_boot_prop_free();
4556                         return (EINVAL);
4557                 } else {
4558                         if (!i_ddi_attach_pseudo_node("iscsi")) {
4559                                 cmn_err(CE_WARN,
4560                                     "Failed to attach iscsi driver");
4561                                 iscsi_boot_prop_free();
4562                                 return (ENODEV);
4563                         }
4564                 }
4565         }
4566 
4567         error = VFS_MOUNTROOT(rootvfs, ROOT_INIT);
4568         vfs_unrefvfssw(vsw);
4569         rootdev = rootvfs->vfs_dev;
4570 
4571         if (error)
4572                 cmn_err(CE_CONT, "Cannot mount root on %s fstype %s\n",
4573                     rootfs.bo_name, fstyp);
4574         else
4575                 cmn_err(CE_CONT, "?root on %s fstype %s\n",
4576                     rootfs.bo_name, fstyp);
4577         return (error);
4578 }
4579 
4580 /*
4581  * XXX this is called by nfs only and should probably be removed
4582  * If booted with ASKNAME, prompt on the console for a filesystem
4583  * name and return it.
4584  */
4585 void
4586 getfsname(char *askfor, char *name, size_t namelen)
4587 {
4588         if (boothowto & RB_ASKNAME) {
4589                 printf("%s name: ", askfor);
4590                 console_gets(name, namelen);
4591         }
 
 | 
 
 
4469 vfs_root_redev(vfs_t *vfsp, dev_t ndev, int fstype)
4470 {
4471         vfs_list_lock();
4472 
4473         vfs_hash_remove(vfsp);
4474 
4475         vfsp->vfs_dev = ndev;
4476         vfs_make_fsid(&vfsp->vfs_fsid, ndev, fstype);
4477 
4478         vfs_hash_add(vfsp, 1);
4479 
4480         vfs_list_unlock();
4481 }
4482 
4483 #else /* x86 NEWBOOT */
4484 
4485 #if defined(__x86)
4486 extern int hvmboot_rootconf();
4487 #endif /* __x86 */
4488 
4489 extern char *aoepath_prop;
4490 extern ib_boot_prop_t *iscsiboot_prop;
4491 
4492 int
4493 rootconf()
4494 {
4495         int error;
4496         struct vfssw *vsw;
4497         extern void pm_init();
4498         char *fstyp, *fsmod;
4499         int ret = -1;
4500 
4501         getrootfs(&fstyp, &fsmod);
4502 
4503 #if defined(__x86)
4504         /*
4505          * hvmboot_rootconf() is defined in the hvm_bootstrap misc module,
4506          * which lives in /platform/i86hvm, and hence is only available when
4507          * booted in an x86 hvm environment.  If the hvm_bootstrap misc module
4508          * is not available then the modstub for this function will return 0.
4509          * If the hvm_bootstrap misc module is available it will be loaded
 
4512         if (error = hvmboot_rootconf())
4513                 return (error);
4514 #endif /* __x86 */
4515 
4516         if (error = clboot_rootconf())
4517                 return (error);
4518 
4519         if (modload("fs", fsmod) == -1)
4520                 panic("Cannot _init %s module", fsmod);
4521 
4522         RLOCK_VFSSW();
4523         vsw = vfs_getvfsswbyname(fstyp);
4524         RUNLOCK_VFSSW();
4525         if (vsw == NULL) {
4526                 cmn_err(CE_CONT, "Cannot find %s filesystem\n", fstyp);
4527                 return (ENXIO);
4528         }
4529         VFS_INIT(rootvfs, &vsw->vsw_vfsops, 0);
4530         VFS_HOLD(rootvfs);
4531 
4532         /* Always mount readonly first */
4533         rootvfs->vfs_flag |= VFS_RDONLY;
4534 
4535         pm_init();
4536 
4537         if ((aoepath_prop != NULL && (iscsiboot_prop != NULL || netboot)) ||
4538             (iscsiboot_prop != NULL && (aoepath_prop != NULL || netboot)) ||
4539             (netboot && (aoepath_prop != NULL || iscsiboot_prop != NULL))) {
4540                 cmn_err(CE_WARN, "Only one of AoE, iSCSI or NFS boot "
4541                     "can be specified at time");
4542                 return (EINVAL);
4543         }
4544 
4545         if (aoepath_prop != NULL || iscsiboot_prop != NULL || netboot) {
4546                 ret = strplumb();
4547                 if (ret != 0) {
4548                         cmn_err(CE_WARN, "Cannot plumb network device %d", ret);
4549                         return (EFAULT);
4550                 }
4551         }
4552 
4553         if (aoepath_prop != NULL) {
4554                 if (modload("drv", "aoe") == -1 ||
4555                     modload("drv", "aoeblk") == -1) {
4556                         cmn_err(CE_WARN, "Failed to load aoe modules");
4557                         return (EINVAL);
4558                 }
4559                 if (i_ddi_attach_pseudo_node("aoe") == 0) {
4560                         cmn_err(CE_WARN, "Failed to attach aoe driver");
4561                         return (ENODEV);
4562                 }
4563         }
4564 
4565         if (iscsiboot_prop != NULL) {
4566                 if (modload("drv", "iscsi") == -1) {
4567                         cmn_err(CE_WARN, "Failed to load iscsi module");
4568                         iscsi_boot_prop_free();
4569                         return (EINVAL);
4570                 }
4571                 if (i_ddi_attach_pseudo_node("iscsi") == 0) {
4572                         cmn_err(CE_WARN, "Failed to attach iscsi driver");
4573                         iscsi_boot_prop_free();
4574                         return (ENODEV);
4575                 }
4576         }
4577 
4578         error = VFS_MOUNTROOT(rootvfs, ROOT_INIT);
4579         vfs_unrefvfssw(vsw);
4580         rootdev = rootvfs->vfs_dev;
4581 
4582         if (error != 0)
4583                 cmn_err(CE_CONT, "Cannot mount root on %s fstype %s\n",
4584                     rootfs.bo_name, fstyp);
4585         else
4586                 cmn_err(CE_CONT, "?root on %s fstype %s\n",
4587                     rootfs.bo_name, fstyp);
4588         return (error);
4589 }
4590 
4591 /*
4592  * XXX this is called by nfs only and should probably be removed
4593  * If booted with ASKNAME, prompt on the console for a filesystem
4594  * name and return it.
4595  */
4596 void
4597 getfsname(char *askfor, char *name, size_t namelen)
4598 {
4599         if (boothowto & RB_ASKNAME) {
4600                 printf("%s name: ", askfor);
4601                 console_gets(name, namelen);
4602         }
 
 |