aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/adfs/adfs.h1
-rw-r--r--fs/adfs/dir.c21
-rw-r--r--fs/adfs/dir_f.c17
-rw-r--r--fs/adfs/dir_fplus.c18
4 files changed, 24 insertions, 33 deletions
diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h
index c76db75f02aa..1097bee65fa9 100644
--- a/fs/adfs/adfs.h
+++ b/fs/adfs/adfs.h
@@ -172,6 +172,7 @@ extern const struct dentry_operations adfs_dentry_operations;
172extern const struct adfs_dir_ops adfs_f_dir_ops; 172extern const struct adfs_dir_ops adfs_f_dir_ops;
173extern const struct adfs_dir_ops adfs_fplus_dir_ops; 173extern const struct adfs_dir_ops adfs_fplus_dir_ops;
174 174
175void adfs_object_fixup(struct adfs_dir *dir, struct object_info *obj);
175extern int adfs_dir_update(struct super_block *sb, struct object_info *obj, 176extern int adfs_dir_update(struct super_block *sb, struct object_info *obj,
176 int wait); 177 int wait);
177 178
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index be4b4f950500..03490f16300d 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -16,6 +16,27 @@
16 */ 16 */
17static DEFINE_RWLOCK(adfs_dir_lock); 17static DEFINE_RWLOCK(adfs_dir_lock);
18 18
19void adfs_object_fixup(struct adfs_dir *dir, struct object_info *obj)
20{
21 obj->filetype = -1;
22
23 /*
24 * object is a file and is filetyped and timestamped?
25 * RISC OS 12-bit filetype is stored in load_address[19:8]
26 */
27 if ((0 == (obj->attr & ADFS_NDA_DIRECTORY)) &&
28 (0xfff00000 == (0xfff00000 & obj->loadaddr))) {
29 obj->filetype = (__u16) ((0x000fff00 & obj->loadaddr) >> 8);
30
31 /* optionally append the ,xyz hex filetype suffix */
32 if (ADFS_SB(dir->sb)->s_ftsuffix)
33 obj->name_len +=
34 append_filetype_suffix(
35 &obj->name[obj->name_len],
36 obj->filetype);
37 }
38}
39
19static int 40static int
20adfs_readdir(struct file *file, struct dir_context *ctx) 41adfs_readdir(struct file *file, struct dir_context *ctx)
21{ 42{
diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c
index 0fbfd0b04ae0..1bab896918ed 100644
--- a/fs/adfs/dir_f.c
+++ b/fs/adfs/dir_f.c
@@ -216,23 +216,8 @@ adfs_dir2obj(struct adfs_dir *dir, struct object_info *obj,
216 obj->execaddr = adfs_readval(de->direxec, 4); 216 obj->execaddr = adfs_readval(de->direxec, 4);
217 obj->size = adfs_readval(de->dirlen, 4); 217 obj->size = adfs_readval(de->dirlen, 4);
218 obj->attr = de->newdiratts; 218 obj->attr = de->newdiratts;
219 obj->filetype = -1;
220 219
221 /* 220 adfs_object_fixup(dir, obj);
222 * object is a file and is filetyped and timestamped?
223 * RISC OS 12-bit filetype is stored in load_address[19:8]
224 */
225 if ((0 == (obj->attr & ADFS_NDA_DIRECTORY)) &&
226 (0xfff00000 == (0xfff00000 & obj->loadaddr))) {
227 obj->filetype = (__u16) ((0x000fff00 & obj->loadaddr) >> 8);
228
229 /* optionally append the ,xyz hex filetype suffix */
230 if (ADFS_SB(dir->sb)->s_ftsuffix)
231 obj->name_len +=
232 append_filetype_suffix(
233 &obj->name[obj->name_len],
234 obj->filetype);
235 }
236} 221}
237 222
238/* 223/*
diff --git a/fs/adfs/dir_fplus.c b/fs/adfs/dir_fplus.c
index c92cfb638c18..308009d00a5b 100644
--- a/fs/adfs/dir_fplus.c
+++ b/fs/adfs/dir_fplus.c
@@ -197,23 +197,7 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj)
197 if (obj->name[i] == '/') 197 if (obj->name[i] == '/')
198 obj->name[i] = '.'; 198 obj->name[i] = '.';
199 199
200 obj->filetype = -1; 200 adfs_object_fixup(dir, obj);
201
202 /*
203 * object is a file and is filetyped and timestamped?
204 * RISC OS 12-bit filetype is stored in load_address[19:8]
205 */
206 if ((0 == (obj->attr & ADFS_NDA_DIRECTORY)) &&
207 (0xfff00000 == (0xfff00000 & obj->loadaddr))) {
208 obj->filetype = (__u16) ((0x000fff00 & obj->loadaddr) >> 8);
209
210 /* optionally append the ,xyz hex filetype suffix */
211 if (ADFS_SB(dir->sb)->s_ftsuffix)
212 obj->name_len +=
213 append_filetype_suffix(
214 &obj->name[obj->name_len],
215 obj->filetype);
216 }
217 201
218 dir->pos += 1; 202 dir->pos += 1;
219 ret = 0; 203 ret = 0;