mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH RE-RESEND] Mass storage gadget: Handle eject request
@ 2010-04-26 10:34 fabien.chouteau
  2010-04-27 12:19 ` Chouteau Fabien
  0 siblings, 1 reply; 3+ messages in thread
From: fabien.chouteau @ 2010-04-26 10:34 UTC (permalink / raw)
  To: linux-usb
  Cc: Fabien Chouteau, David Brownell, Greg Kroah-Hartman,
	Michal Nazarewicz, Peter Korsgaard, linux-kernel

From: Fabien Chouteau <fabien.chouteau@barco.com>

This patch adds handling of the "Start/Stop Unit" SCSI request
to simulate media ejection.

Signed-off-by: Fabien Chouteau <fabien.chouteau@barco.com>
---
 drivers/usb/gadget/f_mass_storage.c |   48 ++++++++++++++++++++++++++++++++--
 1 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index f4911c0..c3e5dbb 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -163,6 +163,10 @@
  * ro setting are not allowed when the medium is loaded or if CD-ROM
  * emulation is being used.
  *
+ * When a LUN receive an "eject" SCSI request (Start/Stop Unit),
+ * if the LUN is removable, the backing file is released to simulate
+ * ejection.
+ *
  *
  * This function is heavily based on "File-backed Storage Gadget" by
  * Alan Stern which in turn is heavily based on "Gadget Zero" by David
@@ -1385,12 +1389,50 @@ static int do_mode_sense(struct fsg_common *common, struct fsg_buffhd *bh)
 
 static int do_start_stop(struct fsg_common *common)
 {
-	if (!common->curlun) {
+	struct fsg_lun	*curlun = common->curlun;
+	int		loej, start;
+
+	if (!curlun) {
 		return -EINVAL;
-	} else if (!common->curlun->removable) {
-		common->curlun->sense_data = SS_INVALID_COMMAND;
+	} else if (!curlun->removable) {
+		curlun->sense_data = SS_INVALID_COMMAND;
+		return -EINVAL;
+	}
+
+	loej = common->cmnd[4] & 0x02;
+	start = common->cmnd[4] & 0x01;
+
+	/* eject code from file_storage.c:do_start_stop() */
+
+	if ((common->cmnd[1] & ~0x01) != 0 ||	  /* Mask away Immed */
+		(common->cmnd[4] & ~0x03) != 0) { /* Mask LoEj, Start */
+		curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
 		return -EINVAL;
 	}
+
+	if (!start) {
+		/* Are we allowed to unload the media? */
+		if (curlun->prevent_medium_removal) {
+			LDBG(curlun, "unload attempt prevented\n");
+			curlun->sense_data = SS_MEDIUM_REMOVAL_PREVENTED;
+			return -EINVAL;
+		}
+		if (loej) {	/* Simulate an unload/eject */
+			up_read(&common->filesem);
+			down_write(&common->filesem);
+			fsg_lun_close(curlun);
+			up_write(&common->filesem);
+			down_read(&common->filesem);
+		}
+	} else {
+
+		/* Our emulation doesn't support mounting; the medium is
+		 * available for use as soon as it is loaded. */
+		if (!fsg_lun_is_open(curlun)) {
+			curlun->sense_data = SS_MEDIUM_NOT_PRESENT;
+			return -EINVAL;
+		}
+	}
 	return 0;
 }
 
-- 
1.7.0.5


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

* Re: [PATCH RE-RESEND] Mass storage gadget: Handle eject request
  2010-04-26 10:34 [PATCH RE-RESEND] Mass storage gadget: Handle eject request fabien.chouteau
@ 2010-04-27 12:19 ` Chouteau Fabien
  2010-04-28  7:55   ` Michał Nazarewicz
  0 siblings, 1 reply; 3+ messages in thread
From: Chouteau Fabien @ 2010-04-27 12:19 UTC (permalink / raw)
  To: linux-usb
  Cc: Fabien Chouteau, David Brownell, Greg Kroah-Hartman,
	Michal Nazarewicz, Peter Korsgaard, linux-kernel

On Mon, Apr 26, 2010 at 12:34 PM, <fabien.chouteau@gmail.com> wrote:
>
> From: Fabien Chouteau <fabien.chouteau@barco.com>
>
> This patch adds handling of the "Start/Stop Unit" SCSI request
> to simulate media ejection.

Any comments on the last version?



--
Fabien Chouteau
EPITA GISTR 2010

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

* Re: [PATCH RE-RESEND] Mass storage gadget: Handle eject request
  2010-04-27 12:19 ` Chouteau Fabien
@ 2010-04-28  7:55   ` Michał Nazarewicz
  0 siblings, 0 replies; 3+ messages in thread
From: Michał Nazarewicz @ 2010-04-28  7:55 UTC (permalink / raw)
  To: Chouteau Fabien, linux-usb
  Cc: Fabien Chouteau, David Brownell, Greg Kroah-Hartman,
	Peter Korsgaard, linux-kernel

> On Mon, Apr 26, 2010 at 12:34 PM, <fabien.chouteau@gmail.com> wrote:
>> This patch adds handling of the "Start/Stop Unit" SCSI request
>> to simulate media ejection.

On Tue, 27 Apr 2010 14:19:42 +0200, Chouteau Fabien <fabien.chouteau@gmail.com> wrote:
> Any comments on the last version?

As far as I'm concerned, it looks fine.

-- 
Best regards,                                        _     _
| Humble Liege of Serenely Enlightened Majesty of  o' \,=./ `o
| Computer Science,  Michał "mina86" Nazarewicz       (o o)
+----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--

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

end of thread, other threads:[~2010-04-28  7:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-26 10:34 [PATCH RE-RESEND] Mass storage gadget: Handle eject request fabien.chouteau
2010-04-27 12:19 ` Chouteau Fabien
2010-04-28  7:55   ` Michał Nazarewicz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®