diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 90233f4f3601..ee712a5715e7 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -3138,7 +3138,9 @@ static ssize_t show_ro(struct device *dev, struct device_attribute *attr, char *
 {
 	struct fsg_lun	*curlun = fsg_lun_from_dev(dev);
 
-	return sprintf(buf, "%d\n", curlun->ro);
+	return sprintf(buf, "%d\n", fsg_lun_is_open(curlun)
+				  ? curlun->ro
+				  : curlun->initially_ro);
 }
 
 static ssize_t show_file(struct device *dev, struct device_attribute *attr,
@@ -3188,6 +3190,7 @@ static ssize_t store_ro(struct device *dev, struct device_attribute *attr,
 		rc = -EBUSY;
 	} else {
 		curlun->ro = !!i;
+		curlun->initially_ro = !!i;
 		LDBG(curlun, "read-only status set to %d\n", curlun->ro);
 	}
 	up_read(&fsg->filesem);
@@ -3433,9 +3436,10 @@ static int __init fsg_bind(struct usb_gadget *gadget)
 
 	for (i = 0; i < fsg->nluns; ++i) {
 		curlun = &fsg->luns[i];
-		curlun->ro = mod_data.ro[i];
-		if (mod_data.cdrom)
-			curlun->ro = 1;
+		curlun->cdrom = !!mod_data.cdrom;
+		curlun->ro = mod_data.cdrom || mod_data.ro[i];
+		curlun->initially_ro = curlun->ro;
+		curlun->removable = mod_data.removable;
 		curlun->dev.release = lun_release;
 		curlun->dev.parent = &gadget->dev;
 		curlun->dev.driver = &fsg_driver.driver;
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 19bf1e330dd0..affd23b5436f 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -225,7 +225,10 @@ struct fsg_lun {
 	loff_t		file_length;
 	loff_t		num_sectors;
 
+	unsigned int	initially_ro : 1;
 	unsigned int	ro : 1;
+	unsigned int	removable : 1;
+	unsigned int	cdrom : 1;
 	unsigned int	prevent_medium_removal : 1;
 	unsigned int	registered : 1;
 	unsigned int	info_valid : 1;
@@ -478,7 +481,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 	loff_t				min_sectors;
 
 	/* R/W if we can, R/O if we must */
-	ro = curlun->ro;
+	ro = curlun->initially_ro;
 	if (!ro) {
 		filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0);
 		if (-EROFS == PTR_ERR(filp))
@@ -521,7 +524,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 	}
 	num_sectors = size >> 9;	// File size in 512-byte blocks
 	min_sectors = 1;
-	if (mod_data.cdrom) {
+	if (curlun->cdrom) {
 		num_sectors &= ~3;	// Reduce to a multiple of 2048
 		min_sectors = 300*4;	// Smallest track is 300 frames
 		if (num_sectors >= 256*60*75*4) {