+ /*
+ * Initialize the associated vnode
+ */
+ vp = ITOV(ip);
+ vp->v_type = IFTOVT(ip->i_mode);
+ if (vp->v_type == VFIFO) {
+#ifdef FIFO
+ extern struct vnodeops fifo_inodeops;
+ vp->v_op = &fifo_inodeops;
+#else
+ iput(ip);
+ *ipp = 0;
+ return (EOPNOTSUPP);
+#endif /* FIFO */
+ }
+ if (vp->v_type == VCHR || vp->v_type == VBLK) {
+ vp->v_op = &spec_inodeops;
+ if (nvp = checkalias(vp, ip->i_rdev, mntp)) {
+ /*
+ * Reinitialize aliased inode.
+ */
+ vp = nvp;
+ iq = VTOI(vp);
+ iq->i_vnode = vp;
+ iq->i_flag = 0;
+ ILOCK(iq);
+ iq->i_din = ip->i_din;
+ iq->i_dev = dev;
+ iq->i_number = ino;
+ insque(iq, ih);
+ /*
+ * Discard unneeded vnode
+ */
+ ip->i_mode = 0;
+ iput(ip);
+ ip = iq;
+ }
+ }
+ if (ino == ROOTINO)
+ vp->v_flag |= VROOT;
+ /*
+ * Finish inode initialization.
+ */
+ ip->i_fs = fs;
+ ip->i_devvp = VFSTOUFS(mntp)->um_devvp;
+ VREF(ip->i_devvp);
+ /*
+ * Set up a generation number for this inode if it does not
+ * already have one. This should only happen on old filesystems.
+ */
+ if (ip->i_gen == 0) {
+ if (++nextgennumber < (u_long)time.tv_sec)
+ nextgennumber = time.tv_sec;
+ ip->i_gen = nextgennumber;
+ if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0)
+ ip->i_flag |= IMOD;
+ }
+ *ipp = ip;
+ return (0);