linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / kernel / params.c
index 91aea7a..c76ad25 100644 (file)
@@ -15,6 +15,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
+#include <linux/config.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
@@ -30,7 +31,7 @@
 #define DEBUGP(fmt, a...)
 #endif
 
-static inline char dash2underscore(char c)
+static inline int dash2underscore(char c)
 {
        if (c == '-')
                return '_';
@@ -264,12 +265,12 @@ int param_get_invbool(char *buffer, struct kernel_param *kp)
 }
 
 /* We cheat here and temporarily mangle the string. */
-static int param_array(const char *name,
-                      const char *val,
-                      unsigned int min, unsigned int max,
-                      void *elem, int elemsize,
-                      int (*set)(const char *, struct kernel_param *kp),
-                      int *num)
+int param_array(const char *name,
+               const char *val,
+               unsigned int min, unsigned int max,
+               void *elem, int elemsize,
+               int (*set)(const char *, struct kernel_param *kp),
+               int *num)
 {
        int ret;
        struct kernel_param kp;
@@ -637,8 +638,13 @@ static ssize_t module_attr_show(struct kobject *kobj,
        if (!attribute->show)
                return -EIO;
 
+       if (!try_module_get(mk->mod))
+               return -ENODEV;
+
        ret = attribute->show(attribute, mk->mod, buf);
 
+       module_put(mk->mod);
+
        return ret;
 }
 
@@ -656,8 +662,13 @@ static ssize_t module_attr_store(struct kobject *kobj,
        if (!attribute->store)
                return -EIO;
 
+       if (!try_module_get(mk->mod))
+               return -ENODEV;
+
        ret = attribute->store(attribute, mk->mod, buf, len);
 
+       module_put(mk->mod);
+
        return ret;
 }