[libvirt] [v2] storage: Ignore dangling symbol link for filesystem pool

Eric Blake eblake at redhat.com
Tue Dec 21 14:40:46 UTC 2010


On 12/20/2010 11:47 PM, Osier Yang wrote:
> 
> a more efficient solution would be to check if errno
>> is ELOOP or ENOENT (the only possibilities for a dangling symlink; any
>> other error should return -1), and in those two cases a successful
>> lstat() is sufficient to detect a broken symlink without resorting to
>> reading its contents.
>>
> 
> I guess you mean stat, lstat will not work here, as it doesn't follow
> the *symbolic* link. what we need to do is to determine if the symbolic
> link is dangling, so use "stat" to update the patch, v3 send, thanks
> again.

No, I really meant lstat().  If stat() would have failed because of a
dangling symlink, then open() will fail for the same reasons.
Therefore, check errno before lstat, and use the successful lstat as
proof that a symlink is in place but that stat()ing the symlink would
fail because it is dangling.

if (open(f) < 0) {
    if ((errno == ENOENT || errno == ELOOP) &&
        lstat(f, buf) == 0) {
        /* Dangling symlink, since lstat() passed but open failed. */
        log message about ignored file
        return -2;
    }
    either an unrelated errno, like EACCES, or we got ENOENT because
    the file was deleted after readdir but before open/lstat
    error message about unaccessible file
    return -1;
}

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20101221/30a16be5/attachment-0001.sig>


More information about the libvir-list mailing list