feat: mount point flags check
[lunaix-os.git] / lunaix-os / kernel / fs / mount.c
index aa4acef20254d94cda3b2646d5392ec7c5078be6..7b83757e91b26740ac43426bbda421934a226750 100644 (file)
@@ -1,3 +1,4 @@
+#include <lunaix/foptions.h>
 #include <lunaix/fs.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/process.h>
 #include <lunaix/fs.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/process.h>
@@ -95,18 +96,21 @@ vfs_mount_root(const char* fs_name, struct device* device)
     if (vfs_sysroot->mnt && (errno = vfs_unmount_at(vfs_sysroot))) {
         return errno;
     }
     if (vfs_sysroot->mnt && (errno = vfs_unmount_at(vfs_sysroot))) {
         return errno;
     }
-    return vfs_mount_at(fs_name, device, vfs_sysroot);
+    return vfs_mount_at(fs_name, device, vfs_sysroot, 0);
 }
 
 int
 }
 
 int
-vfs_mount(const char* target, const char* fs_name, struct device* device)
+vfs_mount(const char* target,
+          const char* fs_name,
+          struct device* device,
+          int options)
 {
     int errno;
     struct v_dnode* mnt;
 
     if (!(errno =
             vfs_walk(__current->cwd, target, &mnt, NULL, VFS_WALK_MKPARENT))) {
 {
     int errno;
     struct v_dnode* mnt;
 
     if (!(errno =
             vfs_walk(__current->cwd, target, &mnt, NULL, VFS_WALK_MKPARENT))) {
-        errno = vfs_mount_at(fs_name, device, mnt);
+        errno = vfs_mount_at(fs_name, device, mnt, options);
     }
 
     return errno;
     }
 
     return errno;
@@ -128,7 +132,8 @@ vfs_unmount(const char* target)
 int
 vfs_mount_at(const char* fs_name,
              struct device* device,
 int
 vfs_mount_at(const char* fs_name,
              struct device* device,
-             struct v_dnode* mnt_point)
+             struct v_dnode* mnt_point,
+             int options)
 {
     if (mnt_point->inode && !(mnt_point->inode->itype & VFS_IFDIR)) {
         return ENOTDIR;
 {
     if (mnt_point->inode && !(mnt_point->inode->itype & VFS_IFDIR)) {
         return ENOTDIR;
@@ -153,6 +158,8 @@ vfs_mount_at(const char* fs_name,
             errno = ENOMEM;
             goto cleanup;
         }
             errno = ENOMEM;
             goto cleanup;
         }
+
+        mnt_point->mnt->flags = options;
     } else {
         goto cleanup;
     }
     } else {
         goto cleanup;
     }
@@ -188,14 +195,25 @@ vfs_unmount_at(struct v_dnode* mnt_point)
     return errno;
 }
 
     return errno;
 }
 
-__DEFINE_LXSYSCALL3(int,
+int
+vfs_check_writable(struct v_dnode* dnode)
+{
+    if ((dnode->mnt->flags & MNT_RO)) {
+        return EROFS;
+    }
+    return 0;
+}
+
+__DEFINE_LXSYSCALL4(int,
                     mount,
                     const char*,
                     source,
                     const char*,
                     target,
                     const char*,
                     mount,
                     const char*,
                     source,
                     const char*,
                     target,
                     const char*,
-                    fstype)
+                    fstype,
+                    int,
+                    options)
 {
     struct v_dnode *dev, *mnt;
     int errno = 0;
 {
     struct v_dnode *dev, *mnt;
     int errno = 0;
@@ -222,7 +240,7 @@ __DEFINE_LXSYSCALL3(int,
         goto done;
     }
 
         goto done;
     }
 
-    errno = vfs_mount_at(fstype, device, mnt);
+    errno = vfs_mount_at(fstype, device, mnt, options);
 
 done:
     return DO_STATUS(errno);
 
 done:
     return DO_STATUS(errno);