Hi Corentin, [auto build test ERROR on char-misc/char-misc-testing] [also build test ERROR on v4.9-rc8 next-20161209] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Corentin-Labbe/hwrng-core-do-not-use-multiple-blank-lines/20161210-072632 config: i386-randconfig-x007-201649 (attached as .config) compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901 reproduce: # save the attached .config to linux build tree make ARCH=i386 All error/warnings (new ones prefixed by >>): In file included from include/linux/linkage.h:4:0, from include/linux/kernel.h:6, from include/linux/delay.h:10, from drivers/char/hw_random/core.c:13: drivers/char/hw_random/core.c: In function 'rng_dev_open': >> drivers/char/hw_random/core.c:169:11: error: dereferencing pointer to incomplete type 'struct file' if ((filp->f_mode & FMODE_READ) == 0) ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^~~~ >> drivers/char/hw_random/core.c:169:2: note: in expansion of macro 'if' if ((filp->f_mode & FMODE_READ) == 0) ^~ >> drivers/char/hw_random/core.c:169:22: error: 'FMODE_READ' undeclared (first use in this function) if ((filp->f_mode & FMODE_READ) == 0) ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^~~~ >> drivers/char/hw_random/core.c:169:2: note: in expansion of macro 'if' if ((filp->f_mode & FMODE_READ) == 0) ^~ drivers/char/hw_random/core.c:169:22: note: each undeclared identifier is reported only once for each function it appears in if ((filp->f_mode & FMODE_READ) == 0) ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^~~~ >> drivers/char/hw_random/core.c:169:2: note: in expansion of macro 'if' if ((filp->f_mode & FMODE_READ) == 0) ^~ >> drivers/char/hw_random/core.c:171:21: error: 'FMODE_WRITE' undeclared (first use in this function) if (filp->f_mode & FMODE_WRITE) ^ include/linux/compiler.h:149:30: note: in definition of macro '__trace_if' if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ ^~~~ drivers/char/hw_random/core.c:171:2: note: in expansion of macro 'if' if (filp->f_mode & FMODE_WRITE) ^~ drivers/char/hw_random/core.c: In function 'rng_dev_read': >> drivers/char/hw_random/core.c:221:23: error: 'O_NONBLOCK' undeclared (first use in this function) !(filp->f_flags & O_NONBLOCK)); ^~~~~~~~~~ drivers/char/hw_random/core.c: At top level: >> drivers/char/hw_random/core.c:272:21: error: variable 'rng_chrdev_ops' has initializer but incomplete type static const struct file_operations rng_chrdev_ops = { ^~~~~~~~~~~~~~~ >> drivers/char/hw_random/core.c:273:2: error: unknown field 'owner' specified in initializer .owner = THIS_MODULE, ^ In file included from include/linux/linkage.h:6:0, from include/linux/kernel.h:6, from include/linux/delay.h:10, from drivers/char/hw_random/core.c:13: include/linux/export.h:37:21: warning: excess elements in struct initializer #define THIS_MODULE ((struct module *)0) ^ >> drivers/char/hw_random/core.c:273:12: note: in expansion of macro 'THIS_MODULE' .owner = THIS_MODULE, ^~~~~~~~~~~ include/linux/export.h:37:21: note: (near initialization for 'rng_chrdev_ops') #define THIS_MODULE ((struct module *)0) ^ >> drivers/char/hw_random/core.c:273:12: note: in expansion of macro 'THIS_MODULE' .owner = THIS_MODULE, ^~~~~~~~~~~ >> drivers/char/hw_random/core.c:274:2: error: unknown field 'open' specified in initializer .open = rng_dev_open, ^ >> drivers/char/hw_random/core.c:274:11: warning: excess elements in struct initializer .open = rng_dev_open, ^~~~~~~~~~~~ drivers/char/hw_random/core.c:274:11: note: (near initialization for 'rng_chrdev_ops') >> drivers/char/hw_random/core.c:275:2: error: unknown field 'read' specified in initializer .read = rng_dev_read, ^ drivers/char/hw_random/core.c:275:11: warning: excess elements in struct initializer .read = rng_dev_read, ^~~~~~~~~~~~ drivers/char/hw_random/core.c:275:11: note: (near initialization for 'rng_chrdev_ops') >> drivers/char/hw_random/core.c:276:2: error: unknown field 'llseek' specified in initializer .llseek = noop_llseek, ^ >> drivers/char/hw_random/core.c:276:13: error: 'noop_llseek' undeclared here (not in a function) .llseek = noop_llseek, ^~~~~~~~~~~ drivers/char/hw_random/core.c:276:13: warning: excess elements in struct initializer drivers/char/hw_random/core.c:276:13: note: (near initialization for 'rng_chrdev_ops') >> drivers/char/hw_random/core.c:272:37: error: storage size of 'rng_chrdev_ops' isn't known static const struct file_operations rng_chrdev_ops = { ^~~~~~~~~~~~~~ vim +169 drivers/char/hw_random/core.c 92c7987e7 Corentin Labbe 2016-12-09 7 * Please read Documentation/hw_random.txt for details on use. 92c7987e7 Corentin Labbe 2016-12-09 8 * 92c7987e7 Corentin Labbe 2016-12-09 9 * This software may be used and distributed according to the terms 92c7987e7 Corentin Labbe 2016-12-09 10 * of the GNU General Public License, incorporated herein by reference. 844dd05fe Michael Buesch 2006-06-26 11 */ 844dd05fe Michael Buesch 2006-06-26 12 b70f09c75 Corentin Labbe 2016-12-09 @13 #include <linux/delay.h> 844dd05fe Michael Buesch 2006-06-26 14 #include <linux/device.h> b70f09c75 Corentin Labbe 2016-12-09 15 #include <linux/err.h> 844dd05fe Michael Buesch 2006-06-26 16 #include <linux/hw_random.h> 844dd05fe Michael Buesch 2006-06-26 17 #include <linux/kernel.h> be4000bc4 Torsten Duwe 2014-06-14 18 #include <linux/kthread.h> b70f09c75 Corentin Labbe 2016-12-09 19 #include <linux/miscdevice.h> b70f09c75 Corentin Labbe 2016-12-09 20 #include <linux/module.h> d9e797261 Kees Cook 2014-03-03 21 #include <linux/random.h> b70f09c75 Corentin Labbe 2016-12-09 22 #include <linux/slab.h> b70f09c75 Corentin Labbe 2016-12-09 23 #include <linux/uaccess.h> 844dd05fe Michael Buesch 2006-06-26 24 844dd05fe Michael Buesch 2006-06-26 25 #define RNG_MODULE_NAME "hw_random" 844dd05fe Michael Buesch 2006-06-26 26 844dd05fe Michael Buesch 2006-06-26 27 static struct hwrng *current_rng; be4000bc4 Torsten Duwe 2014-06-14 28 static struct task_struct *hwrng_fill; 844dd05fe Michael Buesch 2006-06-26 29 static LIST_HEAD(rng_list); 9372b35e1 Rusty Russell 2014-12-08 30 /* Protects rng_list and current_rng */ 844dd05fe Michael Buesch 2006-06-26 31 static DEFINE_MUTEX(rng_mutex); 9372b35e1 Rusty Russell 2014-12-08 32 /* Protects rng read functions, data_avail, rng_buffer and rng_fillbuf */ 9372b35e1 Rusty Russell 2014-12-08 33 static DEFINE_MUTEX(reading_mutex); 9996508b3 Ian Molton 2009-12-01 34 static int data_avail; be4000bc4 Torsten Duwe 2014-06-14 35 static u8 *rng_buffer, *rng_fillbuf; 0f734e6e7 Torsten Duwe 2014-06-14 36 static unsigned short current_quality; 0f734e6e7 Torsten Duwe 2014-06-14 37 static unsigned short default_quality; /* = 0; default to "off" */ be4000bc4 Torsten Duwe 2014-06-14 38 be4000bc4 Torsten Duwe 2014-06-14 39 module_param(current_quality, ushort, 0644); be4000bc4 Torsten Duwe 2014-06-14 40 MODULE_PARM_DESC(current_quality, be4000bc4 Torsten Duwe 2014-06-14 41 "current hwrng entropy estimation per mill"); 0f734e6e7 Torsten Duwe 2014-06-14 42 module_param(default_quality, ushort, 0644); 0f734e6e7 Torsten Duwe 2014-06-14 43 MODULE_PARM_DESC(default_quality, 0f734e6e7 Torsten Duwe 2014-06-14 44 "default entropy content of hwrng per mill"); be4000bc4 Torsten Duwe 2014-06-14 45 ff77c150f Herbert Xu 2014-12-23 46 static void drop_current_rng(void); 90ac41bd4 Herbert Xu 2014-12-23 47 static int hwrng_init(struct hwrng *rng); be4000bc4 Torsten Duwe 2014-06-14 48 static void start_khwrngd(void); f7f154f12 Rusty Russell 2013-03-05 49 d3cc79964 Amit Shah 2014-07-10 50 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, d3cc79964 Amit Shah 2014-07-10 51 int wait); d3cc79964 Amit Shah 2014-07-10 52 f7f154f12 Rusty Russell 2013-03-05 53 static size_t rng_buffer_size(void) f7f154f12 Rusty Russell 2013-03-05 54 { f7f154f12 Rusty Russell 2013-03-05 55 return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES; f7f154f12 Rusty Russell 2013-03-05 56 } 844dd05fe Michael Buesch 2006-06-26 57 d3cc79964 Amit Shah 2014-07-10 58 static void add_early_randomness(struct hwrng *rng) d3cc79964 Amit Shah 2014-07-10 59 { d3cc79964 Amit Shah 2014-07-10 60 int bytes_read; 6d4952d9d Andrew Lutomirski 2016-10-17 61 size_t size = min_t(size_t, 16, rng_buffer_size()); d3cc79964 Amit Shah 2014-07-10 62 9372b35e1 Rusty Russell 2014-12-08 63 mutex_lock(&reading_mutex); 6d4952d9d Andrew Lutomirski 2016-10-17 64 bytes_read = rng_get_data(rng, rng_buffer, size, 1); 9372b35e1 Rusty Russell 2014-12-08 65 mutex_unlock(&reading_mutex); d3cc79964 Amit Shah 2014-07-10 66 if (bytes_read > 0) 6d4952d9d Andrew Lutomirski 2016-10-17 67 add_device_randomness(rng_buffer, bytes_read); d3cc79964 Amit Shah 2014-07-10 68 } d3cc79964 Amit Shah 2014-07-10 69 3a2c0ba5a Rusty Russell 2014-12-08 70 static inline void cleanup_rng(struct kref *kref) 3a2c0ba5a Rusty Russell 2014-12-08 71 { 3a2c0ba5a Rusty Russell 2014-12-08 72 struct hwrng *rng = container_of(kref, struct hwrng, ref); 3a2c0ba5a Rusty Russell 2014-12-08 73 3a2c0ba5a Rusty Russell 2014-12-08 74 if (rng->cleanup) 3a2c0ba5a Rusty Russell 2014-12-08 75 rng->cleanup(rng); a027f30d7 Rusty Russell 2014-12-08 76 77584ee57 Herbert Xu 2014-12-23 77 complete(&rng->cleanup_done); 3a2c0ba5a Rusty Russell 2014-12-08 78 } 3a2c0ba5a Rusty Russell 2014-12-08 79 90ac41bd4 Herbert Xu 2014-12-23 80 static int set_current_rng(struct hwrng *rng) 3a2c0ba5a Rusty Russell 2014-12-08 81 { 90ac41bd4 Herbert Xu 2014-12-23 82 int err; 90ac41bd4 Herbert Xu 2014-12-23 83 3a2c0ba5a Rusty Russell 2014-12-08 84 BUG_ON(!mutex_is_locked(&rng_mutex)); 90ac41bd4 Herbert Xu 2014-12-23 85 90ac41bd4 Herbert Xu 2014-12-23 86 err = hwrng_init(rng); 90ac41bd4 Herbert Xu 2014-12-23 87 if (err) 90ac41bd4 Herbert Xu 2014-12-23 88 return err; 90ac41bd4 Herbert Xu 2014-12-23 89 ff77c150f Herbert Xu 2014-12-23 90 drop_current_rng(); 3a2c0ba5a Rusty Russell 2014-12-08 91 current_rng = rng; 90ac41bd4 Herbert Xu 2014-12-23 92 90ac41bd4 Herbert Xu 2014-12-23 93 return 0; 3a2c0ba5a Rusty Russell 2014-12-08 94 } 3a2c0ba5a Rusty Russell 2014-12-08 95 3a2c0ba5a Rusty Russell 2014-12-08 96 static void drop_current_rng(void) 3a2c0ba5a Rusty Russell 2014-12-08 97 { 3a2c0ba5a Rusty Russell 2014-12-08 98 BUG_ON(!mutex_is_locked(&rng_mutex)); 3a2c0ba5a Rusty Russell 2014-12-08 99 if (!current_rng) 3a2c0ba5a Rusty Russell 2014-12-08 100 return; 3a2c0ba5a Rusty Russell 2014-12-08 101 3a2c0ba5a Rusty Russell 2014-12-08 102 /* decrease last reference for triggering the cleanup */ 3a2c0ba5a Rusty Russell 2014-12-08 103 kref_put(¤t_rng->ref, cleanup_rng); 3a2c0ba5a Rusty Russell 2014-12-08 104 current_rng = NULL; 3a2c0ba5a Rusty Russell 2014-12-08 105 } 3a2c0ba5a Rusty Russell 2014-12-08 106 3a2c0ba5a Rusty Russell 2014-12-08 107 /* Returns ERR_PTR(), NULL or refcounted hwrng */ 3a2c0ba5a Rusty Russell 2014-12-08 108 static struct hwrng *get_current_rng(void) 3a2c0ba5a Rusty Russell 2014-12-08 109 { 3a2c0ba5a Rusty Russell 2014-12-08 110 struct hwrng *rng; 3a2c0ba5a Rusty Russell 2014-12-08 111 3a2c0ba5a Rusty Russell 2014-12-08 112 if (mutex_lock_interruptible(&rng_mutex)) 3a2c0ba5a Rusty Russell 2014-12-08 113 return ERR_PTR(-ERESTARTSYS); 3a2c0ba5a Rusty Russell 2014-12-08 114 3a2c0ba5a Rusty Russell 2014-12-08 115 rng = current_rng; 3a2c0ba5a Rusty Russell 2014-12-08 116 if (rng) 3a2c0ba5a Rusty Russell 2014-12-08 117 kref_get(&rng->ref); 3a2c0ba5a Rusty Russell 2014-12-08 118 3a2c0ba5a Rusty Russell 2014-12-08 119 mutex_unlock(&rng_mutex); 3a2c0ba5a Rusty Russell 2014-12-08 120 return rng; 3a2c0ba5a Rusty Russell 2014-12-08 121 } 3a2c0ba5a Rusty Russell 2014-12-08 122 3a2c0ba5a Rusty Russell 2014-12-08 123 static void put_rng(struct hwrng *rng) 3a2c0ba5a Rusty Russell 2014-12-08 124 { 3a2c0ba5a Rusty Russell 2014-12-08 125 /* 3a2c0ba5a Rusty Russell 2014-12-08 126 * Hold rng_mutex here so we serialize in case they set_current_rng 3a2c0ba5a Rusty Russell 2014-12-08 127 * on rng again immediately. 3a2c0ba5a Rusty Russell 2014-12-08 128 */ 3a2c0ba5a Rusty Russell 2014-12-08 129 mutex_lock(&rng_mutex); 3a2c0ba5a Rusty Russell 2014-12-08 130 if (rng) 3a2c0ba5a Rusty Russell 2014-12-08 131 kref_put(&rng->ref, cleanup_rng); 3a2c0ba5a Rusty Russell 2014-12-08 132 mutex_unlock(&rng_mutex); 3a2c0ba5a Rusty Russell 2014-12-08 133 } 3a2c0ba5a Rusty Russell 2014-12-08 134 90ac41bd4 Herbert Xu 2014-12-23 135 static int hwrng_init(struct hwrng *rng) 844dd05fe Michael Buesch 2006-06-26 136 { 15b66cd54 Herbert Xu 2014-12-23 137 if (kref_get_unless_zero(&rng->ref)) 15b66cd54 Herbert Xu 2014-12-23 138 goto skip_init; 15b66cd54 Herbert Xu 2014-12-23 139 d3cc79964 Amit Shah 2014-07-10 140 if (rng->init) { d3cc79964 Amit Shah 2014-07-10 141 int ret; d3cc79964 Amit Shah 2014-07-10 142 d3cc79964 Amit Shah 2014-07-10 143 ret = rng->init(rng); d3cc79964 Amit Shah 2014-07-10 144 if (ret) d3cc79964 Amit Shah 2014-07-10 145 return ret; d3cc79964 Amit Shah 2014-07-10 146 } 15b66cd54 Herbert Xu 2014-12-23 147 15b66cd54 Herbert Xu 2014-12-23 148 kref_init(&rng->ref); 15b66cd54 Herbert Xu 2014-12-23 149 reinit_completion(&rng->cleanup_done); 15b66cd54 Herbert Xu 2014-12-23 150 15b66cd54 Herbert Xu 2014-12-23 151 skip_init: d3cc79964 Amit Shah 2014-07-10 152 add_early_randomness(rng); be4000bc4 Torsten Duwe 2014-06-14 153 0f734e6e7 Torsten Duwe 2014-06-14 154 current_quality = rng->quality ? : default_quality; 506bf0c04 Keith Packard 2015-03-18 155 if (current_quality > 1024) 506bf0c04 Keith Packard 2015-03-18 156 current_quality = 1024; 0f734e6e7 Torsten Duwe 2014-06-14 157 0f734e6e7 Torsten Duwe 2014-06-14 158 if (current_quality == 0 && hwrng_fill) 0f734e6e7 Torsten Duwe 2014-06-14 159 kthread_stop(hwrng_fill); be4000bc4 Torsten Duwe 2014-06-14 160 if (current_quality > 0 && !hwrng_fill) be4000bc4 Torsten Duwe 2014-06-14 161 start_khwrngd(); be4000bc4 Torsten Duwe 2014-06-14 162 844dd05fe Michael Buesch 2006-06-26 163 return 0; 844dd05fe Michael Buesch 2006-06-26 164 } 844dd05fe Michael Buesch 2006-06-26 165 844dd05fe Michael Buesch 2006-06-26 166 static int rng_dev_open(struct inode *inode, struct file *filp) 844dd05fe Michael Buesch 2006-06-26 167 { 844dd05fe Michael Buesch 2006-06-26 168 /* enforce read-only access to this chrdev */ 844dd05fe Michael Buesch 2006-06-26 @169 if ((filp->f_mode & FMODE_READ) == 0) 844dd05fe Michael Buesch 2006-06-26 170 return -EINVAL; 844dd05fe Michael Buesch 2006-06-26 @171 if (filp->f_mode & FMODE_WRITE) 844dd05fe Michael Buesch 2006-06-26 172 return -EINVAL; 844dd05fe Michael Buesch 2006-06-26 173 return 0; 844dd05fe Michael Buesch 2006-06-26 174 } 844dd05fe Michael Buesch 2006-06-26 175 9996508b3 Ian Molton 2009-12-01 176 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, 9996508b3 Ian Molton 2009-12-01 177 int wait) { 9996508b3 Ian Molton 2009-12-01 178 int present; 9996508b3 Ian Molton 2009-12-01 179 9372b35e1 Rusty Russell 2014-12-08 180 BUG_ON(!mutex_is_locked(&reading_mutex)); 9996508b3 Ian Molton 2009-12-01 181 if (rng->read) 9996508b3 Ian Molton 2009-12-01 182 return rng->read(rng, (void *)buffer, size, wait); 9996508b3 Ian Molton 2009-12-01 183 9996508b3 Ian Molton 2009-12-01 184 if (rng->data_present) 9996508b3 Ian Molton 2009-12-01 185 present = rng->data_present(rng, wait); 9996508b3 Ian Molton 2009-12-01 186 else 9996508b3 Ian Molton 2009-12-01 187 present = 1; 9996508b3 Ian Molton 2009-12-01 188 9996508b3 Ian Molton 2009-12-01 189 if (present) 9996508b3 Ian Molton 2009-12-01 190 return rng->data_read(rng, (u32 *)buffer); 9996508b3 Ian Molton 2009-12-01 191 9996508b3 Ian Molton 2009-12-01 192 return 0; 9996508b3 Ian Molton 2009-12-01 193 } 9996508b3 Ian Molton 2009-12-01 194 844dd05fe Michael Buesch 2006-06-26 195 static ssize_t rng_dev_read(struct file *filp, char __user *buf, 844dd05fe Michael Buesch 2006-06-26 196 size_t size, loff_t *offp) 844dd05fe Michael Buesch 2006-06-26 197 { 844dd05fe Michael Buesch 2006-06-26 198 ssize_t ret = 0; 984e976f5 Patrick McHardy 2007-11-21 199 int err = 0; 9996508b3 Ian Molton 2009-12-01 200 int bytes_read, len; 3a2c0ba5a Rusty Russell 2014-12-08 201 struct hwrng *rng; 844dd05fe Michael Buesch 2006-06-26 202 844dd05fe Michael Buesch 2006-06-26 203 while (size) { 3a2c0ba5a Rusty Russell 2014-12-08 204 rng = get_current_rng(); 3a2c0ba5a Rusty Russell 2014-12-08 205 if (IS_ERR(rng)) { 3a2c0ba5a Rusty Russell 2014-12-08 206 err = PTR_ERR(rng); 844dd05fe Michael Buesch 2006-06-26 207 goto out; 9996508b3 Ian Molton 2009-12-01 208 } 3a2c0ba5a Rusty Russell 2014-12-08 209 if (!rng) { 844dd05fe Michael Buesch 2006-06-26 210 err = -ENODEV; 3a2c0ba5a Rusty Russell 2014-12-08 211 goto out; 844dd05fe Michael Buesch 2006-06-26 212 } 984e976f5 Patrick McHardy 2007-11-21 213 1ab87298c Jiri Slaby 2015-11-27 214 if (mutex_lock_interruptible(&reading_mutex)) { 1ab87298c Jiri Slaby 2015-11-27 215 err = -ERESTARTSYS; 1ab87298c Jiri Slaby 2015-11-27 216 goto out_put; 1ab87298c Jiri Slaby 2015-11-27 217 } 9996508b3 Ian Molton 2009-12-01 218 if (!data_avail) { 3a2c0ba5a Rusty Russell 2014-12-08 219 bytes_read = rng_get_data(rng, rng_buffer, f7f154f12 Rusty Russell 2013-03-05 220 rng_buffer_size(), 9996508b3 Ian Molton 2009-12-01 @221 !(filp->f_flags & O_NONBLOCK)); 893f11286 Ralph Wuerthner 2008-04-17 222 if (bytes_read < 0) { 893f11286 Ralph Wuerthner 2008-04-17 223 err = bytes_read; 9372b35e1 Rusty Russell 2014-12-08 224 goto out_unlock_reading; 9996508b3 Ian Molton 2009-12-01 225 } 9996508b3 Ian Molton 2009-12-01 226 data_avail = bytes_read; 893f11286 Ralph Wuerthner 2008-04-17 227 } 844dd05fe Michael Buesch 2006-06-26 228 9996508b3 Ian Molton 2009-12-01 229 if (!data_avail) { 9996508b3 Ian Molton 2009-12-01 230 if (filp->f_flags & O_NONBLOCK) { 9996508b3 Ian Molton 2009-12-01 231 err = -EAGAIN; 9372b35e1 Rusty Russell 2014-12-08 232 goto out_unlock_reading; 9996508b3 Ian Molton 2009-12-01 233 } 9996508b3 Ian Molton 2009-12-01 234 } else { 9996508b3 Ian Molton 2009-12-01 235 len = data_avail; 9996508b3 Ian Molton 2009-12-01 236 if (len > size) 9996508b3 Ian Molton 2009-12-01 237 len = size; 9996508b3 Ian Molton 2009-12-01 238 9996508b3 Ian Molton 2009-12-01 239 data_avail -= len; 9996508b3 Ian Molton 2009-12-01 240 9996508b3 Ian Molton 2009-12-01 241 if (copy_to_user(buf + ret, rng_buffer + data_avail, 9996508b3 Ian Molton 2009-12-01 242 len)) { 844dd05fe Michael Buesch 2006-06-26 243 err = -EFAULT; 9372b35e1 Rusty Russell 2014-12-08 244 goto out_unlock_reading; 9996508b3 Ian Molton 2009-12-01 245 } 9996508b3 Ian Molton 2009-12-01 246 9996508b3 Ian Molton 2009-12-01 247 size -= len; 9996508b3 Ian Molton 2009-12-01 248 ret += len; 844dd05fe Michael Buesch 2006-06-26 249 } 844dd05fe Michael Buesch 2006-06-26 250 9372b35e1 Rusty Russell 2014-12-08 251 mutex_unlock(&reading_mutex); 3a2c0ba5a Rusty Russell 2014-12-08 252 put_rng(rng); 9996508b3 Ian Molton 2009-12-01 253 844dd05fe Michael Buesch 2006-06-26 254 if (need_resched()) 844dd05fe Michael Buesch 2006-06-26 255 schedule_timeout_interruptible(1); 9996508b3 Ian Molton 2009-12-01 256 9996508b3 Ian Molton 2009-12-01 257 if (signal_pending(current)) { 844dd05fe Michael Buesch 2006-06-26 258 err = -ERESTARTSYS; 844dd05fe Michael Buesch 2006-06-26 259 goto out; 844dd05fe Michael Buesch 2006-06-26 260 } 9996508b3 Ian Molton 2009-12-01 261 } 844dd05fe Michael Buesch 2006-06-26 262 out: 844dd05fe Michael Buesch 2006-06-26 263 return ret ? : err; 3a2c0ba5a Rusty Russell 2014-12-08 264 9372b35e1 Rusty Russell 2014-12-08 265 out_unlock_reading: 9372b35e1 Rusty Russell 2014-12-08 266 mutex_unlock(&reading_mutex); 1ab87298c Jiri Slaby 2015-11-27 267 out_put: 3a2c0ba5a Rusty Russell 2014-12-08 268 put_rng(rng); 3a2c0ba5a Rusty Russell 2014-12-08 269 goto out; 844dd05fe Michael Buesch 2006-06-26 270 } 844dd05fe Michael Buesch 2006-06-26 271 62322d255 Arjan van de Ven 2006-07-03 @272 static const struct file_operations rng_chrdev_ops = { 844dd05fe Michael Buesch 2006-06-26 @273 .owner = THIS_MODULE, 844dd05fe Michael Buesch 2006-06-26 @274 .open = rng_dev_open, 844dd05fe Michael Buesch 2006-06-26 @275 .read = rng_dev_read, 6038f373a Arnd Bergmann 2010-08-15 @276 .llseek = noop_llseek, 844dd05fe Michael Buesch 2006-06-26 277 }; 844dd05fe Michael Buesch 2006-06-26 278 0daa7a0af Takashi Iwai 2015-02-02 279 static const struct attribute_group *rng_dev_groups[]; :::::: The code at line 169 was first introduced by commit :::::: 844dd05fec172d98b0dacecd9b9e9f6595204c13 [PATCH] Add new generic HW RNG core :::::: TO: Michael Buesch <mb@xxxxxxxxx> :::::: CC: Linus Torvalds <torvalds@xxxxxxxxxxx> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip