summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Smith <brad@cvs.openbsd.org>2005-05-21 18:05:59 +0000
committerBrad Smith <brad@cvs.openbsd.org>2005-05-21 18:05:59 +0000
commit46b230207cc84bc82f0cd18d81d2c57e55ea8a4f (patch)
treebbbf59576a521b87a654fb29aa46846b63ceca14
parent404f35f676d5df1450f030d77a5f18c465333703 (diff)
- use MIN()/MAX() rather than min()/max(), to avoid possible truncation
of 64bit values to 'int' - read always single cluster of data, to avoid confusing the buffer cache; this appears to fix the random file content corruption which happens when more than one cluster is read at the same time, i.e. for files > 3*cluster_size - fix some questionable pointer arithmetics; gcc-3.4.x didn't like it - g/c redundant debug printf - remove all traces of non-working quota support add quota support to TODO - makes sense only once writing support would be implemented, and only once NTFS would support notion of file 'owner' - use 64bit local variable for free space computation From NetBSD - Comment fixes from joris@ ok millert@ joris@ pedro@
-rw-r--r--sys/ntfs/TODO3
-rw-r--r--sys/ntfs/ntfs_subr.c58
-rw-r--r--sys/ntfs/ntfs_vfsops.c10
-rw-r--r--sys/ntfs/ntfs_vnops.c25
4 files changed, 46 insertions, 50 deletions
diff --git a/sys/ntfs/TODO b/sys/ntfs/TODO
index d0909c37502..f31e318810b 100644
--- a/sys/ntfs/TODO
+++ b/sys/ntfs/TODO
@@ -1,4 +1,4 @@
-$OpenBSD: TODO,v 1.2 2003/05/20 03:23:11 mickey Exp $
+$OpenBSD: TODO,v 1.3 2005/05/21 18:05:58 brad Exp $
$NetBSD: TODO,v 1.1 2002/12/23 17:38:31 jdolecek Exp $
- convert the code to do caching in buffer cache indexed by
@@ -27,6 +27,7 @@ $NetBSD: TODO,v 1.1 2002/12/23 17:38:31 jdolecek Exp $
(from Semen Ustimenko <semenu@FreeBSD.org>)
generally, better write support
+- once writing would work, consider quota support
- support mount update
diff --git a/sys/ntfs/ntfs_subr.c b/sys/ntfs/ntfs_subr.c
index 8589f4f786a..9ee4b857d1f 100644
--- a/sys/ntfs/ntfs_subr.c
+++ b/sys/ntfs/ntfs_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ntfs_subr.c,v 1.4 2005/03/08 15:45:20 pat Exp $ */
+/* $OpenBSD: ntfs_subr.c,v 1.5 2005/05/21 18:05:58 brad Exp $ */
/* $NetBSD: ntfs_subr.c,v 1.4 2003/04/10 21:37:32 jdolecek Exp $ */
/*-
@@ -980,9 +980,6 @@ ntfs_ntlookupfile(
rdbuf = (caddr_t) malloc(blsize, M_TEMP, M_WAITOK);
- dprintf(("ntfs_ntlookupfile: blksz: %d\n", blsize, rdsize));
-
-
loop:
rdsize = vap->va_datalen;
dprintf(("ntfs_ntlookupfile: rdsz: %d\n", rdsize));
@@ -1273,7 +1270,7 @@ ntfs_ntreaddir(
if (fp->f_dirblbuf == NULL) {
fp->f_dirblsz = vap->va_a_iroot->ir_size;
fp->f_dirblbuf = (caddr_t) malloc(
- max(vap->va_datalen,fp->f_dirblsz), M_NTFSDIR, M_WAITOK);
+ MAX(vap->va_datalen,fp->f_dirblsz), M_NTFSDIR, M_WAITOK);
}
blsize = fp->f_dirblsz;
@@ -1494,7 +1491,7 @@ ntfs_filesize(
}
/*
- * This is one of write routine.
+ * This is one of the write routines.
*/
int
ntfs_writeattr_plain(
@@ -1520,7 +1517,7 @@ ntfs_writeattr_plain(
ntfs_btocn(off), &vap);
if (error)
return (error);
- towrite = min(left, ntfs_cntob(vap->va_vcnend + 1) - off);
+ towrite = MIN(left, ntfs_cntob(vap->va_vcnend + 1) - off);
ddprintf(("ntfs_writeattr_plain: o: %d, s: %d (%d - %d)\n",
(u_int32_t) off, (u_int32_t) towrite,
(u_int32_t) vap->va_vcnstart,
@@ -1549,7 +1546,7 @@ ntfs_writeattr_plain(
}
/*
- * This is one of write routine.
+ * This is one of the write routines.
*
* ntnode should be locked.
*/
@@ -1609,9 +1606,15 @@ ntfs_writentvattr_plain(
off = ntfs_btocnoff(off);
while (left && ccl) {
- tocopy = min(left,
- min(ntfs_cntob(ccl) - off, MAXBSIZE - off));
+ /*
+ * Always read and write single clusters at a time -
+ * we need to avoid requesting differently-sized
+ * blocks at the same disk offsets to avoid
+ * confusing the buffer cache.
+ */
+ tocopy = MIN(left, ntfs_cntob(1) - off);
cl = ntfs_btocl(tocopy + off);
+ KASSERT(cl == 1 && tocopy <= ntfs_cntob(1));
ddprintf(("ntfs_writentvattr_plain: write: " \
"cn: 0x%x cl: %d, off: %d len: %d, left: %d\n",
(u_int32_t) cn, (u_int32_t) cl,
@@ -1653,7 +1656,7 @@ ntfs_writentvattr_plain(
}
/*
- * This is one of read routines.
+ * This is one of the read routines.
*
* ntnode should be locked.
*/
@@ -1707,23 +1710,18 @@ ntfs_readntvattr_plain(
off = ntfs_btocnoff(off);
while (left && ccl) {
- tocopy = min(left,
- min(ntfs_cntob(ccl) - off,
- MAXBSIZE - off));
- cl = ntfs_btocl(tocopy + off);
-
/*
- * If 'off' pushes us to next
- * block, don't attempt to read whole
- * 'tocopy' at once. This is to avoid
- * bread() with varying 'size' for
- * same 'blkno', which is not good.
+ * Always read single clusters at a
+ * time - we need to avoid reading
+ * differently-sized blocks at the
+ * same disk offsets to avoid
+ * confusing the buffer cache.
*/
- if (cl > ntfs_btocl(tocopy)) {
- tocopy -=
- ntfs_btocnoff(tocopy + off);
- cl--;
- }
+ tocopy = MIN(left,
+ ntfs_cntob(1) - off);
+ cl = ntfs_btocl(tocopy + off);
+ KASSERT(cl == 1 &&
+ tocopy <= ntfs_cntob(1));
ddprintf(("ntfs_readntvattr_plain: " \
"read: cn: 0x%x cl: %d, " \
@@ -1757,7 +1755,7 @@ ntfs_readntvattr_plain(
ccl -= cl;
}
} else {
- tocopy = min(left, ntfs_cntob(ccl) - off);
+ tocopy = MIN(left, ntfs_cntob(ccl) - off);
ddprintf(("ntfs_readntvattr_plain: "
"hole: ccn: 0x%x ccl: %d, off: %d, " \
" len: %d, left: %d\n",
@@ -1819,7 +1817,7 @@ ntfs_readattr_plain(
ntfs_btocn(off), &vap);
if (error)
return (error);
- toread = min(left, ntfs_cntob(vap->va_vcnend + 1) - off);
+ toread = MIN(left, ntfs_cntob(vap->va_vcnend + 1) - off);
ddprintf(("ntfs_readattr_plain: o: %d, s: %d (%d - %d)\n",
(u_int32_t) off, (u_int32_t) toread,
(u_int32_t) vap->va_vcnstart,
@@ -1906,7 +1904,7 @@ ntfs_readattr(
if (error)
break;
- tocopy = min(left, ntfs_cntob(NTFS_COMPUNIT_CL) - off);
+ tocopy = MIN(left, ntfs_cntob(NTFS_COMPUNIT_CL) - off);
if (init == ntfs_cntob(NTFS_COMPUNIT_CL)) {
if (uio)
@@ -2031,7 +2029,7 @@ ntfs_procfixups(
return (EINVAL);
}
*cfxp = *fxp;
- ((caddr_t) cfxp) += ntmp->ntm_bps;
+ cfxp = (u_int16_t *)((caddr_t)cfxp + ntmp->ntm_bps);
}
return (0);
}
diff --git a/sys/ntfs/ntfs_vfsops.c b/sys/ntfs/ntfs_vfsops.c
index 5423e75c0d1..fb33ac2fa0a 100644
--- a/sys/ntfs/ntfs_vfsops.c
+++ b/sys/ntfs/ntfs_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ntfs_vfsops.c,v 1.8 2005/03/08 15:45:20 pat Exp $ */
+/* $OpenBSD: ntfs_vfsops.c,v 1.9 2005/05/21 18:05:58 brad Exp $ */
/* $NetBSD: ntfs_vfsops.c,v 1.7 2003/04/24 07:50:19 christos Exp $ */
/*-
@@ -819,6 +819,10 @@ ntfs_root(
return (0);
}
+/*
+ * Do operations associated with quotas, not supported
+ */
+/* ARGSUSED */
static int
ntfs_quotactl (
struct mount *mp,
@@ -827,7 +831,7 @@ ntfs_quotactl (
caddr_t arg,
struct proc *p)
{
- printf("\nntfs_quotactl():\n");
+
return EOPNOTSUPP;
}
@@ -839,7 +843,7 @@ ntfs_calccfree(
struct vnode *vp;
u_int8_t *tmp;
int j, error;
- long cfree = 0;
+ cn_t cfree = 0;
size_t bmsize, i;
vp = ntmp->ntm_sysvn[NTFS_BITMAPINO];
diff --git a/sys/ntfs/ntfs_vnops.c b/sys/ntfs/ntfs_vnops.c
index 383dfbf2fe6..fcf7b110781 100644
--- a/sys/ntfs/ntfs_vnops.c
+++ b/sys/ntfs/ntfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ntfs_vnops.c,v 1.6 2005/04/16 16:28:42 joris Exp $ */
+/* $OpenBSD: ntfs_vnops.c,v 1.7 2005/05/21 18:05:58 brad Exp $ */
/* $NetBSD: ntfs_vnops.c,v 1.6 2003/04/10 21:57:26 jdolecek Exp $ */
/*
@@ -176,7 +176,7 @@ ntfs_read(ap)
if (uio->uio_offset > fp->f_size)
toread = 0;
else
- toread = min( uio->uio_resid, fp->f_size - uio->uio_offset );
+ toread = MIN(uio->uio_resid, fp->f_size - uio->uio_offset );
dprintf((", toread: %d\n",(u_int32_t)toread));
@@ -367,7 +367,7 @@ ntfs_strategy(ap)
(u_int32_t)bp->b_lblkno));
#endif
- dprintf(("strategy: bcount: %d flags: 0x%lx\n",
+ dprintf(("strategy: bcount: %u flags: 0x%x\n",
(u_int32_t)bp->b_bcount,bp->b_flags));
if (bp->b_flags & B_READ) {
@@ -377,8 +377,8 @@ ntfs_strategy(ap)
clrbuf(bp);
error = 0;
} else {
- toread = min(bp->b_bcount,
- fp->f_size-ntfs_cntob(bp->b_blkno));
+ toread = MIN(bp->b_bcount,
+ fp->f_size - ntfs_cntob(bp->b_blkno));
dprintf(("ntfs_strategy: toread: %d, fsize: %d\n",
toread,(u_int32_t)fp->f_size));
@@ -403,8 +403,8 @@ ntfs_strategy(ap)
bp->b_error = error = EFBIG;
bp->b_flags |= B_ERROR;
} else {
- towrite = min(bp->b_bcount,
- fp->f_size-ntfs_cntob(bp->b_blkno));
+ towrite = MIN(bp->b_bcount,
+ fp->f_size - ntfs_cntob(bp->b_blkno));
dprintf(("ntfs_strategy: towrite: %d, fsize: %d\n",
towrite,(u_int32_t)fp->f_size));
@@ -449,7 +449,7 @@ ntfs_write(ap)
return (EFBIG);
}
- towrite = min(uio->uio_resid, fp->f_size - uio->uio_offset);
+ towrite = MIN(uio->uio_resid, fp->f_size - uio->uio_offset);
dprintf((", towrite: %d\n",(u_int32_t)towrite));
@@ -478,9 +478,6 @@ ntfs_access(ap)
mode_t mask, mode = ap->a_mode;
gid_t *gp;
int i;
-#if defined(__NetBSD__) && defined(QUOTA)
- int error;
-#endif
dprintf(("ntfs_access: %d\n",ip->i_number));
@@ -496,10 +493,6 @@ ntfs_access(ap)
case VREG:
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);
-#if defined(__NetBSD__) && defined(QUOTA)
- if (error = getinoquota(ip))
- return (error);
-#endif
break;
}
}
@@ -724,7 +717,7 @@ ntfs_readdir(ap)
off_t *cookiep;
#endif
- printf("ntfs_readdir: %d cookies\n",ncookies);
+ dprintf("ntfs_readdir: %d cookies\n",ncookies);
if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1)
panic("ntfs_readdir: unexpected uio from NFS server");
dpStart = (struct dirent *)