Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sound_firmware.c
Go to the documentation of this file.
1 #include <linux/vmalloc.h>
2 #include <linux/module.h>
3 #include <linux/fs.h>
4 #include <linux/mm.h>
5 #include <linux/sched.h>
6 #include <asm/uaccess.h>
7 #include "oss/sound_firmware.h"
8 
9 static int do_mod_firmware_load(const char *fn, char **fp)
10 {
11  struct file* filp;
12  long l;
13  char *dp;
14  loff_t pos;
15 
16  filp = filp_open(fn, 0, 0);
17  if (IS_ERR(filp))
18  {
19  printk(KERN_INFO "Unable to load '%s'.\n", fn);
20  return 0;
21  }
22  l = i_size_read(filp->f_path.dentry->d_inode);
23  if (l <= 0 || l > 131072)
24  {
25  printk(KERN_INFO "Invalid firmware '%s'\n", fn);
26  filp_close(filp, NULL);
27  return 0;
28  }
29  dp = vmalloc(l);
30  if (dp == NULL)
31  {
32  printk(KERN_INFO "Out of memory loading '%s'.\n", fn);
33  filp_close(filp, NULL);
34  return 0;
35  }
36  pos = 0;
37  if (vfs_read(filp, dp, l, &pos) != l)
38  {
39  printk(KERN_INFO "Failed to read '%s'.\n", fn);
40  vfree(dp);
41  filp_close(filp, NULL);
42  return 0;
43  }
44  filp_close(filp, NULL);
45  *fp = dp;
46  return (int) l;
47 }
48 
66 int mod_firmware_load(const char *fn, char **fp)
67 {
68  int r;
70 
71  set_fs(get_ds());
72  r = do_mod_firmware_load(fn, fp);
73  set_fs(fs);
74  return r;
75 }
77 
78 MODULE_LICENSE("GPL");