diff options
author | Roman Zippel <zippel@linux-m68k.org> | 2005-09-06 18:18:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 19:57:50 -0400 |
commit | 328b9227865026268261a24a97a578907b280415 (patch) | |
tree | 1e0cad4f422252a9c3add879cf847afbb9786cfe /fs/hfs/catalog.c | |
parent | 717dd80e999cdc84fb611decec5c5054d37c40d2 (diff) |
[PATCH] hfs: NLS support
This adds NLS support to HFS. Using the kernel options iocharset and codepage
it's possible to map the disk encoding to a local mapping. If these options
are not used, it falls back to the old direct mapping.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/hfs/catalog.c')
-rw-r--r-- | fs/hfs/catalog.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c index 65dedefcabfc..2fcd679f0238 100644 --- a/fs/hfs/catalog.c +++ b/fs/hfs/catalog.c | |||
@@ -20,12 +20,12 @@ | |||
20 | * | 20 | * |
21 | * Given the ID of the parent and the name build a search key. | 21 | * Given the ID of the parent and the name build a search key. |
22 | */ | 22 | */ |
23 | void hfs_cat_build_key(btree_key *key, u32 parent, struct qstr *name) | 23 | void hfs_cat_build_key(struct super_block *sb, btree_key *key, u32 parent, struct qstr *name) |
24 | { | 24 | { |
25 | key->cat.reserved = 0; | 25 | key->cat.reserved = 0; |
26 | key->cat.ParID = cpu_to_be32(parent); | 26 | key->cat.ParID = cpu_to_be32(parent); |
27 | if (name) { | 27 | if (name) { |
28 | hfs_triv2mac(&key->cat.CName, name); | 28 | hfs_asc2mac(sb, &key->cat.CName, name); |
29 | key->key_len = 6 + key->cat.CName.len; | 29 | key->key_len = 6 + key->cat.CName.len; |
30 | } else { | 30 | } else { |
31 | memset(&key->cat.CName, 0, sizeof(struct hfs_name)); | 31 | memset(&key->cat.CName, 0, sizeof(struct hfs_name)); |
@@ -62,13 +62,14 @@ static int hfs_cat_build_record(hfs_cat_rec *rec, u32 cnid, struct inode *inode) | |||
62 | } | 62 | } |
63 | } | 63 | } |
64 | 64 | ||
65 | static int hfs_cat_build_thread(hfs_cat_rec *rec, int type, | 65 | static int hfs_cat_build_thread(struct super_block *sb, |
66 | hfs_cat_rec *rec, int type, | ||
66 | u32 parentid, struct qstr *name) | 67 | u32 parentid, struct qstr *name) |
67 | { | 68 | { |
68 | rec->type = type; | 69 | rec->type = type; |
69 | memset(rec->thread.reserved, 0, sizeof(rec->thread.reserved)); | 70 | memset(rec->thread.reserved, 0, sizeof(rec->thread.reserved)); |
70 | rec->thread.ParID = cpu_to_be32(parentid); | 71 | rec->thread.ParID = cpu_to_be32(parentid); |
71 | hfs_triv2mac(&rec->thread.CName, name); | 72 | hfs_asc2mac(sb, &rec->thread.CName, name); |
72 | return sizeof(struct hfs_cat_thread); | 73 | return sizeof(struct hfs_cat_thread); |
73 | } | 74 | } |
74 | 75 | ||
@@ -93,8 +94,8 @@ int hfs_cat_create(u32 cnid, struct inode *dir, struct qstr *str, struct inode * | |||
93 | sb = dir->i_sb; | 94 | sb = dir->i_sb; |
94 | hfs_find_init(HFS_SB(sb)->cat_tree, &fd); | 95 | hfs_find_init(HFS_SB(sb)->cat_tree, &fd); |
95 | 96 | ||
96 | hfs_cat_build_key(fd.search_key, cnid, NULL); | 97 | hfs_cat_build_key(sb, fd.search_key, cnid, NULL); |
97 | entry_size = hfs_cat_build_thread(&entry, S_ISDIR(inode->i_mode) ? | 98 | entry_size = hfs_cat_build_thread(sb, &entry, S_ISDIR(inode->i_mode) ? |
98 | HFS_CDR_THD : HFS_CDR_FTH, | 99 | HFS_CDR_THD : HFS_CDR_FTH, |
99 | dir->i_ino, str); | 100 | dir->i_ino, str); |
100 | err = hfs_brec_find(&fd); | 101 | err = hfs_brec_find(&fd); |
@@ -107,7 +108,7 @@ int hfs_cat_create(u32 cnid, struct inode *dir, struct qstr *str, struct inode * | |||
107 | if (err) | 108 | if (err) |
108 | goto err2; | 109 | goto err2; |
109 | 110 | ||
110 | hfs_cat_build_key(fd.search_key, dir->i_ino, str); | 111 | hfs_cat_build_key(sb, fd.search_key, dir->i_ino, str); |
111 | entry_size = hfs_cat_build_record(&entry, cnid, inode); | 112 | entry_size = hfs_cat_build_record(&entry, cnid, inode); |
112 | err = hfs_brec_find(&fd); | 113 | err = hfs_brec_find(&fd); |
113 | if (err != -ENOENT) { | 114 | if (err != -ENOENT) { |
@@ -127,7 +128,7 @@ int hfs_cat_create(u32 cnid, struct inode *dir, struct qstr *str, struct inode * | |||
127 | return 0; | 128 | return 0; |
128 | 129 | ||
129 | err1: | 130 | err1: |
130 | hfs_cat_build_key(fd.search_key, cnid, NULL); | 131 | hfs_cat_build_key(sb, fd.search_key, cnid, NULL); |
131 | if (!hfs_brec_find(&fd)) | 132 | if (!hfs_brec_find(&fd)) |
132 | hfs_brec_remove(&fd); | 133 | hfs_brec_remove(&fd); |
133 | err2: | 134 | err2: |
@@ -176,7 +177,7 @@ int hfs_cat_find_brec(struct super_block *sb, u32 cnid, | |||
176 | hfs_cat_rec rec; | 177 | hfs_cat_rec rec; |
177 | int res, len, type; | 178 | int res, len, type; |
178 | 179 | ||
179 | hfs_cat_build_key(fd->search_key, cnid, NULL); | 180 | hfs_cat_build_key(sb, fd->search_key, cnid, NULL); |
180 | res = hfs_brec_read(fd, &rec, sizeof(rec)); | 181 | res = hfs_brec_read(fd, &rec, sizeof(rec)); |
181 | if (res) | 182 | if (res) |
182 | return res; | 183 | return res; |
@@ -211,7 +212,7 @@ int hfs_cat_delete(u32 cnid, struct inode *dir, struct qstr *str) | |||
211 | sb = dir->i_sb; | 212 | sb = dir->i_sb; |
212 | hfs_find_init(HFS_SB(sb)->cat_tree, &fd); | 213 | hfs_find_init(HFS_SB(sb)->cat_tree, &fd); |
213 | 214 | ||
214 | hfs_cat_build_key(fd.search_key, dir->i_ino, str); | 215 | hfs_cat_build_key(sb, fd.search_key, dir->i_ino, str); |
215 | res = hfs_brec_find(&fd); | 216 | res = hfs_brec_find(&fd); |
216 | if (res) | 217 | if (res) |
217 | goto out; | 218 | goto out; |
@@ -239,7 +240,7 @@ int hfs_cat_delete(u32 cnid, struct inode *dir, struct qstr *str) | |||
239 | if (res) | 240 | if (res) |
240 | goto out; | 241 | goto out; |
241 | 242 | ||
242 | hfs_cat_build_key(fd.search_key, cnid, NULL); | 243 | hfs_cat_build_key(sb, fd.search_key, cnid, NULL); |
243 | res = hfs_brec_find(&fd); | 244 | res = hfs_brec_find(&fd); |
244 | if (!res) { | 245 | if (!res) { |
245 | res = hfs_brec_remove(&fd); | 246 | res = hfs_brec_remove(&fd); |
@@ -280,7 +281,7 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | |||
280 | dst_fd = src_fd; | 281 | dst_fd = src_fd; |
281 | 282 | ||
282 | /* find the old dir entry and read the data */ | 283 | /* find the old dir entry and read the data */ |
283 | hfs_cat_build_key(src_fd.search_key, src_dir->i_ino, src_name); | 284 | hfs_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name); |
284 | err = hfs_brec_find(&src_fd); | 285 | err = hfs_brec_find(&src_fd); |
285 | if (err) | 286 | if (err) |
286 | goto out; | 287 | goto out; |
@@ -289,7 +290,7 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | |||
289 | src_fd.entrylength); | 290 | src_fd.entrylength); |
290 | 291 | ||
291 | /* create new dir entry with the data from the old entry */ | 292 | /* create new dir entry with the data from the old entry */ |
292 | hfs_cat_build_key(dst_fd.search_key, dst_dir->i_ino, dst_name); | 293 | hfs_cat_build_key(sb, dst_fd.search_key, dst_dir->i_ino, dst_name); |
293 | err = hfs_brec_find(&dst_fd); | 294 | err = hfs_brec_find(&dst_fd); |
294 | if (err != -ENOENT) { | 295 | if (err != -ENOENT) { |
295 | if (!err) | 296 | if (!err) |
@@ -305,7 +306,7 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | |||
305 | mark_inode_dirty(dst_dir); | 306 | mark_inode_dirty(dst_dir); |
306 | 307 | ||
307 | /* finally remove the old entry */ | 308 | /* finally remove the old entry */ |
308 | hfs_cat_build_key(src_fd.search_key, src_dir->i_ino, src_name); | 309 | hfs_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name); |
309 | err = hfs_brec_find(&src_fd); | 310 | err = hfs_brec_find(&src_fd); |
310 | if (err) | 311 | if (err) |
311 | goto out; | 312 | goto out; |
@@ -321,7 +322,7 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | |||
321 | goto out; | 322 | goto out; |
322 | 323 | ||
323 | /* remove old thread entry */ | 324 | /* remove old thread entry */ |
324 | hfs_cat_build_key(src_fd.search_key, cnid, NULL); | 325 | hfs_cat_build_key(sb, src_fd.search_key, cnid, NULL); |
325 | err = hfs_brec_find(&src_fd); | 326 | err = hfs_brec_find(&src_fd); |
326 | if (err) | 327 | if (err) |
327 | goto out; | 328 | goto out; |
@@ -330,8 +331,8 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, struct qstr *src_name, | |||
330 | goto out; | 331 | goto out; |
331 | 332 | ||
332 | /* create new thread entry */ | 333 | /* create new thread entry */ |
333 | hfs_cat_build_key(dst_fd.search_key, cnid, NULL); | 334 | hfs_cat_build_key(sb, dst_fd.search_key, cnid, NULL); |
334 | entry_size = hfs_cat_build_thread(&entry, type == HFS_CDR_FIL ? HFS_CDR_FTH : HFS_CDR_THD, | 335 | entry_size = hfs_cat_build_thread(sb, &entry, type == HFS_CDR_FIL ? HFS_CDR_FTH : HFS_CDR_THD, |
335 | dst_dir->i_ino, dst_name); | 336 | dst_dir->i_ino, dst_name); |
336 | err = hfs_brec_find(&dst_fd); | 337 | err = hfs_brec_find(&dst_fd); |
337 | if (err != -ENOENT) { | 338 | if (err != -ENOENT) { |