X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/61a1daa59589212608039e2734009870818bacd3..8c06c883e7b13c115d5ff207f79d4b68fccd5ad6:/lunaix-os/kernel/fs/mount.c diff --git a/lunaix-os/kernel/fs/mount.c b/lunaix-os/kernel/fs/mount.c index 38258ee..97ef359 100644 --- a/lunaix-os/kernel/fs/mount.c +++ b/lunaix-os/kernel/fs/mount.c @@ -2,9 +2,14 @@ #include #include #include +#include +#include +#include #include -static struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts }; +LOG_MODULE("fs") + +struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts }; struct v_mount* vfs_create_mount(struct v_mount* parent, struct v_dnode* mnt_point) @@ -18,12 +23,12 @@ vfs_create_mount(struct v_mount* parent, struct v_dnode* mnt_point) llist_append(&all_mnts, &mnt->list); mutex_init(&mnt->lock); - mnt_mkbusy(parent); mnt->parent = parent; mnt->mnt_point = mnt_point; mnt->super_block = mnt_point->super_block; if (parent) { + mnt_mkbusy(parent); mutex_lock(&mnt->parent->lock); llist_append(&parent->submnts, &mnt->sibmnts); mutex_unlock(&mnt->parent->lock); @@ -68,30 +73,23 @@ __vfs_do_unmount(struct v_mount* mnt) void mnt_mkbusy(struct v_mount* mnt) { - while (mnt) { - mutex_lock(&mnt->lock); - mnt->busy_counter++; - mutex_unlock(&mnt->lock); - - mnt = mnt->parent; - } + mutex_lock(&mnt->lock); + mnt->busy_counter++; + mutex_unlock(&mnt->lock); } void mnt_chillax(struct v_mount* mnt) { - while (mnt) { - mutex_lock(&mnt->lock); - mnt->busy_counter--; - mutex_unlock(&mnt->lock); - - mnt = mnt->parent; - } + mutex_lock(&mnt->lock); + mnt->busy_counter--; + mutex_unlock(&mnt->lock); } int vfs_mount_root(const char* fs_name, struct device* device) { + extern struct v_dnode* vfs_sysroot; int errno = 0; if (vfs_sysroot->mnt && (errno = vfs_unmount_at(vfs_sysroot))) { return errno; @@ -135,7 +133,11 @@ vfs_mount_at(const char* fs_name, struct v_dnode* mnt_point, int options) { - if (mnt_point->inode && !(mnt_point->inode->itype & VFS_IFDIR)) { + if (device && device->dev_type != DEV_IFVOL) { + return ENOTBLK; + } + + if (mnt_point->inode && (mnt_point->inode->itype & F_MFILE)) { return ENOTDIR; } @@ -144,11 +146,20 @@ vfs_mount_at(const char* fs_name, return ENODEV; } + if (fs->types == FSTYPE_ROFS) { + options |= MNT_RO; + } + + char* dev_name = "sys"; struct v_mount* parent_mnt = mnt_point->mnt; struct v_superblock *sb = vfs_sb_alloc(), *old_sb = mnt_point->super_block; sb->dev = device; mnt_point->super_block = sb; + if (device) { + dev_name = device->name_val; + } + int errno = 0; if (!(errno = fs->mount(sb, mnt_point))) { sb->fs = fs; @@ -159,6 +170,8 @@ vfs_mount_at(const char* fs_name, goto cleanup; } + kprintf("mount: dev=%s, fs=%s, mode=%d", dev_name, fs_name, options); + mnt_point->mnt->flags = options; } else { goto cleanup; @@ -167,6 +180,11 @@ vfs_mount_at(const char* fs_name, return errno; cleanup: + kprintf(KERROR "mount: dev=%s, fs=%s, mode=%d, err=%d", + dev_name, + fs_name, + options, + errno); mnt_point->super_block = old_sb; vfs_sb_free(sb); return errno;