struct niobuf_local *lnb, int npages)
{
struct osd_object *obj = osd_dt_obj(dt);
- loff_t size;
- int i;
+ struct lu_buf buf;
+ loff_t offset;
+ int i;
LASSERT(dt_object_exists(dt));
LASSERT(obj->oo_db);
- read_lock(&obj->oo_attr_lock);
- size = obj->oo_attr.la_size;
- read_unlock(&obj->oo_attr_lock);
-
for (i = 0; i < npages; i++) {
- if (unlikely(lnb[i].lnb_rc < 0))
- continue;
-
- lnb[i].lnb_rc = lnb[i].lnb_len;
+ buf.lb_buf = kmap(lnb[i].lnb_page);
+ buf.lb_len = lnb[i].lnb_len;
+ offset = lnb[i].lnb_file_offset;
- if (lnb[i].lnb_file_offset + lnb[i].lnb_len > size) {
- lnb[i].lnb_rc = size - lnb[i].lnb_file_offset;
+ CDEBUG(D_OTHER, "read %u bytes at %u\n",
+ (unsigned) lnb[i].lnb_len,
+ (unsigned) lnb[i].lnb_file_offset);
+ lnb[i].lnb_rc = osd_read(env, dt, &buf, &offset, NULL);
+ kunmap(lnb[i].lnb_page);
+ if (lnb[i].lnb_rc < buf.lb_len) {
/* all subsequent rc should be 0 */
while (++i < npages)
lnb[i].lnb_rc = 0;