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__ procfs_init(void) { SUBSYS_DEP(ramfs_init); SUBSYS_INIT("procfs"); /* * This must be static as it's referenced and used in the file system via * the fs object system. */ static fs_t procfs_fs = { .fsname = PROCFS_FSNAME, .mount = procfs_mount, .sblist_head = SLIST_HEAD_INITIALIZER(), }; specinfo_pool = mempool_init(MEMPOOL_TYPE_NONBLOCKING, sizeof(struct procfs_info), configMAXPROC); if (!specinfo_pool) return -ENOMEM; FS_GIANT_INIT(&procfs_fs.fs_giant); /* * Inherit unimplemented vnops from ramfs. */ fs_inherit_vnops(&procfs_vnode_ops, &ramfs_vnode_ops); vn_procfs = fs_create_pseudofs_root(&procfs_fs, VDEV_MJNR_PROCFS); if (!vn_procfs) return -ENOMEM; struct fs_superblock * sb = vn_procfs->sb; sb->delete_vnode = procfs_delete_vnode; vn_procfs->sb->umount = procfs_umount; fs_register(&procfs_fs); int err = init_permanent_files(); if (err) return err; procfs_updatedir(vn_procfs); 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; }
int __kinit__ fatfs_init(void) { int err; SUBSYS_DEP(fs_init); SUBSYS_DEP(proc_init); SUBSYS_INIT("fatfs"); fatfs_sb_arr = kcalloc(configFATFS_MAX_MOUNTS, sizeof(struct fatfs_sb *)); if (!fatfs_sb_arr) return -ENOMEM; fs_inherit_vnops(&fatfs_vnode_ops, &nofs_vnode_ops); err = ff_init(); if (err) return err; FS_GIANT_INIT(&fatfs_fs.fs_giant); fs_register(&fatfs_fs); return 0; }