From 0e8799ff2730a9d637035cffba9e15302bcb94a0 Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Wed, 9 Dec 1998 15:11:32 +0000 Subject: [PATCH] Module use count trick expanded to all files and directories Also fixed a minor Makefile typo. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@55 7894878c-1315-0410-8ee3-d5d059ff63e0 --- TODO | 2 -- i2c/eeprom/Module.mk | 2 +- kernel/i2c-proc.c | 23 +++++++++++++++++++++++ kernel/sensors.c | 21 +++++++++++++++++++-- src/i2c-proc.c | 23 +++++++++++++++++++++++ src/sensors.c | 21 +++++++++++++++++++-- 6 files changed, 85 insertions(+), 7 deletions(-) diff --git a/TODO b/TODO index 2302dfa4..faae3892 100644 --- a/TODO +++ b/TODO @@ -14,8 +14,6 @@ Many, many things. Most notably: * Make it SMP-safe: there are no spinlocks yet. They are needed at many places, probably (everywhere where global vars are accessed). This must be done for the i2c modules, too. -* Extend the mod_inc_use/mod_dec_use through the fill_inode trick, for all - new /proc files. * Make lm78.c detect 'double hits', (same chip connected to both SMBus and ISA). * Better lm78/lm75 detection; insmod-time paramters to set addresses diff --git a/i2c/eeprom/Module.mk b/i2c/eeprom/Module.mk index 7fa08dea..df8c4221 100644 --- a/i2c/eeprom/Module.mk +++ b/i2c/eeprom/Module.mk @@ -35,6 +35,6 @@ all :: all-i2c-eeprom # No install rule clean-i2c-eeprom: - $(RM) $(I2CEEPROMSOURCES:.c=.d) $(I2CEEPROMSOURCES:.c=.o) \ + $(RM) $(I2CEEPROMSOURCES:.c=.rd) $(I2CEEPROMSOURCES:.c=.ro) \ $(I2CEEPROMTARGETS) clean :: clean-i2c-eeprom diff --git a/kernel/i2c-proc.c b/kernel/i2c-proc.c index 64ea3103..ab6304af 100644 --- a/kernel/i2c-proc.c +++ b/kernel/i2c-proc.c @@ -41,6 +41,10 @@ static int i2cproc_command(struct i2c_client *client, unsigned int cmd, static void i2cproc_inc_use(struct i2c_client *client); static void i2cproc_dec_use(struct i2c_client *client); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +static void monitor_bus_i2c(struct inode *inode, int fill); +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, @@ -80,6 +84,9 @@ static struct proc_dir_entry proc_bus_i2c_dir = /* size */ 0, /* ops */ NULL, /* get_info */ &read_bus_i2c +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + /* fill_inode */ &monitor_bus_i2c +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ }; /* List of registered entries in /proc/bus */ @@ -223,6 +230,19 @@ int i2cproc_cleanup(void) return 0; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +/* Monitor access to /proc/bus/i2c*; make unloading i2c-proc.o impossible + if some process still uses it or some file in it */ +void monitor_bus_i2c(struct inode *inode, int fill) +{ + if (fill) + MOD_INC_USE_COUNT; + else + MOD_DEC_USE_COUNT; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ + + /* This function generates the output for /proc/bus/i2c */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) int read_bus_i2c(char *buf, char **start, off_t offset, int len, int *eof, @@ -349,6 +369,9 @@ int i2cproc_attach_adapter(struct i2c_adapter *adapter) return -ENOENT; } proc_entry->ops = &i2cproc_inode_operations; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + proc_entry->fill_inode = &monitor_bus_i2c; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ #else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ if (!(proc_entry = kmalloc(sizeof(struct proc_dir_entry)+strlen(name)+1, GFP_KERNEL))) { diff --git a/kernel/sensors.c b/kernel/sensors.c index bf9056a0..27365306 100644 --- a/kernel/sensors.c +++ b/kernel/sensors.c @@ -56,7 +56,8 @@ static struct ctl_table_header *sensors_entries[SENSORS_ENTRY_MAX]; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) static struct i2c_client *sensors_clients[SENSORS_ENTRY_MAX]; static unsigned short sensors_inodes[SENSORS_ENTRY_MAX]; -void sensors_fill_inode(struct inode *inode, int fill); +static void sensors_fill_inode(struct inode *inode, int fill); +static void sensors_dir_fill_inode(struct inode *inode, int fill); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ static ctl_table sysctl_table[] = { @@ -180,7 +181,7 @@ int sensors_register_entry(struct i2c_client *client ,const char *prefix, } #endif /* DEBUG */ sensors_inodes[id-256] = new_header->ctl_table->child->child->de->low_ino; - new_header->ctl_table->child->child->de->fill_inode = &sensors_fill_inode; + new_header->ctl_table->child->child->de->fill_inode = &sensors_dir_fill_inode; #endif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) return id; @@ -203,7 +204,20 @@ void sensors_deregister_entry(int id) } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +/* Monitor access for /proc/sys/dev/sensors; make unloading sensors.o + impossible if some process still uses it or some file in it */ void sensors_fill_inode(struct inode *inode, int fill) +{ + if (fill) + MOD_INC_USE_COUNT; + else + MOD_DEC_USE_COUNT; +} + +/* Monitor access for /proc/sys/dev/sensors/* directories; make unloading + the corresponding module impossible if some process still uses it or + some file in it */ +void sensors_dir_fill_inode(struct inode *inode, int fill) { int i; struct i2c_client *client; @@ -567,6 +581,9 @@ int sensors_init(void) sensors_initialized = 0; if (! (sensors_proc_header = register_sysctl_table(sensors_proc,0))) return -ENOMEM; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + sensors_proc_header->ctl_table->child->de->fill_inode = &sensors_fill_inode; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ sensors_initialized ++; return 0; } diff --git a/src/i2c-proc.c b/src/i2c-proc.c index 64ea3103..ab6304af 100644 --- a/src/i2c-proc.c +++ b/src/i2c-proc.c @@ -41,6 +41,10 @@ static int i2cproc_command(struct i2c_client *client, unsigned int cmd, static void i2cproc_inc_use(struct i2c_client *client); static void i2cproc_dec_use(struct i2c_client *client); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +static void monitor_bus_i2c(struct inode *inode, int fill); +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) static ssize_t i2cproc_bus_read(struct file * file, char * buf,size_t count, @@ -80,6 +84,9 @@ static struct proc_dir_entry proc_bus_i2c_dir = /* size */ 0, /* ops */ NULL, /* get_info */ &read_bus_i2c +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + /* fill_inode */ &monitor_bus_i2c +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ }; /* List of registered entries in /proc/bus */ @@ -223,6 +230,19 @@ int i2cproc_cleanup(void) return 0; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +/* Monitor access to /proc/bus/i2c*; make unloading i2c-proc.o impossible + if some process still uses it or some file in it */ +void monitor_bus_i2c(struct inode *inode, int fill) +{ + if (fill) + MOD_INC_USE_COUNT; + else + MOD_DEC_USE_COUNT; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ + + /* This function generates the output for /proc/bus/i2c */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,29)) int read_bus_i2c(char *buf, char **start, off_t offset, int len, int *eof, @@ -349,6 +369,9 @@ int i2cproc_attach_adapter(struct i2c_adapter *adapter) return -ENOENT; } proc_entry->ops = &i2cproc_inode_operations; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + proc_entry->fill_inode = &monitor_bus_i2c; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ #else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,29)) */ if (!(proc_entry = kmalloc(sizeof(struct proc_dir_entry)+strlen(name)+1, GFP_KERNEL))) { diff --git a/src/sensors.c b/src/sensors.c index bf9056a0..27365306 100644 --- a/src/sensors.c +++ b/src/sensors.c @@ -56,7 +56,8 @@ static struct ctl_table_header *sensors_entries[SENSORS_ENTRY_MAX]; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) static struct i2c_client *sensors_clients[SENSORS_ENTRY_MAX]; static unsigned short sensors_inodes[SENSORS_ENTRY_MAX]; -void sensors_fill_inode(struct inode *inode, int fill); +static void sensors_fill_inode(struct inode *inode, int fill); +static void sensors_dir_fill_inode(struct inode *inode, int fill); #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ static ctl_table sysctl_table[] = { @@ -180,7 +181,7 @@ int sensors_register_entry(struct i2c_client *client ,const char *prefix, } #endif /* DEBUG */ sensors_inodes[id-256] = new_header->ctl_table->child->child->de->low_ino; - new_header->ctl_table->child->child->de->fill_inode = &sensors_fill_inode; + new_header->ctl_table->child->child->de->fill_inode = &sensors_dir_fill_inode; #endif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) return id; @@ -203,7 +204,20 @@ void sensors_deregister_entry(int id) } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) +/* Monitor access for /proc/sys/dev/sensors; make unloading sensors.o + impossible if some process still uses it or some file in it */ void sensors_fill_inode(struct inode *inode, int fill) +{ + if (fill) + MOD_INC_USE_COUNT; + else + MOD_DEC_USE_COUNT; +} + +/* Monitor access for /proc/sys/dev/sensors/* directories; make unloading + the corresponding module impossible if some process still uses it or + some file in it */ +void sensors_dir_fill_inode(struct inode *inode, int fill) { int i; struct i2c_client *client; @@ -567,6 +581,9 @@ int sensors_init(void) sensors_initialized = 0; if (! (sensors_proc_header = register_sysctl_table(sensors_proc,0))) return -ENOMEM; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) + sensors_proc_header->ctl_table->child->de->fill_inode = &sensors_fill_inode; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,58)) */ sensors_initialized ++; return 0; }