Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-6]: src/sys/dev Pull up following revision(s) (requested by hannk...
details: https://anonhg.NetBSD.org/src/rev/c6d74385973d
branches: netbsd-6
changeset: 777294:c6d74385973d
user: snj <snj%NetBSD.org@localhost>
date: Tue Mar 13 16:38:28 2018 +0000
description:
Pull up following revision(s) (requested by hannken in ticket #1516):
sys/dev/fss.c: 1.101-1.103
Bounds check against media size for non-persistent snapshots.
--
Treat partial read from backing store as I/O error.
--
Pass residual back to b_resid for persistent snapshots.
diffstat:
sys/dev/fss.c | 53 ++++++++++++++++++++++++++++++++++-------------------
1 files changed, 34 insertions(+), 19 deletions(-)
diffs (164 lines):
diff -r 051fc35bcc89 -r c6d74385973d sys/dev/fss.c
--- a/sys/dev/fss.c Sat Mar 03 20:50:38 2018 +0000
+++ b/sys/dev/fss.c Tue Mar 13 16:38:28 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fss.c,v 1.81.4.4 2016/08/27 14:47:47 bouyer Exp $ */
+/* $NetBSD: fss.c,v 1.81.4.5 2018/03/13 16:38:28 snj Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.81.4.4 2016/08/27 14:47:47 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.81.4.5 2018/03/13 16:38:28 snj Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -90,7 +90,7 @@
static int fss_read_cluster(struct fss_softc *, u_int32_t);
static void fss_bs_thread(void *);
static int fss_bs_io(struct fss_softc *, fss_io_type,
- u_int32_t, off_t, int, void *);
+ u_int32_t, off_t, int, void *, size_t *);
static u_int32_t *fss_bs_indir(struct fss_softc *, u_int32_t);
static kmutex_t fss_device_lock; /* Protect all units. */
@@ -266,20 +266,26 @@
mutex_enter(&sc->sc_slock);
if (write || !FSS_ISVALID(sc)) {
-
- mutex_exit(&sc->sc_slock);
-
bp->b_error = (write ? EROFS : ENXIO);
- bp->b_resid = bp->b_bcount;
- biodone(bp);
- return;
+ goto done;
}
+ /* Check bounds for non-persistent snapshots. */
+ if ((sc->sc_flags & FSS_PERSISTENT) == 0 &&
+ bounds_check_with_mediasize(bp, DEV_BSIZE,
+ btodb(FSS_CLTOB(sc, sc->sc_clcount - 1) + sc->sc_clresid)) <= 0)
+ goto done;
bp->b_rawblkno = bp->b_blkno;
bufq_put(sc->sc_bufq, bp);
cv_signal(&sc->sc_work_cv);
mutex_exit(&sc->sc_slock);
+ return;
+
+done:
+ mutex_exit(&sc->sc_slock);
+ bp->b_resid = bp->b_bcount;
+ biodone(bp);
}
int
@@ -993,6 +999,8 @@
todo -= len;
}
error = biowait(mbp);
+ if (error == 0 && mbp->b_resid != 0)
+ error = EIO;
putiobuf(mbp);
mutex_enter(&sc->sc_slock);
@@ -1014,7 +1022,7 @@
*/
static int
fss_bs_io(struct fss_softc *sc, fss_io_type rw,
- u_int32_t cl, off_t off, int len, void *data)
+ u_int32_t cl, off_t off, int len, void *data, size_t *resid)
{
int error;
@@ -1025,7 +1033,7 @@
error = vn_rdwr((rw == FSS_READ ? UIO_READ : UIO_WRITE), sc->sc_bs_vp,
data, len, off, UIO_SYSSPACE,
IO_ADV_ENCODE(POSIX_FADV_NOREUSE) | IO_NODELOCKED,
- sc->sc_bs_lwp->l_cred, NULL, NULL);
+ sc->sc_bs_lwp->l_cred, resid, NULL);
if (error == 0) {
mutex_enter(sc->sc_bs_vp->v_interlock);
error = VOP_PUTPAGES(sc->sc_bs_vp, trunc_page(off),
@@ -1054,7 +1062,7 @@
if (sc->sc_indir_dirty) {
if (fss_bs_io(sc, FSS_WRITE, sc->sc_indir_cur, 0,
- FSS_CLSIZE(sc), (void *)sc->sc_indir_data) != 0)
+ FSS_CLSIZE(sc), (void *)sc->sc_indir_data, NULL) != 0)
return NULL;
setbit(sc->sc_indir_valid, sc->sc_indir_cur);
}
@@ -1064,7 +1072,7 @@
if (isset(sc->sc_indir_valid, sc->sc_indir_cur)) {
if (fss_bs_io(sc, FSS_READ, sc->sc_indir_cur, 0,
- FSS_CLSIZE(sc), (void *)sc->sc_indir_data) != 0)
+ FSS_CLSIZE(sc), (void *)sc->sc_indir_data, NULL) != 0)
return NULL;
} else
memset(sc->sc_indir_data, 0, FSS_CLSIZE(sc));
@@ -1085,6 +1093,7 @@
long off;
char *addr;
u_int32_t c, cl, ch, *indirp;
+ size_t resid;
struct buf *bp, *nbp;
struct fss_softc *sc;
struct fss_cache *scp, *scl;
@@ -1121,14 +1130,18 @@
disk_busy(sc->sc_dkdev);
error = fss_bs_io(sc, FSS_READ, 0,
dbtob(bp->b_blkno), bp->b_bcount,
- bp->b_data);
+ bp->b_data, &resid);
+ if (error)
+ resid = bp->b_bcount;
disk_unbusy(sc->sc_dkdev,
(error ? 0 : bp->b_bcount), is_read);
- } else
+ } else {
error = ENXIO;
+ resid = bp->b_bcount;
+ }
bp->b_error = error;
- bp->b_resid = (error ? bp->b_bcount : 0);
+ bp->b_resid = resid;
biodone(bp);
mutex_enter(&sc->sc_slock);
@@ -1149,7 +1162,7 @@
indirp = fss_bs_indir(sc, scp->fc_cluster);
if (indirp != NULL) {
error = fss_bs_io(sc, FSS_WRITE, sc->sc_clnext,
- 0, FSS_CLSIZE(sc), scp->fc_data);
+ 0, FSS_CLSIZE(sc), scp->fc_data, NULL);
} else
error = EIO;
@@ -1217,6 +1230,8 @@
bdev_strategy(nbp);
error = biowait(nbp);
+ if (error == 0 && nbp->b_resid != 0)
+ error = EIO;
if (error != 0) {
bp->b_resid = bp->b_bcount;
bp->b_error = nbp->b_error;
@@ -1268,8 +1283,8 @@
/*
* Read from backing store.
*/
- error =
- fss_bs_io(sc, FSS_READ, *indirp, off, len, addr);
+ error = fss_bs_io(sc, FSS_READ,
+ *indirp, off, len, addr, NULL);
mutex_enter(&sc->sc_slock);
if (error) {
Home |
Main Index |
Thread Index |
Old Index