Hi,

adapted from msdosfs code + fixed one typo in debug printing. Tested on amd64.

-- 
Antti Harri


Index: sys/ntfs/ntfs_vfsops.c
===================================================================
RCS file: /OpenBSD/src/sys/ntfs/ntfs_vfsops.c,v
retrieving revision 1.24
diff -u -r1.24 ntfs_vfsops.c
--- sys/ntfs/ntfs_vfsops.c      21 Dec 2010 20:14:43 -0000      1.24
+++ sys/ntfs/ntfs_vfsops.c      9 Mar 2011 19:15:01 -0000
@@ -37,6 +37,7 @@
 #include <sys/vnode.h>
 #include <sys/mount.h>
 #include <sys/buf.h>
+#include <sys/disk.h>
 #include <sys/fcntl.h>
 #include <sys/malloc.h>
 #include <sys/systm.h>
@@ -167,6 +168,7 @@
        struct ntfs_args args;
        size_t size;
        mode_t amode;
+       char *fspec = NULL;
 
        /*
         ***
@@ -204,7 +206,13 @@
         * Not an update, or updating the name: look up the name
         * and verify that it refers to a sensible block device.
         */
-       NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, p);
+       fspec = malloc(MNAMELEN, M_MOUNT, M_WAITOK);
+       err = copyinstr(args.fspec, fspec, MNAMELEN - 1, &size);
+       if (err)
+               goto error_1;
+       disk_map(fspec, fspec, MNAMELEN, DM_OPENBLCK);
+
+       NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, p);
        err = namei(ndp);
        if (err) {
                /* can't get devvp!*/
@@ -273,8 +281,8 @@
                (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1,
                           &size);
                bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size);
-               (void) copyinstr(args.fspec, mp->mnt_stat.f_mntfromname, 
-                          MNAMELEN - 1, &size);
+
+               size = strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN - 1);
                bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
                bcopy(&args, &mp->mnt_stat.mount_info.ntfs_args, sizeof(args));
                if ( !err) {
@@ -304,6 +312,9 @@
 error_1:       /* no state to back out*/
 
 success:
+       if (fspec)
+               free(fspec, M_MOUNT);
+
        return(err);
 }
 
@@ -572,7 +583,7 @@
        /* free the toupper table, if this has been last mounted ntfs volume */
        ntfs_toupper_unuse(p);
 
-       dprintf(("ntfs_umount: freeing memory...\n"));
+       dprintf(("ntfs_unmount: freeing memory...\n"));
        mp->mnt_data = NULL;
        mp->mnt_flag &= ~MNT_LOCAL;
        free(ntmp->ntm_ad, M_NTFSMNT);

Reply via email to