Source-Changes-HG archive

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

[src/netbsd-7]: src/sys/dev Pull up following revision(s) (requested by hannk...



details:   https://anonhg.NetBSD.org/src/rev/5b0e836d1dde
branches:  netbsd-7
changeset: 800390:5b0e836d1dde
user:      snj <snj%NetBSD.org@localhost>
date:      Wed Jan 03 21:47:45 2018 +0000

description:
Pull up following revision(s) (requested by hannken in ticket #1549):
        sys/dev/fss.c: revision 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 ff87ae789a2c -r 5b0e836d1dde sys/dev/fss.c
--- a/sys/dev/fss.c     Wed Jan 03 21:40:28 2018 +0000
+++ b/sys/dev/fss.c     Wed Jan 03 21:47:45 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fss.c,v 1.91.2.1 2016/08/27 15:09:22 bouyer Exp $      */
+/*     $NetBSD: fss.c,v 1.91.2.2 2018/01/03 21:47:45 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.91.2.1 2016/08/27 15:09:22 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.91.2.2 2018/01/03 21:47:45 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -89,7 +89,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. */
@@ -281,20 +281,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
@@ -991,6 +997,8 @@
                todo -= len;
        }
        error = biowait(mbp);
+       if (error == 0 && mbp->b_resid != 0)
+               error = EIO;
        putiobuf(mbp);
 
        mutex_enter(&sc->sc_slock);
@@ -1012,7 +1020,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;
 
@@ -1023,7 +1031,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),
@@ -1052,7 +1060,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);
        }
@@ -1062,7 +1070,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));
@@ -1083,6 +1091,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;
@@ -1119,14 +1128,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);
@@ -1147,7 +1160,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;
 
@@ -1215,6 +1228,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;
@@ -1266,8 +1281,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