feat: owloysius - dynamic init function invocator
[lunaix-os.git] / lunaix-os / kernel / fs / mount.c
index 97ef359f40351c22acb2f8937bc27f82cd3c37b0..96cc7418cec8a702573120a70b824d79fcaf89ac 100644 (file)
@@ -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;
@@ -64,7 +64,7 @@ __vfs_do_unmount(struct v_mount* mnt)
     mnt_chillax(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;
@@ -180,11 +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);
+    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;
@@ -234,12 +234,11 @@ __DEFINE_LXSYSCALL4(int,
                     int,
                     options)
 {
-    struct v_dnode *dev, *mnt;
+    struct v_dnode *dev = NULL, *mnt = NULL;
     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;
@@ -252,11 +251,14 @@ __DEFINE_LXSYSCALL4(int,
 
     // 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);