int (*dbo_write_prep)(const struct lu_env *env,
struct dt_object *dt,
struct niobuf_local *lb,
- int nr);
+ int nr, bool read);
/**
* Declare intention to write data stored in the buffers.
}
static inline int dt_write_prep(const struct lu_env *env, struct dt_object *d,
- struct niobuf_local *lnb, int n)
+ struct niobuf_local *lnb, int n, bool read)
{
LASSERT(d);
LASSERT(d->do_body_ops);
LASSERT(d->do_body_ops->dbo_write_prep);
- return d->do_body_ops->dbo_write_prep(env, d, lnb, n);
+ return d->do_body_ops->dbo_write_prep(env, d, lnb, n, read);
}
static inline int dt_declare_write_commit(const struct lu_env *env,
tot_bytes += rnb[i].rnb_len;
}
- rc = dt_write_prep(env, dob, lnb, *nr_local);
+ rc = dt_write_prep(env, dob, lnb, *nr_local, false);
if (likely(rc))
GOTO(err, rc);
}
}
- rc = dt_write_prep(env, ofd_object_child(fo), write_lnb, *nr_write);
+ rc = dt_write_prep(env, ofd_object_child(fo), write_lnb, *nr_write, false);
if (unlikely(rc != 0))
GOTO(err, rc);
}
static int osd_write_prep(const struct lu_env *env, struct dt_object *dt,
- struct niobuf_local *lnb, int npages)
+ struct niobuf_local *lnb, int npages, bool read)
{
struct osd_thread_info *oti = osd_oti_get(env);
struct osd_iobuf *iobuf = &oti->oti_iobuf;
*/
ClearPageUptodate(lnb[i].lnb_page);
- if (lnb[i].lnb_len == PAGE_SIZE)
+ if (lnb[i].lnb_len == PAGE_SIZE && read == false)
continue;
/* for compressed components, any partial pages have already
* been read up, so we should never add one here for the
if (maxidx >= lnb[i].lnb_page->index) {
osd_iobuf_add_page(iobuf, &lnb[i]);
} else {
- long off;
char *p = kmap(lnb[i].lnb_page);
-
- off = lnb[i].lnb_page_offset;
- if (off)
- memset(p, 0, off);
- off = (lnb[i].lnb_page_offset + lnb[i].lnb_len) &
- ~PAGE_MASK;
- if (off)
- memset(p + off, 0, PAGE_SIZE - off);
+ memset(p, 0, PAGE_SIZE);
kunmap(lnb[i].lnb_page);
}
}
}
static int osd_write_prep(const struct lu_env *env, struct dt_object *dt,
- struct niobuf_local *lnb, int npages)
+ struct niobuf_local *lnb, int npages, bool read)
{
struct osd_object *obj = osd_dt_obj(dt);