#include #include #include #include #include #include #include #include static semaphore_t bootfs_sem; static struct inode *bootfs_node = NULL; extern void vfs_devlist_init(void); // __alloc_fs - allocate memory for fs, and set fs type struct fs * __alloc_fs(int type) { struct fs *fs; if ((fs = kmalloc(sizeof(struct fs))) != NULL) { fs->fs_type = type; } return fs; } // vfs_init - vfs initialize void vfs_init(void) { sem_init(&bootfs_sem, 1); vfs_devlist_init(); } // lock_bootfs - lock for bootfs static void lock_bootfs(void) { down(&bootfs_sem); } // ulock_bootfs - ulock for bootfs static void unlock_bootfs(void) { up(&bootfs_sem); } // change_bootfs - set the new fs inode static void change_bootfs(struct inode *node) { struct inode *old; lock_bootfs(); { old = bootfs_node, bootfs_node = node; } unlock_bootfs(); if (old != NULL) { vop_ref_dec(old); } } // vfs_set_bootfs - change the dir of file system int vfs_set_bootfs(char *fsname) { struct inode *node = NULL; if (fsname != NULL) { char *s; if ((s = strchr(fsname, ':')) == NULL || s[1] != '\0') { return -E_INVAL; } int ret; if ((ret = vfs_chdir(fsname)) != 0) { return ret; } if ((ret = vfs_get_curdir(&node)) != 0) { return ret; } } change_bootfs(node); return 0; } // vfs_get_bootfs - get the inode of bootfs int vfs_get_bootfs(struct inode **node_store) { struct inode *node = NULL; if (bootfs_node != NULL) { lock_bootfs(); { if ((node = bootfs_node) != NULL) { vop_ref_inc(bootfs_node); } } unlock_bootfs(); } if (node == NULL) { return -E_NOENT; } *node_store = node; return 0; }