@@ -1557,17 +1557,14 @@ dbuf_read_verify_dnode_crypt(dmu_buf_impl_t *db, uint32_t flags)
1557
1557
* returning.
1558
1558
*/
1559
1559
static int
1560
- dbuf_read_impl (dmu_buf_impl_t * db , zio_t * zio , uint32_t flags ,
1560
+ dbuf_read_impl (dmu_buf_impl_t * db , dnode_t * dn , zio_t * zio , uint32_t flags ,
1561
1561
db_lock_type_t dblt , const void * tag )
1562
1562
{
1563
- dnode_t * dn ;
1564
1563
zbookmark_phys_t zb ;
1565
1564
uint32_t aflags = ARC_FLAG_NOWAIT ;
1566
1565
int err , zio_flags ;
1567
1566
blkptr_t bp , * bpp ;
1568
1567
1569
- DB_DNODE_ENTER (db );
1570
- dn = DB_DNODE (db );
1571
1568
ASSERT (!zfs_refcount_is_zero (& db -> db_holds ));
1572
1569
ASSERT (MUTEX_HELD (& db -> db_mtx ));
1573
1570
ASSERT (db -> db_state == DB_UNCACHED || db -> db_state == DB_NOFILL );
@@ -1643,8 +1640,6 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
1643
1640
if (err != 0 )
1644
1641
goto early_unlock ;
1645
1642
1646
- DB_DNODE_EXIT (db );
1647
-
1648
1643
db -> db_state = DB_READ ;
1649
1644
DTRACE_SET_STATE (db , "read issued" );
1650
1645
mutex_exit (& db -> db_mtx );
@@ -1669,12 +1664,11 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags,
1669
1664
* parent's rwlock, which would be a lock ordering violation.
1670
1665
*/
1671
1666
dmu_buf_unlock_parent (db , dblt , tag );
1672
- ( void ) arc_read (zio , db -> db_objset -> os_spa , bpp ,
1667
+ return ( arc_read (zio , db -> db_objset -> os_spa , bpp ,
1673
1668
dbuf_read_done , db , ZIO_PRIORITY_SYNC_READ , zio_flags ,
1674
- & aflags , & zb );
1675
- return ( err );
1669
+ & aflags , & zb )) ;
1670
+
1676
1671
early_unlock :
1677
- DB_DNODE_EXIT (db );
1678
1672
mutex_exit (& db -> db_mtx );
1679
1673
dmu_buf_unlock_parent (db , dblt , tag );
1680
1674
return (err );
@@ -1759,7 +1753,7 @@ dbuf_fix_old_data(dmu_buf_impl_t *db, uint64_t txg)
1759
1753
}
1760
1754
1761
1755
int
1762
- dbuf_read (dmu_buf_impl_t * db , zio_t * zio , uint32_t flags )
1756
+ dbuf_read (dmu_buf_impl_t * db , zio_t * pio , uint32_t flags )
1763
1757
{
1764
1758
int err = 0 ;
1765
1759
boolean_t prefetch ;
@@ -1775,7 +1769,7 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
1775
1769
dn = DB_DNODE (db );
1776
1770
1777
1771
prefetch = db -> db_level == 0 && db -> db_blkid != DMU_BONUS_BLKID &&
1778
- (flags & DB_RF_NOPREFETCH ) == 0 && dn != NULL ;
1772
+ (flags & DB_RF_NOPREFETCH ) == 0 ;
1779
1773
1780
1774
mutex_enter (& db -> db_mtx );
1781
1775
if (flags & DB_RF_PARTIAL_FIRST )
@@ -1822,13 +1816,13 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
1822
1816
1823
1817
db_lock_type_t dblt = dmu_buf_lock_parent (db , RW_READER , FTAG );
1824
1818
1825
- if (zio == NULL && (db -> db_state == DB_NOFILL ||
1819
+ if (pio == NULL && (db -> db_state == DB_NOFILL ||
1826
1820
(db -> db_blkptr != NULL && !BP_IS_HOLE (db -> db_blkptr )))) {
1827
1821
spa_t * spa = dn -> dn_objset -> os_spa ;
1828
- zio = zio_root (spa , NULL , NULL , ZIO_FLAG_CANFAIL );
1822
+ pio = zio_root (spa , NULL , NULL , ZIO_FLAG_CANFAIL );
1829
1823
need_wait = B_TRUE ;
1830
1824
}
1831
- err = dbuf_read_impl (db , zio , flags , dblt , FTAG );
1825
+ err = dbuf_read_impl (db , dn , pio , flags , dblt , FTAG );
1832
1826
/*
1833
1827
* dbuf_read_impl has dropped db_mtx and our parent's rwlock
1834
1828
* for us
@@ -1849,9 +1843,10 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
1849
1843
*/
1850
1844
if (need_wait ) {
1851
1845
if (err == 0 )
1852
- err = zio_wait (zio );
1846
+ err = zio_wait (pio );
1853
1847
else
1854
- VERIFY0 (zio_wait (zio ));
1848
+ (void ) zio_wait (pio );
1849
+ pio = NULL ;
1855
1850
}
1856
1851
} else {
1857
1852
/*
@@ -1878,7 +1873,7 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
1878
1873
ASSERT (db -> db_state == DB_READ ||
1879
1874
(flags & DB_RF_HAVESTRUCT ) == 0 );
1880
1875
DTRACE_PROBE2 (blocked__read , dmu_buf_impl_t * ,
1881
- db , zio_t * , zio );
1876
+ db , zio_t * , pio );
1882
1877
cv_wait (& db -> db_changed , & db -> db_mtx );
1883
1878
}
1884
1879
if (db -> db_state == DB_UNCACHED )
@@ -1887,6 +1882,13 @@ dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
1887
1882
}
1888
1883
}
1889
1884
1885
+ if (pio && err != 0 ) {
1886
+ zio_t * zio = zio_null (pio , pio -> io_spa , NULL , NULL , NULL ,
1887
+ ZIO_FLAG_CANFAIL );
1888
+ zio -> io_error = err ;
1889
+ zio_nowait (zio );
1890
+ }
1891
+
1890
1892
return (err );
1891
1893
}
1892
1894
0 commit comments