diff options
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/file.c | 46 |
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, char tbuf[128]; int width; - if (file->f_flags & O_NONBLOCK) { - if (spufs_switch_log_used(ctx) == 0) { + if (spufs_switch_log_used(ctx) == 0) { + if (cnt > 0) { + /* If there's data ready to go, we can + * just return straight away */ + break; + + } else if (file->f_flags & O_NONBLOCK) { error = -EAGAIN; break; + + } else { + /* spufs_wait will drop the mutex and + * re-acquire, but since we're in read(), the + * file cannot be _released (and so + * ctx->switch_log is stable). + */ + error = spufs_wait(ctx->switch_log->wait, + spufs_switch_log_used(ctx) > 0); + + /* On error, spufs_wait returns without the + * state mutex held */ + if (error) + return error; + + /* We may have had entries read from underneath + * us while we dropped the mutex in spufs_wait, + * so re-check */ + if (spufs_switch_log_used(ctx) == 0) + continue; } - } else { - /* spufs_wait will drop the mutex and re-acquire, - * but since we're in read(), the file cannot be - * _released (and so ctx->switch_log is stable). - */ - error = spufs_wait(ctx->switch_log->wait, - spufs_switch_log_used(ctx) > 0); - - /* On error, spufs_wait returns without the - * state mutex held */ - if (error) - return error; } - /* We may have had entries read from underneath us while we - * dropped the mutex in spufs_wait, so re-check */ - if (ctx->switch_log->head == ctx->switch_log->tail) - continue; - width = switch_log_sprint(ctx, tbuf, sizeof(tbuf)); if (width < len) ctx->switch_log->tail = |