Mercurial > nomad
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)