Commit de80af4c authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6:
  sysfs: don't warn on removal of a nonexistent binary file
  HOWTO: latest lxr url address changed
  HOWTO: korean translation of Documentation/HOWTO
  Fix Off-by-one in /sys/module/*/refcnt
  sysfs: fix locking in sysfs_lookup() and sysfs_rename_dir()
parents 405d2965 5f1835da
...@@ -208,7 +208,7 @@ tools. One such tool that is particularly recommended is the Linux ...@@ -208,7 +208,7 @@ tools. One such tool that is particularly recommended is the Linux
Cross-Reference project, which is able to present source code in a Cross-Reference project, which is able to present source code in a
self-referential, indexed webpage format. An excellent up-to-date self-referential, indexed webpage format. An excellent up-to-date
repository of the kernel code may be found at: repository of the kernel code may be found at:
http://sosdg.org/~coywolf/lxr/ http://users.sosdg.org/~qiyong/lxr/
The development process The development process
...@@ -384,7 +384,7 @@ One of the best ways to put into practice your hacking skills is by fixing ...@@ -384,7 +384,7 @@ One of the best ways to put into practice your hacking skills is by fixing
bugs reported by other people. Not only you will help to make the kernel bugs reported by other people. Not only you will help to make the kernel
more stable, you'll learn to fix real world problems and you will improve more stable, you'll learn to fix real world problems and you will improve
your skills, and other developers will be aware of your presence. Fixing your skills, and other developers will be aware of your presence. Fixing
bugs is one of the best ways to earn merit amongst the developers, because bugs is one of the best ways to get merits among other developers, because
not many people like wasting time fixing other people's bugs. not many people like wasting time fixing other people's bugs.
To work in the already reported bug reports, go to http://bugzilla.kernel.org. To work in the already reported bug reports, go to http://bugzilla.kernel.org.
......
...@@ -560,7 +560,7 @@ NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people! ...@@ -560,7 +560,7 @@ NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
<http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2> <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
Kernel Documentation/CodingStyle: Kernel Documentation/CodingStyle:
<http://sosdg.org/~coywolf/lxr/source/Documentation/CodingStyle> <http://users.sosdg.org/~qiyong/lxr/source/Documentation/CodingStyle>
Linus Torvalds's mail on the canonical patch format: Linus Torvalds's mail on the canonical patch format:
<http://lkml.org/lkml/2005/4/7/183> <http://lkml.org/lkml/2005/4/7/183>
......
This diff is collapsed.
...@@ -248,12 +248,7 @@ int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr) ...@@ -248,12 +248,7 @@ int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr)
void sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr) void sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr)
{ {
if (sysfs_hash_and_remove(kobj->sd, attr->attr.name) < 0) { sysfs_hash_and_remove(kobj->sd, attr->attr.name);
printk(KERN_ERR "%s: "
"bad dentry or inode or no such file: \"%s\"\n",
__FUNCTION__, attr->attr.name);
dump_stack();
}
} }
EXPORT_SYMBOL_GPL(sysfs_create_bin_file); EXPORT_SYMBOL_GPL(sysfs_create_bin_file);
......
...@@ -762,12 +762,15 @@ static int sysfs_count_nlink(struct sysfs_dirent *sd) ...@@ -762,12 +762,15 @@ static int sysfs_count_nlink(struct sysfs_dirent *sd)
static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
struct nameidata *nd) struct nameidata *nd)
{ {
struct dentry *ret = NULL;
struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata; struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
struct sysfs_dirent * sd; struct sysfs_dirent * sd;
struct bin_attribute *bin_attr; struct bin_attribute *bin_attr;
struct inode *inode; struct inode *inode;
int found = 0; int found = 0;
mutex_lock(&sysfs_mutex);
for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) { for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) {
if (sysfs_type(sd) && if (sysfs_type(sd) &&
!strcmp(sd->s_name, dentry->d_name.name)) { !strcmp(sd->s_name, dentry->d_name.name)) {
...@@ -778,14 +781,14 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -778,14 +781,14 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
/* no such entry */ /* no such entry */
if (!found) if (!found)
return NULL; goto out_unlock;
/* attach dentry and inode */ /* attach dentry and inode */
inode = sysfs_get_inode(sd); inode = sysfs_get_inode(sd);
if (!inode) if (!inode) {
return ERR_PTR(-ENOMEM); ret = ERR_PTR(-ENOMEM);
goto out_unlock;
mutex_lock(&sysfs_mutex); }
if (inode->i_state & I_NEW) { if (inode->i_state & I_NEW) {
/* initialize inode according to type */ /* initialize inode according to type */
...@@ -815,9 +818,9 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -815,9 +818,9 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
sysfs_instantiate(dentry, inode); sysfs_instantiate(dentry, inode);
sysfs_attach_dentry(sd, dentry); sysfs_attach_dentry(sd, dentry);
out_unlock:
mutex_unlock(&sysfs_mutex); mutex_unlock(&sysfs_mutex);
return ret;
return NULL;
} }
const struct inode_operations sysfs_dir_inode_operations = { const struct inode_operations sysfs_dir_inode_operations = {
...@@ -942,6 +945,8 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd, ...@@ -942,6 +945,8 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd,
if (error) if (error)
goto out_drop; goto out_drop;
mutex_lock(&sysfs_mutex);
dup_name = sd->s_name; dup_name = sd->s_name;
sd->s_name = new_name; sd->s_name = new_name;
...@@ -949,8 +954,6 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd, ...@@ -949,8 +954,6 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd,
d_add(new_dentry, NULL); d_add(new_dentry, NULL);
d_move(sd->s_dentry, new_dentry); d_move(sd->s_dentry, new_dentry);
mutex_lock(&sysfs_mutex);
sysfs_unlink_sibling(sd); sysfs_unlink_sibling(sd);
sysfs_get(new_parent_sd); sysfs_get(new_parent_sd);
sysfs_put(sd->s_parent); sysfs_put(sd->s_parent);
......
...@@ -784,8 +784,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr); ...@@ -784,8 +784,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr);
static ssize_t show_refcnt(struct module_attribute *mattr, static ssize_t show_refcnt(struct module_attribute *mattr,
struct module *mod, char *buffer) struct module *mod, char *buffer)
{ {
/* sysfs holds a reference */ return sprintf(buffer, "%u\n", module_refcount(mod));
return sprintf(buffer, "%u\n", module_refcount(mod)-1);
} }
static struct module_attribute refcnt = { static struct module_attribute refcnt = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment