[sheepdog] [PATCH] sheepfs: introduce dedicated printf funciton

Liu Yuan namei.unix at gmail.com
Sat May 26 11:16:32 CEST 2012


From: Liu Yuan <tailai.ly at taobao.com>

Now with -f option, we can redirect printf output to stderr and also save
us from manual adding function name and function line to printf.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheepfs/cluster.c     |    1 -
 sheepfs/config.c      |    1 -
 sheepfs/core.c        |   38 ++++++++++++++++++++++++++++++++------
 sheepfs/node.c        |    1 -
 sheepfs/shadow_file.c |   19 +++++++++----------
 sheepfs/sheepfs.h     |   10 ++++++++++
 sheepfs/vdi.c         |    1 -
 sheepfs/volume.c      |   33 ++++++++++++++-------------------
 8 files changed, 65 insertions(+), 39 deletions(-)

diff --git a/sheepfs/cluster.c b/sheepfs/cluster.c
index 39415f8..eeb8bed 100644
--- a/sheepfs/cluster.c
+++ b/sheepfs/cluster.c
@@ -18,7 +18,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
-#include <syslog.h>
 
 #include "strbuf.h"
 #include "sheepfs.h"
diff --git a/sheepfs/config.c b/sheepfs/config.c
index 09dae34..27d8b4e 100644
--- a/sheepfs/config.c
+++ b/sheepfs/config.c
@@ -18,7 +18,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
-#include <syslog.h>
 
 #include "strbuf.h"
 #include "sheepfs.h"
diff --git a/sheepfs/core.c b/sheepfs/core.c
index 873c318..3b0de45 100644
--- a/sheepfs/core.c
+++ b/sheepfs/core.c
@@ -20,6 +20,7 @@
 #include <getopt.h>
 #include <syslog.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 #include "strbuf.h"
 #include "util.h"
@@ -77,6 +78,30 @@ static struct sheepfs_file_operation {
 				volume_sync, volume_open },
 };
 
