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
This commit is contained in:
parent
5bde8f1cdb
commit
62dd7866ca
@ -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 (semenu@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 ntnode *ip)
|
||||
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, struct ntnode *ip)
|
||||
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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user