On 04/24/2012 12:42 AM, Andreas Dilger wrote:
On 2012-04-23, at 5:23 PM, Eric Sandeen wrote:
I'm curious about the above as well as:
case SEEK_END:
if (unlikely(offset> 0))
goto out_err; /* not supported for directories */
The previous .llseek handler, and the generic handler for other filesystems, allow seeking past the end of the dir AFAICT. (not sure why you'd want to, but I don't see that you'd get an error back).
Is there a reason to uniquely exclude it in ext4? Does that line up with POSIX?
I don't know what the origin of this was... I don't think there is a real reason for it except that it doesn't make any sense to do so.
I think I added that. According to pubs.opengroup.org:
(http://pubs.opengroup.org/onlinepubs/009695399/functions/seekdir.html)
void seekdir(DIR *dirp, long loc);
<quote>
If the value of loc was not obtained from an earlier call to telldir(),
or if a call to rewinddir() occurred between the call to telldir() and
the call to seekdir(), the results of subsequent calls to readdir() are
unspecified.
</quote>
As telldir(), which should correlate to 'case SEEK_CUR' will not provide
invalid values, the behaviour is undefined.
Also,
case SEEK_END:
[...]
if (dx_dir)
offset += ext4_get_htree_eof(file);
else
offset += inode->i_size;
[...]
if (!dx_dir) {
if (offset > inode->i_sb->s_maxbytes)
goto out_err;
} else if (offset > ext4_get_htree_eof(file))
goto out_err;
Hence, the additional:
case SEEK_END:
if (unlikely(offset> 0))
goto out_err; /* not supported for directories */
is just a shortcut to avoid useless calculations.
Unless I missed something, it only remains the question if could break
existing applications relying on undefined behaviour. However, I have no
idea how an application might trigger that?
Thanks,
Bernd
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html