diff options
author | Andrzej Pietrasiewicz <andrzej.p@samsung.com> | 2013-10-15 02:33:13 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-10-15 07:52:08 -0400 |
commit | b8798636798ee04feb0f1bb87eec0027e3f68d98 (patch) | |
tree | e1fd22c9a2743d1d383d9ffc7dfcb7871b94c722 /drivers/usb | |
parent | 81a1d5ea6670acecf1366cd6a4d328c123bdf9fa (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.c | 7 | ||||
-rw-r--r-- | drivers/usb/gadget/storage_common.c | 42 | ||||
-rw-r--r-- | drivers/usb/gadget/storage_common.h | 3 |
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) | |||
3281 | static ssize_t fsg_lun_opts_cdrom_store(struct fsg_lun_opts *opts, | 3281 | static 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 | ||
3287 | static struct fsg_lun_opts_attribute fsg_lun_opts_cdrom = | 3292 | static 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 | } |
372 | EXPORT_SYMBOL(fsg_show_removable); | 372 | EXPORT_SYMBOL(fsg_show_removable); |
373 | 373 | ||
374 | /* | ||
375 | * The caller must hold fsg->filesem for reading when calling this function. | ||
376 | */ | ||
377 | static 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 | |||
374 | ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem, | 391 | ssize_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 | } |
401 | EXPORT_SYMBOL(fsg_store_ro); | 413 | EXPORT_SYMBOL(fsg_store_ro); |
@@ -450,7 +462,8 @@ ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem, | |||
450 | } | 462 | } |
451 | EXPORT_SYMBOL(fsg_store_file); | 463 | EXPORT_SYMBOL(fsg_store_file); |
452 | 464 | ||
453 | ssize_t fsg_store_cdrom(struct fsg_lun *curlun, const char *buf, size_t count) | 465 | ssize_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 | } |
466 | EXPORT_SYMBOL(fsg_store_cdrom); | 486 | EXPORT_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, | |||
221 | ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count); | 221 | ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count); |
222 | ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem, | 222 | ssize_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); |
224 | ssize_t fsg_store_cdrom(struct fsg_lun *curlun, const char *buf, size_t count); | 224 | ssize_t fsg_store_cdrom(struct fsg_lun *curlun, struct rw_semaphore *filesem, |
225 | const char *buf, size_t count); | ||
225 | ssize_t fsg_store_removable(struct fsg_lun *curlun, const char *buf, | 226 | ssize_t fsg_store_removable(struct fsg_lun *curlun, const char *buf, |
226 | size_t count); | 227 | size_t count); |
227 | 228 | ||