git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ld-tool portability fix: MacOS build experience
[lunaix-os.git]
/
lunaix-os
/
kernel
/
fs
/
mount.c
diff --git
a/lunaix-os/kernel/fs/mount.c
b/lunaix-os/kernel/fs/mount.c
index ca8023805fc19435d1b6c61294721e007abf3356..2b996d413c8b304dfb6e7efc71454ddbd9a8c226 100644
(file)
--- a/
lunaix-os/kernel/fs/mount.c
+++ b/
lunaix-os/kernel/fs/mount.c
@@
-3,8
+3,12
@@
#include <lunaix/mm/valloc.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
#include <lunaix/mm/valloc.h>
#include <lunaix/process.h>
#include <lunaix/spike.h>
+#include <lunaix/syscall_utils.h>
+#include <lunaix/syslog.h>
#include <lunaix/types.h>
#include <lunaix/types.h>
+LOG_MODULE("fs")
+
struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts };
struct v_mount*
struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts };
struct v_mount*
@@
-29,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);
}
llist_append(&parent->submnts, &mnt->sibmnts);
mutex_unlock(&mnt->parent->lock);
}
-
+
atomic_fetch_add(&mnt_point->ref_count, 1);
return mnt;
atomic_fetch_add(&mnt_point->ref_count, 1);
return mnt;
@@
-59,8
+63,10
@@
__vfs_do_unmount(struct v_mount* mnt)
mnt_chillax(mnt->parent);
mnt_chillax(mnt->parent);
+ mnt->mnt_point->mnt = mnt->parent;
+
vfs_sb_free(sb);
vfs_sb_free(sb);
-
vfs_d_free(mnt->mnt_point
);
+
atomic_fetch_sub(&mnt->mnt_point->ref_count, 1
);
vfree(mnt);
return errno;
vfree(mnt);
return errno;
@@
-129,7
+135,11
@@
vfs_mount_at(const char* fs_name,
struct v_dnode* mnt_point,
int options)
{
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;
}
return ENOTDIR;
}
@@
-138,11
+148,20
@@
vfs_mount_at(const char* fs_name,
return ENODEV;
}
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;
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;
int errno = 0;
if (!(errno = fs->mount(sb, mnt_point))) {
sb->fs = fs;
@@
-153,6
+172,8
@@
vfs_mount_at(const char* fs_name,
goto cleanup;
}
goto cleanup;
}
+ kprintf("mount: dev=%s, fs=%s, mode=%d", dev_name, fs_name, options);
+
mnt_point->mnt->flags = options;
} else {
goto cleanup;
mnt_point->mnt->flags = options;
} else {
goto cleanup;
@@
-161,6
+182,11
@@
vfs_mount_at(const char* fs_name,
return errno;
cleanup:
return errno;
cleanup:
+ ERROR("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;
mnt_point->super_block = old_sb;
vfs_sb_free(sb);
return errno;
@@
-210,12
+236,11
@@
__DEFINE_LXSYSCALL4(int,
int,
options)
{
int,
options)
{
- struct v_dnode *dev
, *mnt
;
+ struct v_dnode *dev
= NULL, *mnt = NULL
;
int errno = 0;
int errno = 0;
- if ((errno = vfs_walk(__current->cwd, source, &dev, NULL, 0))) {
- goto done;
- }
+ // It is fine if source is not exist, as some mounting don't require it
+ vfs_walk(__current->cwd, source, &dev, NULL, 0);
if ((errno = vfs_walk(__current->cwd, target, &mnt, NULL, 0))) {
goto done;
if ((errno = vfs_walk(__current->cwd, target, &mnt, NULL, 0))) {
goto done;
@@
-226,13
+251,21
@@
__DEFINE_LXSYSCALL4(int,
goto done;
}
goto done;
}
+ if (mnt->mnt->mnt_point == mnt) {
+ errno = EBUSY;
+ goto done;
+ }
+
// By our convention.
// XXX could we do better?
// By our convention.
// XXX could we do better?
- struct device* device =
(struct device*)dev->inode->data
;
+ struct device* device =
NULL
;
- if (!(dev->inode->itype & VFS_IFVOLDEV) || !device) {
- errno = ENOTDEV;
- goto done;
+ if (dev) {
+ if (!(dev->inode->itype & VFS_IFVOLDEV)) {
+ errno = ENOTDEV;
+ goto done;
+ }
+ device = (struct device*)dev->inode->data;
}
errno = vfs_mount_at(fstype, device, mnt, options);
}
errno = vfs_mount_at(fstype, device, mnt, options);