Commit cab4e4c4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-module-and-param:
  module: use strstarts()
  strstarts: helper function for !strncmp(str, prefix, strlen(prefix))
  arm: allow usage of string functions in linux/string.h
  module: don't use stop_machine on module load
  module: create a request_module_nowait()
  module: include other structures in module version check
  module: remove the SHF_ALLOC flag on the __versions section.
  module: clarify the force-loading taint message.
  module: Export symbols needed for Ksplice
  Ksplice: Add functions for walking kallsyms symbols
  module: remove module_text_address()
  module: __module_address
  module: Make find_symbol return a struct kernel_symbol
  kernel/module.c: fix an unused goto label
  param: fix charp parameters set via sysfs

Fix trivial conflicts in kernel/extable.c manually.
parents 5412b539 49502677
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -18,7 +18,10 @@


unsigned int __machine_arch_type;
unsigned int __machine_arch_type;


#include <linux/string.h>
#include <linux/compiler.h>	/* for inline */
#include <linux/types.h>	/* for size_t */
#include <linux/stddef.h>	/* for NULL */
#include <asm/string.h>


#ifdef STANDALONE_DEBUG
#ifdef STANDALONE_DEBUG
#define putstr printf
#define putstr printf
+2 −2
Original line number Original line Diff line number Diff line
@@ -2720,14 +2720,14 @@ int nand_scan_tail(struct mtd_info *mtd)
	return chip->scan_bbt(mtd);
	return chip->scan_bbt(mtd);
}
}


/* module_text_address() isn't exported, and it's mostly a pointless
/* is_module_text_address() isn't exported, and it's mostly a pointless
   test if this is a module _anyway_ -- they'd have to try _really_ hard
   test if this is a module _anyway_ -- they'd have to try _really_ hard
   to call us from in-kernel code if the core NAND support is modular. */
   to call us from in-kernel code if the core NAND support is modular. */
#ifdef MODULE
#ifdef MODULE
#define caller_is_module() (1)
#define caller_is_module() (1)
#else
#else
#define caller_is_module() \
#define caller_is_module() \
	module_text_address((unsigned long)__builtin_return_address(0))
	is_module_text_address((unsigned long)__builtin_return_address(0))
#endif
#endif


/**
/**
+15 −0
Original line number Original line Diff line number Diff line
@@ -13,10 +13,17 @@
#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \
#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \
			 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1)
			 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1)


struct module;

#ifdef CONFIG_KALLSYMS
#ifdef CONFIG_KALLSYMS
/* Lookup the address for a symbol. Returns 0 if not found. */
/* Lookup the address for a symbol. Returns 0 if not found. */
unsigned long kallsyms_lookup_name(const char *name);
unsigned long kallsyms_lookup_name(const char *name);


/* Call a function on each kallsyms symbol in the core kernel */
int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
				      unsigned long),
			    void *data);

extern int kallsyms_lookup_size_offset(unsigned long addr,
extern int kallsyms_lookup_size_offset(unsigned long addr,
				  unsigned long *symbolsize,
				  unsigned long *symbolsize,
				  unsigned long *offset);
				  unsigned long *offset);
@@ -43,6 +50,14 @@ static inline unsigned long kallsyms_lookup_name(const char *name)
	return 0;
	return 0;
}
}


static inline int kallsyms_on_each_symbol(int (*fn)(void *, const char *,
						    struct module *,
						    unsigned long),
					  void *data)
{
	return 0;
}

static inline int kallsyms_lookup_size_offset(unsigned long addr,
static inline int kallsyms_lookup_size_offset(unsigned long addr,
					      unsigned long *symbolsize,
					      unsigned long *symbolsize,
					      unsigned long *offset)
					      unsigned long *offset)
+8 −3
Original line number Original line Diff line number Diff line
@@ -29,10 +29,15 @@
#ifdef CONFIG_MODULES
#ifdef CONFIG_MODULES
/* modprobe exit status on success, -ve on error.  Return value
/* modprobe exit status on success, -ve on error.  Return value
 * usually useless though. */
 * usually useless though. */
extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
extern int __request_module(bool wait, const char *name, ...) \
#define try_then_request_module(x, mod...) ((x) ?: (request_module(mod), (x)))
	__attribute__((format(printf, 2, 3)));
#define request_module(mod...) __request_module(true, mod)
#define request_module_nowait(mod...) __request_module(false, mod)
#define try_then_request_module(x, mod...) \
	((x) ?: (__request_module(false, mod), (x)))
#else
#else
static inline int request_module(const char *name, ...) { return -ENOSYS; }
static inline int request_module(const char *name, ...) { return -ENOSYS; }
static inline int request_module_nowait(const char *name, ...) { return -ENOSYS; }
#define try_then_request_module(x, mod...) (x)
#define try_then_request_module(x, mod...) (x)
#endif
#endif


