2 fs/umsdos/Makefile | 4 +-
3 fs/umsdos/dir.c | 25 +++++++++------
4 fs/umsdos/inode.c | 71 ++++++++++++++++++++++++++++++++------------
5 fs/umsdos/ioctl.c | 17 ++++++----
6 fs/umsdos/namei.c | 2 +
8 include/linux/umsdos_fs.p | 14 +++-----
9 include/linux/umsdos_fs_i.h | 4 ++
10 9 files changed, 96 insertions(+), 48 deletions(-)
12 diff -Naurp linux-260-test8-efs/include/linux/umsdos_fs_i.h linux-260-test8/include/linux/umsdos_fs_i.h
13 --- linux-260-test8-efs/include/linux/umsdos_fs_i.h 2003-10-17 14:43:20.000000000 -0700
14 +++ linux-260-test8/include/linux/umsdos_fs_i.h 2003-10-23 16:13:10.000000000 -0700
15 @@ -55,4 +55,8 @@ struct umsdos_inode_info {
16 off_t pos; /* Entry offset in the emd_owner file */
19 +static inline struct umsdos_inode_info *UMSDOS_I(struct inode *inode)
21 + return (struct umsdos_inode_info *)inode->u.generic_ip;
24 diff -Naurp linux-260-test8-efs/include/linux/umsdos_fs.p linux-260-test8/include/linux/umsdos_fs.p
25 --- linux-260-test8-efs/include/linux/umsdos_fs.p 2003-10-17 14:43:00.000000000 -0700
26 +++ linux-260-test8/include/linux/umsdos_fs.p 2003-10-23 23:20:36.000000000 -0700
27 @@ -37,8 +37,10 @@ void UMSDOS_write_inode (struct inode *,
28 int UMSDOS_notify_change (struct dentry *, struct iattr *attr);
29 int umsdos_notify_change_locked(struct dentry *, struct iattr *attr);
30 void UMSDOS_put_inode (struct inode *);
31 -int UMSDOS_statfs (struct super_block *, struct statfs *);
32 -struct super_block *UMSDOS_read_super (struct super_block *, void *, int);
34 +int UMSDOS_statfs (struct super_block *, struct kstatfs *);
35 +int UMSDOS_read_super (struct super_block *, void *, int,
36 + struct inode_operations *, int);
37 void UMSDOS_put_super (struct super_block *);
39 void umsdos_setup_dir(struct dentry *);
40 @@ -74,7 +76,8 @@ int UMSDOS_link (struct dentry *olddentr
41 struct dentry *dentry);
42 int UMSDOS_create (struct inode *dir,
43 struct dentry *dentry,
46 + struct nameidata *nd);
48 int UMSDOS_mkdir (struct inode *dir,
49 struct dentry *dentry,
50 @@ -93,8 +96,3 @@ int UMSDOS_rename (struct inode *old_dir
51 /* rdir.c 22/03/95 03.31.42 */
52 struct dentry *umsdos_rlookup_x (struct inode *dir, struct dentry *dentry, int nopseudo);
53 struct dentry *UMSDOS_rlookup (struct inode *dir, struct dentry *dentry, struct nameidata *nd);
55 -static inline struct umsdos_inode_info *UMSDOS_I(struct inode *inode)
57 - return &inode->u.umsdos_i;
59 --- linux-260-test8-efs/fs/Kconfig 2003-10-17 14:43:15.000000000 -0700
60 +++ linux-260-test8/fs/Kconfig 2003-10-23 13:01:50.000000000 -0700
61 @@ -621,9 +621,9 @@ config VFAT_FS
65 -#dep_tristate ' UMSDOS: Unix-like file system on top of standard MSDOS fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
66 -# UMSDOS is temprory broken
68 + tristate ' UMSDOS: Unix-like file system on top of standard MSDOS fs'
69 + depends on MSDOS_FS || BROKEN
70 +# UMSDOS is BROKEN until someone spends some time to fix it
72 Say Y here if you want to run Linux from within an existing DOS
73 partition of your hard drive. The advantage of this is that you can
74 diff -Naurp linux-260-test8-efs/fs/umsdos/inode.c linux-260-test8/fs/umsdos/inode.c
75 --- linux-260-test8-efs/fs/umsdos/inode.c 2003-10-17 14:42:54.000000000 -0700
76 +++ linux-260-test8/fs/umsdos/inode.c 2003-10-23 23:18:39.000000000 -0700
79 #include <linux/msdos_fs.h>
80 #include <linux/kernel.h>
81 +#include <linux/namei.h>
82 #include <linux/time.h>
83 #include <linux/errno.h>
84 #include <asm/uaccess.h>
85 #include <linux/string.h>
86 #include <linux/stat.h>
87 +#include <linux/statfs.h>
88 +#include <linux/smp_lock.h>
89 #include <linux/umsdos_fs.h>
90 +#include <linux/umsdos_fs_i.h>
91 #include <linux/list.h>
92 #include <linux/pagemap.h>
94 extern struct dentry_operations umsdos_dentry_operations;
95 +extern dev_t ROOT_DEV;
97 struct dentry *saved_root; /* Original root if changed */
98 struct inode *pseudo_root; /* Useful to simulate the pseudo DOS */
99 @@ -49,7 +54,9 @@ void UMSDOS_put_inode (struct inode *ino
100 void UMSDOS_put_super (struct super_block *sb)
102 Printk ((KERN_DEBUG "UMSDOS_put_super: entering\n"));
103 - if (saved_root && pseudo_root && kdev_same(sb->s_dev, ROOT_DEV)) {
104 + if (saved_root && pseudo_root &&
105 + old_encode_dev(sb->s_dev) == old_encode_dev(ROOT_DEV)) {
106 + /* TBD: is using 16-bit dev_t OK here? */
107 shrink_dcache_parent(saved_root);
110 @@ -150,7 +157,7 @@ dentry, f_pos));
111 inode->i_op = &umsdos_symlink_inode_operations;
113 init_special_inode(inode, inode->i_mode,
114 - kdev_t_to_nr(inode->i_rdev));
119 @@ -282,12 +289,15 @@ dentry->d_parent->d_name.name, dentry->d
120 entry->gid = cpu_to_le16(attr->ia_gid);
121 if (attr->ia_valid & ATTR_MODE)
122 entry->mode = cpu_to_le16(attr->ia_mode);
123 + /* TBD: fix times */
125 if (attr->ia_valid & ATTR_ATIME)
126 entry->atime = cpu_to_le32(attr->ia_atime);
127 if (attr->ia_valid & ATTR_MTIME)
128 entry->mtime = cpu_to_le32(attr->ia_mtime);
129 if (attr->ia_valid & ATTR_CTIME)
130 entry->ctime = cpu_to_le32(attr->ia_ctime);
132 entry->nlink = cpu_to_le16(inode->i_nlink);
133 ret=mapping->a_ops->commit_write(NULL,page,offs,offs+UMSDOS_REC_SIZE);
135 @@ -343,7 +353,7 @@ static struct super_operations umsdos_so
136 .clear_inode = fat_clear_inode,
139 -int UMSDOS_statfs(struct super_block *sb,struct statfs *buf)
140 +int UMSDOS_statfs(struct super_block *sb, struct kstatfs *buf)
143 ret = fat_statfs (sb, buf);
144 @@ -355,26 +365,27 @@ int UMSDOS_statfs(struct super_block *sb
146 * Read the super block of an Extended MS-DOS FS.
148 -struct super_block *UMSDOS_read_super (struct super_block *sb, void *data,
150 +int UMSDOS_read_super (struct super_block *sb,
151 + void *data, int silent,
152 + struct inode_operations *fs_dir_inode_ops,
155 - struct super_block *res;
156 struct dentry *new_root;
160 * Call msdos-fs to mount the disk.
161 - * Note: this returns res == sb or NULL
162 + * Note: this returns res == 0 (success) else error.
164 MSDOS_SB(sb)->options.isvfat = 0;
165 - res = fat_read_super(sb, data, silent, &umsdos_rdir_inode_operations);
170 + // TBD: which inode_operations to use:
171 + res = fat_fill_super(sb, data, silent,
172 + &umsdos_rdir_inode_operations, isvfat);
175 printk(KERN_INFO "VFS: Can't find a valid "
176 "UMSDOS filesystem on dev %s.\n", sb->s_id);
181 printk (KERN_INFO "UMSDOS 0.86k "
182 @@ -402,14 +413,13 @@ struct super_block *UMSDOS_read_super (s
183 printk(KERN_INFO "UMSDOS: changed to alternate root\n");
184 dget (sb->s_root); sb->s_root = dget(new_root);
191 * Check for an alternate root if we're the root device.
194 -extern kdev_t ROOT_DEV;
195 static struct dentry *check_pseudo_root(struct super_block *sb)
197 struct dentry *root, *sbin, *init;
198 @@ -419,14 +429,15 @@ static struct dentry *check_pseudo_root(
199 * must check like this, because we can be used with initrd
202 - if (!kdev_same(sb->s_dev, ROOT_DEV))
203 + if (old_encode_dev(sb->s_dev) != old_encode_dev(ROOT_DEV))
207 * lookup_dentry needs a (so far non-existent) root.
209 printk(KERN_INFO "check_pseudo_root: mounted as root\n");
210 - root = lookup_one_len(UMSDOS_PSDROOT_NAME, sb->s_root,UMSDOS_PSDROOT_LEN);
211 + root = lookup_one_len(UMSDOS_PSDROOT_NAME,
212 + sb->s_root, UMSDOS_PSDROOT_LEN);
216 @@ -464,7 +475,31 @@ out_noroot:
220 -static DECLARE_FSTYPE_DEV(umsdos_fs_type, "umsdos", UMSDOS_read_super);
221 +static int umsdos_fill_super(struct super_block *sb, void *data, int silent)
225 + res = UMSDOS_read_super(sb, data, silent, &umsdos_dir_inode_operations, 0);
230 +static struct super_block *umsdos_get_sb(struct file_system_type *fs_type,
231 + int flags, const char *dev_name, void *data)
233 + return get_sb_bdev(fs_type, flags, dev_name, data, umsdos_fill_super);
236 +//TBD: must EXPORT all entry points;
237 +//and use UMSDOS_ for them by local convention;
239 +static struct file_system_type umsdos_fs_type = {
240 + .owner = THIS_MODULE,
242 + .get_sb = umsdos_get_sb,
243 + .kill_sb = kill_block_super,
244 + .fs_flags = FS_REQUIRES_DEV,
247 static int __init init_umsdos_fs (void)
249 diff -Naurp linux-260-test8-efs/fs/umsdos/ioctl.c linux-260-test8/fs/umsdos/ioctl.c
250 --- linux-260-test8-efs/fs/umsdos/ioctl.c 2003-10-17 14:42:54.000000000 -0700
251 +++ linux-260-test8/fs/umsdos/ioctl.c 2003-10-23 21:22:53.000000000 -0700
252 @@ -402,9 +402,10 @@ new_dentry->d_parent->d_name.name, new_d
253 data.stat.st_ino = inode->i_ino;
254 data.stat.st_mode = inode->i_mode;
255 data.stat.st_size = inode->i_size;
256 - data.stat.st_atime = inode->i_atime;
257 - data.stat.st_ctime = inode->i_ctime;
258 - data.stat.st_mtime = inode->i_mtime;
259 + /* TBD: fix times */
260 + ///data.stat.st_atime = inode->i_atime;
261 + ///data.stat.st_ctime = inode->i_ctime;
262 + ///data.stat.st_mtime = inode->i_mtime;
264 if (!copy_to_user (&idata->stat, &data.stat,
266 @@ -414,6 +415,7 @@ new_dentry->d_parent->d_name.name, new_d
269 else if (cmd == UMSDOS_DOS_SETUP) {
270 + struct msdos_sb_info *msdossbi = (struct msdos_sb_info *)dir->i_sb->s_fs_info;
271 /* #Specification: ioctl / UMSDOS_DOS_SETUP
272 * The UMSDOS_DOS_SETUP ioctl allow changing the
273 * default permission of the MS-DOS filesystem driver
274 @@ -433,10 +435,11 @@ new_dentry->d_parent->d_name.name, new_d
275 * umsdos_dirent.uid and gid sets the owner and group.
276 * umsdos_dirent.mode set the permissions flags.
278 - dir->i_sb->u.msdos_sb.options.fs_uid = data.umsdos_dirent.uid;
279 - dir->i_sb->u.msdos_sb.options.fs_gid = data.umsdos_dirent.gid;
280 - dir->i_sb->u.msdos_sb.options.fs_fmask =
281 - dir->i_sb->u.msdos_sb.options.fs_dmask =
282 + msdossbi->options.fs_uid = data.umsdos_dirent.uid;
283 + msdossbi->options.fs_gid = data.umsdos_dirent.gid;
284 + msdossbi->options.fs_fmask =
285 + data.umsdos_dirent.mode;
286 + msdossbi->options.fs_dmask =
287 data.umsdos_dirent.mode;
290 diff -Naurp linux-260-test8-efs/fs/umsdos/Makefile linux-260-test8/fs/umsdos/Makefile
291 --- linux-260-test8-efs/fs/umsdos/Makefile 2003-10-17 14:42:58.000000000 -0700
292 +++ linux-260-test8/fs/umsdos/Makefile 2003-10-23 13:05:13.000000000 -0700
294 # Makefile for the umsdos Unix-like filesystem routines.
297 -obj-$(CONFIG_UMSDOS) += umsdos.o
298 +obj-$(CONFIG_UMSDOS_FS) += umsdos.o
300 -umsdos-objs := dir.o inode.o ioctl.o mangle.o namei.o rdir.o emd.o
301 +umsdos-objs := dir.o inode.o ioctl.o mangle.o namei.o rdir.o emd.o
304 proto *.c >/usr/include/linux/umsdos_fs.p
305 diff -Naurp linux-260-test8-efs/fs/umsdos/namei.c linux-260-test8/fs/umsdos/namei.c
306 --- linux-260-test8-efs/fs/umsdos/namei.c 2003-10-17 14:43:23.000000000 -0700
307 +++ linux-260-test8/fs/umsdos/namei.c 2003-10-23 21:46:02.000000000 -0700
309 #include <linux/time.h>
310 #include <linux/types.h>
311 #include <linux/fcntl.h>
312 +#include <linux/sched.h>
313 #include <linux/stat.h>
314 #include <linux/string.h>
315 #include <linux/msdos_fs.h>
316 #include <linux/umsdos_fs.h>
317 +#include <linux/umsdos_fs_i.h>
318 #include <linux/slab.h>
320 #define UMSDOS_DIR_LOCK
321 diff -Naurp linux-260-test8-efs/fs/umsdos/rdir.c linux-260-test8/fs/umsdos/rdir.c
322 --- linux-260-test8-efs/fs/umsdos/rdir.c 2003-10-17 14:42:56.000000000 -0700
323 +++ linux-260-test8/fs/umsdos/rdir.c 2003-10-23 20:11:33.000000000 -0700
325 #include <linux/stat.h>
326 #include <linux/limits.h>
327 #include <linux/umsdos_fs.h>
328 +#include <linux/umsdos_fs_i.h>
329 #include <linux/slab.h>
330 #include <linux/smp_lock.h>
332 diff -Naurp linux-260-test8-efs/fs/umsdos/dir.c linux-260-test8/fs/umsdos/dir.c
333 --- linux-260-test8-efs/fs/umsdos/dir.c 2003-10-17 14:43:11.000000000 -0700
334 +++ linux-260-test8/fs/umsdos/dir.c 2003-10-23 23:45:19.000000000 -0700
336 #include <linux/stat.h>
337 #include <linux/limits.h>
338 #include <linux/umsdos_fs.h>
339 +#include <linux/umsdos_fs_i.h>
340 #include <linux/slab.h>
341 #include <linux/pagemap.h>
342 #include <linux/smp_lock.h>
343 @@ -368,13 +369,16 @@ void umsdos_lookup_patch_new(struct dent
344 if (UMSDOS_I(inode)->i_patched)
346 UMSDOS_I(inode)->i_patched = 1;
347 - if (S_ISREG (entry->mode))
348 - entry->mtime = inode->i_mtime;
349 + /* TBD: fix mtime */
350 + ///if (S_ISREG (entry->mode))
351 + ///entry->mtime = inode->i_mtime;
352 inode->i_mode = entry->mode;
353 - inode->i_rdev = to_kdev_t (entry->rdev);
354 - inode->i_atime = entry->atime;
355 - inode->i_ctime = entry->ctime;
356 - inode->i_mtime = entry->mtime;
357 + /* TBD: still using 16-bit dev_t; is this a problem? */
358 + inode->i_rdev = old_decode_dev (entry->rdev);
359 + /* TBD: fix times */
360 + ///inode->i_atime = entry->atime;
361 + ///inode->i_ctime = entry->ctime;
362 + ///inode->i_mtime = entry->mtime;
363 inode->i_uid = entry->uid;
364 inode->i_gid = entry->gid;
366 @@ -593,7 +597,7 @@ struct dentry *umsdos_covered(struct den
367 dentry = d_alloc(parent, &qstr);
369 /* XXXXXXXXXXXXXXXXXXX Race alert! */
370 - result = UMSDOS_rlookup(parent->d_inode, dentry);
371 + result = UMSDOS_rlookup(parent->d_inode, dentry, NULL);
375 @@ -628,8 +632,8 @@ struct dentry *umsdos_lookup_dentry(stru
376 dentry = d_alloc(parent, &qstr);
379 - UMSDOS_rlookup(parent->d_inode, dentry) :
380 - UMSDOS_lookup(parent->d_inode, dentry);
381 + UMSDOS_rlookup(parent->d_inode, dentry, NULL) :
382 + UMSDOS_lookup(parent->d_inode, dentry, NULL);
386 @@ -655,7 +659,8 @@ char * umsdos_d_path(struct dentry *dent
387 old_root = dget(current->fs->root);
388 read_unlock(¤t->fs->lock);
389 spin_lock(&dcache_lock);
390 - path = __d_path(dentry, current->fs->rootmnt, dentry->d_sb->s_root, current->fs->rootmnt, buffer, len); /* FIXME: current->fs->rootmnt */
391 + /* FIXME: current->fs->rootmnt: */
392 + path = d_path(dentry, current->fs->rootmnt, buffer, len);
393 spin_unlock(&dcache_lock);