+__attribute__ ((format (__printf__, 3, 4)))
+static void fg_printf(const char *func, int line, const char *fmt, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s(%d): ", func, line);
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+}
+
+__attribute__ ((format (__printf__, 3, 4)))
+static void bg_printf(const char *func, int line, const char *fmt, ...)
+{
+	va_list ap;
+
+	syslog(LOG_ERR, "%s(%d)", func, line);
+	va_start(ap, fmt);
+	vsyslog(LOG_ERR, fmt, ap);
+	va_end(ap);
+}
+
+printf_fn fs_printf = bg_printf;
+
 int sheepfs_set_op(const char *path, unsigned opcode)
 {
 	if (shadow_file_setxattr(path, SH_OP_NAME, &opcode, SH_OP_SIZE) < 0) {
@@ -136,13 +161,13 @@ static int sheepfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
 	dir = opendir(p.buf);
 	if (!dir) {
 		ret = -errno;
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		goto out;
 	}
 
 	while ((dentry = readdir(dir))) {
 		if (filler(buf, dentry->d_name, NULL, 0) != 0) {
-			syslog(LOG_ERR, "[%s] out of memory\n", __func__);
+			sheepfs_pr("out of memory\n");
 			ret = -ENOMEM;
 			goto out;
 		}
@@ -241,10 +266,10 @@ static int sheepfs_main_loop(char *mountpoint)
 	if (sheepfs_fg)
 		fuse_opt_add_arg(&args, "-f");
 
-	syslog(LOG_INFO, "sheepfs daemon started\n");
+	sheepfs_pr("sheepfs daemon started\n");
 	ret = fuse_main(args.argc, args.argv, &sheepfs_ops, NULL);
 	rmdir_r(sheepfs_shadow);
-	syslog(LOG_INFO, "sheepfs daemon exited %d\n", ret);
+	sheepfs_pr("sheepfs daemon exited %d\n", ret);
 	return ret;
 }
 
@@ -304,6 +329,7 @@ int main(int argc, char **argv)
 			break;
 		case 'f':
 			sheepfs_fg = 1;
+			fs_printf = fg_printf;
 			break;
 		case 'k':
 			sheepfs_page_cache = 1;
@@ -315,7 +341,7 @@ int main(int argc, char **argv)
 			sdport = strtol(optarg, NULL, 10);
 			if (sdport < 1 || sdport > UINT16_MAX) {
 				fprintf(stderr,
-				"Invalid port number '%s'\n", optarg);
+					"Invalid port number '%s'\n", optarg);
 				exit(1);
 			}
 			break;
@@ -359,7 +385,7 @@ struct strbuf *sheepfs_run_cmd(const char *command)
 	FILE *f = popen(command, "re");
 
 	if (!f) {
-		syslog(LOG_ERR, "[%s] popen failed\n", __func__);
+		sheepfs_pr("popen failed\n");
 		goto err;
 	}
 
diff --git a/sheepfs/node.c b/sheepfs/node.c
index 38472e7..d3ef21b 100644
--- a/sheepfs/node.c
+++ b/sheepfs/node.c
@@ -18,7 +18,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
-#include <syslog.h>
 
 #include "strbuf.h"
 #include "sheepfs.h"
diff --git a/sheepfs/shadow_file.c b/sheepfs/shadow_file.c
index e7b4878..4037e65 100644
--- a/sheepfs/shadow_file.c
+++ b/sheepfs/shadow_file.c
@@ -22,7 +22,6 @@
 #include <errno.h>
 #include <stdio.h>
 #include <sys/xattr.h>
-#include <syslog.h>
 #include <stdlib.h>
 
 #include "util.h"
@@ -36,7 +35,7 @@ int shadow_file_read(const char *path, char *buf, size_t size, off_t offset)
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	fd = open(p, O_RDONLY);
 	if (fd < 0) {
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		return -errno;
 	}
 	len = xpread(fd, buf, size, offset);
@@ -53,12 +52,12 @@ size_t shadow_file_write(const char *path, char *buf, size_t size)
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	fd = open(p, O_WRONLY | O_TRUNC);
 	if (fd < 0) {
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		return 0;
 	}
 	len = xwrite(fd, buf, size);
 	if (len != size) {
-		syslog(LOG_ERR, "[%s] failed to write\n", __func__);
+		sheepfs_pr("failed to write\n");
 		len = 0;
 	}
 	close(fd);
@@ -73,7 +72,7 @@ int shadow_file_create(const char *path)
 	fd = creat(p, 0644);
 	if (fd < 0) {
 		if (errno != EEXIST) {
-			syslog(LOG_ERR, "[%s] %m\n", __func__);
+			sheepfs_pr("%m\n");
 			return -1;
 		}
 	}
@@ -88,7 +87,7 @@ int shadow_dir_create(const char *path)
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	if (mkdir(p, 0755) < 0) {
 		if (errno != EEXIST) {
-			syslog(LOG_ERR, "[%s] %m\n", __func__);
+			sheepfs_pr("%m\n");
 			return -1;
 		}
 	}
@@ -102,7 +101,7 @@ int shadow_file_setxattr(const char *path, const char *name,
 
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	if (setxattr(p, name, value, size, 0) < 0) {
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		return -1;
 	}
 	return 0;
@@ -115,7 +114,7 @@ int shadow_file_getxattr(const char *path, const char *name,
 
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	if (getxattr(p, name, value, size) < 0) {
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		return -1;
 	}
 	return 0;
@@ -128,7 +127,7 @@ int shadow_file_delete(const char *path)
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	if (unlink(p) < 0) {
 		if (errno != ENOENT) {
-			syslog(LOG_ERR, "[%s] %m\n", __func__);
+			sheepfs_pr("%m\n");
 			return -1;
 		}
 	}
@@ -142,7 +141,7 @@ int shadow_file_exsit(const char *path)
 	sprintf(p, "%s%s", sheepfs_shadow, path);
 	if (access(p, R_OK | W_OK) < 0) {
 		if (errno != ENOENT)
-			syslog(LOG_ERR, "[%s] %m\n", __func__);
+			sheepfs_pr("%m\n");
 		return 0;
 	}
 
diff --git a/sheepfs/sheepfs.h b/sheepfs/sheepfs.h
index af64f56..da59a92 100644
--- a/sheepfs/sheepfs.h
+++ b/sheepfs/sheepfs.h
@@ -28,6 +28,16 @@ extern int sdport;
 extern struct strbuf *sheepfs_run_cmd(const char *command);
 extern int sheepfs_set_op(const char *path, unsigned opcode);
 
+typedef void (*printf_fn)(const char *func, int line, const char *, ...)
+__attribute__ ((format (__printf__, 3, 4)));
+
+printf_fn fs_printf;
+
+#define sheepfs_pr(fmt, args...)			\
+({							\
+	fs_printf(__func__, __LINE__, fmt, ##args);	\
+})
+
 /* shadow_file.c */
 extern size_t shadow_file_write(const char *path, char *buf, size_t size);
 extern int shadow_file_read(const char *, char *buf, size_t size, off_t);
diff --git a/sheepfs/vdi.c b/sheepfs/vdi.c
index 980dfaa..b15bce4 100644
--- a/sheepfs/vdi.c
+++ b/sheepfs/vdi.c
@@ -18,7 +18,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
-#include <syslog.h>
 
 #include "strbuf.h"
 #include "sheepfs.h"
diff --git a/sheepfs/volume.c b/sheepfs/volume.c
index 8daea98..43db09d 100644
--- a/sheepfs/volume.c
+++ b/sheepfs/volume.c
@@ -19,7 +19,6 @@
 #include <stdio.h>
 #include <time.h>
 #include <assert.h>
-#include <syslog.h>
 #include <urcu/uatomic.h>
 #include <pthread.h>
 
@@ -153,7 +152,7 @@ static int volume_rw_object(char *buf, uint64_t oid, size_t size,
 
 	if (is_data_obj(oid)) {
 		if (off % SECTOR_SIZE || size % SECTOR_SIZE) {
-			syslog(LOG_ERR, "offset or size not aligned\n");
+			sheepfs_pr("offset or size not aligned\n");
 			return -1;
 		}
 
@@ -204,7 +203,7 @@ static int volume_rw_object(char *buf, uint64_t oid, size_t size,
 	put_socket_fd(vdi, sock_idx);
 
 	if (ret || rsp->result != SD_RES_SUCCESS) {
-		syslog(LOG_ERR,
+		sheepfs_pr(
 			"[%s] failed to %s object %" PRIx64 " ret %d, res %u\n",
 			__func__, rw == VOLUME_READ ? "read" : "write",
 			oid, ret, rsp->result);
@@ -247,10 +246,10 @@ static int volume_do_rw(const char *path, char *buf, size_t size,
 
 	do {
 #ifdef DEBUG
-		syslog(LOG_INFO, "%s oid %"PRIx64", off %ju, len %zu,"
-			" size %zu\n",
-			rw == VOLUME_READ ? "read" : "write",
-			oid, start, len, size);
+		sheepfs_pr("%s oid %"PRIx64", off %ju, len %zu,"
+			   " size %zu\n",
+			   rw == VOLUME_READ ? "read" : "write",
+			   oid, start, len, size);
 #endif
 		ret = volume_rw_object(buf, oid, len, start, rw);
 
@@ -312,8 +311,7 @@ static int volume_do_sync(uint32_t vid)
 	put_socket_fd(vdi, idx);
 
 	if (ret || rsp->result != SD_RES_SUCCESS) {
-		syslog(LOG_ERR, "[%s] failed to flush vdi %"PRIx32"\n",
-			__func__, vid);
+		sheepfs_pr("failed to flush vdi %"PRIx32"\n", vid);
 		return -1;
 	}
 
@@ -354,14 +352,14 @@ static int setup_socket_pool(int array[], int len)
 	for (i = 0; i < len; i++) {
 		fd = connect_to(sdhost, sdport);
 		if (fd < 0) {
-			syslog(LOG_ERR, "[%s] connect_to %m\n", __func__);
+			sheepfs_pr("connect_to %m\n");
 			destroy_socket_pool(array, --i);
 			return -1;
 		}
 
 		ret = set_nodelay(fd);
 		if (ret) {
-			syslog(LOG_ERR, "[%s] %m\n", __func__);
+			sheepfs_pr("%m\n");
 			destroy_socket_pool(array, i);
 			return -1;
 		}
@@ -407,21 +405,20 @@ static int init_vdi_info(const char *entry, uint32_t *vid, size_t *size)
 		return -1;
 	if (sscanf(buf->buf, "%*s %*s %*d %zu %*s %*s %*s %"PRIx32,
 	    size, vid) < 2) {
-		syslog(LOG_ERR, "[%s] failed to sscanf %s\n", __func__, entry);
+		sheepfs_pr("failed to sscanf %s\n", entry);
 		goto err;
 	}
 
 	inode_buf = malloc(SD_INODE_SIZE);
 	if (!inode_buf) {
-		syslog(LOG_ERR, "[%s] %m\n", __func__);
+		sheepfs_pr("%m\n");
 		goto err;
 	}
 
 	inode = xzalloc(sizeof(*inode));
 	inode->vid = *vid;
 	if (setup_socket_pool(inode->socket_pool, SOCKET_POOL_SIZE) < 0) {
-		syslog(LOG_ERR, "[%s] failed to setup socket pool\n",
-			__func__);
+		sheepfs_pr("failed to setup socket pool\n");
 		goto err;
 	}
 	/* we need insert inode before calling volume_rw_object */
@@ -433,8 +430,7 @@ static int init_vdi_info(const char *entry, uint32_t *vid, size_t *size)
 	if (volume_rw_object(inode_buf, vid_to_vdi_oid(*vid), SD_INODE_SIZE,
 			     0, VOLUME_READ) < 0) {
 		rb_erase(&inode->rb, &vdi_inode_tree);
-		syslog(LOG_ERR, "[%s] failed to read inode for %"PRIx32"\n",
-			__func__, *vid);
+		sheepfs_pr("failed to read inode for %"PRIx32"\n", *vid);
 		goto err;
 	}
 	inode->inode = inode_buf;
@@ -503,8 +499,7 @@ static int volume_sync_and_delete(uint32_t vid)
 	put_socket_fd(vdi, idx);
 
 	if (ret || rsp->result != SD_RES_SUCCESS) {
-		syslog(LOG_ERR, "[%s] failed to flush vdi %" PRIx32 "\n",
-			__func__, vid);
+		sheepfs_pr("failed to flush vdi %" PRIx32 "\n", vid);
 		return -1;
 	}
 
-- 
1.7.10.2




More information about the sheepdog mailing list