usb: gadget: mass_storage: make "file" and "ro" read only in some cases
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / usb / gadget / f_mass_storage.c
index 7ad4f81..4f1142e 100644 (file)
@@ -2609,11 +2609,15 @@ static int fsg_main_thread(void *common_)
 
 /*************************** DEVICE ATTRIBUTES ***************************/
 
-/* Write permission is checked per LUN in store_*() functions. */
 static DEVICE_ATTR(ro, 0644, fsg_show_ro, fsg_store_ro);
 static DEVICE_ATTR(nofua, 0644, fsg_show_nofua, fsg_store_nofua);
 static DEVICE_ATTR(file, 0644, fsg_show_file, fsg_store_file);
 
+static struct device_attribute dev_attr_ro_cdrom =
+       __ATTR(ro, 0444, fsg_show_ro, NULL);
+static struct device_attribute dev_attr_file_nonremovable =
+       __ATTR(file, 0444, fsg_show_file, NULL);
+
 
 /****************************** FSG COMMON ******************************/
 
@@ -2724,10 +2728,16 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,
                        goto error_release;
                }
 
-               rc = device_create_file(&curlun->dev, &dev_attr_ro);
+               rc = device_create_file(&curlun->dev,
+                                       curlun->cdrom
+                                     ? &dev_attr_ro_cdrom
+                                     : &dev_attr_ro);
                if (rc)
                        goto error_luns;
-               rc = device_create_file(&curlun->dev, &dev_attr_file);
+               rc = device_create_file(&curlun->dev,
+                                       curlun->removable
+                                     ? &dev_attr_file
+                                     : &dev_attr_file_nonremovable);
                if (rc)
                        goto error_luns;
                rc = device_create_file(&curlun->dev, &dev_attr_nofua);
@@ -2862,8 +2872,14 @@ static void fsg_common_release(struct kref *ref)
                /* In error recovery common->nluns may be zero. */
                for (; i; --i, ++lun) {
                        device_remove_file(&lun->dev, &dev_attr_nofua);
-                       device_remove_file(&lun->dev, &dev_attr_ro);
-                       device_remove_file(&lun->dev, &dev_attr_file);
+                       device_remove_file(&lun->dev,
+                                          lun->cdrom
+                                        ? &dev_attr_ro_cdrom
+                                        : &dev_attr_ro);
+                       device_remove_file(&lun->dev,
+                                          lun->removable
+                                        ? &dev_attr_file
+                                        : &dev_attr_file_nonremovable);
                        fsg_lun_close(lun);
                        device_unregister(&lun->dev);
                }