forked from Minki/linux
random: simplify loop in random_read
The loop condition never changes until just before a break, so we
might as well write it as a constant. Also since a996996dd7
("random: drop weird m_time/a_time manipulation") we don't do anything
after the loop finishes, so the 'break's might as well return
directly. Some other simplifications.
There should be no change in behavior introduced by this commit.
Signed-off-by: Greg Price <price@mit.edu>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
18e9cea749
commit
12ff3a517a
@ -1285,53 +1285,32 @@ void rand_initialize_disk(struct gendisk *disk)
|
||||
static ssize_t
|
||||
random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
|
||||
{
|
||||
ssize_t n, retval = 0, count = 0;
|
||||
ssize_t n;
|
||||
|
||||
if (nbytes == 0)
|
||||
return 0;
|
||||
|
||||
while (nbytes > 0) {
|
||||
n = nbytes;
|
||||
if (n > SEC_XFER_SIZE)
|
||||
n = SEC_XFER_SIZE;
|
||||
|
||||
n = extract_entropy_user(&blocking_pool, buf, n);
|
||||
|
||||
if (n < 0) {
|
||||
retval = n;
|
||||
break;
|
||||
}
|
||||
|
||||
nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE);
|
||||
while (1) {
|
||||
n = extract_entropy_user(&blocking_pool, buf, nbytes);
|
||||
if (n < 0)
|
||||
return n;
|
||||
trace_random_read(n*8, (nbytes-n)*8,
|
||||
ENTROPY_BITS(&blocking_pool),
|
||||
ENTROPY_BITS(&input_pool));
|
||||
if (n > 0)
|
||||
return n;
|
||||
/* Pool is (near) empty. Maybe wait and retry. */
|
||||
|
||||
if (n == 0) {
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
if (file->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
|
||||
wait_event_interruptible(random_read_wait,
|
||||
ENTROPY_BITS(&input_pool) >=
|
||||
random_read_wakeup_thresh);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
count += n;
|
||||
buf += n;
|
||||
nbytes -= n;
|
||||
break; /* This break makes the device work */
|
||||
/* like a named pipe */
|
||||
wait_event_interruptible(random_read_wait,
|
||||
ENTROPY_BITS(&input_pool) >=
|
||||
random_read_wakeup_thresh);
|
||||
if (signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
||||
return (count ? count : retval);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
|
Loading…
Reference in New Issue
Block a user