Util-Linux package development
 help / color / mirror / Atom feed
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: util-linux@vger.kernel.org
Cc: jkosina@suse.cz, kzak@redhat.com, kurt@garloff.de,
	vsementsov@virtuozzo.com, den@openvz.org, msuchanek@suse.de,
	efremov@linux.com
Subject: [PATCH 2/2] libblkid: reopen floppy without O_NONBLOCK
Date: Thu,  9 Dec 2021 15:12:33 +0100	[thread overview]
Message-ID: <20211209141233.3774937-3-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20211209141233.3774937-1-vsementsov@virtuozzo.com>

Since c7e9d0020361f4308a70cdfd6d5335e273eb8717
"Revert "floppy: reintroduce O_NDELAY fix"" commit in linux kernel,
floppy drive works bad when opened with O_NONBLOCK: first read may
fail. This cause probing fail and leave error messages in dmesg. So, if
we detect that openedfd is floppy, reopen it without O_NONBLOCK flag.

Reproduce is simple:
1. start the linux system (kernel should include the mentioned commit)
   in QEMU virtual machine with floppy device and with floppy disk
   inserted.
2. If floppy module is not inserted, modprobe it.
3. Try "blkid /dev/fd9": it will show nothing, errors will appear in
   dmesg
4. Try "mount /dev/fd0 /mnt": it may succeed (as mount not only probing
   but also try filesystems one by one, if you have vfat in
   /etc/filesytems or in /proc/filesystems, mount will succeed), but
   errors about failed read still appear in dmesg, as probing was done.

Mentioned errors in dmesg looks like this:
 floppy0: disk absent or changed during operation
 blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
 floppy0: disk absent or changed during operation
 blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
 Buffer I/O error on dev fd0, logical block 0, async page read

Note also, that these errors also appear in early dmesg messages, if
probing is done on system startup. For example, it happens when
cloud-init package is installed.

Note2: O_NONBLOCK flag for probing is used since
39f5af25982d8b0244000e92a9d0e0e6557d0e17
"libblkid: open device in nonblock mode", which was done to fix the
issue with cdrom: if tray is open and we call open() without O_NONBLOCK
the tray may be automatically closed, which is not what we want in
blkid.

Good discussion on this bug is here:
https://bugzilla.suse.com/show_bug.cgi?id=1181018

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---

Note, that this commit is done as a "minimal change", i.e. I only try to
rollback O_NONBLOCK for floppy. The other way is to detect CDROM
instead, and reopen with original flags for everything except CDROM.

I also tried fcntl instead of close/open, and that didn't help.

 libblkid/src/probe.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 70e3dc0eb..68a644597 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -94,6 +94,9 @@
 #ifdef HAVE_LINUX_CDROM_H
 #include <linux/cdrom.h>
 #endif
+#ifdef HAVE_LINUX_FD_H
+#include <linux/fd.h>
+#endif
 #ifdef HAVE_LINUX_BLKZONED_H
 #include <linux/blkzoned.h>
 #endif
@@ -200,10 +203,32 @@ blkid_probe blkid_clone_probe(blkid_probe parent)
  * 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.
+ *
+ * Still, since c7e9d0020361f4308a70cdfd6d5335e273eb8717
+ * "Revert "floppy: reintroduce O_NDELAY fix"" commit in linux kernel, floppy
+ * drive works bad when opened with O_NONBLOCK: first read may fail. This cause
+ * probing fail and leave error messages in dmesg. So, if we detect that opened
+ * fd is floppy, reopen it without O_NONBLOCK flag.
  */
 int blkid_safe_open(const char *filename, int mode)
 {
-	return open(filename, mode | O_NONBLOCK);
+	int fd = open(filename, mode | O_NONBLOCK);
+	if (fd < 0) {
+		return fd;
+	}
+
+#ifdef FDGETDRVTYP
+	{
+		char name[1000];
+
+		if (ioctl(fd, FDGETDRVTYP, &name) >= 0) {
+			close(fd);
+			fd = open(filename, mode);
+		}
+	}
+#endif /* FDGETDRVTYP */
+
+	return fd;
 }
 
 
-- 
2.31.1


  parent reply	other threads:[~2021-12-09 14:12 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-09 14:12 [PATCH 0/2] libblkid: don't use O_NONBLOCK for floppy Vladimir Sementsov-Ogievskiy
2021-12-09 14:12 ` [PATCH 1/2] libblkid: introduce blkid_safe_open Vladimir Sementsov-Ogievskiy
2021-12-09 14:12 ` Vladimir Sementsov-Ogievskiy [this message]
2021-12-14 11:45   ` [PATCH 2/2] libblkid: reopen floppy without O_NONBLOCK Michal Suchánek
2021-12-14 13:58     ` Vladimir Sementsov-Ogievskiy
2021-12-14 12:03   ` Karel Zak
2021-12-14 14:24     ` Vladimir Sementsov-Ogievskiy
2021-12-15 12:56       ` Karel Zak
2021-12-16  8:47         ` Vladimir Sementsov-Ogievskiy
2021-12-24 15:31           ` Vladimir Sementsov-Ogievskiy
2022-01-03  8:43             ` Karel Zak
2022-01-17 11:50               ` Karel Zak
2022-01-17 15:46                 ` Vladimir Sementsov-Ogievskiy
2022-01-17 16:12                   ` Karel Zak
2022-01-17 18:10                   ` Vladimir Sementsov-Ogievskiy
2022-01-20  9:14                     ` Karel Zak
2022-01-21 10:18   ` Karel Zak
2022-01-21 12:13     ` Vladimir Sementsov-Ogievskiy
2022-01-21 13:57       ` Karel Zak
2021-12-14 10:25 ` [PATCH 0/2] libblkid: don't use O_NONBLOCK for floppy Jiri Kosina
2021-12-14 10:29   ` Kurt Garloff
2021-12-14 11:46 ` Michal Suchánek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211209141233.3774937-3-vsementsov@virtuozzo.com \
    --to=vsementsov@virtuozzo.com \
    --cc=den@openvz.org \
    --cc=efremov@linux.com \
    --cc=jkosina@suse.cz \
    --cc=kurt@garloff.de \
    --cc=kzak@redhat.com \
    --cc=msuchanek@suse.de \
    --cc=util-linux@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox