aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/platforms/cell/spufs/file.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c
index adb5abb9af5d..f139cd8b594d 100644
--- a/arch/powerpc/platforms/cell/spufs/file.c
+++ b/arch/powerpc/platforms/cell/spufs/file.c
@@ -2503,30 +2503,38 @@ static ssize_t spufs_switch_log_read(struct file *file, char __user *buf,
2503 char tbuf[128]; 2503 char tbuf[128];
2504 int width; 2504 int width;
2505 2505
2506 if (file->f_flags & O_NONBLOCK) { 2506 if (spufs_switch_log_used(ctx) == 0) {
2507 if (spufs_switch_log_used(ctx) == 0) { 2507 if (cnt > 0) {
2508 /* If there's data ready to go, we can
2509 * just return straight away */
2510 break;
2511
2512 } else if (file->f_flags & O_NONBLOCK) {
2508 error = -EAGAIN; 2513 error = -EAGAIN;
2509 break; 2514 break;
2515
2516 } else {
2517 /* spufs_wait will drop the mutex and
2518 * re-acquire, but since we're in read(), the
2519 * file cannot be _released (and so
2520 * ctx->switch_log is stable).
2521 */
2522 error = spufs_wait(ctx->switch_log->wait,
2523 spufs_switch_log_used(ctx) > 0);
2524
2525 /* On error, spufs_wait returns without the
2526 * state mutex held */
2527 if (error)
2528 return error;
2529
2530 /* We may have had entries read from underneath
2531 * us while we dropped the mutex in spufs_wait,
2532 * so re-check */
2533 if (spufs_switch_log_used(ctx) == 0)
2534 continue;
2510 } 2535 }
2511 } else {
2512 /* spufs_wait will drop the mutex and re-acquire,
2513 * but since we're in read(), the file cannot be
2514 * _released (and so ctx->switch_log is stable).
2515 */
2516 error = spufs_wait(ctx->switch_log->wait,
2517 spufs_switch_log_used(ctx) > 0);
2518
2519 /* On error, spufs_wait returns without the
2520 * state mutex held */
2521 if (error)
2522 return error;
2523 } 2536 }
2524 2537
2525 /* We may have had entries read from underneath us while we
2526 * dropped the mutex in spufs_wait, so re-check */
2527 if (ctx->switch_log->head == ctx->switch_log->tail)
2528 continue;
2529
2530 width = switch_log_sprint(ctx, tbuf, sizeof(tbuf)); 2538 width = switch_log_sprint(ctx, tbuf, sizeof(tbuf));
2531 if (width < len) 2539 if (width < len)
2532 ctx->switch_log->tail = 2540 ctx->switch_log->tail =