[Sheepdog] [PATCH RFC 05/10] sheepfs: implement shadown file mechanism

Liu Yuan namei.unix at gmail.com
Sat May 5 13:29:17 CEST 2012


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


Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/Makefile.am           |    3 +-
 sheep/sheepfs/shadow_file.c |  130 +++++++++++++++++++++++++++++++++++++++++++
 sheep/sheepfs/sheepfs.h     |   12 ++++
 3 files changed, 144 insertions(+), 1 deletions(-)
 create mode 100644 sheep/sheepfs/shadow_file.c

diff --git a/sheep/Makefile.am b/sheep/Makefile.am
index 9ad9492..09cb091 100644
--- a/sheep/Makefile.am
+++ b/sheep/Makefile.am
@@ -47,7 +47,8 @@ sheep_SOURCES		+= trace/trace.c trace/mcount.S trace/stabs.c trace/graph.c
 endif
 
 if BUILD_SHEEPFS
-sheep_SOURCES		+= sheepfs/core.c sheepfs/cluster.c sheepfs/VDI.c
+sheep_SOURCES		+= sheepfs/core.c sheepfs/cluster.c sheepfs/VDI.c \
+			   sheepfs/shadow_file.c
 endif
 
 sheep_LDADD	  	= ../lib/libsheepdog.a -lpthread \
diff --git a/sheep/sheepfs/shadow_file.c b/sheep/sheepfs/shadow_file.c
new file mode 100644
index 0000000..6f7d141
--- /dev/null
+++ b/sheep/sheepfs/shadow_file.c
@@ -0,0 +1,130 @@
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <attr/xattr.h>
+
+#include "util.h"
+#include "logger.h"
+#include "sheepfs.h"
+
+int shadow_file_read(const char *path, char *buf, size_t size, off_t offset)
+{
+	char p[PATH_MAX];
+	int fd, len;
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	fd = open(p, O_RDONLY);
+	if (fd < 0) {
+		eprintf("%m\n");
+		return -errno;
+	}
+	len = xpread(fd, buf, size, offset);
+	close(fd);
+	return len;
+}
+
+size_t shadow_file_fill(const char *path, char *buf, size_t size)
+{
+	char p[PATH_MAX];
+	int fd;
+	size_t len = 0;
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	fd = open(p, O_WRONLY | O_TRUNC);
+	if (fd < 0) {
+		eprintf("%m\n");
+		return 0;
+	}
+	len = xwrite(fd, buf, size);
+	if (len != size) {
+		eprintf("failed to write\n");
+		len = 0;
+	}
+	close(fd);
+	return len;
+}
+
+int shadow_file_create(const char *path)
+{
+	char p[PATH_MAX];
+	int fd;
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	fd = creat(p, 0644);
+	if (fd < 0) {
+		if (errno != EEXIST) {
+			eprintf("%m\n");
+			return -1;
+		}
+	}
+	close(fd);
+	return 0;
+}
+
+int shadow_dir_create(const char *path)
+{
+	char p[PATH_MAX];
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	if (mkdir(p, 0755) < 0) {
+		if (errno != EEXIST) {
+			eprintf("%m\n");
+			return -1;
+		}
+	}
+	return 0;
+}
+
+int shadow_file_setxattr(const char *path, const char *name,
+		const void *value, size_t size)
+{
+	char p[PATH_MAX];
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	if (setxattr(p, name, value, size, 0) < 0) {
+		eprintf("%m\n");
+		return -1;
+	}
+	return 0;
+}
+
+int shadow_file_getxattr(const char *path, const char *name,
+		void *value, size_t size)
+{
+	char p[PATH_MAX];
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	if (getxattr(p, name, value, size) < 0) {
+		eprintf("%m\n");
+		return -1;
+	}
+	return 0;
+}
+
+int shadow_file_delete(const char *path)
+{
+	char p[PATH_MAX];
+
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	if (unlink(p) < 0) {
+		if (errno != ENOENT) {
+			eprintf("%m\n");
+			return -1;
+		}
+	}
+	return 0;
+}
+
+int shadow_file_exsit(const char *path)
+{
+	char p[PATH_MAX];
+	int fd;
+	sprintf(p, "%s%s", sheepfs_shadow, path);
+	fd = open(p, O_RDWR);
+	if (fd < 0)
+		return 0;
+	close(fd);
+	return 1;
+}
diff --git a/sheep/sheepfs/sheepfs.h b/sheep/sheepfs/sheepfs.h
index b06b91b..85c95e3 100644
--- a/sheep/sheepfs/sheepfs.h
+++ b/sheep/sheepfs/sheepfs.h
@@ -14,6 +14,18 @@ extern struct strbuf *sheepfs_run_cmd(const char *command);
 extern int sheepfs_init(const char *dir);
 extern int sheepfs_set_op(const char *path, unsigned opcode);
 
+/* shadow_file.c */
+extern size_t shadow_file_fill(const char *path, char *buf, size_t size);
+extern int shadow_file_read(const char *, char *buf, size_t size, off_t);
+extern int shadow_dir_create(const char *path);
+extern int shadow_file_create(const char *path);
+extern int shadow_file_setxattr(const char *path, const char *name,
+				const void *value, size_t size);
+extern int shadow_file_getxattr(const char *path, const char *name,
+				void *value, size_t size);
+extern int shadow_file_delete(const char *path);
+extern int shadow_file_exsit(const char *path);
+
 /* cluster.c */
 extern int cluster_info_read(const char *path, char *buf, size_t size, off_t);
 extern size_t cluster_info_get_size(const char *path);
-- 
1.7.8.2




More information about the sheepdog mailing list