fuse: fuse_flush must check mapping->flags for errors
Subsystems (2)
PATCH v2 1/1 fuse: fuse_flush must check mapping->flags for errors
fuse_flush() calls write_inode_now() that triggers writeback, but actual writeback will happen later, on fuse_sync_writes(). If an error happens, fuse_writepage_end() will set error bit in mapping->flags. So, we have to check mapping->flags after fuse_sync_writes().
Changed in v2:
- fixed silly type: check must be *after* fuse_sync_writes()
--- fs/fuse/file.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/fuse/file.c +9 -0
@@ -417,6 +417,15 @@ static int fuse_flush(struct file *file, fl_owner_t id)fuse_sync_writes (inode);inode_unlock (inode); +if (test_bit (AS_ENOSPC , &file->f_mapping->flags) && +test_and_clear_bit (AS_ENOSPC , &file->f_mapping->flags)) + err = -ENOSPC ; +if (test_bit (AS_EIO , &file->f_mapping->flags) && +test_and_clear_bit (AS_EIO , &file->f_mapping->flags)) + err = -EIO ; +if (err) +return err; + req =fuse_get_req_nofail_nopages (fc, file);memset (&inarg,0 ,sizeof (inarg)); inarg.fh = ff->fh;
Quoted 7 lines · Maxim Patlasov
fuse_flush()callswrite_inode_now()that triggers writeback, but actual writeback will happen later, onfuse_sync_writes(). If an error happens,fuse_writepage_end()will set error bit inmapping->flags. So, we have to checkmapping->flagsafterfuse_sync_writes().Changed in v2:
- fixed silly type: check must be *after*fuse_sync_writes()
I applied both with a cleanup patch at the end to use the filemap_check_errors() helper, which does exactly this.
Thanks,
Miklos