diff options
Diffstat (limited to 'fs/adfs')
-rw-r--r-- | fs/adfs/dir.c | 12 | ||||
-rw-r--r-- | fs/adfs/super.c | 13 |
2 files changed, 17 insertions, 8 deletions
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index f4287e4de744..3b4a764ed780 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c | |||
@@ -201,7 +201,8 @@ const struct file_operations adfs_dir_operations = { | |||
201 | }; | 201 | }; |
202 | 202 | ||
203 | static int | 203 | static int |
204 | adfs_hash(struct dentry *parent, struct qstr *qstr) | 204 | adfs_hash(const struct dentry *parent, const struct inode *inode, |
205 | struct qstr *qstr) | ||
205 | { | 206 | { |
206 | const unsigned int name_len = ADFS_SB(parent->d_sb)->s_namelen; | 207 | const unsigned int name_len = ADFS_SB(parent->d_sb)->s_namelen; |
207 | const unsigned char *name; | 208 | const unsigned char *name; |
@@ -237,17 +238,19 @@ adfs_hash(struct dentry *parent, struct qstr *qstr) | |||
237 | * requirements of the underlying filesystem. | 238 | * requirements of the underlying filesystem. |
238 | */ | 239 | */ |
239 | static int | 240 | static int |
240 | adfs_compare(struct dentry *parent, struct qstr *entry, struct qstr *name) | 241 | adfs_compare(const struct dentry *parent, const struct inode *pinode, |
242 | const struct dentry *dentry, const struct inode *inode, | ||
243 | unsigned int len, const char *str, const struct qstr *name) | ||
241 | { | 244 | { |
242 | int i; | 245 | int i; |
243 | 246 | ||
244 | if (entry->len != name->len) | 247 | if (len != name->len) |
245 | return 1; | 248 | return 1; |
246 | 249 | ||
247 | for (i = 0; i < name->len; i++) { | 250 | for (i = 0; i < name->len; i++) { |
248 | char a, b; | 251 | char a, b; |
249 | 252 | ||
250 | a = entry->name[i]; | 253 | a = str[i]; |
251 | b = name->name[i]; | 254 | b = name->name[i]; |
252 | 255 | ||
253 | if (a >= 'A' && a <= 'Z') | 256 | if (a >= 'A' && a <= 'Z') |
@@ -273,7 +276,6 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
273 | struct object_info obj; | 276 | struct object_info obj; |
274 | int error; | 277 | int error; |
275 | 278 | ||
276 | dentry->d_op = &adfs_dentry_operations; | ||
277 | lock_kernel(); | 279 | lock_kernel(); |
278 | error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj); | 280 | error = adfs_dir_lookup_byname(dir, &dentry->d_name, &obj); |
279 | if (error == 0) { | 281 | if (error == 0) { |
diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 959dbff2d42d..2d7954049fbe 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c | |||
@@ -240,11 +240,18 @@ static struct inode *adfs_alloc_inode(struct super_block *sb) | |||
240 | return &ei->vfs_inode; | 240 | return &ei->vfs_inode; |
241 | } | 241 | } |
242 | 242 | ||
243 | static void adfs_destroy_inode(struct inode *inode) | 243 | static void adfs_i_callback(struct rcu_head *head) |
244 | { | 244 | { |
245 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
246 | INIT_LIST_HEAD(&inode->i_dentry); | ||
245 | kmem_cache_free(adfs_inode_cachep, ADFS_I(inode)); | 247 | kmem_cache_free(adfs_inode_cachep, ADFS_I(inode)); |
246 | } | 248 | } |
247 | 249 | ||
250 | static void adfs_destroy_inode(struct inode *inode) | ||
251 | { | ||
252 | call_rcu(&inode->i_rcu, adfs_i_callback); | ||
253 | } | ||
254 | |||
248 | static void init_once(void *foo) | 255 | static void init_once(void *foo) |
249 | { | 256 | { |
250 | struct adfs_inode_info *ei = (struct adfs_inode_info *) foo; | 257 | struct adfs_inode_info *ei = (struct adfs_inode_info *) foo; |
@@ -466,6 +473,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) | |||
466 | asb->s_namelen = ADFS_F_NAME_LEN; | 473 | asb->s_namelen = ADFS_F_NAME_LEN; |
467 | } | 474 | } |
468 | 475 | ||
476 | sb->s_d_op = &adfs_dentry_operations; | ||
469 | root = adfs_iget(sb, &root_obj); | 477 | root = adfs_iget(sb, &root_obj); |
470 | sb->s_root = d_alloc_root(root); | 478 | sb->s_root = d_alloc_root(root); |
471 | if (!sb->s_root) { | 479 | if (!sb->s_root) { |
@@ -476,8 +484,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) | |||
476 | kfree(asb->s_map); | 484 | kfree(asb->s_map); |
477 | adfs_error(sb, "get root inode failed\n"); | 485 | adfs_error(sb, "get root inode failed\n"); |
478 | goto error; | 486 | goto error; |
479 | } else | 487 | } |
480 | sb->s_root->d_op = &adfs_dentry_operations; | ||
481 | unlock_kernel(); | 488 | unlock_kernel(); |
482 | return 0; | 489 | return 0; |
483 | 490 | ||