[sheepdog] [PATCH 09/10] sheep: caluculate actually allocated size

MORITA Kazutaka morita.kazutaka at gmail.com
Tue May 21 02:11:58 CEST 2013


From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>

Now we allow sparse objects, it's better to calculate the actually
allocated sizes.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/md.c  |   11 +++++++++--
 sheep/ops.c |   11 +++++++++--
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/sheep/md.c b/sheep/md.c
index 66abe79..32b6628 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -181,10 +181,17 @@ static inline void calculate_vdisks(struct disk *disks, int nr_disks,
 #define MDNAME	"user.md.size"
 #define MDSIZE	sizeof(uint64_t)
 
-static int get_total_object_size(uint64_t oid, char *ignore, void *total)
+static int get_total_object_size(uint64_t oid, char *wd, void *total)
 {
 	uint64_t *t = total;
-	*t += get_objsize(oid);
+	struct stat s;
+	char path[PATH_MAX];
+
+	snprintf(path, PATH_MAX, "%s/%016" PRIx64, wd, oid);
+	if (stat(path, &s) == 0)
+		*t += s.st_blocks * SECTOR_SIZE;
+	else
+		*t += get_objsize(oid);
 
 	return SD_RES_SUCCESS;
 }
diff --git a/sheep/ops.c b/sheep/ops.c
index 9f15fb8..133ccc7 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -61,10 +61,17 @@ struct sd_op_template {
 	int (*process_main)(const struct sd_req *req, struct sd_rsp *rsp, void *data);
 };
 
-static int get_total_object_size(uint64_t oid, char *ignore, void *total)
+static int get_total_object_size(uint64_t oid, char *wd, void *total)
 {
 	uint64_t *t = total;
-	*t += get_objsize(oid);
+	struct stat s;
+	char path[PATH_MAX];
+
+	snprintf(path, PATH_MAX, "%s/%016" PRIx64, wd, oid);
+	if (stat(path, &s) == 0)
+		*t += s.st_blocks * SECTOR_SIZE;
+	else
+		*t += get_objsize(oid);
 
 	return SD_RES_SUCCESS;
 }
-- 
1.7.9.5



More information about the sheepdog mailing list