+55 −8
Original line number Original line Diff line number Diff line
@@ -248,6 +248,10 @@ struct module
	const unsigned long *crcs;
	const unsigned long *crcs;
	unsigned int num_syms;
	unsigned int num_syms;


	/* Kernel parameters. */
	struct kernel_param *kp;
	unsigned int num_kp;

	/* GPL-only exported symbols. */
	/* GPL-only exported symbols. */
	unsigned int num_gpl_syms;
	unsigned int num_gpl_syms;
	const struct kernel_symbol *gpl_syms;
	const struct kernel_symbol *gpl_syms;
@@ -350,6 +354,8 @@ struct module
#define MODULE_ARCH_INIT {}
#define MODULE_ARCH_INIT {}
#endif
#endif


extern struct mutex module_mutex;

/* FIXME: It'd be nice to isolate modules during init, too, so they
/* FIXME: It'd be nice to isolate modules during init, too, so they
   aren't used before they (may) fail.  But presently too much code
   aren't used before they (may) fail.  But presently too much code
   (IDE & SCSI) require entry into the module during init.*/
   (IDE & SCSI) require entry into the module during init.*/
@@ -358,10 +364,10 @@ static inline int module_is_live(struct module *mod)
	return mod->state != MODULE_STATE_GOING;
	return mod->state != MODULE_STATE_GOING;
}
}


/* Is this address in a module? (second is with no locks, for oops) */
struct module *module_text_address(unsigned long addr);
struct module *__module_text_address(unsigned long addr);
struct module *__module_text_address(unsigned long addr);
int is_module_address(unsigned long addr);
struct module *__module_address(unsigned long addr);
bool is_module_address(unsigned long addr);
bool is_module_text_address(unsigned long addr);


static inline int within_module_core(unsigned long addr, struct module *mod)
static inline int within_module_core(unsigned long addr, struct module *mod)
{
{
@@ -375,6 +381,31 @@ static inline int within_module_init(unsigned long addr, struct module *mod)
	       addr < (unsigned long)mod->module_init + mod->init_size;
	       addr < (unsigned long)mod->module_init + mod->init_size;
}
}


/* Search for module by name: must hold module_mutex. */
struct module *find_module(const char *name);

struct symsearch {
	const struct kernel_symbol *start, *stop;
	const unsigned long *crcs;
	enum {
		NOT_GPL_ONLY,
		GPL_ONLY,
		WILL_BE_GPL_ONLY,
	} licence;
	bool unused;
};

/* Search for an exported symbol by name. */
const struct kernel_symbol *find_symbol(const char *name,
					struct module **owner,
					const unsigned long **crc,
					bool gplok,
					bool warn);

/* Walk the exported symbol table */
bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
			    unsigned int symnum, void *data), void *data);

/* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
/* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
   symnum out of range. */
   symnum out of range. */
int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
@@ -383,6 +414,10 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
/* Look for this name: can be of form module:name. */
/* Look for this name: can be of form module:name. */
unsigned long module_kallsyms_lookup_name(const char *name);
unsigned long module_kallsyms_lookup_name(const char *name);


int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
					     struct module *, unsigned long),
				   void *data);

extern void __module_put_and_exit(struct module *mod, long code)
extern void __module_put_and_exit(struct module *mod, long code)
	__attribute__((noreturn));
	__attribute__((noreturn));
#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
@@ -444,6 +479,7 @@ static inline void __module_get(struct module *module)
#define symbol_put_addr(p) do { } while(0)
#define symbol_put_addr(p) do { } while(0)


#endif /* CONFIG_MODULE_UNLOAD */
#endif /* CONFIG_MODULE_UNLOAD */
int use_module(struct module *a, struct module *b);


/* This is a #define so the string doesn't get put in every .o file */
/* This is a #define so the string doesn't get put in every .o file */
#define module_name(mod)			\
#define module_name(mod)			\
@@ -490,21 +526,24 @@ search_module_extables(unsigned long addr)
	return NULL;
	return NULL;
}
}


/* Is this address in a module? */
static inline struct module *__module_address(unsigned long addr)
static inline struct module *module_text_address(unsigned long addr)
{
{
	return NULL;
	return NULL;
}
}


/* Is this address in a module? (don't take a lock, we're oopsing) */
static inline struct module *__module_text_address(unsigned long addr)
static inline struct module *__module_text_address(unsigned long addr)
{
{
	return NULL;
	return NULL;
}
}


static inline int is_module_address(unsigned long addr)
static inline bool is_module_address(unsigned long addr)
{
{
	return 0;
	return false;
}

static inline bool is_module_text_address(unsigned long addr)
{
	return false;
}
}


/* Get/put a kernel symbol (calls should be symmetric) */
/* Get/put a kernel symbol (calls should be symmetric) */
@@ -559,6 +598,14 @@ static inline unsigned long module_kallsyms_lookup_name(const char *name)
	return 0;
	return 0;
}
}


static inline int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
							   struct module *,
							   unsigned long),
						 void *data)
{
	return 0;
}

static inline int register_module_notifier(struct notifier_block * nb)
static inline int register_module_notifier(struct notifier_block * nb)
{
{
	/* no events will happen anyway, so this can always succeed */
	/* no events will happen anyway, so this can always succeed */
Loading