mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
zonefs fixes for 6.2-rc5
* A single patch to fix sync write operations to detect and handle errors due to external zone corruptions resulting in writes at invalid location, from me. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSRPv8tYSvhwAzJdzjdoc3SxdoYdgUCY8ifmAAKCRDdoc3SxdoY dqkXAP4tHVH3mrgtLsne2GsnjEuIl/fhZHf2J6kNDIMaflmoNgEAkWWNku9rn0OQ sqGZRiMFRrrCSrGas9zy1O/0t26ILQY= =MuX5 -----END PGP SIGNATURE----- Merge tag 'zonefs-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs Pull zonefs fix from Damien Le Moal: - A single patch to fix sync write operations to detect and handle errors due to external zone corruptions resulting in writes at invalid location, from me. * tag 'zonefs-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/zonefs: zonefs: Detect append writes at invalid locations
This commit is contained in:
commit
081edded9b
@ -442,6 +442,10 @@ static int zonefs_io_error_cb(struct blk_zone *zone, unsigned int idx,
|
||||
data_size = zonefs_check_zone_condition(inode, zone,
|
||||
false, false);
|
||||
}
|
||||
} else if (sbi->s_mount_opts & ZONEFS_MNTOPT_ERRORS_RO &&
|
||||
data_size > isize) {
|
||||
/* Do not expose garbage data */
|
||||
data_size = isize;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -805,6 +809,24 @@ static ssize_t zonefs_file_dio_append(struct kiocb *iocb, struct iov_iter *from)
|
||||
|
||||
ret = submit_bio_wait(bio);
|
||||
|
||||
/*
|
||||
* If the file zone was written underneath the file system, the zone
|
||||
* write pointer may not be where we expect it to be, but the zone
|
||||
* append write can still succeed. So check manually that we wrote where
|
||||
* we intended to, that is, at zi->i_wpoffset.
|
||||
*/
|
||||
if (!ret) {
|
||||
sector_t wpsector =
|
||||
zi->i_zsector + (zi->i_wpoffset >> SECTOR_SHIFT);
|
||||
|
||||
if (bio->bi_iter.bi_sector != wpsector) {
|
||||
zonefs_warn(inode->i_sb,
|
||||
"Corrupted write pointer %llu for zone at %llu\n",
|
||||
wpsector, zi->i_zsector);
|
||||
ret = -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
zonefs_file_write_dio_end_io(iocb, size, ret, 0);
|
||||
trace_zonefs_file_dio_append(inode, size, ret);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user