diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-22 12:52:16 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-22 12:52:16 -0700 |
commit | 3e59ddff2b8dfe42b15520c4f8f2486bd9f9708e (patch) | |
tree | 10587a53ab093fc498fa52651f8a7c1b2b99af60 /fs/configfs/dir.c | |
parent | 6bbd9b6d694ff7242d63cda2faac4bd59ee4328e (diff) | |
parent | eb35746ca5e2211569b91ebb44d55b88ec91f3b0 (diff) |
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2:
ocfs2: Remove overzealous BUG_ON()
ocfs2: Don't print on unknown remote blocking call
ocfs2: Remove EXPERIMENTAL dependency
ocfs2: implement directory read-ahead
ocfs2: properly update i_mtime on buffered write
ocfs2: Fix directory link count checks in ocfs2_link()
ocfs2: move nlink check in ocfs2_mknod()
ocfs2: Fix heartbeat sector calculation
[PATCH] fs/ocfs2/ioctl.c should #include "ioctl.h"
ocfs2: add ext2 attributes
configfs: Prevent duplicate subsystem names.
Diffstat (limited to 'fs/configfs/dir.c')
-rw-r--r-- | fs/configfs/dir.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index df025453dd97..816e8ef64560 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -86,6 +86,32 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent * pare return sd; } +/* + * + * Return -EEXIST if there is already a configfs element with the same + * name for the same parent. + * + * called with parent inode's i_mutex held + */ +int configfs_dirent_exists(struct configfs_dirent *parent_sd, + const unsigned char *new) +{ + struct configfs_dirent * sd; + + list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { + if (sd->s_element) { + const unsigned char *existing = configfs_get_name(sd); + if (strcmp(existing, new)) + continue; + else + return -EEXIST; + } + } + + return 0; +} + + int configfs_make_dirent(struct configfs_dirent * parent_sd, struct dentry * dentry, void * element, umode_t mode, int type) @@ -136,8 +162,10 @@ static int create_dir(struct config_item * k, struct dentry * p, int error; umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; - error = configfs_make_dirent(p->d_fsdata, d, k, mode, - CONFIGFS_DIR); + error = configfs_dirent_exists(p->d_fsdata, d->d_name.name); + if (!error) + error = configfs_make_dirent(p->d_fsdata, d, k, mode, + CONFIGFS_DIR); if (!error) { error = configfs_create(d, mode, init_dir); if (!error) { |