summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/vfs.c
diff options
context:
space:
mode:
authorJack Meng <Jack.Meng@Sun.COM>2008-11-22 07:33:57 +0800
committerJack Meng <Jack.Meng@Sun.COM>2008-11-22 07:33:57 +0800
commit6cefaae1e90a413ba01560575bb3998e1a3df40e (patch)
treec749b753f1ee011412736e0a48381d6e5bb58a34 /usr/src/uts/common/fs/vfs.c
parent7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0 (diff)
downloadillumos-joyent-6cefaae1e90a413ba01560575bb3998e1a3df40e.tar.gz
PSARC 2008/427 iSCSI Boot
PSARC 2008/640 iSCSI With DHCP 6701045 iSCSI boot on x86 6713364 iscsi needs to support PSARC 2008/337 scsi-self-identifying 6422549 delay nl7c_init() call until after the root is mounted 6751246 dhcp release the lease before sync is committed on iSCSI disk 6763891 device name of the same lun is different by different discovery mode, non MPxIO 6768382 Add dependency on netowrk/physical in local-fs service
Diffstat (limited to 'usr/src/uts/common/fs/vfs.c')
-rw-r--r--usr/src/uts/common/fs/vfs.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/usr/src/uts/common/fs/vfs.c b/usr/src/uts/common/fs/vfs.c
index 30e9cf7430..bf9d325048 100644
--- a/usr/src/uts/common/fs/vfs.c
+++ b/usr/src/uts/common/fs/vfs.c
@@ -36,7 +36,6 @@
* contributors.
*/
-
#include <sys/types.h>
#include <sys/t_lock.h>
#include <sys/param.h>
@@ -84,11 +83,11 @@
#include <sys/attr.h>
#include <sys/spa.h>
#include <sys/lofi.h>
+#include <sys/bootprops.h>
#include <vm/page.h>
#include <fs/fs_subr.h>
-
/* Private interfaces to create vopstats-related data structures */
extern void initialize_vopstats(vopstats_t *);
extern vopstats_t *get_fstype_vopstats(struct vfs *, struct vfssw *);
@@ -4489,6 +4488,9 @@ vfs_root_redev(vfs_t *vfsp, dev_t ndev, int fstype)
extern int hvmboot_rootconf();
#endif /* __x86 */
+extern ib_boot_prop_t *iscsiboot_prop;
+extern void iscsi_boot_prop_free();
+
int
rootconf()
{
@@ -4496,6 +4498,7 @@ rootconf()
struct vfssw *vsw;
extern void pm_init();
char *fstyp, *fsmod;
+ int ret = -1;
getrootfs(&fstyp, &fsmod);
@@ -4533,8 +4536,31 @@ rootconf()
pm_init();
- if (netboot)
- (void) strplumb();
+ if (netboot && iscsiboot_prop) {
+ cmn_err(CE_WARN, "NFS boot and iSCSI boot"
+ " shouldn't happen in the same time");
+ return (EINVAL);
+ }
+
+ if (netboot || iscsiboot_prop)
+ ret = strplumb();
+
+ if ((ret == 0) && iscsiboot_prop) {
+ ret = modload("drv", "iscsi");
+ /* -1 indicates fail */
+ if (ret == -1) {
+ cmn_err(CE_WARN, "Failed to load iscsi module");
+ iscsi_boot_prop_free();
+ return (EINVAL);
+ } else {
+ if (!i_ddi_attach_pseudo_node("iscsi")) {
+ cmn_err(CE_WARN,
+ "Failed to attach iscsi driver");
+ iscsi_boot_prop_free();
+ return (ENODEV);
+ }
+ }
+ }
error = VFS_MOUNTROOT(rootvfs, ROOT_INIT);
vfs_unrefvfssw(vsw);