Skip to content

Commit

Permalink
Revert "Report holes when there are only metadata changes"
Browse files Browse the repository at this point in the history
This reverts commit ec4f9b8 which introduced a narrow race which
can lead to lseek(, SEEK_DATA) incorrectly returning ENXIO.  Resolve
the issue by revering this change to restore the previous behavior
which depends solely on checking the dirty list.

Reviewed-by: Olaf Faaland <[email protected]>
Reviewed-by: Igor Kozhukhov <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #8816 
Closes #8834
  • Loading branch information
behlendorf authored May 31, 2019
1 parent 1608985 commit 2531ce3
Showing 1 changed file with 3 additions and 28 deletions.
31 changes: 3 additions & 28 deletions module/zfs/dmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -2373,39 +2373,14 @@ dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
return (err);

/*
* Check if there are dirty data blocks or frees which have not been
* synced. Dirty spill and bonus blocks which are external to the
* object can ignored when reporting holes.
* Check if dnode is dirty
*/
mutex_enter(&dn->dn_mtx);
for (i = 0; i < TXG_SIZE; i++) {
if (multilist_link_active(&dn->dn_dirty_link[i])) {

if (dn->dn_free_ranges[i] != NULL) {
clean = B_FALSE;
break;
}

list_t *list = &dn->dn_dirty_records[i];
dbuf_dirty_record_t *dr;

for (dr = list_head(list); dr != NULL;
dr = list_next(list, dr)) {
dmu_buf_impl_t *db = dr->dr_dbuf;

if (db->db_blkid == DMU_SPILL_BLKID ||
db->db_blkid == DMU_BONUS_BLKID)
continue;

clean = B_FALSE;
break;
}
}

if (clean == B_FALSE)
clean = B_FALSE;
break;
}
}
mutex_exit(&dn->dn_mtx);

/*
* If compatibility option is on, sync any current changes before
Expand Down

0 comments on commit 2531ce3

Please sign in to comment.