changeset 827:a1fd85c42d83

objstore: use read_page if backend didn't provide read obj op The read op will get removed in the future, but for now having both simplifies everything. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Wed, 15 Apr 2020 10:19:00 -0400
parents 169014e358a6
children e9addd3bf94b
files src/objstore/obj_txn.c
diffstat 1 files changed, 28 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/obj_txn.c	Wed Apr 15 10:12:14 2020 -0400
+++ b/src/objstore/obj_txn.c	Wed Apr 15 10:19:00 2020 -0400
@@ -56,10 +56,36 @@
 	return 0;
 }
 
-ssize_t obj_read(struct objver *ver, void *buf, size_t len,
+/* returns number of bytes read (if > 0), or negated errno otherwise */
+ssize_t obj_read(struct objver *ver, void *_buf, size_t len,
 		 uint64_t offset)
 {
-	return ver->obj->ops->read(ver, buf, len, offset);
+	uint8_t page[PAGE_SIZE];
+	uint8_t *buf = _buf;
+	size_t orig_len;
+	int ret;
+
+	orig_len = len;
+
+	if (ver->obj->ops->read)
+		return ver->obj->ops->read(ver, buf, len, offset);
+
+	while (len) {
+		const uint64_t pgoff = offset & PAGE_OFFSET_MASK;
+		const size_t thislen = MIN(len, PAGE_SIZE - pgoff);
+
+		ret = ver->obj->ops->read_page(ver, page, offset / PAGE_SIZE);
+		if (ret)
+			break;
+
+		memcpy(buf, &page[pgoff], thislen);
+
+		buf += thislen;
+		len -= thislen;
+		offset += thislen;
+	}
+
+	return (orig_len == len) ? ret : (orig_len - len);
 }
 
 static int __obj_setattr_perform(struct txn *txn, struct txn_entry *entry)