int __kinit__ devfs_init(void) { struct fs_superblock * sb; SUBSYS_DEP(ramfs_init); SUBSYS_INIT("devfs"); FS_GIANT_INIT(&devfs_fs.fs_giant); /* * Inherit ramfs and override what's needed. */ fs_inherit_vnops(&devfs_vnode_ops, &ramfs_vnode_ops); vn_devfs = fs_create_pseudofs_root(&devfs_fs, VDEV_MJNR_DEVFS); if (!vn_devfs) return -ENOMEM; /* * It's perfectly ok to set a new delete_vnode() function * as sb struct is always a fresh struct so altering it * doesn't really break functionality for anyone else than us. */ sb = vn_devfs->sb; sb->delete_vnode = devfs_delete_vnode; sb->umount = devfs_umount; /* * Finally register our creation with fs subsystem. */ fs_register(&devfs_fs); _devfs_create_specials(); return 0; }
int __kinit__ devfs_init(void) { SUBSYS_DEP(ramfs_init); SUBSYS_INIT("devfs"); /* * This must be static as it's referenced and used in the file system via * the fs object system. */ static fs_t devfs_fs = { .fsname = DEVFS_FSNAME, .mount = devfs_mount, .sblist_head = SLIST_HEAD_INITIALIZER(), }; FS_GIANT_INIT(&devfs_fs.fs_giant); /* * Inherit ramfs and override what's needed. */ fs_inherit_vnops(&devfs_vnode_ops, &ramfs_vnode_ops); vn_devfs = fs_create_pseudofs_root(&devfs_fs, VDEV_MJNR_DEVFS); if (!vn_devfs) return -ENOMEM; /* * It's perfectly ok to set a new delete_vnode() function * as sb struct is always a fresh struct so altering it * doesn't really break functionality for anyone else than us. */ struct fs_superblock * sb = vn_devfs->sb; sb->delete_vnode = devfs_delete_vnode; sb->umount = devfs_umount; /* * Finally register our creation with fs subsystem. */ fs_register(&devfs_fs); _devfs_create_specials(); return 0; }