From 772dde83049bb424b33e6c94b1804285bdaca697 Mon Sep 17 00:00:00 2001
From: Prasad Joshi <prasadjoshi.linux@gmail.com>
Date: Wed, 21 May 2014 17:56:30 +0530
Subject: [PATCH] vfs: enable support for DEBUG_VFS

At the moment, defining DEBUG_VFS fails OSv compilation. The patch
ensures OSv compiles and correct debug logs are emitted.

Reviewed-by: Glauber Costa <glommer@cloudius-systems.com>
Signed-off-by: Prasad Joshi <prasadjoshi.linux@gmail.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 fs/vfs/main.cc         |  2 +-
 fs/vfs/vfs.h           |  2 ++
 fs/vfs/vfs_syscalls.cc | 10 +++++-----
 fs/vfs/vfs_vnode.c     | 35 ++++++++++++++++++++++++-----------
 4 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/fs/vfs/main.cc b/fs/vfs/main.cc
index 6d25263a1..d6d9c304a 100644
--- a/fs/vfs/main.cc
+++ b/fs/vfs/main.cc
@@ -1554,7 +1554,7 @@ fs_noop(void)
     return 0;
 }
 
-#ifdef DEBUG_VFS
+#ifdef NOTYET
 /*
  * Dump internal data.
  */
diff --git a/fs/vfs/vfs.h b/fs/vfs/vfs.h
index ce4b73515..8f25e127f 100644
--- a/fs/vfs/vfs.h
+++ b/fs/vfs/vfs.h
@@ -54,6 +54,8 @@
 #define FSMAXNAMES	16		/* max length of 'file system' name */
 
 #ifdef DEBUG_VFS
+#include <osv/debug.h>
+
 extern int vfs_debug;
 
 #define	VFSDB_CORE	0x00000001
diff --git a/fs/vfs/vfs_syscalls.cc b/fs/vfs/vfs_syscalls.cc
index 7c24c0d2e..86d35ce49 100644
--- a/fs/vfs/vfs_syscalls.cc
+++ b/fs/vfs/vfs_syscalls.cc
@@ -186,8 +186,8 @@ sys_read(struct file *fp, struct iovec *iov, size_t niov,
 	ssize_t bytes;
 	int error;
 
-	DPRINTF(VFSDB_SYSCALL, ("sys_write: fp=%x buf=%x size=%d\n",
-				(u_int)fp, (u_int)buf, size));
+	DPRINTF(VFSDB_SYSCALL, ("sys_write: fp=%x offset=%d\n",
+				(u_long)fp, (u_int)offset));
 
 	if ((fp->f_flags & FREAD) == 0)
 		return EBADF;
@@ -221,8 +221,8 @@ sys_write(struct file *fp, struct iovec *iov, size_t niov,
 	ssize_t bytes;
 	int error;
 
-	DPRINTF(VFSDB_SYSCALL, ("sys_write: fp=%x uio=%x niv=%zu\n",
-				(u_long)fp, (u_long)uio, niv));
+	DPRINTF(VFSDB_SYSCALL, ("sys_write: fp=%x uio=%x niov=%zu\n",
+				(u_long)fp, (u_long)uio, niov));
 
 	if ((fp->f_flags & FWRITE) == 0)
 		return EBADF;
@@ -254,7 +254,7 @@ sys_lseek(struct file *fp, off_t off, int type, off_t *origin)
 	struct vnode *vp;
 
 	DPRINTF(VFSDB_SYSCALL, ("sys_seek: fp=%x off=%d type=%d\n",
-				(u_int)fp, (u_int)off, type));
+				(u_long)fp, (u_int)off, type));
 
 	if (!fp->f_dentry) {
 	    // Linux doesn't implement lseek() on pipes, sockets, or ttys.
diff --git a/fs/vfs/vfs_vnode.c b/fs/vfs/vfs_vnode.c
index 80a6bb0fa..18d5435e6 100644
--- a/fs/vfs/vfs_vnode.c
+++ b/fs/vfs/vfs_vnode.c
@@ -117,6 +117,20 @@ vn_lookup(struct mount *mp, uint64_t ino)
 	return NULL;		/* not found */
 }
 
+#ifdef DEBUG_VFS
+static const char *
+vn_path(struct vnode *vp)
+{
+	struct dentry *dp;
+
+	if (LIST_EMPTY(&vp->v_names) == 1) {
+		return (" ");
+	}
+	dp = LIST_FIRST(&vp->v_names);
+	return (dp->d_path);
+}
+#endif
+
 /*
  * Lock vnode
  */
@@ -128,7 +142,7 @@ vn_lock(struct vnode *vp)
 
 	mutex_lock(&vp->v_lock);
 	vp->v_nrlocks++;
-	DPRINTF(VFSDB_VNODE, ("vn_lock:   %s\n", vp->v_path));
+	DPRINTF(VFSDB_VNODE, ("vn_lock:   %s\n", vn_path(vp)));
 }
 
 /*
@@ -141,9 +155,9 @@ vn_unlock(struct vnode *vp)
 	ASSERT(vp->v_refcnt > 0);
 	ASSERT(vp->v_nrlocks > 0);
 
-	DPRINTF(VFSDB_VNODE, ("vn_unlock: %s\n", vp->v_path));
 	vp->v_nrlocks--;
 	mutex_unlock(&vp->v_lock);
+	DPRINTF(VFSDB_VNODE, ("vn_lock:   %s\n", vn_path(vp)));
 }
 
 /*
@@ -215,8 +229,7 @@ vput(struct vnode *vp)
 	ASSERT(vp);
 	ASSERT(vp->v_nrlocks > 0);
 	ASSERT(vp->v_refcnt > 0);
-	DPRINTF(VFSDB_VNODE, ("vput: ref=%d %s\n", vp->v_refcnt,
-			      vp->v_path));
+	DPRINTF(VFSDB_VNODE, ("vput: ref=%d %s\n", vp->v_refcnt, vn_path(vp)));
 
 	VNODE_LOCK();
 	vp->v_refcnt--;
@@ -440,21 +453,21 @@ vnode_dump(void)
 			   "VLNK ", "VSOCK", "VFIFO" };
 
 	VNODE_LOCK();
-	dprintf("Dump vnode\n");
-	dprintf(" vnode    mount    type  refcnt blkno    path\n");
-	dprintf(" -------- -------- ----- ------ -------- ------------------------------\n");
+	kprintf("Dump vnode\n");
+	kprintf(" vnode    mount    type  refcnt blkno    path\n");
+	kprintf(" -------- -------- ----- ------ -------- ------------------------------\n");
 
 	for (i = 0; i < VNODE_BUCKETS; i++) {
 	        LIST_FOREACH(vp, &vnode_table[i], v_link) {
 			mp = vp->v_mount;
 
-			dprintf(" %08x %08x %s %6d %8d %s%s\n", (u_int)vp,
-				(u_int)mp, type[vp->v_type], vp->v_refcnt,
+			kprintf(" %08x %08x %s %6d %8d %s%s\n", (u_long)vp,
+				(u_long)mp, type[vp->v_type], vp->v_refcnt,
 				(strlen(mp->m_path) == 1) ? "\0" : mp->m_path,
-				vp->v_path);
+				vn_path(vp));
 		}
 	}
-	dprintf("\n");
+	kprintf("\n");
 	VNODE_UNLOCK();
 }
 #endif
-- 
GitLab