loop-util: use auto-detect open mode for loop device setup
When callers do not explicitly request read-only mode, pass open_flags as -1 (auto-detect) instead of hardcoding O_RDWR. This enables the existing O_RDWR-to-O_RDONLY retry logic in loop_device_make_by_path_at() which falls back to O_RDONLY when opening the backing device with O_RDWR fails with EROFS or similar errors. Previously, callers passed O_RDWR explicitly when read-only mode was not requested, which bypassed the retry logic entirely. This meant that inherently read-only block devices (such as CD-ROMs) would fail to open instead of gracefully falling back to read-only mode. Also propagate the unresolved open_flags through loop_device_make_by_path_at() into loop_device_make_internal() instead of resolving it to O_RDWR early. For loop_device_make_by_path_memory(), resolve to O_RDWR immediately since memfds are always writable. In mstack, switch from loop_device_make() to loop_device_make_by_path_at() with a NULL path, which reopens the O_PATH file descriptor with the appropriate access mode. This is necessary because the backing file descriptor is opened with O_PATH, which prevents loop_device_make_internal() from auto-detecting the access mode via fcntl(F_GETFL).
This commit is contained in:
committed by
Daan De Meyer
parent
da69848791
commit
614509699a
+1
-1
@@ -6483,7 +6483,7 @@ static int run(int argc, char *argv[]) {
|
||||
if (arg_userns_mode != USER_NAMESPACE_MANAGED) {
|
||||
r = loop_device_make_by_path(
|
||||
arg_image,
|
||||
arg_read_only ? O_RDONLY : O_RDWR,
|
||||
arg_read_only ? O_RDONLY : -1,
|
||||
/* sector_size= */ UINT32_MAX,
|
||||
FLAGS_SET(dissect_image_flags, DISSECT_IMAGE_NO_PARTITION_TABLE) ? 0 : LO_FLAGS_PARTSCAN,
|
||||
LOCK_SH,
|
||||
|
||||
Reference in New Issue
Block a user