public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: generic_file_llseek() broken?
@ 2001-11-15  0:55 Andries.Brouwer
  2001-11-15  9:02 ` Andreas Dilger
  0 siblings, 1 reply; 10+ messages in thread
From: Andries.Brouwer @ 2001-11-15  0:55 UTC (permalink / raw)
  To: adilger, linux-fsdevel, linux-kernel

> I _think_ there is a bug in generic_file_llseek(), with it returning -EINVAL
> instead of -EFBIG in the case where the offset is larger than the s_maxbytes.
> AFAICS, the return -EINVAL is for the case where "whence" is invalid, not the
> case where "offset" is too large for the underlying filesystem

My reading of the standards is:

[EFBIG] - File too large. You get this when trying to write. Not for a seek.
  The size of a file would exceed the maximum file size
  of an implementation or offset maximum established
  in the corresponding file description.

[EOVERFLOW] - Value too large for data type. This can happen for a seek.
  The resulting file offset would be a value which cannot be represented
  correctly in an object of the given type.

[EINVAL] - Bad value for other reasons. This will happen for a seek to a
  negative offset.

Andries

^ permalink raw reply	[flat|nested] 10+ messages in thread
* generic_file_llseek() broken?
@ 2001-11-14 23:51 Andreas Dilger
  2001-11-15  0:08 ` Alan Cox
  2001-11-15  1:47 ` David Gomez
  0 siblings, 2 replies; 10+ messages in thread
From: Andreas Dilger @ 2001-11-14 23:51 UTC (permalink / raw)
  To: linux-kernel, linux-fsdevel

Hello,
I was recently testing a bit with creating very large files on ext2/ext3
(just to see if limits were what they should be).  Now, I know that ext2/3
allows files just shy of 2TB right now, because of an issue with i_blocks
being in units of 512-byte sectors, instead of fs blocks.

I tried to create a (sparse!) file of 2TB size with:

dd if=/dev/zero of=/tmp/tt bs=1k count=1 seek=2047M

and it worked fine (finished immediately, don't try this with reiserfs...).

When I tried to make it just a bit bigger, with:

dd if=/dev/zero of=/tmp/tt bs=1k count=1 seek=2048M

dd fails the "llseek(fd, 2T, SEEK_SET)" with -EINVAL, and then proceeds
to loop "infinitely" reading from the file to try and manually advance
the file descriptor offset to the desired offset.  That is bad.

I _think_ there is a bug in generic_file_llseek(), with it returning -EINVAL
instead of -EFBIG in the case where the offset is larger than the s_maxbytes.
AFAICS, the return -EINVAL is for the case where "whence" is invalid, not the
case where "offset" is too large for the underlying filesystem (I can see
-EINVAL for seeking to a negative position).

If I use:

dd if=/dev/zero of=/tmp/tt bs=1k count=1025 seek=2097151k

I correctly get "EFBIG (file too large)" and "SIGXFSZ" from write(2).

Does anyone know the correct LFS interpretation on this?  From what I can
see (I have not read the whole thing) lseek() should return EOVERFLOW if
the resulting offset is too large to fit in the passed type.  It doesn't
really say what should happen in this particular case - can someone try
on a non-Linux system and see what the result is?

Either way, I think the kernel is broken in this regard.

Cheers, Andreas
--
Andreas Dilger
http://sourceforge.net/projects/ext2resize/
http://www-mddsp.enel.ucalgary.ca/People/adilger/


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2001-11-15 21:55 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-11-15  0:55 generic_file_llseek() broken? Andries.Brouwer
2001-11-15  9:02 ` Andreas Dilger
2001-11-15  9:55   ` Trond Myklebust
  -- strict thread matches above, loose matches on Subject: below --
2001-11-14 23:51 Andreas Dilger
2001-11-15  0:08 ` Alan Cox
2001-11-15  0:46   ` Andreas Dilger
2001-11-15  1:47 ` David Gomez
2001-11-15  5:24   ` Andreas Dilger
     [not found]     ` <3BF38CFB.21998301@idb.hist.no>
2001-11-15 21:09       ` Andreas Dilger
2001-11-15 22:02         ` Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox