Module Name: src Committed By: hannken Date: Fri Oct 18 08:19:33 UTC 2019
Modified Files: src/sys/fs/ntfs: ntfs_subr.c Log Message: 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 To generate a diff of this commit: cvs rdiff -u -r1.61 -r1.62 src/sys/fs/ntfs/ntfs_subr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/ntfs/ntfs_subr.c diff -u src/sys/fs/ntfs/ntfs_subr.c:1.61 src/sys/fs/ntfs/ntfs_subr.c:1.62 --- src/sys/fs/ntfs/ntfs_subr.c:1.61 Sat Mar 28 19:24:05 2015 +++ src/sys/fs/ntfs/ntfs_subr.c Fri Oct 18 08:19:33 2019 @@ -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.62 2019/10/18 08:19:33 hannken Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko (sem...@freebsd.org) @@ -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.62 2019/10/18 08:19:33 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -271,6 +271,8 @@ ntfs_loadntnode(struct ntfsmount *ntmp, 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 @@ ntfs_loadntnode(struct ntfsmount *ntmp, 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; + } + memcpy(data, (char *)bp->b_data + boff, l); + bqrelse(bp); - error = bread(ntmp->ntm_devvp, bn, ntfs_cntob(1), - 0, &bp); - if (error) { - printf("%s: BREAD FAILED\n", __func__); - goto out; + 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;