Hello, all!

        /*
         * For i/o error checking, read the first and last level-0
         * blocks (if they are not aligned), and all the level-1 blocks.
         */
        if (dn->dn_maxblkid == 0) {
            delta = dn->dn_datablksz;
            start = (off < dn->dn_datablksz) ? 0 : 1;
            end = (off+len <= dn->dn_datablksz) ? 0 : 1;
            if (start == 0 && (off > 0 || len < dn->dn_datablksz)) {
                err = dmu_tx_check_ioerr(NULL, dn, 0, 0);
                if (err)
                    goto out;
                delta -= off;
            }
        } else {
            zio_t *zio = zio_root(dn->dn_objset->os_spa,
                NULL, NULL, ZIO_FLAG_CANFAIL);

            /* first level-0 block */
            start = off >> dn->dn_datablkshift;
            if (P2PHASE(off, dn->dn_datablksz) ||
                len < dn->dn_datablksz) {
                err = dmu_tx_check_ioerr(zio, dn, 0, start);
                if (err)
                    goto out;
            }

            /* last level-0 block */
            end = (off+len-1) >> dn->dn_datablkshift;
            if (end != start && end <= dn->dn_maxblkid &&
                P2PHASE(off+len, dn->dn_datablksz)) {
                err = dmu_tx_check_ioerr(zio, dn, 0, end);
                if (err)
                    goto out;
            }

            /* level-1 blocks */
            if (nlvls > 1) {
                int shft = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
                for (i = (start>>shft)+1; i < end>>shft; i++) {
                    err = dmu_tx_check_ioerr(zio, dn, 1, i);
                    if (err)
                        goto out;
                }
            }

            err = zio_wait(zio);
            if (err)
                goto out;
            delta = P2NPHASE(off, dn->dn_datablksz);
        }


Why should read the block from disk before starting write ?
Can't the errors be handled in the write path ?

We observe this zio can take 60ms to complete on a busy zpool,
it kills the performance.
_______________________________________________
developer mailing list
[email protected]
http://lists.open-zfs.org/mailman/listinfo/developer

Reply via email to