X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/2236410f4582ab45ae8c384dd6eeeef5d10aab15..1eeed1150149b63d6e49e033697454bc12b533b9:/lunaix-os/kernel/fs/mount.c diff --git a/lunaix-os/kernel/fs/mount.c b/lunaix-os/kernel/fs/mount.c index 084a400..2b996d4 100644 --- a/lunaix-os/kernel/fs/mount.c +++ b/lunaix-os/kernel/fs/mount.c @@ -33,7 +33,7 @@ vfs_create_mount(struct v_mount* parent, struct v_dnode* mnt_point) llist_append(&parent->submnts, &mnt->sibmnts); mutex_unlock(&mnt->parent->lock); } - + atomic_fetch_add(&mnt_point->ref_count, 1); return mnt; @@ -63,8 +63,10 @@ __vfs_do_unmount(struct v_mount* mnt) mnt_chillax(mnt->parent); + mnt->mnt_point->mnt = mnt->parent; + vfs_sb_free(sb); - vfs_d_free(mnt->mnt_point); + atomic_fetch_sub(&mnt->mnt_point->ref_count, 1); vfree(mnt); return errno; @@ -249,6 +251,11 @@ __DEFINE_LXSYSCALL4(int, goto done; } + if (mnt->mnt->mnt_point == mnt) { + errno = EBUSY; + goto done; + } + // By our convention. // XXX could we do better? struct device* device = NULL;