All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libmount: if ENOMEDIUM and tray is open, close tray and retry
@ 2017-07-21 15:12 Stanislav Brabec
  2017-07-21 18:42 ` Stanislav Brabec
  0 siblings, 1 reply; 16+ messages in thread
From: Stanislav Brabec @ 2017-07-21 15:12 UTC (permalink / raw)
  To: util-linux

In past, d50c5917 introduced an interesting behavior: If mount was called on a
CDROM with open tray, the tray was closed and mount was retried. But the
implementation caused 15 seconds delay, so ca55a451 reverted it.

This is another attempt to implement that:
If tray is closed: No change, no delay, no retry, simply fail.
If tray is open: Close tray and retry after 3 seconds.

It can never cause delay more than time to close tray + 3 sec.

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
---
 libmount/src/context_mount.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index 65f7dbfd0..80cc2e8c8 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -18,11 +18,15 @@
 
 #include <sys/wait.h>
 #include <sys/mount.h>
+#include <linux/cdrom.h>
 
 #include "linux_version.h"
 #include "mountP.h"
 #include "strutils.h"
 
+/* open() retries when errno is ENOMEDIUM and tray is open */
+#define CRDOM_TRAYOPEN_RETRIES    5
+
 /*
  * Kernel supports only one MS_PROPAGATION flag change by one mount(2) syscall,
  * to bypass this restriction we call mount(2) per flag. It's really not a perfect
@@ -1292,6 +1296,8 @@ int mnt_context_get_mount_excode(
 	int syserr;
 	struct stat st;
 	unsigned long uflags = 0, mflags = 0;
+	int cdrom;
+	unsigned int retries = 0;
 
 	int restricted = mnt_context_is_restricted(cxt);
 	const char *tgt = mnt_context_get_target(cxt);
@@ -1399,6 +1405,7 @@ int mnt_context_get_mount_excode(
 	/*
 	 * mount(2) errors
 	 */
+mount_retry:
 	syserr = mnt_context_get_syscall_errno(cxt);
 
 
@@ -1563,6 +1570,18 @@ int mnt_context_get_mount_excode(
 		break;
 
 	case ENOMEDIUM:
+		cdrom = open(mnt_context_get_source(cxt), O_RDONLY | O_NONBLOCK);
+		if (cdrom != -1) {
+			if (retries < CRDOM_TRAYOPEN_RETRIES &&
+			    ioctl(cdrom, CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
+				ioctl(cdrom, CDROMCLOSETRAY);
+				close(cdrom);
+				sleep(3);
+				++retries;
+				goto mount_retry;
+			} else
+				close(cdrom);
+		}
 		if (uflags & MNT_MS_NOFAIL)
 			return MNT_EX_SUCCESS;
 		if (buf)
-- 
2.13.2

-- 
Best Regards / S pozdravem,

Stanislav Brabec
software developer
---------------------------------------------------------------------
SUSE LINUX, s. r. o.                         e-mail: sbrabec@suse.com
Křižíkova 148/34 (Corso IIa)                  tel: +49 911 7405384547
186 00 Praha 8-Karlín                          fax:  +420 284 084 001
Czech Republic                                    http://www.suse.cz/
PGP: 830B 40D5 9E05 35D8 5E27 6FA3 717C 209F A04F CD76

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2017-11-02 18:20 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-21 15:12 [PATCH] libmount: if ENOMEDIUM and tray is open, close tray and retry Stanislav Brabec
2017-07-21 18:42 ` Stanislav Brabec
2017-07-21 18:44   ` Stanislav Brabec
2017-07-27  8:58     ` Yuriy M. Kaminskiy
2017-07-28 15:26       ` Stanislav Brabec
2017-07-28 15:48         ` Stanislav Brabec
2017-10-02 13:00           ` Michal Suchánek
2017-10-02 13:06             ` Stanislav Brabec
2017-10-02 13:50               ` Michal Suchánek
2017-10-02 14:11                 ` Stanislav Brabec
2017-10-02 14:24                   ` Michal Suchánek
2017-10-02 14:36                   ` Michal Suchánek
2017-11-02 18:20                   ` Michal Suchánek
2017-08-01 12:16     ` Karel Zak
2017-09-05 11:04       ` Karel Zak
2017-09-05 12:53         ` Stanislav Brabec

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.