}
}
-static ssize_t osd_read(const struct lu_env *env, struct dt_object *dt,
- struct lu_buf *buf, loff_t *pos)
+static ssize_t __osd_read(const struct lu_env *env, struct dt_object *dt,
+ struct lu_buf *buf, loff_t *pos, size_t *size)
{
- struct osd_object *obj = osd_dt_obj(dt);
- struct osd_device *osd = osd_obj2dev(obj);
- uint64_t old_size;
- int size = buf->lb_len;
- int rc;
- unsigned long start;
+ struct osd_object *obj = osd_dt_obj(dt);
+ uint64_t old_size;
+ int rc;
LASSERT(dt_object_exists(dt));
LASSERT(obj->oo_dn);
- start = cfs_time_current();
-
read_lock(&obj->oo_attr_lock);
old_size = obj->oo_attr.la_size;
read_unlock(&obj->oo_attr_lock);
- if (*pos + size > old_size) {
+ if (*pos + *size > old_size) {
if (old_size < *pos)
return 0;
- else
- size = old_size - *pos;
+
+ *size = old_size - *pos;
}
- record_start_io(osd, READ, 0);
+ rc = osd_dmu_read(osd_obj2dev(obj), obj->oo_dn, *pos, *size,
+ buf->lb_buf, DMU_READ_PREFETCH);
+ if (!rc) {
+ rc = *size;
+ *pos += *size;
+ }
- rc = osd_dmu_read(osd, obj->oo_dn, *pos, size, buf->lb_buf,
- DMU_READ_PREFETCH);
+ return rc;
+}
+
+static ssize_t osd_read(const struct lu_env *env, struct dt_object *dt,
+ struct lu_buf *buf, loff_t *pos)
+{
+ struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
+ size_t size = buf->lb_len;
+ ktime_t start;
+ s64 delta_ms;
+ int rc;
+
+ start = ktime_get();
+ record_start_io(osd, READ, 0);
+ rc = __osd_read(env, dt, buf, pos, &size);
+ delta_ms = ktime_ms_delta(ktime_get(), start);
+ record_end_io(osd, READ, delta_ms, size, size >> PAGE_SHIFT);
- record_end_io(osd, READ, cfs_time_current() - start, size,
- size >> PAGE_SHIFT);
- if (rc == 0) {
- rc = size;
- *pos += size;
- }
return rc;
}
+static inline ssize_t osd_read_no_record(const struct lu_env *env,
+ struct dt_object *dt,
+ struct lu_buf *buf, loff_t *pos)
+{
+ size_t size = buf->lb_len;
+
+ return __osd_read(env, dt, buf, pos, &size);
+}
+
static ssize_t osd_declare_write(const struct lu_env *env, struct dt_object *dt,
const struct lu_buf *buf, loff_t pos,
struct thandle *th)
loff_t off, ssize_t len, struct niobuf_local *lnb)
{
struct osd_device *osd = osd_obj2dev(obj);
- unsigned long start = cfs_time_current();
- int rc, i, numbufs, npages = 0;
- dmu_buf_t **dbp;
- ENTRY;
+ int rc, i, numbufs, npages = 0;
+ ktime_t start = ktime_get();
+ dmu_buf_t **dbp;
+ s64 delta_ms;
+ ENTRY;
record_start_io(osd, READ, 0);
/* grab buffers for read:
dmu_buf_rele_array(dbp, numbufs, osd_0copy_tag);
}
- record_end_io(osd, READ, cfs_time_current() - start,
- npages * PAGE_SIZE, npages);
+ delta_ms = ktime_ms_delta(ktime_get(), start);
+ record_end_io(osd, READ, delta_ms, npages * PAGE_SIZE, npages);
RETURN(npages);
/* declare we'll free some blocks ... */
if (start < obj->oo_attr.la_size) {
read_unlock(&obj->oo_attr_lock);
+ dmu_tx_mark_netfree(oh->ot_tx);
dmu_tx_hold_free(oh->ot_tx, obj->oo_dn->dn_object, start, len);
} else {
read_unlock(&obj->oo_attr_lock);
.dbo_punch = osd_punch,
.dbo_ladvise = osd_ladvise,
};
+
+struct dt_body_operations osd_body_scrub_ops = {
+ .dbo_read = osd_read_no_record,
+ .dbo_declare_write = osd_declare_write,
+ .dbo_write = osd_write,
+};