/* * Mount a filesystem. Once we've found the device, call MOUNTFUNC to * set up the filesystem and hand back a struct fs. * * The DATA argument is passed through unchanged to MOUNTFUNC. */ int vfs_mount(const char *devname, void *data, int (*mountfunc)(void *data, struct device *, struct fs **ret)) { const char *volname; struct knowndev *kd; struct fs *fs; int result; vfs_biglock_acquire(); result = findmount(devname, &kd); if (result) { vfs_biglock_release(); return result; } if (kd->kd_fs != NULL) { vfs_biglock_release(); return EBUSY; } KASSERT(kd->kd_rawname != NULL); KASSERT(kd->kd_device != NULL); result = mountfunc(data, kd->kd_device, &fs); if (result) { vfs_biglock_release(); return result; } KASSERT(fs != NULL); kd->kd_fs = fs; volname = FSOP_GETVOLNAME(fs); kprintf("vfs: Mounted %s: on %s\n", volname ? volname : kd->kd_name, kd->kd_name); vfs_biglock_release(); return 0; }
/* * Mount a filesystem. Once we've found the device, call MOUNTFUNC to * set up the filesystem and hand back a struct fs. */ int vfs_mount(const char *devname, int (*mountfunc)(struct device *dev, struct fs **fs_store)) { int ret; lock_vdev_list(); vfs_dev_t *vdev; if ((ret = find_mount(devname, &vdev)) != 0) { goto out; } if (vdev->fs != NULL) { ret = -E_BUSY; goto out; } assert(vdev->devname != NULL && vdev->mountable); struct device *dev = vop_info(vdev->devnode, device); if ((ret = mountfunc(dev, &(vdev->fs))) == 0) { assert(vdev->fs != NULL); cprintf("vfs: mount %s.\n", vdev->devname); } out: unlock_vdev_list(); return ret; }