aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>2013-10-15 02:33:13 -0400
committerFelipe Balbi <balbi@ti.com>2013-10-15 07:52:08 -0400
commitb8798636798ee04feb0f1bb87eec0027e3f68d98 (patch)
treee1fd22c9a2743d1d383d9ffc7dfcb7871b94c722 /drivers/usb
parent81a1d5ea6670acecf1366cd6a4d328c123bdf9fa (diff)
usb: gadget: storage_common: pass filesem to fsg_store_cdrom
If cdrom flag is set ro flag is implied. Try setting the ro first, and only if it succeeds set the cdrom flag. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Michal Nazarewicz <mina86@mina86.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/f_mass_storage.c7
-rw-r--r--drivers/usb/gadget/storage_common.c42
-rw-r--r--drivers/usb/gadget/storage_common.h3
3 files changed, 39 insertions, 13 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index 6e5a6daf1a12..6b5f45144cdf 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -3281,7 +3281,12 @@ static ssize_t fsg_lun_opts_cdrom_show(struct fsg_lun_opts *opts, char *page)
3281static ssize_t fsg_lun_opts_cdrom_store(struct fsg_lun_opts *opts, 3281static ssize_t fsg_lun_opts_cdrom_store(struct fsg_lun_opts *opts,
3282 const char *page, size_t len) 3282 const char *page, size_t len)
3283{ 3283{
3284 return fsg_store_cdrom(opts->lun, page, len); 3284 struct fsg_opts *fsg_opts;
3285
3286 fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
3287
3288 return fsg_store_cdrom(opts->lun, &fsg_opts->common->filesem, page,
3289 len);
3285} 3290}
3286 3291
3287static struct fsg_lun_opts_attribute fsg_lun_opts_cdrom = 3292static struct fsg_lun_opts_attribute fsg_lun_opts_cdrom =
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 8bd5f2d838db..ec20a1f50c2d 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -371,6 +371,23 @@ ssize_t fsg_show_removable(struct fsg_lun *curlun, char *buf)
371} 371}
372EXPORT_SYMBOL(fsg_show_removable); 372EXPORT_SYMBOL(fsg_show_removable);
373 373
374/*
375 * The caller must hold fsg->filesem for reading when calling this function.
376 */
377static ssize_t _fsg_store_ro(struct fsg_lun *curlun, bool ro)
378{
379 if (fsg_lun_is_open(curlun)) {
380 LDBG(curlun, "read-only status change prevented\n");
381 return -EBUSY;
382 }
383
384 curlun->ro = ro;
385 curlun->initially_ro = ro;
386 LDBG(curlun, "read-only status set to %d\n", curlun->ro);
387
388 return 0;
389}
390
374ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem, 391ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem,
375 const char *buf, size_t count) 392 const char *buf, size_t count)
376{ 393{
@@ -386,16 +403,11 @@ ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem,
386 * backing file is closed. 403 * backing file is closed.
387 */ 404 */
388 down_read(filesem); 405 down_read(filesem);
389 if (fsg_lun_is_open(curlun)) { 406 rc = _fsg_store_ro(curlun, ro);
390 LDBG(curlun, "read-only status change prevented\n"); 407 if (!rc)
391 rc = -EBUSY;
392 } else {
393 curlun->ro = ro;
394 curlun->initially_ro = ro;
395 LDBG(curlun, "read-only status set to %d\n", curlun->ro);
396 rc = count; 408 rc = count;
397 }
398 up_read(filesem); 409 up_read(filesem);
410
399 return rc; 411 return rc;
400} 412}
401EXPORT_SYMBOL(fsg_store_ro); 413EXPORT_SYMBOL(fsg_store_ro);
@@ -450,7 +462,8 @@ ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
450} 462}
451EXPORT_SYMBOL(fsg_store_file); 463EXPORT_SYMBOL(fsg_store_file);
452 464
453ssize_t fsg_store_cdrom(struct fsg_lun *curlun, const char *buf, size_t count) 465ssize_t fsg_store_cdrom(struct fsg_lun *curlun, struct rw_semaphore *filesem,
466 const char *buf, size_t count)
454{ 467{
455 bool cdrom; 468 bool cdrom;
456 int ret; 469 int ret;
@@ -459,9 +472,16 @@ ssize_t fsg_store_cdrom(struct fsg_lun *curlun, const char *buf, size_t count)
459 if (ret) 472 if (ret)
460 return ret; 473 return ret;
461 474
462 curlun->cdrom = cdrom; 475 down_read(filesem);
476 ret = cdrom ? _fsg_store_ro(curlun, true) : 0;
463 477
464 return count; 478 if (!ret) {
479 curlun->cdrom = cdrom;
480 ret = count;
481 }
482 up_read(filesem);
483
484 return ret;
465} 485}
466EXPORT_SYMBOL(fsg_store_cdrom); 486EXPORT_SYMBOL(fsg_store_cdrom);
467 487
diff --git a/drivers/usb/gadget/storage_common.h b/drivers/usb/gadget/storage_common.h
index e0f7aa69c7ed..c74c2fdbd56e 100644
--- a/drivers/usb/gadget/storage_common.h
+++ b/drivers/usb/gadget/storage_common.h
@@ -221,7 +221,8 @@ ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem,
221ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count); 221ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count);
222ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem, 222ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
223 const char *buf, size_t count); 223 const char *buf, size_t count);
224ssize_t fsg_store_cdrom(struct fsg_lun *curlun, const char *buf, size_t count); 224ssize_t fsg_store_cdrom(struct fsg_lun *curlun, struct rw_semaphore *filesem,
225 const char *buf, size_t count);
225ssize_t fsg_store_removable(struct fsg_lun *curlun, const char *buf, 226ssize_t fsg_store_removable(struct fsg_lun *curlun, const char *buf,
226 size_t count); 227 size_t count);
227 228