X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_io.c;h=829226bdaf5db4491175a92ccf7ee24f77e660ca;hp=284e886af9189e71d9566cd6c200dbeb70f59156;hb=1249edcd71e6a44f92aba1482201b30696e85d0d;hpb=01bc529ccffdb21d33ab6a36ed64fe96ef9ac55b diff --git a/lustre/osd-zfs/osd_io.c b/lustre/osd-zfs/osd_io.c index 284e886..829226b 100644 --- a/lustre/osd-zfs/osd_io.c +++ b/lustre/osd-zfs/osd_io.c @@ -721,25 +721,25 @@ static int osd_read_prep(const struct lu_env *env, struct dt_object *dt, struct niobuf_local *lnb, int npages) { struct osd_object *obj = osd_dt_obj(dt); - struct lu_buf buf; - loff_t offset; - int i; + loff_t size; + 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++) { - buf.lb_buf = kmap(lnb[i].lnb_page); - buf.lb_len = lnb[i].lnb_len; - offset = lnb[i].lnb_file_offset; + if (unlikely(lnb[i].lnb_rc < 0)) + continue; - 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); + lnb[i].lnb_rc = lnb[i].lnb_len; + + if (lnb[i].lnb_file_offset + lnb[i].lnb_len > size) { + lnb[i].lnb_rc = size - lnb[i].lnb_file_offset; - if (lnb[i].lnb_rc < buf.lb_len) { /* all subsequent rc should be 0 */ while (++i < npages) lnb[i].lnb_rc = 0;