[Ocfs2-tools-devel] [PATCH v2] debugfs.ocfs2: encode lockname with generation only for specific lock types

piaojun piaojun at huawei.com
Thu Sep 8 22:24:44 PDT 2016


I got the wrong lockname 'M000000000000000001a90276b7f60a' by encoding
the inode of a regular file. So I could not resolve lockres info by
'dlm_locks' command of debugfs.ocfs2. The right lockname should be
'M000000000000000001a90200000000' with no generation at tail. We need
make lockname corresponding to the kernel code. 'W', 'F', 'T' and 'M'
lock of sysfile has generation at tail.

Signed-off-by: Jun Piao <piaojun at huawei.com>
---
 debugfs.ocfs2/commands.c | 4 +++-
 libocfs2/lockid.c        | 6 ++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/debugfs.ocfs2/commands.c b/debugfs.ocfs2/commands.c
index 3d5518a..4e4ea7f 100644
--- a/debugfs.ocfs2/commands.c
+++ b/debugfs.ocfs2/commands.c
@@ -1673,7 +1673,9 @@ static void do_encode_lockres(char **args)
 				blkno);
 			return;
 		}
-		gen = inode->i_generation;
+
+		if (inode->i_flags & OCFS2_SYSTEM_FL)
+			gen = inode->i_generation;
 	}
 
 	ret = ocfs2_encode_lockres(type, blkno, gen, 0, lock);
diff --git a/libocfs2/lockid.c b/libocfs2/lockid.c
index d46e24e..76e6a9a 100644
--- a/libocfs2/lockid.c
+++ b/libocfs2/lockid.c
@@ -66,8 +66,10 @@ errcode_t ocfs2_encode_lockres(enum ocfs2_lock_type type, uint64_t blkno,
 		return OCFS2_ET_INVALID_LOCKRES;
 
 	blkno = (type == OCFS2_LOCK_TYPE_RENAME) ? 0 : blkno;
-	generation = ((type == OCFS2_LOCK_TYPE_SUPER) ||
-		      (type == OCFS2_LOCK_TYPE_RENAME)) ? 0 : generation;
+	generation = ((type == OCFS2_LOCK_TYPE_META) ||
+		      (type == OCFS2_LOCK_TYPE_RW) ||
+		      (type == OCFS2_LOCK_TYPE_FLOCK) ||
+		      (type == OCFS2_LOCK_TYPE_REFCOUNT)) ? generation : 0;
 
 	if (type != OCFS2_LOCK_TYPE_DENTRY) {
 		snprintf(lockres, OCFS2_LOCK_ID_MAX_LEN, "%c%s%016"PRIx64"%08x",
-- 
1.8.4.3




More information about the Ocfs2-tools-devel mailing list