[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4F96D08B.2020606@itwm.fraunhofer.de>
Date: Tue, 24 Apr 2012 18:10:51 +0200
From: Bernd Schubert <bernd.schubert@...m.fraunhofer.de>
To: Andreas Dilger <adilger@...mcloud.com>
CC: Eric Sandeen <sandeen@...hat.com>, linux-nfs@...r.kernel.org,
linux-ext4@...r.kernel.org, linux-fsdevel@...r.kernel.org,
Fan Yong <yong.fan@...mcloud.com>, bfields@...hat.com
Subject: Re: [PATCH 5 2/4] Return 32/64-bit dir name hash according to usage
type
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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists