Whamcloud - gitweb
LU-5155 scripts: added lustre/scripts/zfsobj2fid
[fs/lustre-release.git] / lustre / scripts / zfsobj2fid
diff --git a/lustre/scripts/zfsobj2fid b/lustre/scripts/zfsobj2fid
new file mode 100755 (executable)
index 0000000..e229e29
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014, Lawrence Livermore National Security, LLC.
+# Produced at the Lawrence Livermore National Laboratory.
+# Written by Christopher J. Morrone <morrone2@llnl.gov>
+# LLNL-CODE-468512
+#
+# This file is part of lustre-tools-llnl.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License (as published by the
+# Free Software Foundation) version 2, dated June 1991.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the IMPLIED WARRANTY OF
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# terms and conditions of the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# Given a zfs dataset for a Lustre OST and the object number of a file
+# in that dataset, this script will call zdb to retreive the Lustre FID
+# and print it out in standard Lustre FID format.
+
+import sys
+import subprocess
+
+def from_bytes(b):
+    return sum(b[i] << i*8 for i in range(len(b)))
+
+def main():
+    if len(sys.argv) != 3:
+        print "Usage:", sys.argv[0], "<dataset> <object>"
+        return 1
+
+    p = subprocess.Popen(["zdb", "-e", "-vvv", sys.argv[1], sys.argv[2]],
+                          stdout=subprocess.PIPE)
+    pout, perr = p.communicate()
+
+    b = bytearray()
+    found_fid = False
+    for line in pout.split('\n'):
+        part = line.split()
+        if not part or part[0] != 'trusted.fid':
+            continue
+        fid = part[2]
+        found_fid = True
+        while len(fid) > 0:
+            val = fid[0]
+            fid = fid[1:]
+            if val == '\\':
+                val = fid[0:3]
+                fid = fid[3:]
+                b.append(int(val, 8))
+            else:
+                b.append(ord(val))
+        break
+
+    if not found_fid:
+        print "FID not found on", sys.argv[1], sys.argv[2]
+        return 1
+
+    print '[' \
+        + hex(from_bytes(b[0:8])) \
+        + ':' \
+        + hex(from_bytes(b[8:12])) \
+        + ':' \
+        + hex(from_bytes(b[12:16])) \
+        + ']'
+
+    return 0
+
+if __name__ == '__main__':
+      sys.exit(main())