Commit 39f5af25982d8b0244000e92a9d0e0e6557d0e17 modified open() calls used to get fds for probing by adding O_NONBLOCK flag. We want to modify this logic in the following commit. So, as a first step create a generic wrapper on open, so blkid-related open logic live in one place. Formally blkid_safe_open() becomes recommended method to open device file for probing, as it workarounds problems of opening CDROM (and in further patch also of FLOPPY). So, it's good to make a public API function. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@xxxxxxxxxxxxx> --- libblkid/src/blkid.h.in | 2 ++ libblkid/src/evaluate.c | 2 +- libblkid/src/libblkid.sym | 4 ++++ libblkid/src/probe.c | 19 ++++++++++++++++++- libblkid/src/verify.c | 2 +- misc-utils/blkid.c | 2 +- misc-utils/wipefs.c | 2 +- 7 files changed, 28 insertions(+), 5 deletions(-) diff --git a/libblkid/src/blkid.h.in b/libblkid/src/blkid.h.in index 3cd4116d9..7ecf4f9be 100644 --- a/libblkid/src/blkid.h.in +++ b/libblkid/src/blkid.h.in @@ -217,6 +217,8 @@ extern char *blkid_evaluate_spec(const char *spec, blkid_cache *cache) __ul_attribute__((warn_unused_result)); /* probe.c */ +extern int blkid_safe_open(const char *filename, int mode) + __ul_attribute__((warn_unused_result)); extern blkid_probe blkid_new_probe(void) __ul_attribute__((warn_unused_result)); extern blkid_probe blkid_new_probe_from_filename(const char *filename) diff --git a/libblkid/src/evaluate.c b/libblkid/src/evaluate.c index 710eac956..1eefe455c 100644 --- a/libblkid/src/evaluate.c +++ b/libblkid/src/evaluate.c @@ -73,7 +73,7 @@ static int verify_tag(const char *devname, const char *name, const char *value) blkid_probe_enable_partitions(pr, TRUE); blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS); - fd = open(devname, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = blkid_safe_open(devname, O_RDONLY|O_CLOEXEC); if (fd < 0) { errsv = errno; goto done; diff --git a/libblkid/src/libblkid.sym b/libblkid/src/libblkid.sym index 366f2c0c0..1549a29f4 100644 --- a/libblkid/src/libblkid.sym +++ b/libblkid/src/libblkid.sym @@ -183,3 +183,7 @@ BLKID_2_37 { blkid_probe_set_hint; blkid_probe_reset_hints; } BLKID_2_36; + +BLKID_2_38 { + blkid_safe_open; +} BLKID_2_37; diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c index 3685ea5e1..70e3dc0eb 100644 --- a/libblkid/src/probe.c +++ b/libblkid/src/probe.c @@ -189,6 +189,23 @@ blkid_probe blkid_clone_probe(blkid_probe parent) } +/** + * blkid_safe_open + * @filename: device or regular file + * @mode: open mode + * + * This wrapper is blkid-specific wrapper on open(). It's "safe" in a meaning + * that it doesn't change + * + * We add O_NONBLOCK flag to the mode, as opening CDROM without this flag may + * load to closing the rom (if it's open), which is bad thing in context of + * blkid: we don't want to change the actual device state. + */ +int blkid_safe_open(const char *filename, int mode) +{ + return open(filename, mode | O_NONBLOCK); +} + /** * blkid_new_probe_from_filename: @@ -208,7 +225,7 @@ blkid_probe blkid_new_probe_from_filename(const char *filename) int fd; blkid_probe pr = NULL; - fd = open(filename, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = blkid_safe_open(filename, O_RDONLY|O_CLOEXEC); if (fd < 0) return NULL; diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c index 3b9754f57..96b43634c 100644 --- a/libblkid/src/verify.c +++ b/libblkid/src/verify.c @@ -126,7 +126,7 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev) } } - fd = open(dev->bid_name, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = blkid_safe_open(dev->bid_name, O_RDONLY|O_CLOEXEC); if (fd < 0) { DBG(PROBE, ul_debug("blkid_verify: error %s (%d) while " "opening %s", strerror(errno), errno, diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c index 41826e6dc..1f7be80eb 100644 --- a/misc-utils/blkid.c +++ b/misc-utils/blkid.c @@ -516,7 +516,7 @@ static int lowprobe_device(blkid_probe pr, const char *devname, int rc = 0; static int first = 1; - fd = open(devname, O_RDONLY|O_CLOEXEC|O_NONBLOCK); + fd = blkid_safe_open(devname, O_RDONLY|O_CLOEXEC); if (fd < 0) { warn(_("error: %s"), devname); return BLKID_EXIT_NOTFOUND; diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c index 78dc63ee7..2597135b5 100644 --- a/misc-utils/wipefs.c +++ b/misc-utils/wipefs.c @@ -390,7 +390,7 @@ new_probe(const char *devname, int mode) return NULL; if (mode) { - int fd = open(devname, mode | O_NONBLOCK); + int fd = blkid_safe_open(devname, mode); if (fd < 0) goto error; -- 2.31.1