From 5479e45d9e21df170affa3545aafa4d1261be9bb Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 27 Mar 2008 04:50:32 +0000 Subject: [PATCH] Bug #212882 - For compatibility with ENOENT exceptions raised from fstat calls with CIFS, wrap fstat calls with an appropriate exception handler. (trunk r9474) - Fix lockfile() to handle errno.EACCES raised from the fcntl call since the spec says that it's equivalent to EAGAIN and it appears that CIFS returns EACCES in this case. (trunk r9458) svn path=/main/branches/2.1.2/; revision=9518 --- pym/portage_locks.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/pym/portage_locks.py b/pym/portage_locks.py index 9b17c60e3..340096a7c 100644 --- a/pym/portage_locks.py +++ b/pym/portage_locks.py @@ -79,7 +79,7 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None): except IOError, e: if "errno" not in dir(e): raise - if e.errno == errno.EAGAIN: + if e.errno in (errno.EACCES, errno.EAGAIN): # resource temp unavailable; eg, someone beat us to the lock. if waiting_msg is None: if isinstance(mypath, int): @@ -111,7 +111,7 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None): if type(lockfilename) == types.StringType and \ - myfd != HARDLINK_FD and os.fstat(myfd).st_nlink == 0: + myfd != HARDLINK_FD and _fstat_nlink(myfd) == 0: # The file was deleted on us... Keep trying to make one... os.close(myfd) portage_util.writemsg("lockfile recurse\n",1) @@ -122,6 +122,22 @@ def lockfile(mypath, wantnewlockfile=0, unlinkfile=0, waiting_msg=None): portage_util.writemsg(str((lockfilename,myfd,unlinkfile))+"\n",1) return (lockfilename,myfd,unlinkfile,locking_method) +def _fstat_nlink(fd): + """ + @param fd: an open file descriptor + @type fd: Integer + @rtype: Integer + @return: the current number of hardlinks to the file + """ + try: + return os.fstat(fd).st_nlink + except EnvironmentError, e: + if e.errno == errno.ENOENT: + # Some filesystems such as CIFS return + # ENOENT which means st_nlink == 0. + return 0 + raise + def unlockfile(mytuple): import fcntl @@ -167,7 +183,7 @@ def unlockfile(mytuple): # We won the lock, so there isn't competition for it. # We can safely delete the file. portage_util.writemsg("Got the lockfile...\n",1) - if os.fstat(myfd).st_nlink == 1: + if _fstat_nlink(myfd) == 1: os.unlink(lockfilename) portage_util.writemsg("Unlinked lockfile...\n",1) locking_method(myfd,fcntl.LOCK_UN) -- 2.26.2