On 11/26/19 4:04 PM, Jaegeuk Kim wrote:
Subject: [PATCH] loop: avoid EAGAIN, if offset or block_size are changed This patch tries to avoid EAGAIN due to nrpages!=0 that was originally trying to drop stale pages resulting in wrong data access.
Does this patch remove all code that returns EAGAIN from the code paths used for changing the offset and block size? If so, please make the commit message more affirmative.
if (lo->lo_offset != info->lo_offset || - lo->lo_sizelimit != info->lo_sizelimit) { - sync_blockdev(lo->lo_device); - kill_bdev(lo->lo_device); - } + lo->lo_sizelimit != info->lo_sizelimit) + drop_caches = true;
If the offset is changed and dirty pages are only flushed after the loop device offset has been changed, can that cause data to be written at a wrong LBA? In other words, I'd like to keep a sync_blockdev() call here.
+ /* truncate stale pages cached by previous operations */ + if (!err && drop_caches) { + sync_blockdev(lo->lo_device); + invalidate_bdev(lo->lo_device); + }
Is the invalidate_bdev() call necessary here? Thanks, Bart.