diff options
Diffstat (limited to 'fs/hpfs')
-rw-r--r-- | fs/hpfs/anode.c | 2 | ||||
-rw-r--r-- | fs/hpfs/buffer.c | 1 | ||||
-rw-r--r-- | fs/hpfs/dentry.c | 14 | ||||
-rw-r--r-- | fs/hpfs/dir.c | 15 | ||||
-rw-r--r-- | fs/hpfs/dnode.c | 21 | ||||
-rw-r--r-- | fs/hpfs/ea.c | 7 | ||||
-rw-r--r-- | fs/hpfs/hpfs_fn.h | 30 | ||||
-rw-r--r-- | fs/hpfs/inode.c | 5 | ||||
-rw-r--r-- | fs/hpfs/map.c | 6 | ||||
-rw-r--r-- | fs/hpfs/name.c | 21 | ||||
-rw-r--r-- | fs/hpfs/namei.c | 75 | ||||
-rw-r--r-- | fs/hpfs/super.c | 18 |
12 files changed, 118 insertions, 97 deletions
diff --git a/fs/hpfs/anode.c b/fs/hpfs/anode.c index 1aa88c4e0964..6a2f04bf3df0 100644 --- a/fs/hpfs/anode.c +++ b/fs/hpfs/anode.c | |||
@@ -353,7 +353,7 @@ int hpfs_ea_read(struct super_block *s, secno a, int ano, unsigned pos, | |||
353 | } | 353 | } |
354 | 354 | ||
355 | int hpfs_ea_write(struct super_block *s, secno a, int ano, unsigned pos, | 355 | int hpfs_ea_write(struct super_block *s, secno a, int ano, unsigned pos, |
356 | unsigned len, char *buf) | 356 | unsigned len, const char *buf) |
357 | { | 357 | { |
358 | struct buffer_head *bh; | 358 | struct buffer_head *bh; |
359 | char *data; | 359 | char *data; |
diff --git a/fs/hpfs/buffer.c b/fs/hpfs/buffer.c index b6fca543544c..eac5f96323e3 100644 --- a/fs/hpfs/buffer.c +++ b/fs/hpfs/buffer.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * general buffer i/o | 6 | * general buffer i/o |
7 | */ | 7 | */ |
8 | #include <linux/sched.h> | 8 | #include <linux/sched.h> |
9 | #include <linux/slab.h> | ||
9 | #include "hpfs_fn.h" | 10 | #include "hpfs_fn.h" |
10 | 11 | ||
11 | void hpfs_lock_creation(struct super_block *s) | 12 | void hpfs_lock_creation(struct super_block *s) |
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c index 940d6d150bee..67d9d36b3d5f 100644 --- a/fs/hpfs/dentry.c +++ b/fs/hpfs/dentry.c | |||
@@ -20,8 +20,8 @@ static int hpfs_hash_dentry(struct dentry *dentry, struct qstr *qstr) | |||
20 | 20 | ||
21 | if (l == 1) if (qstr->name[0]=='.') goto x; | 21 | if (l == 1) if (qstr->name[0]=='.') goto x; |
22 | if (l == 2) if (qstr->name[0]=='.' || qstr->name[1]=='.') goto x; | 22 | if (l == 2) if (qstr->name[0]=='.' || qstr->name[1]=='.') goto x; |
23 | hpfs_adjust_length((char *)qstr->name, &l); | 23 | hpfs_adjust_length(qstr->name, &l); |
24 | /*if (hpfs_chk_name((char *)qstr->name,&l))*/ | 24 | /*if (hpfs_chk_name(qstr->name,&l))*/ |
25 | /*return -ENAMETOOLONG;*/ | 25 | /*return -ENAMETOOLONG;*/ |
26 | /*return -ENOENT;*/ | 26 | /*return -ENOENT;*/ |
27 | x: | 27 | x: |
@@ -38,14 +38,16 @@ static int hpfs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qst | |||
38 | { | 38 | { |
39 | unsigned al=a->len; | 39 | unsigned al=a->len; |
40 | unsigned bl=b->len; | 40 | unsigned bl=b->len; |
41 | hpfs_adjust_length((char *)a->name, &al); | 41 | hpfs_adjust_length(a->name, &al); |
42 | /*hpfs_adjust_length((char *)b->name, &bl);*/ | 42 | /*hpfs_adjust_length(b->name, &bl);*/ |
43 | /* 'a' is the qstr of an already existing dentry, so the name | 43 | /* 'a' is the qstr of an already existing dentry, so the name |
44 | * must be valid. 'b' must be validated first. | 44 | * must be valid. 'b' must be validated first. |
45 | */ | 45 | */ |
46 | 46 | ||
47 | if (hpfs_chk_name((char *)b->name, &bl)) return 1; | 47 | if (hpfs_chk_name(b->name, &bl)) |
48 | if (hpfs_compare_names(dentry->d_sb, (char *)a->name, al, (char *)b->name, bl, 0)) return 1; | 48 | return 1; |
49 | if (hpfs_compare_names(dentry->d_sb, a->name, al, b->name, bl, 0)) | ||
50 | return 1; | ||
49 | return 0; | 51 | return 0; |
50 | } | 52 | } |
51 | 53 | ||
diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 8865c94f55f6..2338130cceba 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c | |||
@@ -7,6 +7,7 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/smp_lock.h> | 9 | #include <linux/smp_lock.h> |
10 | #include <linux/slab.h> | ||
10 | #include "hpfs_fn.h" | 11 | #include "hpfs_fn.h" |
11 | 12 | ||
12 | static int hpfs_dir_release(struct inode *inode, struct file *filp) | 13 | static int hpfs_dir_release(struct inode *inode, struct file *filp) |
@@ -59,7 +60,7 @@ static int hpfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
59 | struct hpfs_dirent *de; | 60 | struct hpfs_dirent *de; |
60 | int lc; | 61 | int lc; |
61 | long old_pos; | 62 | long old_pos; |
62 | char *tempname; | 63 | unsigned char *tempname; |
63 | int c1, c2 = 0; | 64 | int c1, c2 = 0; |
64 | int ret = 0; | 65 | int ret = 0; |
65 | 66 | ||
@@ -158,11 +159,11 @@ static int hpfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
158 | tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); | 159 | tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); |
159 | if (filldir(dirent, tempname, de->namelen, old_pos, de->fnode, DT_UNKNOWN) < 0) { | 160 | if (filldir(dirent, tempname, de->namelen, old_pos, de->fnode, DT_UNKNOWN) < 0) { |
160 | filp->f_pos = old_pos; | 161 | filp->f_pos = old_pos; |
161 | if (tempname != (char *)de->name) kfree(tempname); | 162 | if (tempname != de->name) kfree(tempname); |
162 | hpfs_brelse4(&qbh); | 163 | hpfs_brelse4(&qbh); |
163 | goto out; | 164 | goto out; |
164 | } | 165 | } |
165 | if (tempname != (char *)de->name) kfree(tempname); | 166 | if (tempname != de->name) kfree(tempname); |
166 | hpfs_brelse4(&qbh); | 167 | hpfs_brelse4(&qbh); |
167 | } | 168 | } |
168 | out: | 169 | out: |
@@ -187,7 +188,7 @@ out: | |||
187 | 188 | ||
188 | struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | 189 | struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) |
189 | { | 190 | { |
190 | const char *name = dentry->d_name.name; | 191 | const unsigned char *name = dentry->d_name.name; |
191 | unsigned len = dentry->d_name.len; | 192 | unsigned len = dentry->d_name.len; |
192 | struct quad_buffer_head qbh; | 193 | struct quad_buffer_head qbh; |
193 | struct hpfs_dirent *de; | 194 | struct hpfs_dirent *de; |
@@ -197,7 +198,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
197 | struct hpfs_inode_info *hpfs_result; | 198 | struct hpfs_inode_info *hpfs_result; |
198 | 199 | ||
199 | lock_kernel(); | 200 | lock_kernel(); |
200 | if ((err = hpfs_chk_name((char *)name, &len))) { | 201 | if ((err = hpfs_chk_name(name, &len))) { |
201 | if (err == -ENAMETOOLONG) { | 202 | if (err == -ENAMETOOLONG) { |
202 | unlock_kernel(); | 203 | unlock_kernel(); |
203 | return ERR_PTR(-ENAMETOOLONG); | 204 | return ERR_PTR(-ENAMETOOLONG); |
@@ -209,7 +210,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
209 | * '.' and '..' will never be passed here. | 210 | * '.' and '..' will never be passed here. |
210 | */ | 211 | */ |
211 | 212 | ||
212 | de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *) name, len, NULL, &qbh); | 213 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, NULL, &qbh); |
213 | 214 | ||
214 | /* | 215 | /* |
215 | * This is not really a bailout, just means file not found. | 216 | * This is not really a bailout, just means file not found. |
@@ -250,7 +251,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
250 | hpfs_result = hpfs_i(result); | 251 | hpfs_result = hpfs_i(result); |
251 | if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino; | 252 | if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino; |
252 | 253 | ||
253 | hpfs_decide_conv(result, (char *)name, len); | 254 | hpfs_decide_conv(result, name, len); |
254 | 255 | ||
255 | if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) { | 256 | if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) { |
256 | hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures"); | 257 | hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures"); |
diff --git a/fs/hpfs/dnode.c b/fs/hpfs/dnode.c index fe83c2b7d2d8..9b2ffadfc8c4 100644 --- a/fs/hpfs/dnode.c +++ b/fs/hpfs/dnode.c | |||
@@ -158,7 +158,8 @@ static void set_last_pointer(struct super_block *s, struct dnode *d, dnode_secno | |||
158 | 158 | ||
159 | /* Add an entry to dnode and don't care if it grows over 2048 bytes */ | 159 | /* Add an entry to dnode and don't care if it grows over 2048 bytes */ |
160 | 160 | ||
161 | struct hpfs_dirent *hpfs_add_de(struct super_block *s, struct dnode *d, unsigned char *name, | 161 | struct hpfs_dirent *hpfs_add_de(struct super_block *s, struct dnode *d, |
162 | const unsigned char *name, | ||
162 | unsigned namelen, secno down_ptr) | 163 | unsigned namelen, secno down_ptr) |
163 | { | 164 | { |
164 | struct hpfs_dirent *de; | 165 | struct hpfs_dirent *de; |
@@ -223,7 +224,7 @@ static void fix_up_ptrs(struct super_block *s, struct dnode *d) | |||
223 | /* Add an entry to dnode and do dnode splitting if required */ | 224 | /* Add an entry to dnode and do dnode splitting if required */ |
224 | 225 | ||
225 | static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | 226 | static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, |
226 | unsigned char *name, unsigned namelen, | 227 | const unsigned char *name, unsigned namelen, |
227 | struct hpfs_dirent *new_de, dnode_secno down_ptr) | 228 | struct hpfs_dirent *new_de, dnode_secno down_ptr) |
228 | { | 229 | { |
229 | struct quad_buffer_head qbh, qbh1, qbh2; | 230 | struct quad_buffer_head qbh, qbh1, qbh2; |
@@ -231,7 +232,7 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
231 | dnode_secno adno, rdno; | 232 | dnode_secno adno, rdno; |
232 | struct hpfs_dirent *de; | 233 | struct hpfs_dirent *de; |
233 | struct hpfs_dirent nde; | 234 | struct hpfs_dirent nde; |
234 | char *nname; | 235 | unsigned char *nname; |
235 | int h; | 236 | int h; |
236 | int pos; | 237 | int pos; |
237 | struct buffer_head *bh; | 238 | struct buffer_head *bh; |
@@ -305,7 +306,9 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
305 | pos++; | 306 | pos++; |
306 | } | 307 | } |
307 | copy_de(new_de = &nde, de); | 308 | copy_de(new_de = &nde, de); |
308 | memcpy(name = nname, de->name, namelen = de->namelen); | 309 | memcpy(nname, de->name, de->namelen); |
310 | name = nname; | ||
311 | namelen = de->namelen; | ||
309 | for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | pos, 4); | 312 | for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | pos, 4); |
310 | down_ptr = adno; | 313 | down_ptr = adno; |
311 | set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); | 314 | set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); |
@@ -368,7 +371,8 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
368 | * I hope, now it's finally bug-free. | 371 | * I hope, now it's finally bug-free. |
369 | */ | 372 | */ |
370 | 373 | ||
371 | int hpfs_add_dirent(struct inode *i, unsigned char *name, unsigned namelen, | 374 | int hpfs_add_dirent(struct inode *i, |
375 | const unsigned char *name, unsigned namelen, | ||
372 | struct hpfs_dirent *new_de, int cdepth) | 376 | struct hpfs_dirent *new_de, int cdepth) |
373 | { | 377 | { |
374 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); | 378 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
@@ -897,7 +901,8 @@ struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp, | |||
897 | 901 | ||
898 | /* Find a dirent in tree */ | 902 | /* Find a dirent in tree */ |
899 | 903 | ||
900 | struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno, char *name, unsigned len, | 904 | struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno, |
905 | const unsigned char *name, unsigned len, | ||
901 | dnode_secno *dd, struct quad_buffer_head *qbh) | 906 | dnode_secno *dd, struct quad_buffer_head *qbh) |
902 | { | 907 | { |
903 | struct dnode *dnode; | 908 | struct dnode *dnode; |
@@ -988,8 +993,8 @@ void hpfs_remove_dtree(struct super_block *s, dnode_secno dno) | |||
988 | struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, | 993 | struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, |
989 | struct fnode *f, struct quad_buffer_head *qbh) | 994 | struct fnode *f, struct quad_buffer_head *qbh) |
990 | { | 995 | { |
991 | char *name1; | 996 | unsigned char *name1; |
992 | char *name2; | 997 | unsigned char *name2; |
993 | int name1len, name2len; | 998 | int name1len, name2len; |
994 | struct dnode *d; | 999 | struct dnode *d; |
995 | dnode_secno dno, downd; | 1000 | dnode_secno dno, downd; |
diff --git a/fs/hpfs/ea.c b/fs/hpfs/ea.c index 547a8384571f..45e53d972b42 100644 --- a/fs/hpfs/ea.c +++ b/fs/hpfs/ea.c | |||
@@ -62,8 +62,8 @@ static char *get_indirect_ea(struct super_block *s, int ano, secno a, int size) | |||
62 | return ret; | 62 | return ret; |
63 | } | 63 | } |
64 | 64 | ||
65 | static void set_indirect_ea(struct super_block *s, int ano, secno a, char *data, | 65 | static void set_indirect_ea(struct super_block *s, int ano, secno a, |
66 | int size) | 66 | const char *data, int size) |
67 | { | 67 | { |
68 | hpfs_ea_write(s, a, ano, 0, size, data); | 68 | hpfs_ea_write(s, a, ano, 0, size, data); |
69 | } | 69 | } |
@@ -186,7 +186,8 @@ char *hpfs_get_ea(struct super_block *s, struct fnode *fnode, char *key, int *si | |||
186 | * This driver can't change sizes of eas ('cause I just don't need it). | 186 | * This driver can't change sizes of eas ('cause I just don't need it). |
187 | */ | 187 | */ |
188 | 188 | ||
189 | void hpfs_set_ea(struct inode *inode, struct fnode *fnode, char *key, char *data, int size) | 189 | void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, |
190 | const char *data, int size) | ||
190 | { | 191 | { |
191 | fnode_secno fno = inode->i_ino; | 192 | fnode_secno fno = inode->i_ino; |
192 | struct super_block *s = inode->i_sb; | 193 | struct super_block *s = inode->i_sb; |
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index 701ca54c0867..97bf738cd5d6 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h | |||
@@ -215,7 +215,7 @@ secno hpfs_bplus_lookup(struct super_block *, struct inode *, struct bplus_heade | |||
215 | secno hpfs_add_sector_to_btree(struct super_block *, secno, int, unsigned); | 215 | secno hpfs_add_sector_to_btree(struct super_block *, secno, int, unsigned); |
216 | void hpfs_remove_btree(struct super_block *, struct bplus_header *); | 216 | void hpfs_remove_btree(struct super_block *, struct bplus_header *); |
217 | int hpfs_ea_read(struct super_block *, secno, int, unsigned, unsigned, char *); | 217 | int hpfs_ea_read(struct super_block *, secno, int, unsigned, unsigned, char *); |
218 | int hpfs_ea_write(struct super_block *, secno, int, unsigned, unsigned, char *); | 218 | int hpfs_ea_write(struct super_block *, secno, int, unsigned, unsigned, const char *); |
219 | void hpfs_ea_remove(struct super_block *, secno, int, unsigned); | 219 | void hpfs_ea_remove(struct super_block *, secno, int, unsigned); |
220 | void hpfs_truncate_btree(struct super_block *, secno, int, unsigned); | 220 | void hpfs_truncate_btree(struct super_block *, secno, int, unsigned); |
221 | void hpfs_remove_fnode(struct super_block *, fnode_secno fno); | 221 | void hpfs_remove_fnode(struct super_block *, fnode_secno fno); |
@@ -244,13 +244,17 @@ extern const struct file_operations hpfs_dir_ops; | |||
244 | 244 | ||
245 | void hpfs_add_pos(struct inode *, loff_t *); | 245 | void hpfs_add_pos(struct inode *, loff_t *); |
246 | void hpfs_del_pos(struct inode *, loff_t *); | 246 | void hpfs_del_pos(struct inode *, loff_t *); |
247 | struct hpfs_dirent *hpfs_add_de(struct super_block *, struct dnode *, unsigned char *, unsigned, secno); | 247 | struct hpfs_dirent *hpfs_add_de(struct super_block *, struct dnode *, |
248 | int hpfs_add_dirent(struct inode *, unsigned char *, unsigned, struct hpfs_dirent *, int); | 248 | const unsigned char *, unsigned, secno); |
249 | int hpfs_add_dirent(struct inode *, const unsigned char *, unsigned, | ||
250 | struct hpfs_dirent *, int); | ||
249 | int hpfs_remove_dirent(struct inode *, dnode_secno, struct hpfs_dirent *, struct quad_buffer_head *, int); | 251 | int hpfs_remove_dirent(struct inode *, dnode_secno, struct hpfs_dirent *, struct quad_buffer_head *, int); |
250 | void hpfs_count_dnodes(struct super_block *, dnode_secno, int *, int *, int *); | 252 | void hpfs_count_dnodes(struct super_block *, dnode_secno, int *, int *, int *); |
251 | dnode_secno hpfs_de_as_down_as_possible(struct super_block *, dnode_secno dno); | 253 | dnode_secno hpfs_de_as_down_as_possible(struct super_block *, dnode_secno dno); |
252 | struct hpfs_dirent *map_pos_dirent(struct inode *, loff_t *, struct quad_buffer_head *); | 254 | struct hpfs_dirent *map_pos_dirent(struct inode *, loff_t *, struct quad_buffer_head *); |
253 | struct hpfs_dirent *map_dirent(struct inode *, dnode_secno, char *, unsigned, dnode_secno *, struct quad_buffer_head *); | 255 | struct hpfs_dirent *map_dirent(struct inode *, dnode_secno, |
256 | const unsigned char *, unsigned, dnode_secno *, | ||
257 | struct quad_buffer_head *); | ||
254 | void hpfs_remove_dtree(struct super_block *, dnode_secno); | 258 | void hpfs_remove_dtree(struct super_block *, dnode_secno); |
255 | struct hpfs_dirent *map_fnode_dirent(struct super_block *, fnode_secno, struct fnode *, struct quad_buffer_head *); | 259 | struct hpfs_dirent *map_fnode_dirent(struct super_block *, fnode_secno, struct fnode *, struct quad_buffer_head *); |
256 | 260 | ||
@@ -259,7 +263,8 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *, fnode_secno, struct f | |||
259 | void hpfs_ea_ext_remove(struct super_block *, secno, int, unsigned); | 263 | void hpfs_ea_ext_remove(struct super_block *, secno, int, unsigned); |
260 | int hpfs_read_ea(struct super_block *, struct fnode *, char *, char *, int); | 264 | int hpfs_read_ea(struct super_block *, struct fnode *, char *, char *, int); |
261 | char *hpfs_get_ea(struct super_block *, struct fnode *, char *, int *); | 265 | char *hpfs_get_ea(struct super_block *, struct fnode *, char *, int *); |
262 | void hpfs_set_ea(struct inode *, struct fnode *, char *, char *, int); | 266 | void hpfs_set_ea(struct inode *, struct fnode *, const char *, |
267 | const char *, int); | ||
263 | 268 | ||
264 | /* file.c */ | 269 | /* file.c */ |
265 | 270 | ||
@@ -282,7 +287,7 @@ void hpfs_delete_inode(struct inode *); | |||
282 | 287 | ||
283 | unsigned *hpfs_map_dnode_bitmap(struct super_block *, struct quad_buffer_head *); | 288 | unsigned *hpfs_map_dnode_bitmap(struct super_block *, struct quad_buffer_head *); |
284 | unsigned *hpfs_map_bitmap(struct super_block *, unsigned, struct quad_buffer_head *, char *); | 289 | unsigned *hpfs_map_bitmap(struct super_block *, unsigned, struct quad_buffer_head *, char *); |
285 | char *hpfs_load_code_page(struct super_block *, secno); | 290 | unsigned char *hpfs_load_code_page(struct super_block *, secno); |
286 | secno *hpfs_load_bitmap_directory(struct super_block *, secno bmp); | 291 | secno *hpfs_load_bitmap_directory(struct super_block *, secno bmp); |
287 | struct fnode *hpfs_map_fnode(struct super_block *s, ino_t, struct buffer_head **); | 292 | struct fnode *hpfs_map_fnode(struct super_block *s, ino_t, struct buffer_head **); |
288 | struct anode *hpfs_map_anode(struct super_block *s, anode_secno, struct buffer_head **); | 293 | struct anode *hpfs_map_anode(struct super_block *s, anode_secno, struct buffer_head **); |
@@ -292,12 +297,13 @@ dnode_secno hpfs_fnode_dno(struct super_block *s, ino_t ino); | |||
292 | /* name.c */ | 297 | /* name.c */ |
293 | 298 | ||
294 | unsigned char hpfs_upcase(unsigned char *, unsigned char); | 299 | unsigned char hpfs_upcase(unsigned char *, unsigned char); |
295 | int hpfs_chk_name(unsigned char *, unsigned *); | 300 | int hpfs_chk_name(const unsigned char *, unsigned *); |
296 | char *hpfs_translate_name(struct super_block *, unsigned char *, unsigned, int, int); | 301 | unsigned char *hpfs_translate_name(struct super_block *, unsigned char *, unsigned, int, int); |
297 | int hpfs_compare_names(struct super_block *, unsigned char *, unsigned, unsigned char *, unsigned, int); | 302 | int hpfs_compare_names(struct super_block *, const unsigned char *, unsigned, |
298 | int hpfs_is_name_long(unsigned char *, unsigned); | 303 | const unsigned char *, unsigned, int); |
299 | void hpfs_adjust_length(unsigned char *, unsigned *); | 304 | int hpfs_is_name_long(const unsigned char *, unsigned); |
300 | void hpfs_decide_conv(struct inode *, unsigned char *, unsigned); | 305 | void hpfs_adjust_length(const unsigned char *, unsigned *); |
306 | void hpfs_decide_conv(struct inode *, const unsigned char *, unsigned); | ||
301 | 307 | ||
302 | /* namei.c */ | 308 | /* namei.c */ |
303 | 309 | ||
diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index fe703ae46bc7..1042a9bc97f3 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c | |||
@@ -7,6 +7,7 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/smp_lock.h> | 9 | #include <linux/smp_lock.h> |
10 | #include <linux/slab.h> | ||
10 | #include "hpfs_fn.h" | 11 | #include "hpfs_fn.h" |
11 | 12 | ||
12 | void hpfs_init_inode(struct inode *i) | 13 | void hpfs_init_inode(struct inode *i) |
@@ -46,7 +47,7 @@ void hpfs_read_inode(struct inode *i) | |||
46 | struct fnode *fnode; | 47 | struct fnode *fnode; |
47 | struct super_block *sb = i->i_sb; | 48 | struct super_block *sb = i->i_sb; |
48 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); | 49 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
49 | unsigned char *ea; | 50 | void *ea; |
50 | int ea_size; | 51 | int ea_size; |
51 | 52 | ||
52 | if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) { | 53 | if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) { |
@@ -112,7 +113,7 @@ void hpfs_read_inode(struct inode *i) | |||
112 | } | 113 | } |
113 | } | 114 | } |
114 | if (fnode->dirflag) { | 115 | if (fnode->dirflag) { |
115 | unsigned n_dnodes, n_subdirs; | 116 | int n_dnodes, n_subdirs; |
116 | i->i_mode |= S_IFDIR; | 117 | i->i_mode |= S_IFDIR; |
117 | i->i_op = &hpfs_dir_iops; | 118 | i->i_op = &hpfs_dir_iops; |
118 | i->i_fop = &hpfs_dir_ops; | 119 | i->i_fop = &hpfs_dir_ops; |
diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c index c4724589b2eb..840d033ecee8 100644 --- a/fs/hpfs/map.c +++ b/fs/hpfs/map.c | |||
@@ -35,7 +35,7 @@ unsigned int *hpfs_map_bitmap(struct super_block *s, unsigned bmp_block, | |||
35 | * lowercasing table | 35 | * lowercasing table |
36 | */ | 36 | */ |
37 | 37 | ||
38 | char *hpfs_load_code_page(struct super_block *s, secno cps) | 38 | unsigned char *hpfs_load_code_page(struct super_block *s, secno cps) |
39 | { | 39 | { |
40 | struct buffer_head *bh; | 40 | struct buffer_head *bh; |
41 | secno cpds; | 41 | secno cpds; |
@@ -71,7 +71,7 @@ char *hpfs_load_code_page(struct super_block *s, secno cps) | |||
71 | brelse(bh); | 71 | brelse(bh); |
72 | return NULL; | 72 | return NULL; |
73 | } | 73 | } |
74 | ptr = (char *)cpd + cpd->offs[cpi] + 6; | 74 | ptr = (unsigned char *)cpd + cpd->offs[cpi] + 6; |
75 | if (!(cp_table = kmalloc(256, GFP_KERNEL))) { | 75 | if (!(cp_table = kmalloc(256, GFP_KERNEL))) { |
76 | printk("HPFS: out of memory for code page table\n"); | 76 | printk("HPFS: out of memory for code page table\n"); |
77 | brelse(bh); | 77 | brelse(bh); |
@@ -217,7 +217,7 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno, | |||
217 | if ((dnode = hpfs_map_4sectors(s, secno, qbh, DNODE_RD_AHEAD))) | 217 | if ((dnode = hpfs_map_4sectors(s, secno, qbh, DNODE_RD_AHEAD))) |
218 | if (hpfs_sb(s)->sb_chk) { | 218 | if (hpfs_sb(s)->sb_chk) { |
219 | unsigned p, pp = 0; | 219 | unsigned p, pp = 0; |
220 | unsigned char *d = (char *)dnode; | 220 | unsigned char *d = (unsigned char *)dnode; |
221 | int b = 0; | 221 | int b = 0; |
222 | if (dnode->magic != DNODE_MAGIC) { | 222 | if (dnode->magic != DNODE_MAGIC) { |
223 | hpfs_error(s, "bad magic on dnode %08x", secno); | 223 | hpfs_error(s, "bad magic on dnode %08x", secno); |
diff --git a/fs/hpfs/name.c b/fs/hpfs/name.c index 1f4a964384eb..f24736d7a439 100644 --- a/fs/hpfs/name.c +++ b/fs/hpfs/name.c | |||
@@ -8,16 +8,16 @@ | |||
8 | 8 | ||
9 | #include "hpfs_fn.h" | 9 | #include "hpfs_fn.h" |
10 | 10 | ||
11 | static char *text_postfix[]={ | 11 | static const char *text_postfix[]={ |
12 | ".ASM", ".BAS", ".BAT", ".C", ".CC", ".CFG", ".CMD", ".CON", ".CPP", ".DEF", | 12 | ".ASM", ".BAS", ".BAT", ".C", ".CC", ".CFG", ".CMD", ".CON", ".CPP", ".DEF", |
13 | ".DOC", ".DPR", ".ERX", ".H", ".HPP", ".HTM", ".HTML", ".JAVA", ".LOG", ".PAS", | 13 | ".DOC", ".DPR", ".ERX", ".H", ".HPP", ".HTM", ".HTML", ".JAVA", ".LOG", ".PAS", |
14 | ".RC", ".TEX", ".TXT", ".Y", ""}; | 14 | ".RC", ".TEX", ".TXT", ".Y", ""}; |
15 | 15 | ||
16 | static char *text_prefix[]={ | 16 | static const char *text_prefix[]={ |
17 | "AUTOEXEC.", "CHANGES", "COPYING", "CONFIG.", "CREDITS", "FAQ", "FILE_ID.DIZ", | 17 | "AUTOEXEC.", "CHANGES", "COPYING", "CONFIG.", "CREDITS", "FAQ", "FILE_ID.DIZ", |
18 | "MAKEFILE", "READ.ME", "README", "TERMCAP", ""}; | 18 | "MAKEFILE", "READ.ME", "README", "TERMCAP", ""}; |
19 | 19 | ||
20 | void hpfs_decide_conv(struct inode *inode, unsigned char *name, unsigned len) | 20 | void hpfs_decide_conv(struct inode *inode, const unsigned char *name, unsigned len) |
21 | { | 21 | { |
22 | struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); | 22 | struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); |
23 | int i; | 23 | int i; |
@@ -71,7 +71,7 @@ static inline unsigned char locase(unsigned char *dir, unsigned char a) | |||
71 | return dir[a]; | 71 | return dir[a]; |
72 | } | 72 | } |
73 | 73 | ||
74 | int hpfs_chk_name(unsigned char *name, unsigned *len) | 74 | int hpfs_chk_name(const unsigned char *name, unsigned *len) |
75 | { | 75 | { |
76 | int i; | 76 | int i; |
77 | if (*len > 254) return -ENAMETOOLONG; | 77 | if (*len > 254) return -ENAMETOOLONG; |
@@ -83,10 +83,10 @@ int hpfs_chk_name(unsigned char *name, unsigned *len) | |||
83 | return 0; | 83 | return 0; |
84 | } | 84 | } |
85 | 85 | ||
86 | char *hpfs_translate_name(struct super_block *s, unsigned char *from, | 86 | unsigned char *hpfs_translate_name(struct super_block *s, unsigned char *from, |
87 | unsigned len, int lc, int lng) | 87 | unsigned len, int lc, int lng) |
88 | { | 88 | { |
89 | char *to; | 89 | unsigned char *to; |
90 | int i; | 90 | int i; |
91 | if (hpfs_sb(s)->sb_chk >= 2) if (hpfs_is_name_long(from, len) != lng) { | 91 | if (hpfs_sb(s)->sb_chk >= 2) if (hpfs_is_name_long(from, len) != lng) { |
92 | printk("HPFS: Long name flag mismatch - name "); | 92 | printk("HPFS: Long name flag mismatch - name "); |
@@ -103,8 +103,9 @@ char *hpfs_translate_name(struct super_block *s, unsigned char *from, | |||
103 | return to; | 103 | return to; |
104 | } | 104 | } |
105 | 105 | ||
106 | int hpfs_compare_names(struct super_block *s, unsigned char *n1, unsigned l1, | 106 | int hpfs_compare_names(struct super_block *s, |
107 | unsigned char *n2, unsigned l2, int last) | 107 | const unsigned char *n1, unsigned l1, |
108 | const unsigned char *n2, unsigned l2, int last) | ||
108 | { | 109 | { |
109 | unsigned l = l1 < l2 ? l1 : l2; | 110 | unsigned l = l1 < l2 ? l1 : l2; |
110 | unsigned i; | 111 | unsigned i; |
@@ -120,7 +121,7 @@ int hpfs_compare_names(struct super_block *s, unsigned char *n1, unsigned l1, | |||
120 | return 0; | 121 | return 0; |
121 | } | 122 | } |
122 | 123 | ||
123 | int hpfs_is_name_long(unsigned char *name, unsigned len) | 124 | int hpfs_is_name_long(const unsigned char *name, unsigned len) |
124 | { | 125 | { |
125 | int i,j; | 126 | int i,j; |
126 | for (i = 0; i < len && name[i] != '.'; i++) | 127 | for (i = 0; i < len && name[i] != '.'; i++) |
@@ -134,7 +135,7 @@ int hpfs_is_name_long(unsigned char *name, unsigned len) | |||
134 | 135 | ||
135 | /* OS/2 clears dots and spaces at the end of file name, so we have to */ | 136 | /* OS/2 clears dots and spaces at the end of file name, so we have to */ |
136 | 137 | ||
137 | void hpfs_adjust_length(unsigned char *name, unsigned *len) | 138 | void hpfs_adjust_length(const unsigned char *name, unsigned *len) |
138 | { | 139 | { |
139 | if (!*len) return; | 140 | if (!*len) return; |
140 | if (*len == 1 && name[0] == '.') return; | 141 | if (*len == 1 && name[0] == '.') return; |
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index 82b9c4ba9ed0..11c2b4080f65 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c | |||
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | 12 | static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) |
13 | { | 13 | { |
14 | const char *name = dentry->d_name.name; | 14 | const unsigned char *name = dentry->d_name.name; |
15 | unsigned len = dentry->d_name.len; | 15 | unsigned len = dentry->d_name.len; |
16 | struct quad_buffer_head qbh0; | 16 | struct quad_buffer_head qbh0; |
17 | struct buffer_head *bh; | 17 | struct buffer_head *bh; |
@@ -24,7 +24,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
24 | int r; | 24 | int r; |
25 | struct hpfs_dirent dee; | 25 | struct hpfs_dirent dee; |
26 | int err; | 26 | int err; |
27 | if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; | 27 | if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err; |
28 | lock_kernel(); | 28 | lock_kernel(); |
29 | err = -ENOSPC; | 29 | err = -ENOSPC; |
30 | fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh); | 30 | fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh); |
@@ -62,7 +62,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
62 | result->i_mode &= ~0222; | 62 | result->i_mode &= ~0222; |
63 | 63 | ||
64 | mutex_lock(&hpfs_i(dir)->i_mutex); | 64 | mutex_lock(&hpfs_i(dir)->i_mutex); |
65 | r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); | 65 | r = hpfs_add_dirent(dir, name, len, &dee, 0); |
66 | if (r == 1) | 66 | if (r == 1) |
67 | goto bail3; | 67 | goto bail3; |
68 | if (r == -1) { | 68 | if (r == -1) { |
@@ -121,7 +121,7 @@ bail: | |||
121 | 121 | ||
122 | static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd) | 122 | static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd) |
123 | { | 123 | { |
124 | const char *name = dentry->d_name.name; | 124 | const unsigned char *name = dentry->d_name.name; |
125 | unsigned len = dentry->d_name.len; | 125 | unsigned len = dentry->d_name.len; |
126 | struct inode *result = NULL; | 126 | struct inode *result = NULL; |
127 | struct buffer_head *bh; | 127 | struct buffer_head *bh; |
@@ -130,7 +130,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
130 | int r; | 130 | int r; |
131 | struct hpfs_dirent dee; | 131 | struct hpfs_dirent dee; |
132 | int err; | 132 | int err; |
133 | if ((err = hpfs_chk_name((char *)name, &len))) | 133 | if ((err = hpfs_chk_name(name, &len))) |
134 | return err==-ENOENT ? -EINVAL : err; | 134 | return err==-ENOENT ? -EINVAL : err; |
135 | lock_kernel(); | 135 | lock_kernel(); |
136 | err = -ENOSPC; | 136 | err = -ENOSPC; |
@@ -155,7 +155,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
155 | result->i_op = &hpfs_file_iops; | 155 | result->i_op = &hpfs_file_iops; |
156 | result->i_fop = &hpfs_file_ops; | 156 | result->i_fop = &hpfs_file_ops; |
157 | result->i_nlink = 1; | 157 | result->i_nlink = 1; |
158 | hpfs_decide_conv(result, (char *)name, len); | 158 | hpfs_decide_conv(result, name, len); |
159 | hpfs_i(result)->i_parent_dir = dir->i_ino; | 159 | hpfs_i(result)->i_parent_dir = dir->i_ino; |
160 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); | 160 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); |
161 | result->i_ctime.tv_nsec = 0; | 161 | result->i_ctime.tv_nsec = 0; |
@@ -170,7 +170,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
170 | hpfs_i(result)->mmu_private = 0; | 170 | hpfs_i(result)->mmu_private = 0; |
171 | 171 | ||
172 | mutex_lock(&hpfs_i(dir)->i_mutex); | 172 | mutex_lock(&hpfs_i(dir)->i_mutex); |
173 | r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); | 173 | r = hpfs_add_dirent(dir, name, len, &dee, 0); |
174 | if (r == 1) | 174 | if (r == 1) |
175 | goto bail2; | 175 | goto bail2; |
176 | if (r == -1) { | 176 | if (r == -1) { |
@@ -211,7 +211,7 @@ bail: | |||
211 | 211 | ||
212 | static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) | 212 | static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) |
213 | { | 213 | { |
214 | const char *name = dentry->d_name.name; | 214 | const unsigned char *name = dentry->d_name.name; |
215 | unsigned len = dentry->d_name.len; | 215 | unsigned len = dentry->d_name.len; |
216 | struct buffer_head *bh; | 216 | struct buffer_head *bh; |
217 | struct fnode *fnode; | 217 | struct fnode *fnode; |
@@ -220,7 +220,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
220 | struct hpfs_dirent dee; | 220 | struct hpfs_dirent dee; |
221 | struct inode *result = NULL; | 221 | struct inode *result = NULL; |
222 | int err; | 222 | int err; |
223 | if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; | 223 | if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err; |
224 | if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM; | 224 | if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM; |
225 | if (!new_valid_dev(rdev)) | 225 | if (!new_valid_dev(rdev)) |
226 | return -EINVAL; | 226 | return -EINVAL; |
@@ -256,7 +256,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
256 | init_special_inode(result, mode, rdev); | 256 | init_special_inode(result, mode, rdev); |
257 | 257 | ||
258 | mutex_lock(&hpfs_i(dir)->i_mutex); | 258 | mutex_lock(&hpfs_i(dir)->i_mutex); |
259 | r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); | 259 | r = hpfs_add_dirent(dir, name, len, &dee, 0); |
260 | if (r == 1) | 260 | if (r == 1) |
261 | goto bail2; | 261 | goto bail2; |
262 | if (r == -1) { | 262 | if (r == -1) { |
@@ -289,7 +289,7 @@ bail: | |||
289 | 289 | ||
290 | static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *symlink) | 290 | static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *symlink) |
291 | { | 291 | { |
292 | const char *name = dentry->d_name.name; | 292 | const unsigned char *name = dentry->d_name.name; |
293 | unsigned len = dentry->d_name.len; | 293 | unsigned len = dentry->d_name.len; |
294 | struct buffer_head *bh; | 294 | struct buffer_head *bh; |
295 | struct fnode *fnode; | 295 | struct fnode *fnode; |
@@ -298,7 +298,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
298 | struct hpfs_dirent dee; | 298 | struct hpfs_dirent dee; |
299 | struct inode *result; | 299 | struct inode *result; |
300 | int err; | 300 | int err; |
301 | if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; | 301 | if ((err = hpfs_chk_name(name, &len))) return err==-ENOENT ? -EINVAL : err; |
302 | lock_kernel(); | 302 | lock_kernel(); |
303 | if (hpfs_sb(dir->i_sb)->sb_eas < 2) { | 303 | if (hpfs_sb(dir->i_sb)->sb_eas < 2) { |
304 | unlock_kernel(); | 304 | unlock_kernel(); |
@@ -335,7 +335,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
335 | result->i_data.a_ops = &hpfs_symlink_aops; | 335 | result->i_data.a_ops = &hpfs_symlink_aops; |
336 | 336 | ||
337 | mutex_lock(&hpfs_i(dir)->i_mutex); | 337 | mutex_lock(&hpfs_i(dir)->i_mutex); |
338 | r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); | 338 | r = hpfs_add_dirent(dir, name, len, &dee, 0); |
339 | if (r == 1) | 339 | if (r == 1) |
340 | goto bail2; | 340 | goto bail2; |
341 | if (r == -1) { | 341 | if (r == -1) { |
@@ -345,7 +345,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
345 | fnode->len = len; | 345 | fnode->len = len; |
346 | memcpy(fnode->name, name, len > 15 ? 15 : len); | 346 | memcpy(fnode->name, name, len > 15 ? 15 : len); |
347 | fnode->up = dir->i_ino; | 347 | fnode->up = dir->i_ino; |
348 | hpfs_set_ea(result, fnode, "SYMLINK", (char *)symlink, strlen(symlink)); | 348 | hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); |
349 | mark_buffer_dirty(bh); | 349 | mark_buffer_dirty(bh); |
350 | brelse(bh); | 350 | brelse(bh); |
351 | 351 | ||
@@ -369,7 +369,7 @@ bail: | |||
369 | 369 | ||
370 | static int hpfs_unlink(struct inode *dir, struct dentry *dentry) | 370 | static int hpfs_unlink(struct inode *dir, struct dentry *dentry) |
371 | { | 371 | { |
372 | const char *name = dentry->d_name.name; | 372 | const unsigned char *name = dentry->d_name.name; |
373 | unsigned len = dentry->d_name.len; | 373 | unsigned len = dentry->d_name.len; |
374 | struct quad_buffer_head qbh; | 374 | struct quad_buffer_head qbh; |
375 | struct hpfs_dirent *de; | 375 | struct hpfs_dirent *de; |
@@ -381,12 +381,12 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) | |||
381 | int err; | 381 | int err; |
382 | 382 | ||
383 | lock_kernel(); | 383 | lock_kernel(); |
384 | hpfs_adjust_length((char *)name, &len); | 384 | hpfs_adjust_length(name, &len); |
385 | again: | 385 | again: |
386 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); | 386 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); |
387 | mutex_lock(&hpfs_i(dir)->i_mutex); | 387 | mutex_lock(&hpfs_i(dir)->i_mutex); |
388 | err = -ENOENT; | 388 | err = -ENOENT; |
389 | de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh); | 389 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); |
390 | if (!de) | 390 | if (!de) |
391 | goto out; | 391 | goto out; |
392 | 392 | ||
@@ -413,22 +413,25 @@ again: | |||
413 | 413 | ||
414 | mutex_unlock(&hpfs_i(dir)->i_mutex); | 414 | mutex_unlock(&hpfs_i(dir)->i_mutex); |
415 | mutex_unlock(&hpfs_i(inode)->i_parent_mutex); | 415 | mutex_unlock(&hpfs_i(inode)->i_parent_mutex); |
416 | d_drop(dentry); | 416 | dentry_unhash(dentry); |
417 | spin_lock(&dentry->d_lock); | 417 | if (!d_unhashed(dentry)) { |
418 | if (atomic_read(&dentry->d_count) > 1 || | 418 | dput(dentry); |
419 | generic_permission(inode, MAY_WRITE, NULL) || | 419 | unlock_kernel(); |
420 | return -ENOSPC; | ||
421 | } | ||
422 | if (generic_permission(inode, MAY_WRITE, NULL) || | ||
420 | !S_ISREG(inode->i_mode) || | 423 | !S_ISREG(inode->i_mode) || |
421 | get_write_access(inode)) { | 424 | get_write_access(inode)) { |
422 | spin_unlock(&dentry->d_lock); | ||
423 | d_rehash(dentry); | 425 | d_rehash(dentry); |
426 | dput(dentry); | ||
424 | } else { | 427 | } else { |
425 | struct iattr newattrs; | 428 | struct iattr newattrs; |
426 | spin_unlock(&dentry->d_lock); | ||
427 | /*printk("HPFS: truncating file before delete.\n");*/ | 429 | /*printk("HPFS: truncating file before delete.\n");*/ |
428 | newattrs.ia_size = 0; | 430 | newattrs.ia_size = 0; |
429 | newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; | 431 | newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; |
430 | err = notify_change(dentry, &newattrs); | 432 | err = notify_change(dentry, &newattrs); |
431 | put_write_access(inode); | 433 | put_write_access(inode); |
434 | dput(dentry); | ||
432 | if (!err) | 435 | if (!err) |
433 | goto again; | 436 | goto again; |
434 | } | 437 | } |
@@ -451,7 +454,7 @@ out: | |||
451 | 454 | ||
452 | static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) | 455 | static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) |
453 | { | 456 | { |
454 | const char *name = dentry->d_name.name; | 457 | const unsigned char *name = dentry->d_name.name; |
455 | unsigned len = dentry->d_name.len; | 458 | unsigned len = dentry->d_name.len; |
456 | struct quad_buffer_head qbh; | 459 | struct quad_buffer_head qbh; |
457 | struct hpfs_dirent *de; | 460 | struct hpfs_dirent *de; |
@@ -462,12 +465,12 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
462 | int err; | 465 | int err; |
463 | int r; | 466 | int r; |
464 | 467 | ||
465 | hpfs_adjust_length((char *)name, &len); | 468 | hpfs_adjust_length(name, &len); |
466 | lock_kernel(); | 469 | lock_kernel(); |
467 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); | 470 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); |
468 | mutex_lock(&hpfs_i(dir)->i_mutex); | 471 | mutex_lock(&hpfs_i(dir)->i_mutex); |
469 | err = -ENOENT; | 472 | err = -ENOENT; |
470 | de = map_dirent(dir, hpfs_i(dir)->i_dno, (char *)name, len, &dno, &qbh); | 473 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); |
471 | if (!de) | 474 | if (!de) |
472 | goto out; | 475 | goto out; |
473 | 476 | ||
@@ -546,10 +549,10 @@ const struct address_space_operations hpfs_symlink_aops = { | |||
546 | static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 549 | static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
547 | struct inode *new_dir, struct dentry *new_dentry) | 550 | struct inode *new_dir, struct dentry *new_dentry) |
548 | { | 551 | { |
549 | char *old_name = (char *)old_dentry->d_name.name; | 552 | const unsigned char *old_name = old_dentry->d_name.name; |
550 | int old_len = old_dentry->d_name.len; | 553 | unsigned old_len = old_dentry->d_name.len; |
551 | char *new_name = (char *)new_dentry->d_name.name; | 554 | const unsigned char *new_name = new_dentry->d_name.name; |
552 | int new_len = new_dentry->d_name.len; | 555 | unsigned new_len = new_dentry->d_name.len; |
553 | struct inode *i = old_dentry->d_inode; | 556 | struct inode *i = old_dentry->d_inode; |
554 | struct inode *new_inode = new_dentry->d_inode; | 557 | struct inode *new_inode = new_dentry->d_inode; |
555 | struct quad_buffer_head qbh, qbh1; | 558 | struct quad_buffer_head qbh, qbh1; |
@@ -560,9 +563,9 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
560 | struct buffer_head *bh; | 563 | struct buffer_head *bh; |
561 | struct fnode *fnode; | 564 | struct fnode *fnode; |
562 | int err; | 565 | int err; |
563 | if ((err = hpfs_chk_name((char *)new_name, &new_len))) return err; | 566 | if ((err = hpfs_chk_name(new_name, &new_len))) return err; |
564 | err = 0; | 567 | err = 0; |
565 | hpfs_adjust_length((char *)old_name, &old_len); | 568 | hpfs_adjust_length(old_name, &old_len); |
566 | 569 | ||
567 | lock_kernel(); | 570 | lock_kernel(); |
568 | /* order doesn't matter, due to VFS exclusion */ | 571 | /* order doesn't matter, due to VFS exclusion */ |
@@ -579,7 +582,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
579 | goto end1; | 582 | goto end1; |
580 | } | 583 | } |
581 | 584 | ||
582 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, (char *)old_name, old_len, &dno, &qbh))) { | 585 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) { |
583 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed"); | 586 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed"); |
584 | err = -ENOENT; | 587 | err = -ENOENT; |
585 | goto end1; | 588 | goto end1; |
@@ -590,7 +593,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
590 | if (new_inode) { | 593 | if (new_inode) { |
591 | int r; | 594 | int r; |
592 | if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) { | 595 | if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 1)) != 2) { |
593 | if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, (char *)new_name, new_len, NULL, &qbh1))) { | 596 | if ((nde = map_dirent(new_dir, hpfs_i(new_dir)->i_dno, new_name, new_len, NULL, &qbh1))) { |
594 | clear_nlink(new_inode); | 597 | clear_nlink(new_inode); |
595 | copy_de(nde, &de); | 598 | copy_de(nde, &de); |
596 | memcpy(nde->name, new_name, new_len); | 599 | memcpy(nde->name, new_name, new_len); |
@@ -618,7 +621,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
618 | } | 621 | } |
619 | 622 | ||
620 | if (new_dir == old_dir) | 623 | if (new_dir == old_dir) |
621 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, (char *)old_name, old_len, &dno, &qbh))) { | 624 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) { |
622 | hpfs_unlock_creation(i->i_sb); | 625 | hpfs_unlock_creation(i->i_sb); |
623 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2"); | 626 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2"); |
624 | err = -ENOENT; | 627 | err = -ENOENT; |
@@ -648,7 +651,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
648 | brelse(bh); | 651 | brelse(bh); |
649 | } | 652 | } |
650 | hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv; | 653 | hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv; |
651 | hpfs_decide_conv(i, (char *)new_name, new_len); | 654 | hpfs_decide_conv(i, new_name, new_len); |
652 | end1: | 655 | end1: |
653 | if (old_dir != new_dir) | 656 | if (old_dir != new_dir) |
654 | mutex_unlock(&hpfs_i(new_dir)->i_mutex); | 657 | mutex_unlock(&hpfs_i(new_dir)->i_mutex); |
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index f2feaa06bf26..aa53842c599c 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/magic.h> | 14 | #include <linux/magic.h> |
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/smp_lock.h> | 16 | #include <linux/smp_lock.h> |
17 | #include <linux/bitmap.h> | ||
18 | #include <linux/slab.h> | ||
17 | 19 | ||
18 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ | 20 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ |
19 | 21 | ||
@@ -115,15 +117,13 @@ static void hpfs_put_super(struct super_block *s) | |||
115 | unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno) | 117 | unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno) |
116 | { | 118 | { |
117 | struct quad_buffer_head qbh; | 119 | struct quad_buffer_head qbh; |
118 | unsigned *bits; | 120 | unsigned long *bits; |
119 | unsigned i, count; | 121 | unsigned count; |
120 | if (!(bits = hpfs_map_4sectors(s, secno, &qbh, 4))) return 0; | 122 | |
121 | count = 0; | 123 | bits = hpfs_map_4sectors(s, secno, &qbh, 4); |
122 | for (i = 0; i < 2048 / sizeof(unsigned); i++) { | 124 | if (!bits) |
123 | unsigned b; | 125 | return 0; |
124 | if (!bits[i]) continue; | 126 | count = bitmap_weight(bits, 2048 * BITS_PER_BYTE); |
125 | for (b = bits[i]; b; b>>=1) count += b & 1; | ||
126 | } | ||
127 | hpfs_brelse4(&qbh); | 127 | hpfs_brelse4(&qbh); |
128 | return count; | 128 | return count; |
129 | } | 129 | } |