+
+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*,
+ fstype,
+ int,
+ options)
+{
+ struct v_dnode *dev, *mnt;
+ int errno = 0;
+
+ if ((errno = vfs_walk(__current->cwd, source, &dev, NULL, 0))) {
+ goto done;
+ }
+
+ if ((errno = vfs_walk(__current->cwd, target, &mnt, NULL, 0))) {
+ goto done;
+ }
+
+ if (mnt->ref_count > 1) {
+ errno = EBUSY;
+ goto done;
+ }
+
+ // By our convention.
+ // XXX could we do better?
+ struct device* device = (struct device*)dev->data;
+
+ if (!(dev->inode->itype & VFS_IFVOLDEV) || !device) {
+ errno = ENOTDEV;
+ goto done;
+ }
+
+ errno = vfs_mount_at(fstype, device, mnt, options);
+
+done:
+ return DO_STATUS(errno);
+}
+
+__DEFINE_LXSYSCALL1(int, unmount, const char*, target)
+{
+ return vfs_unmount(target);
+}
\ No newline at end of file