strange interaction between open and cwd

Nobody nobody at nowhere.com
Thu May 6 00:16:40 EDT 2010


On Wed, 05 May 2010 13:23:03 +0100, Baz Walter wrote:

>>> so
>>> if several filesystems are mounted in the same parent directory, there is
>>> no way to tell which of them is the "right" one.
>>
>> The only case which would cause a problem here is if you mount the same
>> device on two different subdirectories of a common directory. But in that
>> case, it doesn't really matter which answer you get, as they're both
>> equivalent in any sense that matters.
> 
> nope! just to be clear:
> 
> here's what i get on my system, where '/dev/sda1' and '/dev/sda6' are 
> mounted at '/boot' and '/home' respectively:
> 
>  >>> os.stat('/').st_ino
> 2L
>  >>> os.stat('/usr').st_ino
> 212993L
>  >>> os.stat('/boot').st_ino
> 2L
>  >>> os.stat('/home').st_ino
> 2L
>  >>>

Right. /, /boot and /home are separate filesystems; ext2/ext3 filesystems
normally use inode #2 as the root directory. If you look at the st_dev
field, all three will be different (for /boot and /home, they'll
correspond to sda1 and sda6 respectively).

> if the algorithm is climbing up from '/home/baz/tmp/xxx', what does it 
> do when it searches os.listdir('../../../..')? how can it tell whether 
> 'boot' or 'home' is the correct next parent if it only checks the inode 
> number?

It doesn't. Inode numbers are only unique within a single device; you need
to use both st_dev and st_ino to uniquely identify an inode within a
complete filesystem.

> i think the algorithm would at least need to take account of 
> changes in the current device id. not sure whether that would be enough 
> to cover all cases, though.

st_dev+st_ino is sufficient.




More information about the Python-list mailing list