mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
proc 2/2: remove struct proc_dir_entry::owner
Setting ->owner as done currently (pde->owner = THIS_MODULE) is racy as correctly noted at bug #12454. Someone can lookup entry with NULL ->owner, thus not pinning enything, and release it later resulting in module refcount underflow. We can keep ->owner and supply it at registration time like ->proc_fops and ->data. But this leaves ->owner as easy-manipulative field (just one C assignment) and somebody will forget to unpin previous/pin current module when switching ->owner. ->proc_fops is declared as "const" which should give some thoughts. ->read_proc/->write_proc were just fixed to not require ->owner for protection. rmmod'ed directories will be empty and return "." and ".." -- no harm. And directories with tricky enough readdir and lookup shouldn't be modular. We definitely don't want such modular code. Removing ->owner will also make PDE smaller. So, let's nuke it. Kudos to Jeff Layton for reminding about this, let's say, oversight. http://bugzilla.kernel.org/show_bug.cgi?id=12454 Signed-off-by: Alexey Dobriyan <[email protected]>
This commit is contained in:
parent
3dec7f59c3
commit
99b7623380
55 changed files with 26 additions and 232 deletions
|
|
@ -191,7 +191,6 @@ static int acpi_ac_add_fs(struct acpi_device *device)
|
|||
acpi_ac_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* 'state' [R] */
|
||||
|
|
|
|||
|
|
@ -760,7 +760,6 @@ static int acpi_battery_add_fs(struct acpi_device *device)
|
|||
acpi_battery_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i) {
|
||||
|
|
|
|||
|
|
@ -200,12 +200,10 @@ static int acpi_button_add_fs(struct acpi_device *device)
|
|||
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
entry->owner = THIS_MODULE;
|
||||
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), entry);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data(ACPI_BUTTON_FILE_INFO,
|
||||
|
|
@ -522,7 +520,6 @@ static int __init acpi_button_init(void)
|
|||
acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
if (!acpi_button_dir)
|
||||
return -ENODEV;
|
||||
acpi_button_dir->owner = THIS_MODULE;
|
||||
result = acpi_bus_register_driver(&acpi_button_driver);
|
||||
if (result < 0) {
|
||||
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
|
|
|
|||
|
|
@ -193,7 +193,6 @@ static int acpi_fan_add_fs(struct acpi_device *device)
|
|||
acpi_fan_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* 'status' [R/W] */
|
||||
|
|
@ -347,7 +346,6 @@ static int __init acpi_fan_init(void)
|
|||
acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir);
|
||||
if (!acpi_fan_dir)
|
||||
return -ENODEV;
|
||||
acpi_fan_dir->owner = THIS_MODULE;
|
||||
#endif
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_fan_driver);
|
||||
|
|
|
|||
|
|
@ -359,7 +359,6 @@ static int acpi_processor_add_fs(struct acpi_device *device)
|
|||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
}
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data(ACPI_PROCESSOR_FILE_INFO,
|
||||
|
|
@ -1137,7 +1136,6 @@ static int __init acpi_processor_init(void)
|
|||
acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
|
||||
if (!acpi_processor_dir)
|
||||
return -ENOMEM;
|
||||
acpi_processor_dir->owner = THIS_MODULE;
|
||||
|
||||
/*
|
||||
* Check whether the system is DMI table. If yes, OSPM
|
||||
|
|
|
|||
|
|
@ -488,7 +488,6 @@ acpi_sbs_add_fs(struct proc_dir_entry **dir,
|
|||
if (!*dir) {
|
||||
return -ENODEV;
|
||||
}
|
||||
(*dir)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* 'info' [R] */
|
||||
|
|
|
|||
|
|
@ -1506,7 +1506,6 @@ static int acpi_thermal_add_fs(struct acpi_device *device)
|
|||
acpi_thermal_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* 'state' [R] */
|
||||
|
|
@ -1875,7 +1874,6 @@ static int __init acpi_thermal_init(void)
|
|||
acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir);
|
||||
if (!acpi_thermal_dir)
|
||||
return -ENODEV;
|
||||
acpi_thermal_dir->owner = THIS_MODULE;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_thermal_driver);
|
||||
if (result < 0) {
|
||||
|
|
|
|||
|
|
@ -1125,8 +1125,6 @@ static int acpi_video_device_add_fs(struct acpi_device *device)
|
|||
if (!device_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
device_dir->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data("info", S_IRUGO, device_dir,
|
||||
&acpi_video_device_info_fops, acpi_driver_data(device));
|
||||
|
|
@ -1403,8 +1401,6 @@ static int acpi_video_bus_add_fs(struct acpi_device *device)
|
|||
if (!device_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
device_dir->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data("info", S_IRUGO, device_dir,
|
||||
&acpi_video_bus_info_fops,
|
||||
|
|
@ -2131,7 +2127,6 @@ static int __init acpi_video_init(void)
|
|||
acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir);
|
||||
if (!acpi_video_dir)
|
||||
return -ENODEV;
|
||||
acpi_video_dir->owner = THIS_MODULE;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_video_bus);
|
||||
if (result < 0) {
|
||||
|
|
|
|||
|
|
@ -551,8 +551,6 @@ static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev)
|
|||
dev_warn(&dev->core, "failed to create /proc entry\n");
|
||||
return;
|
||||
}
|
||||
|
||||
pde->owner = THIS_MODULE;
|
||||
pde->data = priv;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1944,7 +1944,7 @@ static int stat_file_read_proc(char *page, char **start, off_t off,
|
|||
|
||||
int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
|
||||
read_proc_t *read_proc,
|
||||
void *data, struct module *owner)
|
||||
void *data)
|
||||
{
|
||||
int rv = 0;
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
@ -1970,7 +1970,6 @@ int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
|
|||
} else {
|
||||
file->data = data;
|
||||
file->read_proc = read_proc;
|
||||
file->owner = owner;
|
||||
|
||||
mutex_lock(&smi->proc_entry_lock);
|
||||
/* Stick it on the list. */
|
||||
|
|
@ -1993,23 +1992,21 @@ static int add_proc_entries(ipmi_smi_t smi, int num)
|
|||
smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root);
|
||||
if (!smi->proc_dir)
|
||||
rv = -ENOMEM;
|
||||
else
|
||||
smi->proc_dir->owner = THIS_MODULE;
|
||||
|
||||
if (rv == 0)
|
||||
rv = ipmi_smi_add_proc_entry(smi, "stats",
|
||||
stat_file_read_proc,
|
||||
smi, THIS_MODULE);
|
||||
smi);
|
||||
|
||||
if (rv == 0)
|
||||
rv = ipmi_smi_add_proc_entry(smi, "ipmb",
|
||||
ipmb_file_read_proc,
|
||||
smi, THIS_MODULE);
|
||||
smi);
|
||||
|
||||
if (rv == 0)
|
||||
rv = ipmi_smi_add_proc_entry(smi, "version",
|
||||
version_file_read_proc,
|
||||
smi, THIS_MODULE);
|
||||
smi);
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
return rv;
|
||||
|
|
@ -4265,7 +4262,6 @@ static int ipmi_init_msghandler(void)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
proc_ipmi_root->owner = THIS_MODULE;
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
setup_timer(&ipmi_timer, ipmi_timeout, 0);
|
||||
|
|
|
|||
|
|
@ -2899,7 +2899,7 @@ static int try_smi_init(struct smi_info *new_smi)
|
|||
|
||||
rv = ipmi_smi_add_proc_entry(new_smi->intf, "type",
|
||||
type_file_read_proc,
|
||||
new_smi, THIS_MODULE);
|
||||
new_smi);
|
||||
if (rv) {
|
||||
printk(KERN_ERR
|
||||
"ipmi_si: Unable to create proc entry: %d\n",
|
||||
|
|
@ -2909,7 +2909,7 @@ static int try_smi_init(struct smi_info *new_smi)
|
|||
|
||||
rv = ipmi_smi_add_proc_entry(new_smi->intf, "si_stats",
|
||||
stat_file_read_proc,
|
||||
new_smi, THIS_MODULE);
|
||||
new_smi);
|
||||
if (rv) {
|
||||
printk(KERN_ERR
|
||||
"ipmi_si: Unable to create proc entry: %d\n",
|
||||
|
|
@ -2919,7 +2919,7 @@ static int try_smi_init(struct smi_info *new_smi)
|
|||
|
||||
rv = ipmi_smi_add_proc_entry(new_smi->intf, "params",
|
||||
param_read_proc,
|
||||
new_smi, THIS_MODULE);
|
||||
new_smi);
|
||||
if (rv) {
|
||||
printk(KERN_ERR
|
||||
"ipmi_si: Unable to create proc entry: %d\n",
|
||||
|
|
|
|||
|
|
@ -903,8 +903,6 @@ static int __init input_proc_init(void)
|
|||
if (!proc_bus_input_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
proc_bus_input_dir->owner = THIS_MODULE;
|
||||
|
||||
entry = proc_create("devices", 0, proc_bus_input_dir,
|
||||
&input_devices_fileops);
|
||||
if (!entry)
|
||||
|
|
|
|||
|
|
@ -118,7 +118,6 @@ static int DIVA_INIT_FUNCTION create_um_idi_proc(void)
|
|||
return (0);
|
||||
|
||||
um_idi_proc_entry->read_proc = um_idi_proc_read;
|
||||
um_idi_proc_entry->owner = THIS_MODULE;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1381,9 +1381,7 @@ static void proc_cpia_create(void)
|
|||
{
|
||||
cpia_proc_root = proc_mkdir("cpia", NULL);
|
||||
|
||||
if (cpia_proc_root)
|
||||
cpia_proc_root->owner = THIS_MODULE;
|
||||
else
|
||||
if (!cpia_proc_root)
|
||||
LOG("Unable to initialise /proc/cpia\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2037,8 +2037,6 @@ static int __init i2o_proc_fs_create(void)
|
|||
if (!i2o_proc_dir_root)
|
||||
return -1;
|
||||
|
||||
i2o_proc_dir_root->owner = THIS_MODULE;
|
||||
|
||||
list_for_each_entry(c, &i2o_controllers, list)
|
||||
i2o_proc_iop_add(i2o_proc_dir_root, c);
|
||||
|
||||
|
|
|
|||
|
|
@ -3444,25 +3444,12 @@ static void bond_remove_proc_entry(struct bonding *bond)
|
|||
*/
|
||||
static void bond_create_proc_dir(void)
|
||||
{
|
||||
int len = strlen(DRV_NAME);
|
||||
|
||||
for (bond_proc_dir = init_net.proc_net->subdir; bond_proc_dir;
|
||||
bond_proc_dir = bond_proc_dir->next) {
|
||||
if ((bond_proc_dir->namelen == len) &&
|
||||
!memcmp(bond_proc_dir->name, DRV_NAME, len)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bond_proc_dir) {
|
||||
bond_proc_dir = proc_mkdir(DRV_NAME, init_net.proc_net);
|
||||
if (bond_proc_dir) {
|
||||
bond_proc_dir->owner = THIS_MODULE;
|
||||
} else {
|
||||
if (!bond_proc_dir)
|
||||
printk(KERN_WARNING DRV_NAME
|
||||
": Warning: cannot create /proc/net/%s\n",
|
||||
DRV_NAME);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3471,25 +3458,7 @@ static void bond_create_proc_dir(void)
|
|||
*/
|
||||
static void bond_destroy_proc_dir(void)
|
||||
{
|
||||
struct proc_dir_entry *de;
|
||||
|
||||
if (!bond_proc_dir) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* verify that the /proc dir is empty */
|
||||
for (de = bond_proc_dir->subdir; de; de = de->next) {
|
||||
/* ignore . and .. */
|
||||
if (*(de->name) != '.') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (de) {
|
||||
if (bond_proc_dir->owner == THIS_MODULE) {
|
||||
bond_proc_dir->owner = NULL;
|
||||
}
|
||||
} else {
|
||||
if (bond_proc_dir) {
|
||||
remove_proc_entry(DRV_NAME, init_net.proc_net);
|
||||
bond_proc_dir = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1871,13 +1871,6 @@ static int __init vlsi_mod_init(void)
|
|||
* without procfs - it's not required for the driver to work.
|
||||
*/
|
||||
vlsi_proc_root = proc_mkdir(PROC_DIR, NULL);
|
||||
if (vlsi_proc_root) {
|
||||
/* protect registered procdir against module removal.
|
||||
* Because we are in the module init path there's no race
|
||||
* window after create_proc_entry (and no barrier needed).
|
||||
*/
|
||||
vlsi_proc_root->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
ret = pci_register_driver(&vlsi_irda_driver);
|
||||
|
||||
|
|
|
|||
|
|
@ -4494,7 +4494,6 @@ static int setup_proc_entry( struct net_device *dev,
|
|||
goto fail;
|
||||
apriv->proc_entry->uid = proc_uid;
|
||||
apriv->proc_entry->gid = proc_gid;
|
||||
apriv->proc_entry->owner = THIS_MODULE;
|
||||
|
||||
/* Setup the StatsDelta */
|
||||
entry = proc_create_data("StatsDelta",
|
||||
|
|
|
|||
|
|
@ -987,7 +987,6 @@ asus_proc_add(char *name, proc_writefunc *writefunc,
|
|||
proc->write_proc = writefunc;
|
||||
proc->read_proc = readfunc;
|
||||
proc->data = acpi_driver_data(device);
|
||||
proc->owner = THIS_MODULE;
|
||||
proc->uid = asus_uid;
|
||||
proc->gid = asus_gid;
|
||||
return 0;
|
||||
|
|
@ -1020,7 +1019,6 @@ static int asus_hotk_add_fs(struct acpi_device *device)
|
|||
if (proc) {
|
||||
proc->read_proc = proc_read_info;
|
||||
proc->data = acpi_driver_data(device);
|
||||
proc->owner = THIS_MODULE;
|
||||
proc->uid = asus_uid;
|
||||
proc->gid = asus_gid;
|
||||
} else {
|
||||
|
|
@ -1436,7 +1434,6 @@ static int __init asus_acpi_init(void)
|
|||
printk(KERN_ERR "Asus ACPI: Unable to create /proc entry\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
asus_proc_dir->owner = THIS_MODULE;
|
||||
|
||||
result = acpi_bus_register_driver(&asus_hotk_driver);
|
||||
if (result < 0) {
|
||||
|
|
|
|||
|
|
@ -6992,7 +6992,6 @@ static int __init ibm_init(struct ibm_init_struct *iibm)
|
|||
ret = -ENODEV;
|
||||
goto err_out;
|
||||
}
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->data = ibm;
|
||||
entry->read_proc = &dispatch_procfs_read;
|
||||
if (ibm->write)
|
||||
|
|
@ -7405,7 +7404,6 @@ static int __init thinkpad_acpi_module_init(void)
|
|||
thinkpad_acpi_module_exit();
|
||||
return -ENODEV;
|
||||
}
|
||||
proc_dir->owner = THIS_MODULE;
|
||||
|
||||
ret = platform_driver_register(&tpacpi_pdriver);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -679,8 +679,6 @@ static acpi_status __init add_device(void)
|
|||
toshiba_proc_dir,
|
||||
(read_proc_t *) dispatch_read,
|
||||
item);
|
||||
if (proc)
|
||||
proc->owner = THIS_MODULE;
|
||||
if (proc && item->write_func)
|
||||
proc->write_proc = (write_proc_t *) dispatch_write;
|
||||
}
|
||||
|
|
@ -772,7 +770,6 @@ static int __init toshiba_acpi_init(void)
|
|||
toshiba_acpi_exit();
|
||||
return -ENODEV;
|
||||
} else {
|
||||
toshiba_proc_dir->owner = THIS_MODULE;
|
||||
status = add_device();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
toshiba_acpi_exit();
|
||||
|
|
|
|||
|
|
@ -105,14 +105,8 @@ static const struct file_operations rtc_proc_fops = {
|
|||
|
||||
void rtc_proc_add_device(struct rtc_device *rtc)
|
||||
{
|
||||
if (rtc->id == 0) {
|
||||
struct proc_dir_entry *ent;
|
||||
|
||||
ent = proc_create_data("driver/rtc", 0, NULL,
|
||||
&rtc_proc_fops, rtc);
|
||||
if (ent)
|
||||
ent->owner = rtc->owner;
|
||||
}
|
||||
if (rtc->id == 0)
|
||||
proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc);
|
||||
}
|
||||
|
||||
void rtc_proc_del_device(struct rtc_device *rtc)
|
||||
|
|
|
|||
|
|
@ -320,7 +320,6 @@ dasd_proc_init(void)
|
|||
dasd_proc_root_entry = proc_mkdir("dasd", NULL);
|
||||
if (!dasd_proc_root_entry)
|
||||
goto out_nodasd;
|
||||
dasd_proc_root_entry->owner = THIS_MODULE;
|
||||
dasd_devices_entry = proc_create("devices",
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
dasd_proc_root_entry,
|
||||
|
|
@ -334,7 +333,6 @@ dasd_proc_init(void)
|
|||
goto out_nostatistics;
|
||||
dasd_statistics_entry->read_proc = dasd_statistics_read;
|
||||
dasd_statistics_entry->write_proc = dasd_statistics_write;
|
||||
dasd_statistics_entry->owner = THIS_MODULE;
|
||||
return 0;
|
||||
|
||||
out_nostatistics:
|
||||
|
|
|
|||
|
|
@ -596,8 +596,6 @@ int __init scsi_init_devinfo(void)
|
|||
error = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
p->owner = THIS_MODULE;
|
||||
#endif /* CONFIG_SCSI_PROC_FS */
|
||||
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -115,8 +115,6 @@ void scsi_proc_hostdir_add(struct scsi_host_template *sht)
|
|||
if (!sht->proc_dir)
|
||||
printk(KERN_ERR "%s: proc_mkdir failed for %s\n",
|
||||
__func__, sht->proc_name);
|
||||
else
|
||||
sht->proc_dir->owner = sht->module;
|
||||
}
|
||||
mutex_unlock(&global_host_template_mutex);
|
||||
}
|
||||
|
|
@ -163,7 +161,6 @@ void scsi_proc_host_add(struct Scsi_Host *shost)
|
|||
}
|
||||
|
||||
p->write_proc = proc_scsi_write_proc;
|
||||
p->owner = sht->module;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2059,25 +2059,21 @@ static void viafb_init_proc(struct proc_dir_entry **viafb_entry)
|
|||
if (viafb_entry) {
|
||||
entry = create_proc_entry("dvp0", 0, *viafb_entry);
|
||||
if (entry) {
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->read_proc = viafb_dvp0_proc_read;
|
||||
entry->write_proc = viafb_dvp0_proc_write;
|
||||
}
|
||||
entry = create_proc_entry("dvp1", 0, *viafb_entry);
|
||||
if (entry) {
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->read_proc = viafb_dvp1_proc_read;
|
||||
entry->write_proc = viafb_dvp1_proc_write;
|
||||
}
|
||||
entry = create_proc_entry("dfph", 0, *viafb_entry);
|
||||
if (entry) {
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->read_proc = viafb_dfph_proc_read;
|
||||
entry->write_proc = viafb_dfph_proc_write;
|
||||
}
|
||||
entry = create_proc_entry("dfpl", 0, *viafb_entry);
|
||||
if (entry) {
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->read_proc = viafb_dfpl_proc_read;
|
||||
entry->write_proc = viafb_dfpl_proc_write;
|
||||
}
|
||||
|
|
@ -2086,7 +2082,6 @@ static void viafb_init_proc(struct proc_dir_entry **viafb_entry)
|
|||
viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {
|
||||
entry = create_proc_entry("vt1636", 0, *viafb_entry);
|
||||
if (entry) {
|
||||
entry->owner = THIS_MODULE;
|
||||
entry->read_proc = viafb_vt1636_proc_read;
|
||||
entry->write_proc = viafb_vt1636_proc_write;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue