#!/usr/bin/env python3 import os import sys import subprocess import io locksdb = open("/proc/locks") device_inodes = {} for lockline in locksdb: lock_inode_raw = lockline.split()[5] lock_inode = lock_inode_raw.split(":") if len(lock_inode) < 3: #print("Ignoring %s" % lock_inode) continue device = tuple(map(int,lock_inode[0:2])) try: target_device = os.readlink("/sys/dev/block/%s:%s" % device) target_device = target_device.split("/")[-1] except OSError: #print("Device %s:%s not found" % device) continue inode = lock_inode[2] if not device_inodes.get(target_device): device_inodes[target_device] = [] device_inodes[target_device].append(inode) for device in device_inodes: print("-> Inodes on %s" % device) inode_input = [] for inode in device_inodes[device]: inode_input.append("ncheck %s" % inode) debugfs = subprocess.Popen(['debugfs', '/dev/%s' % device], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) debugfs_input = "\n".join(inode_input) out, err = debugfs.communicate(input=debugfs_input.encode()) debugfs_output = out.decode() for line in debugfs_output.split("\n"): if line.startswith("debugfs:"): continue if line.startswith("Inode"): continue print(line)