Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-9]: src/sys/fs/ntfs Pull up following revision(s) (requested by h...



details:   https://anonhg.NetBSD.org/src/rev/e0f1654ea3ad
branches:  netbsd-9
changeset: 963156:e0f1654ea3ad
user:      martin <martin%NetBSD.org@localhost>
date:      Mon Oct 21 20:15:02 2019 +0000

description:
Pull up following revision(s) (requested by hannken in ticket #354):

        sys/fs/ntfs/ntfs_vfsops.c: revision 1.108
        sys/fs/ntfs/ntfs_subr.c: revision 1.62

It is not possible to call vflush() from xxx_mount().
Replace with a vnode iterator and use vrecycle().

 -

When the MFT record size is lower than the cluster size we have
to read consecutive clusters to fill the MFT record.
Should fix PR kern/54598: mount ntfs panic

diffstat:

 sys/fs/ntfs/ntfs_subr.c   |  33 ++++++++++++++++++++++-----------
 sys/fs/ntfs/ntfs_vfsops.c |  13 +++++++++----
 2 files changed, 31 insertions(+), 15 deletions(-)

diffs (105 lines):

diff -r 57ded88fa0ef -r e0f1654ea3ad sys/fs/ntfs/ntfs_subr.c
--- a/sys/fs/ntfs/ntfs_subr.c   Mon Oct 21 20:13:09 2019 +0000
+++ b/sys/fs/ntfs/ntfs_subr.c   Mon Oct 21 20:15:02 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ntfs_subr.c,v 1.61 2015/03/28 19:24:05 maxv Exp $      */
+/*     $NetBSD: ntfs_subr.c,v 1.61.22.1 2019/10/21 20:15:02 martin Exp $       */
 
 /*-
  * Copyright (c) 1998, 1999 Semen Ustimenko (semenu%FreeBSD.org@localhost)
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ntfs_subr.c,v 1.61 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ntfs_subr.c,v 1.61.22.1 2019/10/21 20:15:02 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -271,6 +271,8 @@
                struct buf *bp;
                daddr_t bn;
                off_t boff;
+               size_t resid, l;
+               char *data;
 
                dprintf(("%s: read system node\n", __func__));
 
@@ -281,17 +283,26 @@
                boff = ntfs_cntob(ntmp->ntm_mftcn) +
                    ntfs_bntob(ntmp->ntm_bpmftrec) * ip->i_number;
                bn = ntfs_cntobn(ntfs_btocn(boff));
-               off = ntfs_btocnoff(boff);
+               boff = ntfs_btocnoff(boff);
+               resid = ntfs_bntob(ntmp->ntm_bpmftrec);
+               data = (char *)mfrp;
+               while (resid > 0) {
+                       l = MIN(resid, ntfs_cntob(1) - boff);
 
-               error = bread(ntmp->ntm_devvp, bn, ntfs_cntob(1),
-                   0, &bp);
-               if (error) {
-                       printf("%s: BREAD FAILED\n", __func__);
-                       goto out;
+                       error = bread(ntmp->ntm_devvp, bn, ntfs_cntob(1),
+                           0, &bp);
+                       if (error) {
+                               printf("%s: BREAD FAILED\n", __func__);
+                               goto out;
+                       }
+                       memcpy(data, (char *)bp->b_data + boff, l);
+                       bqrelse(bp);
+
+                       bn += ntfs_cntobn(1);
+                       boff = 0;
+                       data += l;
+                       resid -= l;
                }
-               memcpy(mfrp, (char *)bp->b_data + off,
-                   ntfs_bntob(ntmp->ntm_bpmftrec));
-               bqrelse(bp);
        } else {
                struct vnode   *vp;
 
diff -r 57ded88fa0ef -r e0f1654ea3ad sys/fs/ntfs/ntfs_vfsops.c
--- a/sys/fs/ntfs/ntfs_vfsops.c Mon Oct 21 20:13:09 2019 +0000
+++ b/sys/fs/ntfs/ntfs_vfsops.c Mon Oct 21 20:15:02 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ntfs_vfsops.c,v 1.107 2017/04/17 08:32:00 hannken Exp $        */
+/*     $NetBSD: ntfs_vfsops.c,v 1.107.16.1 2019/10/21 20:15:02 martin Exp $    */
 
 /*-
  * Copyright (c) 1998, 1999 Semen Ustimenko
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.107 2017/04/17 08:32:00 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.107.16.1 2019/10/21 20:15:02 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -322,6 +322,7 @@
        dev_t dev = devvp->v_rdev;
        int error, i;
        struct vnode *vp;
+       struct vnode_iterator *marker;
 
        ntmp = NULL;
 
@@ -471,9 +472,13 @@
                if (ntmp->ntm_sysvn[i])
                        vrele(ntmp->ntm_sysvn[i]);
 
-       if (vflush(mp, NULLVP, 0)) {
-               dprintf(("ntfs_mountfs: vflush failed\n"));
+       vfs_vnode_iterator_init(mp, &marker);
+       while ((vp = vfs_vnode_iterator_next(marker, NULL, NULL))) {
+               if (vrecycle(vp))
+                       continue;
+               panic("%s: cannot recycle vnode %p", __func__, vp);
        }
+       vfs_vnode_iterator_destroy(marker);
 out:
        spec_node_setmountedfs(devvp, NULL);
        if (bp)



Home | Main Index | Thread Index | Old Index