diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
| -rw-r--r-- | fs/btrfs/volumes.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 464485aa7318..2ec3b8ac8fa3 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -1137,6 +1137,19 @@ static void btrfs_close_one_device(struct btrfs_device *device)  	atomic_set(&device->dev_stats_ccnt, 0);  	extent_io_tree_release(&device->alloc_state); +	/* +	 * Reset the flush error record. We might have a transient flush error +	 * in this mount, and if so we aborted the current transaction and set +	 * the fs to an error state, guaranteeing no super blocks can be further +	 * committed. However that error might be transient and if we unmount the +	 * filesystem and mount it again, we should allow the mount to succeed +	 * (btrfs_check_rw_degradable() should not fail) - if after mounting the +	 * filesystem again we still get flush errors, then we will again abort +	 * any transaction and set the error state, guaranteeing no commits of +	 * unsafe super blocks. +	 */ +	device->last_flush_error = 0; +  	/* Verify the device is back in a pristine state  */  	ASSERT(!test_bit(BTRFS_DEV_STATE_FLUSH_SENT, &device->dev_state));  	ASSERT(!test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state));  |