From 0d76caab58a11fee0b5ab990864c867dc049d7be Mon Sep 17 00:00:00 2001 From: Gui Chen Date: Tue, 22 Jan 2013 00:36:18 +0800 Subject: [PATCH] clean up the loop devices not released the pidfiles record last running info of device and process pid, and now mic can clean these up if they are not released for some unknown reason Change-Id: I3b0bbd31fbcfaf7fe4c751feab6f7f9b528d64f6 Signed-off-by: Gui Chen --- mic/utils/fs_related.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mic/utils/fs_related.py b/mic/utils/fs_related.py index 7614132..7c4b538 100644 --- a/mic/utils/fs_related.py +++ b/mic/utils/fs_related.py @@ -948,6 +948,10 @@ def get_loop_device(losetupcmd, lofile): loopdev = None devinst = LoopDevice() + # clean up left loop device first + clean_loop_devices() + + # provide an avaible loop device rc, out = runner.runtool([losetupcmd, "--find"]) if rc == 0: loopdev = out.split()[0] @@ -956,6 +960,7 @@ def get_loop_device(losetupcmd, lofile): devinst.create() loopdev = devinst.device + # setup a loop device for image file rc = runner.show([losetupcmd, loopdev, lofile]) if rc != 0: raise MountError("Failed to setup loop device for '%s'" % lofile) @@ -984,3 +989,28 @@ def get_loop_device(losetupcmd, lofile): return loopdev +def clean_loop_devices(piddir=DEVICE_PIDFILE_DIR): + if not os.path.exists(piddir) or not os.path.isdir(piddir): + return + + for loopdev in os.listdir(piddir): + pidfile = os.path.join(piddir, loopdev) + try: + with open(pidfile, 'r') as rf: + devpid = int(rf.read()) + except: + devpid = None + + # if the process using this device is alive, skip it + if not devpid or os.path.exists(os.path.join('/proc', str(devpid))): + continue + + # try to clean it up + try: + devinst = LoopDevice() + devinst.register(os.path.join('/dev', loopdev)) + devinst.cleanup() + os.unlink(pidfile) + except: + pass + -- 2.7.4