diff options
author | Jens Axboe <jaxboe@fusionio.com> | 2011-03-01 15:04:39 -0500 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-03-01 15:04:39 -0500 |
commit | 6fae9c25134baffbeeb20031479e7ff6f6d8eec0 (patch) | |
tree | c9ab89992ce5293a43cd455a81dc8a5926a28a5e /fs/configfs | |
parent | c186794dbb466b45cf40f942f2d09d6d5b4b0e42 (diff) | |
parent | f5412be599602124d2bdd49947b231dd77c0bf99 (diff) |
Merge commit 'v2.6.38-rc6' into for-2.6.39/core
Conflicts:
block/cfq-iosched.c
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'fs/configfs')
-rw-r--r-- | fs/configfs/Kconfig | 4 | ||||
-rw-r--r-- | fs/configfs/configfs_internal.h | 5 | ||||
-rw-r--r-- | fs/configfs/dir.c | 22 | ||||
-rw-r--r-- | fs/configfs/inode.c | 8 | ||||
-rw-r--r-- | fs/configfs/mount.c | 1 |
5 files changed, 17 insertions, 23 deletions
diff --git a/fs/configfs/Kconfig b/fs/configfs/Kconfig index 13587cc97a0b..9febcdefdfdc 100644 --- a/fs/configfs/Kconfig +++ b/fs/configfs/Kconfig | |||
@@ -1,8 +1,8 @@ | |||
1 | config CONFIGFS_FS | 1 | config CONFIGFS_FS |
2 | tristate "Userspace-driven configuration filesystem" | 2 | tristate "Userspace-driven configuration filesystem" |
3 | depends on SYSFS | 3 | select SYSFS |
4 | help | 4 | help |
5 | configfs is a ram-based filesystem that provides the converse | 5 | configfs is a RAM-based filesystem that provides the converse |
6 | of sysfs's functionality. Where sysfs is a filesystem-based | 6 | of sysfs's functionality. Where sysfs is a filesystem-based |
7 | view of kernel objects, configfs is a filesystem-based manager | 7 | view of kernel objects, configfs is a filesystem-based manager |
8 | of kernel objects, or config_items. | 8 | of kernel objects, or config_items. |
diff --git a/fs/configfs/configfs_internal.h b/fs/configfs/configfs_internal.h index da6061a6df40..82bda8fdfc1c 100644 --- a/fs/configfs/configfs_internal.h +++ b/fs/configfs/configfs_internal.h | |||
@@ -90,6 +90,7 @@ extern const struct file_operations configfs_file_operations; | |||
90 | extern const struct file_operations bin_fops; | 90 | extern const struct file_operations bin_fops; |
91 | extern const struct inode_operations configfs_dir_inode_operations; | 91 | extern const struct inode_operations configfs_dir_inode_operations; |
92 | extern const struct inode_operations configfs_symlink_inode_operations; | 92 | extern const struct inode_operations configfs_symlink_inode_operations; |
93 | extern const struct dentry_operations configfs_dentry_ops; | ||
93 | 94 | ||
94 | extern int configfs_symlink(struct inode *dir, struct dentry *dentry, | 95 | extern int configfs_symlink(struct inode *dir, struct dentry *dentry, |
95 | const char *symname); | 96 | const char *symname); |
@@ -120,7 +121,7 @@ static inline struct config_item *configfs_get_config_item(struct dentry *dentry | |||
120 | { | 121 | { |
121 | struct config_item * item = NULL; | 122 | struct config_item * item = NULL; |
122 | 123 | ||
123 | spin_lock(&dcache_lock); | 124 | spin_lock(&dentry->d_lock); |
124 | if (!d_unhashed(dentry)) { | 125 | if (!d_unhashed(dentry)) { |
125 | struct configfs_dirent * sd = dentry->d_fsdata; | 126 | struct configfs_dirent * sd = dentry->d_fsdata; |
126 | if (sd->s_type & CONFIGFS_ITEM_LINK) { | 127 | if (sd->s_type & CONFIGFS_ITEM_LINK) { |
@@ -129,7 +130,7 @@ static inline struct config_item *configfs_get_config_item(struct dentry *dentry | |||
129 | } else | 130 | } else |
130 | item = config_item_get(sd->s_element); | 131 | item = config_item_get(sd->s_element); |
131 | } | 132 | } |
132 | spin_unlock(&dcache_lock); | 133 | spin_unlock(&dentry->d_lock); |
133 | 134 | ||
134 | return item; | 135 | return item; |
135 | } | 136 | } |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 0b502f80c691..90ff3cb10de3 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -67,12 +67,12 @@ static void configfs_d_iput(struct dentry * dentry, | |||
67 | * We _must_ delete our dentries on last dput, as the chain-to-parent | 67 | * We _must_ delete our dentries on last dput, as the chain-to-parent |
68 | * behavior is required to clear the parents of default_groups. | 68 | * behavior is required to clear the parents of default_groups. |
69 | */ | 69 | */ |
70 | static int configfs_d_delete(struct dentry *dentry) | 70 | static int configfs_d_delete(const struct dentry *dentry) |
71 | { | 71 | { |
72 | return 1; | 72 | return 1; |
73 | } | 73 | } |
74 | 74 | ||
75 | static const struct dentry_operations configfs_dentry_ops = { | 75 | const struct dentry_operations configfs_dentry_ops = { |
76 | .d_iput = configfs_d_iput, | 76 | .d_iput = configfs_d_iput, |
77 | /* simple_delete_dentry() isn't exported */ | 77 | /* simple_delete_dentry() isn't exported */ |
78 | .d_delete = configfs_d_delete, | 78 | .d_delete = configfs_d_delete, |
@@ -232,10 +232,8 @@ int configfs_make_dirent(struct configfs_dirent * parent_sd, | |||
232 | 232 | ||
233 | sd->s_mode = mode; | 233 | sd->s_mode = mode; |
234 | sd->s_dentry = dentry; | 234 | sd->s_dentry = dentry; |
235 | if (dentry) { | 235 | if (dentry) |
236 | dentry->d_fsdata = configfs_get(sd); | 236 | dentry->d_fsdata = configfs_get(sd); |
237 | dentry->d_op = &configfs_dentry_ops; | ||
238 | } | ||
239 | 237 | ||
240 | return 0; | 238 | return 0; |
241 | } | 239 | } |
@@ -278,7 +276,6 @@ static int create_dir(struct config_item * k, struct dentry * p, | |||
278 | error = configfs_create(d, mode, init_dir); | 276 | error = configfs_create(d, mode, init_dir); |
279 | if (!error) { | 277 | if (!error) { |
280 | inc_nlink(p->d_inode); | 278 | inc_nlink(p->d_inode); |
281 | (d)->d_op = &configfs_dentry_ops; | ||
282 | } else { | 279 | } else { |
283 | struct configfs_dirent *sd = d->d_fsdata; | 280 | struct configfs_dirent *sd = d->d_fsdata; |
284 | if (sd) { | 281 | if (sd) { |
@@ -371,9 +368,7 @@ int configfs_create_link(struct configfs_symlink *sl, | |||
371 | CONFIGFS_ITEM_LINK); | 368 | CONFIGFS_ITEM_LINK); |
372 | if (!err) { | 369 | if (!err) { |
373 | err = configfs_create(dentry, mode, init_symlink); | 370 | err = configfs_create(dentry, mode, init_symlink); |
374 | if (!err) | 371 | if (err) { |
375 | dentry->d_op = &configfs_dentry_ops; | ||
376 | else { | ||
377 | struct configfs_dirent *sd = dentry->d_fsdata; | 372 | struct configfs_dirent *sd = dentry->d_fsdata; |
378 | if (sd) { | 373 | if (sd) { |
379 | spin_lock(&configfs_dirent_lock); | 374 | spin_lock(&configfs_dirent_lock); |
@@ -399,8 +394,7 @@ static void remove_dir(struct dentry * d) | |||
399 | if (d->d_inode) | 394 | if (d->d_inode) |
400 | simple_rmdir(parent->d_inode,d); | 395 | simple_rmdir(parent->d_inode,d); |
401 | 396 | ||
402 | pr_debug(" o %s removing done (%d)\n",d->d_name.name, | 397 | pr_debug(" o %s removing done (%d)\n",d->d_name.name, d->d_count); |
403 | atomic_read(&d->d_count)); | ||
404 | 398 | ||
405 | dput(parent); | 399 | dput(parent); |
406 | } | 400 | } |
@@ -448,7 +442,6 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den | |||
448 | return error; | 442 | return error; |
449 | } | 443 | } |
450 | 444 | ||
451 | dentry->d_op = &configfs_dentry_ops; | ||
452 | d_rehash(dentry); | 445 | d_rehash(dentry); |
453 | 446 | ||
454 | return 0; | 447 | return 0; |
@@ -493,7 +486,10 @@ static struct dentry * configfs_lookup(struct inode *dir, | |||
493 | * If it doesn't exist and it isn't a NOT_PINNED item, | 486 | * If it doesn't exist and it isn't a NOT_PINNED item, |
494 | * it must be negative. | 487 | * it must be negative. |
495 | */ | 488 | */ |
496 | return simple_lookup(dir, dentry, nd); | 489 | if (dentry->d_name.len > NAME_MAX) |
490 | return ERR_PTR(-ENAMETOOLONG); | ||
491 | d_add(dentry, NULL); | ||
492 | return NULL; | ||
497 | } | 493 | } |
498 | 494 | ||
499 | out: | 495 | out: |
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index 253476d78ed8..c83f4768eeaa 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c | |||
@@ -250,18 +250,14 @@ void configfs_drop_dentry(struct configfs_dirent * sd, struct dentry * parent) | |||
250 | struct dentry * dentry = sd->s_dentry; | 250 | struct dentry * dentry = sd->s_dentry; |
251 | 251 | ||
252 | if (dentry) { | 252 | if (dentry) { |
253 | spin_lock(&dcache_lock); | ||
254 | spin_lock(&dentry->d_lock); | 253 | spin_lock(&dentry->d_lock); |
255 | if (!(d_unhashed(dentry) && dentry->d_inode)) { | 254 | if (!(d_unhashed(dentry) && dentry->d_inode)) { |
256 | dget_locked(dentry); | 255 | dget_dlock(dentry); |
257 | __d_drop(dentry); | 256 | __d_drop(dentry); |
258 | spin_unlock(&dentry->d_lock); | 257 | spin_unlock(&dentry->d_lock); |
259 | spin_unlock(&dcache_lock); | ||
260 | simple_unlink(parent->d_inode, dentry); | 258 | simple_unlink(parent->d_inode, dentry); |
261 | } else { | 259 | } else |
262 | spin_unlock(&dentry->d_lock); | 260 | spin_unlock(&dentry->d_lock); |
263 | spin_unlock(&dcache_lock); | ||
264 | } | ||
265 | } | 261 | } |
266 | } | 262 | } |
267 | 263 | ||
diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c index 7d3607febe1c..ecc62178beda 100644 --- a/fs/configfs/mount.c +++ b/fs/configfs/mount.c | |||
@@ -101,6 +101,7 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent) | |||
101 | configfs_root_group.cg_item.ci_dentry = root; | 101 | configfs_root_group.cg_item.ci_dentry = root; |
102 | root->d_fsdata = &configfs_root; | 102 | root->d_fsdata = &configfs_root; |
103 | sb->s_root = root; | 103 | sb->s_root = root; |
104 | sb->s_d_op = &configfs_dentry_ops; /* the rest get that */ | ||
104 | return 0; | 105 | return 0; |
105 | } | 106 | } |
106 | 107 | ||