2006-02-08 23:39:29

by kapil a

[permalink] [raw]
Subject: file system question

I am trying to write a file system for 2.6. I have written the
required things to mount my file system and now i am trying to get
some f_op's and d_op's. I was trying to make the 'ls' command work. So
i wrote a myfs_readdir() and linked it to the f_op field. My routine
gets called and also filldir gets called and stores the data in the
dirent but i dont get the output in stdout.

On using strace i find that "ls" does not perform all the calls that
a "ls" in a directory mountedf in ext2 performs. To be specific, the
strace ouput ends after the getdents64 system call. In the normal "ls"
strace, i find there are a couple of more system calls namely a fstat
followed by a write to stdout and some more mmap calls.

I dont understand the reason behind why the write is not called. My
guess is i have not over-ridden some function that i have to write as
part of my file system instead of using the default method.

Any help regarding this would be appreciated...

regards
kaps


2006-02-09 00:01:11

by Avishay Traeger

[permalink] [raw]
Subject: Re: file system question

On Wed, 2006-02-08 at 18:39 -0500, kapil a wrote:
> I am trying to write a file system for 2.6. I have written the
> required things to mount my file system and now i am trying to get
> some f_op's and d_op's. I was trying to make the 'ls' command work. So
> i wrote a myfs_readdir() and linked it to the f_op field. My routine
> gets called and also filldir gets called and stores the data in the
> dirent but i dont get the output in stdout.
>
> On using strace i find that "ls" does not perform all the calls that
> a "ls" in a directory mountedf in ext2 performs. To be specific, the
> strace ouput ends after the getdents64 system call. In the normal "ls"
> strace, i find there are a couple of more system calls namely a fstat
> followed by a write to stdout and some more mmap calls.

Correct. The getdents system call will call your readdir function.

> I dont understand the reason behind why the write is not called. My
> guess is i have not over-ridden some function that i have to write as
> part of my file system instead of using the default method.

Why would your write function get called when 'ls' writes to stdout?
Please explain your question more clearly.


Avishay Traeger
http://www.fsl.cs.sunysb.edu/~avishay/

2006-02-09 00:13:23

by kapil a

[permalink] [raw]
Subject: Re: file system question

---------- Forwarded message ----------
From: kapil a <[email protected]>
Date: Feb 8, 2006 7:11 PM
Subject: Re: file system question
To: Avishay Traeger <[email protected]>


thanks for the reply and sorry for the unclear question.

What i meant was when i do an "ls" in a directory that is part of the
ext2 filesystem, i can see a "write" call in the strace output at the
end and it writes the directory contents to stdout. However when i
issue "ls" in the mount point of my file system, i dont have the
"write" call. The strace ends with the getdents64 call.

When i did some debugging i found that filldir which is suppose to
fill the dirent with the directory entries does its job. My filesystem
currently has only one inode with one block of data where i have a
".", ".." and "test" written into it.

The problem is it does not go further to do some of the other calls as
in a mountpoint in ext2 file system.

Hope i am clear now.

kaps


On 2/8/06, Avishay Traeger <[email protected]> wrote:
> On Wed, 2006-02-08 at 18:39 -0500, kapil a wrote:
> > I am trying to write a file system for 2.6. I have written the
> > required things to mount my file system and now i am trying to get
> > some f_op's and d_op's. I was trying to make the 'ls' command work. So
> > i wrote a myfs_readdir() and linked it to the f_op field. My routine
> > gets called and also filldir gets called and stores the data in the
> > dirent but i dont get the output in stdout.
> >
> > On using strace i find that "ls" does not perform all the calls that
> > a "ls" in a directory mountedf in ext2 performs. To be specific, the
> > strace ouput ends after the getdents64 system call. In the normal "ls"
> > strace, i find there are a couple of more system calls namely a fstat
> > followed by a write to stdout and some more mmap calls.
>
> Correct. The getdents system call will call your readdir function.
>
> > I dont understand the reason behind why the write is not called. My
> > guess is i have not over-ridden some function that i have to write as
> > part of my file system instead of using the default method.
>
> Why would your write function get called when 'ls' writes to stdout?
> Please explain your question more clearly.
>
>
> Avishay Traeger
> http://www.fsl.cs.sunysb.edu/~avishay/
>
>

