From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Maneesh Soni <maneesh@in.ibm.com>, Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 18/23] sysfs: fix problem with duplicate sysfs directories and files
Date: Mon, 20 Mar 2006 14:00:39 -0800 [thread overview]
Message-ID: <11428920391787-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <11428920381762-git-send-email-gregkh@suse.de>
The following patch checks for existing sysfs_dirent before
preparing new one while creating sysfs directories and files.
Signed-off-by: Maneesh Soni <maneesh@in.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/sysfs/dir.c | 32 +++++++++++++++++++++++++++++++-
fs/sysfs/file.c | 6 ++++--
fs/sysfs/symlink.c | 5 +++--
fs/sysfs/sysfs.h | 1 +
4 files changed, 39 insertions(+), 5 deletions(-)
c516865cfbac0d862d4888df91793ad1e74ffd58
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index cfd290d..bea1f4c 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -50,6 +50,32 @@ static struct sysfs_dirent * sysfs_new_d
return sd;
}
+/**
+ *
+ * Return -EEXIST if there is already a sysfs element with the same name for
+ * the same parent.
+ *
+ * called with parent inode's i_mutex held
+ */
+int sysfs_dirent_exist(struct sysfs_dirent *parent_sd,
+ const unsigned char *new)
+{
+ struct sysfs_dirent * sd;
+
+ list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
+ if (sd->s_element) {
+ const unsigned char *existing = sysfs_get_name(sd);
+ if (strcmp(existing, new))
+ continue;
+ else
+ return -EEXIST;
+ }
+ }
+
+ return 0;
+}
+
+
int sysfs_make_dirent(struct sysfs_dirent * parent_sd, struct dentry * dentry,
void * element, umode_t mode, int type)
{
@@ -102,7 +128,11 @@ static int create_dir(struct kobject * k
mutex_lock(&p->d_inode->i_mutex);
*d = lookup_one_len(n, p, strlen(n));
if (!IS_ERR(*d)) {
- error = sysfs_make_dirent(p->d_fsdata, *d, k, mode, SYSFS_DIR);
+ if (sysfs_dirent_exist(p->d_fsdata, n))
+ error = -EEXIST;
+ else
+ error = sysfs_make_dirent(p->d_fsdata, *d, k, mode,
+ SYSFS_DIR);
if (!error) {
error = sysfs_create(*d, mode, init_dir);
if (!error) {
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index e21f402..5e83e72 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -361,10 +361,12 @@ int sysfs_add_file(struct dentry * dir,
{
struct sysfs_dirent * parent_sd = dir->d_fsdata;
umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG;
- int error = 0;
+ int error = -EEXIST;
mutex_lock(&dir->d_inode->i_mutex);
- error = sysfs_make_dirent(parent_sd, NULL, (void *) attr, mode, type);
+ if (!sysfs_dirent_exist(parent_sd, attr->name))
+ error = sysfs_make_dirent(parent_sd, NULL, (void *)attr,
+ mode, type);
mutex_unlock(&dir->d_inode->i_mutex);
return error;
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index e38d633..fe23f47 100644
--- a/fs/sysfs/symlink.c
+++ b/fs/sysfs/symlink.c
@@ -82,12 +82,13 @@ exit1:
int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name)
{
struct dentry * dentry = kobj->dentry;
- int error = 0;
+ int error = -EEXIST;
BUG_ON(!kobj || !kobj->dentry || !name);
mutex_lock(&dentry->d_inode->i_mutex);
- error = sysfs_add_link(dentry, name, target);
+ if (!sysfs_dirent_exist(dentry->d_fsdata, name))
+ error = sysfs_add_link(dentry, name, target);
mutex_unlock(&dentry->d_inode->i_mutex);
return error;
}
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h
index 3f8953e..cf11d5b 100644
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -5,6 +5,7 @@ extern kmem_cache_t *sysfs_dir_cachep;
extern struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent *);
extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *));
+extern int sysfs_dirent_exist(struct sysfs_dirent *, const unsigned char *);
extern int sysfs_make_dirent(struct sysfs_dirent *, struct dentry *, void *,
umode_t, int);
--
1.2.4
next prev parent reply other threads:[~2006-03-20 22:01 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-20 21:50 [GIT PATCH] Driver Core and sysfs stuff for 2.6.16 Greg KH
2006-03-20 22:00 ` [PATCH 01/23] sysfs: sysfs_remove_dir() needs to invalidate the dentry Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 02/23] kobject: fix build error if CONFIG_SYSFS=n Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 03/23] Mark empty release functions as broken Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 04/23] driver core: platform_get_irq*(): return -ENXIO on error Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 05/23] handle errors returned by platform_get_irq*() Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 06/23] kref: avoid an atomic operation in kref_put() Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 07/23] kobj_map semaphore to mutex conversion Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 08/23] Clean up module.c symbol searching logic Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 09/23] add EXPORT_SYMBOL_GPL_FUTURE() Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 12/23] fix module sysfs files reference counting Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 13/23] sysfs: kzalloc conversion Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 14/23] firmware: fix BUG: in fw_realloc_buffer Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 15/23] Driver core: add macros notice(), dev_notice() Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 16/23] Kobject: provide better warning messages when people do stupid things Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 17/23] Kobject: kobject.h: fix a typo Greg Kroah-Hartman
2006-03-20 22:00 ` Greg Kroah-Hartman [this message]
2006-03-20 22:00 ` [PATCH 19/23] debugfs: Add debugfs_create_blob() helper for exporting binary data Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 20/23] kobject_add_dir Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 21/23] get_cpu_sysdev() signedness fix Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 22/23] sysfs: don't export dir symbols Greg Kroah-Hartman
2006-03-20 22:00 ` [PATCH 23/23] sysfs: fix a kobject leak in sysfs_add_link on the error path Greg Kroah-Hartman
2006-03-21 17:16 ` [PATCH 16/23] Kobject: provide better warning messages when people do stupid things Artem B. Bityutskiy
2006-03-22 22:17 ` Greg KH
2006-03-25 8:52 ` Artem B. Bityutskiy
2006-03-20 22:00 ` [PATCH 10/23] add EXPORT_SYMBOL_GPL_FUTURE() to RCU subsystem Greg Kroah-Hartman
2006-03-21 0:13 ` [PATCH 04/23] driver core: platform_get_irq*(): return -ENXIO on error Olivier Galibert
2006-03-21 8:07 ` Russell King
2006-03-21 12:50 ` Olivier Galibert
2006-03-21 20:31 ` Russell King
2006-03-21 22:50 ` Olivier Galibert
2006-03-21 9:33 ` David Vrabel
2006-03-20 23:35 ` [PATCH 02/23] kobject: fix build error if CONFIG_SYSFS=n Jun'ichi Nomura
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11428920391787-git-send-email-gregkh@suse.de \
--to=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=maneesh@in.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.