random: Add a urandom_read_nowait() for random APIs that don't warn
authorAndy Lutomirski <luto@kernel.org>
Mon, 23 Dec 2019 08:20:45 +0000 (00:20 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 7 Jan 2020 21:07:00 +0000 (16:07 -0500)
/dev/random and getrandom() never warn.  Split the meat of
urandom_read() into urandom_read_nowarn() and leave the warning code
in urandom_read().

This has no effect on kernel behavior, but it makes subsequent
patches more straightforward.  It also makes the fact that
getrandom() never warns more obvious.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Link: https://lore.kernel.org/r/c87ab200588de746431d9f916501ef11e5242b13.1577088521.git.luto@kernel.org
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
drivers/char/random.c

index 502e37141c728f9b599addd2be58e56f0a2c8e44..91954c0091a51c7c14f63266447dd0b74f5cebdc 100644 (file)
@@ -2019,12 +2019,23 @@ random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
        return _random_read(file->f_flags & O_NONBLOCK, buf, nbytes);
 }
 
+static ssize_t
+urandom_read_nowarn(struct file *file, char __user *buf, size_t nbytes,
+                   loff_t *ppos)
+{
+       int ret;
+
+       nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
+       ret = extract_crng_user(buf, nbytes);
+       trace_urandom_read(8 * nbytes, 0, ENTROPY_BITS(&input_pool));
+       return ret;
+}
+
 static ssize_t
 urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
 {
        unsigned long flags;
        static int maxwarn = 10;
-       int ret;
 
        if (!crng_ready() && maxwarn > 0) {
                maxwarn--;
@@ -2036,10 +2047,8 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
                crng_init_cnt = 0;
                spin_unlock_irqrestore(&primary_crng.lock, flags);
        }
-       nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
-       ret = extract_crng_user(buf, nbytes);
-       trace_urandom_read(8 * nbytes, 0, ENTROPY_BITS(&input_pool));
-       return ret;
+
+       return urandom_read_nowarn(file, buf, nbytes, ppos);
 }
 
 static __poll_t
@@ -2201,7 +2210,7 @@ SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
                if (unlikely(ret))
                        return ret;
        }
-       return urandom_read(NULL, buf, count, NULL);
+       return urandom_read_nowarn(NULL, buf, count, NULL);
 }
 
 /********************************************************************