2006-02-09 01:15:53

by be-news06

[permalink] [raw]
Subject: Re: file system question

kapil a <[email protected]> wrote:
> When i did some debugging i found that filldir which is suppose to
> fill the dirent with the directory entries does its job. My filesystem
> currently has only one inode with one block of data where i have a
> ".", ".." and "test" written into it.
>
> The problem is it does not go further to do some of the other calls as
> in a mountpoint in ext2 file system.

in that case ls is missing something, maybe a count, a size, filetype,
permission... why dont you debug ls to see where it is exiting? I mean if
you write kernel mode code one could expect that you can step through a user
mode tool?


Gruss
Bernd

2006-02-09 17:57:21

by kapil a

[permalink] [raw]
Subject: Re: file system question

I am only sending the relevant stuff.

My strace output :

fstat64(3, {st_mode=S_IFDIR|0755, st_size=48, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 3 entries */, 4096) = 80
getdents64(3, /* 0 entries */, 4096) = 0
close(3) = 0
exit_group(0)

strace output on a partition under ext2

fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 4 entries */, 4096) = 104
getdents64(3, /* 0 entries */, 4096) = 0
close(3) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7ddc000
write(1, "kapil out\n", 11) = 11
munmap(0xb7ddc000, 4096) = 0
exit_group(0)

We can see that my strace does not call the fstat, mmap, write and
munmap calls. It directly calls the exit_group call. This is what i
fail to understand. The getdents seems to be returning data correctly.
And filldir() called by the readdir() seems to be working
correctly(am not sure).
So i fail to understand why the other calls are not performed.

I would like to remind you that i have not written all the calls. For
example i dont have my file systems implementation of the write call.
But atleast i shd be able to call the default.

any help would be appreciated. And can anybody think of an other way i
can test my filesystem with a smaller call. "ls" seems to be calling
way too many system calls. My filesystem is a disk based file system
with my superblock in a floppy.

kapil




On 2/8/06, Avishay Traeger <[email protected]> wrote:
> On Wed, 2006-02-08 at 19:11 -0500, kapil a wrote:
> > thanks for the reply and sorry for the unclear question.
> >
> > What i meant was when i do an "ls" in a directory that is part of the
> > ext2 filesystem, i can see a "write" call in the strace output at the
> > end and it writes the directory contents to stdout. However when i
> > issue "ls" in the mount point of my file system, i dont have the
> > "write" call. The strace ends with the getdents64 call.
> >
> > When i did some debugging i found that filldir which is suppose to
> > fill the dirent with the directory entries does its job. My filesystem
> > currently has only one inode with one block of data where i have a
> > ".", ".." and "test" written into it.
> >
> > The problem is it does not go further to do some of the other calls as
> > in a mountpoint in ext2 file system.
> >
> > Hope i am clear now.
> >
> > kaps
>
> Can you send the strace output?
>
>

2006-02-09 21:54:09

by Ram Gupta

[permalink] [raw]
Subject: Re: file system question

On 2/9/06, kapil a <[email protected]> wrote:
> I am only sending the relevant stuff.
>
> My strace output :
>
> fstat64(3, {st_mode=S_IFDIR|0755, st_size=48, ...}) = 0
> fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
> getdents64(3, /* 3 entries */, 4096) = 80
> getdents64(3, /* 0 entries */, 4096) = 0
> close(3) = 0
> exit_group(0)
>
> strace output on a partition under ext2
>
> fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
> getdents64(3, /* 4 entries */, 4096) = 104
> getdents64(3, /* 0 entries */, 4096) = 0


Why dont you write a simple program which makes call to
open,read,write & others you want to test. That would not make these
unnecessary calls.

Regards
Ram Gupta