Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12ff3a51 authored by Greg Price's avatar Greg Price Committed by Theodore Ts'o
Browse files

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 a996996d
("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: default avatarGreg Price <price@mit.edu>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 18e9cea7
Loading
Loading
Loading
Loading
+18 −39
Original line number Diff line number Diff line
@@ -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;
		if (signal_pending(current))
			return -ERESTARTSYS;
	}

		count += n;
		buf += n;
		nbytes -= n;
		break;		/* This break makes the device work */
				/* like a named pipe */
	}

	return (count ? count : retval);
}

static ssize_t