{
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,
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);
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;
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;
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))
}
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) {