Dosfs question..?
Thomas Doerfler
Thomas.Doerfler at imd-systems.de
Thu Nov 18 16:51:54 UTC 2004
Daniel, Jennifer,
this seems like a bug to me. I have looked into "unlink()" code,
and currently I really don't understand, why unlink tries to
evalute the permissions of the parent of the current directory.
When I want to delete the file "/mnt/ramdisk0/testfile.txt", it
makes sense to check the permissions of "testfile.txt" and of
"/mnt/ramdisk0", because if any of these two is not writable, a
delete would be illegal. But why check "/mnt" ?
Does unlink check the wrong directory? Or does
"rtems_filesystem_evalute_parent" check the wrong directory?
Currently I don't think that the MSDOS implementation is wrong
here, although there is no "." or ".." directory entry in its
root.
Jennifer, can you help here?
wkr,
Thomas.
>
> -- In unlink()
>
> Rtems_filesystem_evaluate_path() returns fine.
> Rtems_filesystem_evaluate_parent() returns -1.
>
> -- In Rtems_filesystem_evaluate_parent()
>
> msdos_eval_path() (with ".." as path) here we go through MSDOS_UP_DIR.
> Returns an error (se below).
>
>
> /DANIEL
>
>
> >-----Original Message-----
> >From: Eugeny S. Mints [mailto:emints at ru.mvista.com]
> >Sent: Thursday, November 18, 2004 4:17 PM
> >To: Daniel Gustafsson
> >Cc: 'Thomas Doerfler'; rtems-users at rtems.com
> >Subject: Re: Dosfs question..?
> >
> >Daniel Gustafsson wrote:
> >>
> >> Hi.
> >>
> >> I have debugged the unlink() and the error occurs in
> >msdos_eval_path().
> >>
> >> -- in msdos_eval_path(), line 114
> >> ...
> >> switch(type)
> >> {
> >> case MSDOS_UP_DIR:
> >>
> >> if (fat_fd->fat_file_type != FAT_DIRECTORY) -->
> >> fat_fd->fat_file_type = 5 = RTEMS_FILESYSTEM_MEMORY_FILE = FAT_FILE
> >> errno = ENOTDIR;
> > -->
> >> ERROR!!!
> >> ...
> >> --
> >
> >Well, the unlink(file) should not go through case
> >MSDOS_UP_DIR. Please,
> >try to
> >debug why msdos_get_token() returns MSDOS_UP_DIR type for your file1.
> >
> >> Steps to mount and create file:
> >>
> >> 1. msdos_format("/dev/ramdisk0", NULL);
> >> 2. ide_part_table_initialize("/dev/ramdisk0");
> >> 3. rtems_fs_mount(fs_table, sizeof(...), NULL);
> >>
> >> fs_table ~ { "/dev/ramdisk0", "/mnt/ramdisk0" , msdos_ops,
> >> RTEMS_FILESYSTEM_READ_WRITE, flags, 0 } --> example
> >>
> >> 4. creat("/mnt/ramdisk0/file1", S_IREAD | S_IWRITE);
> >> 5. write to file 1
> >> 6. close file 1
> >> 7. unlink("/mnt/ramdisk0/file1");
> > -->
> >> Returns "NOT A DIRECTORY"
> >>
> >>
> >> Everything is OK but the unlink.
> >>
> >> NOTIS: The /mnt/ramdisk0/ doesn't contain "." or "..". If I
> >make a sub
> >> directory in /mnt/ramdisk0/ it will contain "." and "..".
> >>
> >>
> >> //DANIEL
> >>
> >>
> >>
> >>>-----Original Message-----
> >>>From: Eugeny S. Mints [mailto:emints at ru.mvista.com]
> >>>Sent: Thursday, November 18, 2004 3:08 PM
> >>>To: Thomas Doerfler
> >>>Cc: Daniel Gustafsson; rtems-users at rtems.com
> >>>Subject: Re: Dosfs question..?
> >>>
> >>>Hi All,
> >>>
> >>>Really strange return code. unlink() call should transform into
> >>>msdos_file_rmnod() routine call. Check whether the msdos routine is
> >>>reached if not - the issue somewhere in non-msdos related
> >code (start
> >>
> >>>from unlink() routine in libcsupport dir).
> >>
> >>>How do you mount your msdos volume? I suppose you mount to some IMFS
> >>>directory (mnt?). My suggestion that the issue is somehow
> >connected to
> >>>the mount point.
> >>>
> >>> Eugeny
> >>>
> >>>Thomas Doerfler wrote:
> >>>
> >>>>Daniel,
> >>>>
> >>>>I did a quick check of source codes, I really don't
> >>>>know what is going on in your system.
> >>>>
> >>>>My idea, what you might do:
> >>>>- Either step into the unlink call and find out
> >>>>where the error code is set.
> >>>>
> >>>>- Or: perform a grep over the libfs source code:
> >>>>grep ENOTDIR cpukit/libfs/src/*/*.c
> >>>>
> >>>>You will get about 10 results. Set a breakpoint on
> >>>>every of these lines. Start your code. And look
> >>>>where the breakpoint is hit.
> >>>>
> >>>>The rest is analysis then.
> >>>>
> >>>>By the way: which string do you pass to the unlink
> >>>>call?
> >>>>
> >>>>wkr,
> >>>>Thomas.
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>Hello.
> >>>>>
> >>>>>I am running rtems 4.6.2 on a ERC32 using TSIM as simulator
> >>>
> >>>enviroment. Am
> >>>
> >>>>>using dosfs on the ramdisk. Everything works fine, as it
> >>>
> >>>should, except the
> >>>
> >>>>>removal of files. I try to use the unlink() but it won't
> >>>
> >>>accept the file
> >>>
> >>>>>(returns "NOT A DIRECTORY"???). What am I doing wrong. Is maybe the
> >>>>>permissions is f**kt up (does dosfs support permissions
> >>>
> >>>because I can't
> >>>
> >>>>>change them).
> >>>>>
> >>>>>Please help me someone or direct me to some documentation
> >>>
> >>>about rtems dosfs.
> >>>
> >>>>>
> >>>>>Many thanks to Thomas Doerfler for providing to the Rtems
> >>>
> >>>community with a
> >>>
> >>>>>functional format function for dosfs.
> >>>>>
> >>>>>Regards
> >>>>>Daniel Gustavsson
> >>>>
> >>>>
> >>>>--------------------------------------------
> >>>>IMD Ingenieurbuero fuer Microcomputertechnik
> >>>>Thomas Doerfler Herbststrasse 8
> >>>>D-82178 Puchheim Germany
> >>>>email: Thomas.Doerfler at imd-systems.de
> >>>>PGP public key available at: http://www.imd-
> >>>>systems.de/pgp_keys.htm
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>
> >>
> >>
> >
> >
> >
--------------------------------------------
IMD Ingenieurbuero fuer Microcomputertechnik
Thomas Doerfler Herbststrasse 8
D-82178 Puchheim Germany
email: Thomas.Doerfler at imd-systems.de
PGP public key available at: http://www.imd-
systems.de/pgp_keys.htm
More information about the users
mailing list