diff options
Diffstat (limited to 'fs/affs')
-rw-r--r-- | fs/affs/amigaffs.c | 4 | ||||
-rw-r--r-- | fs/affs/namei.c | 68 | ||||
-rw-r--r-- | fs/affs/super.c | 11 |
3 files changed, 52 insertions, 31 deletions
diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c index 7d0f0a30f7a3..3a4557e8325c 100644 --- a/fs/affs/amigaffs.c +++ b/fs/affs/amigaffs.c | |||
@@ -128,7 +128,7 @@ affs_fix_dcache(struct dentry *dentry, u32 entry_ino) | |||
128 | void *data = dentry->d_fsdata; | 128 | void *data = dentry->d_fsdata; |
129 | struct list_head *head, *next; | 129 | struct list_head *head, *next; |
130 | 130 | ||
131 | spin_lock(&dcache_lock); | 131 | spin_lock(&inode->i_lock); |
132 | head = &inode->i_dentry; | 132 | head = &inode->i_dentry; |
133 | next = head->next; | 133 | next = head->next; |
134 | while (next != head) { | 134 | while (next != head) { |
@@ -139,7 +139,7 @@ affs_fix_dcache(struct dentry *dentry, u32 entry_ino) | |||
139 | } | 139 | } |
140 | next = next->next; | 140 | next = next->next; |
141 | } | 141 | } |
142 | spin_unlock(&dcache_lock); | 142 | spin_unlock(&inode->i_lock); |
143 | } | 143 | } |
144 | 144 | ||
145 | 145 | ||
diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 914d1c0bc07a..944a4042fb65 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c | |||
@@ -13,11 +13,19 @@ | |||
13 | typedef int (*toupper_t)(int); | 13 | typedef int (*toupper_t)(int); |
14 | 14 | ||
15 | static int affs_toupper(int ch); | 15 | static int affs_toupper(int ch); |
16 | static int affs_hash_dentry(struct dentry *, struct qstr *); | 16 | static int affs_hash_dentry(const struct dentry *, |
17 | static int affs_compare_dentry(struct dentry *, struct qstr *, struct qstr *); | 17 | const struct inode *, struct qstr *); |
18 | static int affs_compare_dentry(const struct dentry *parent, | ||
19 | const struct inode *pinode, | ||
20 | const struct dentry *dentry, const struct inode *inode, | ||
21 | unsigned int len, const char *str, const struct qstr *name); | ||
18 | static int affs_intl_toupper(int ch); | 22 | static int affs_intl_toupper(int ch); |
19 | static int affs_intl_hash_dentry(struct dentry *, struct qstr *); | 23 | static int affs_intl_hash_dentry(const struct dentry *, |
20 | static int affs_intl_compare_dentry(struct dentry *, struct qstr *, struct qstr *); | 24 | const struct inode *, struct qstr *); |
25 | static int affs_intl_compare_dentry(const struct dentry *parent, | ||
26 | const struct inode *pinode, | ||
27 | const struct dentry *dentry, const struct inode *inode, | ||
28 | unsigned int len, const char *str, const struct qstr *name); | ||
21 | 29 | ||
22 | const struct dentry_operations affs_dentry_operations = { | 30 | const struct dentry_operations affs_dentry_operations = { |
23 | .d_hash = affs_hash_dentry, | 31 | .d_hash = affs_hash_dentry, |
@@ -58,13 +66,13 @@ affs_get_toupper(struct super_block *sb) | |||
58 | * Note: the dentry argument is the parent dentry. | 66 | * Note: the dentry argument is the parent dentry. |
59 | */ | 67 | */ |
60 | static inline int | 68 | static inline int |
61 | __affs_hash_dentry(struct dentry *dentry, struct qstr *qstr, toupper_t toupper) | 69 | __affs_hash_dentry(struct qstr *qstr, toupper_t toupper) |
62 | { | 70 | { |
63 | const u8 *name = qstr->name; | 71 | const u8 *name = qstr->name; |
64 | unsigned long hash; | 72 | unsigned long hash; |
65 | int i; | 73 | int i; |
66 | 74 | ||
67 | i = affs_check_name(qstr->name,qstr->len); | 75 | i = affs_check_name(qstr->name, qstr->len); |
68 | if (i) | 76 | if (i) |
69 | return i; | 77 | return i; |
70 | 78 | ||
@@ -78,39 +86,41 @@ __affs_hash_dentry(struct dentry *dentry, struct qstr *qstr, toupper_t toupper) | |||
78 | } | 86 | } |
79 | 87 | ||
80 | static int | 88 | static int |
81 | affs_hash_dentry(struct dentry *dentry, struct qstr *qstr) | 89 | affs_hash_dentry(const struct dentry *dentry, const struct inode *inode, |
90 | struct qstr *qstr) | ||
82 | { | 91 | { |
83 | return __affs_hash_dentry(dentry, qstr, affs_toupper); | 92 | return __affs_hash_dentry(qstr, affs_toupper); |
84 | } | 93 | } |
85 | static int | 94 | static int |
86 | affs_intl_hash_dentry(struct dentry *dentry, struct qstr *qstr) | 95 | affs_intl_hash_dentry(const struct dentry *dentry, const struct inode *inode, |
96 | struct qstr *qstr) | ||
87 | { | 97 | { |
88 | return __affs_hash_dentry(dentry, qstr, affs_intl_toupper); | 98 | return __affs_hash_dentry(qstr, affs_intl_toupper); |
89 | } | 99 | } |
90 | 100 | ||
91 | static inline int | 101 | static inline int __affs_compare_dentry(unsigned int len, |
92 | __affs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b, toupper_t toupper) | 102 | const char *str, const struct qstr *name, toupper_t toupper) |
93 | { | 103 | { |
94 | const u8 *aname = a->name; | 104 | const u8 *aname = str; |
95 | const u8 *bname = b->name; | 105 | const u8 *bname = name->name; |
96 | int len; | ||
97 | 106 | ||
98 | /* 'a' is the qstr of an already existing dentry, so the name | 107 | /* |
99 | * must be valid. 'b' must be validated first. | 108 | * 'str' is the name of an already existing dentry, so the name |
109 | * must be valid. 'name' must be validated first. | ||
100 | */ | 110 | */ |
101 | 111 | ||
102 | if (affs_check_name(b->name,b->len)) | 112 | if (affs_check_name(name->name, name->len)) |
103 | return 1; | 113 | return 1; |
104 | 114 | ||
105 | /* If the names are longer than the allowed 30 chars, | 115 | /* |
116 | * If the names are longer than the allowed 30 chars, | ||
106 | * the excess is ignored, so their length may differ. | 117 | * the excess is ignored, so their length may differ. |
107 | */ | 118 | */ |
108 | len = a->len; | ||
109 | if (len >= 30) { | 119 | if (len >= 30) { |
110 | if (b->len < 30) | 120 | if (name->len < 30) |
111 | return 1; | 121 | return 1; |
112 | len = 30; | 122 | len = 30; |
113 | } else if (len != b->len) | 123 | } else if (len != name->len) |
114 | return 1; | 124 | return 1; |
115 | 125 | ||
116 | for (; len > 0; len--) | 126 | for (; len > 0; len--) |
@@ -121,14 +131,18 @@ __affs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b, tou | |||
121 | } | 131 | } |
122 | 132 | ||
123 | static int | 133 | static int |
124 | affs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b) | 134 | affs_compare_dentry(const struct dentry *parent, const struct inode *pinode, |
135 | const struct dentry *dentry, const struct inode *inode, | ||
136 | unsigned int len, const char *str, const struct qstr *name) | ||
125 | { | 137 | { |
126 | return __affs_compare_dentry(dentry, a, b, affs_toupper); | 138 | return __affs_compare_dentry(len, str, name, affs_toupper); |
127 | } | 139 | } |
128 | static int | 140 | static int |
129 | affs_intl_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b) | 141 | affs_intl_compare_dentry(const struct dentry *parent,const struct inode *pinode, |
142 | const struct dentry *dentry, const struct inode *inode, | ||
143 | unsigned int len, const char *str, const struct qstr *name) | ||
130 | { | 144 | { |
131 | return __affs_compare_dentry(dentry, a, b, affs_intl_toupper); | 145 | return __affs_compare_dentry(len, str, name, affs_intl_toupper); |
132 | } | 146 | } |
133 | 147 | ||
134 | /* | 148 | /* |
@@ -226,7 +240,7 @@ affs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
226 | if (IS_ERR(inode)) | 240 | if (IS_ERR(inode)) |
227 | return ERR_CAST(inode); | 241 | return ERR_CAST(inode); |
228 | } | 242 | } |
229 | dentry->d_op = AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations; | 243 | d_set_d_op(dentry, AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations); |
230 | d_add(dentry, inode); | 244 | d_add(dentry, inode); |
231 | return NULL; | 245 | return NULL; |
232 | } | 246 | } |
diff --git a/fs/affs/super.c b/fs/affs/super.c index 0cf7f4384cbd..d39081bbe7ce 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -95,11 +95,18 @@ static struct inode *affs_alloc_inode(struct super_block *sb) | |||
95 | return &i->vfs_inode; | 95 | return &i->vfs_inode; |
96 | } | 96 | } |
97 | 97 | ||
98 | static void affs_destroy_inode(struct inode *inode) | 98 | static void affs_i_callback(struct rcu_head *head) |
99 | { | 99 | { |
100 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
101 | INIT_LIST_HEAD(&inode->i_dentry); | ||
100 | kmem_cache_free(affs_inode_cachep, AFFS_I(inode)); | 102 | kmem_cache_free(affs_inode_cachep, AFFS_I(inode)); |
101 | } | 103 | } |
102 | 104 | ||
105 | static void affs_destroy_inode(struct inode *inode) | ||
106 | { | ||
107 | call_rcu(&inode->i_rcu, affs_i_callback); | ||
108 | } | ||
109 | |||
103 | static void init_once(void *foo) | 110 | static void init_once(void *foo) |
104 | { | 111 | { |
105 | struct affs_inode_info *ei = (struct affs_inode_info *) foo; | 112 | struct affs_inode_info *ei = (struct affs_inode_info *) foo; |
@@ -475,7 +482,7 @@ got_root: | |||
475 | printk(KERN_ERR "AFFS: Get root inode failed\n"); | 482 | printk(KERN_ERR "AFFS: Get root inode failed\n"); |
476 | goto out_error; | 483 | goto out_error; |
477 | } | 484 | } |
478 | sb->s_root->d_op = &affs_dentry_operations; | 485 | d_set_d_op(sb->s_root, &affs_dentry_operations); |
479 | 486 | ||
480 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); | 487 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); |
481 | return 0; | 488 | return 0; |