static int osc_lock_flush(struct osc_object *obj, pgoff_t start, pgoff_t end, enum cl_lock_mode mode, int discard) { struct lu_env *env; struct cl_env_nest nest; int rc = 0; int rc2 = 0; env = cl_env_nested_get(&nest); if (IS_ERR(env)) return PTR_ERR(env); if (mode == CLM_WRITE) { rc = osc_cache_writeback_range(env, obj, start, end, 1, discard); CDEBUG(D_CACHE, "object %p: [%lu -> %lu] %d pages were %s.\n", obj, start, end, rc, discard ? "discarded" : "written back"); if (rc > 0) rc = 0; } rc2 = osc_lock_discard_pages(env, obj, start, end, mode); if (rc == 0 && rc2 < 0) rc = rc2; cl_env_nested_put(&nest, env); return rc; }
static int osc_lock_flush(struct osc_object *obj, pgoff_t start, pgoff_t end, enum cl_lock_mode mode, bool discard) { struct lu_env *env; __u16 refcheck; int rc = 0; int rc2 = 0; ENTRY; env = cl_env_get(&refcheck); if (IS_ERR(env)) RETURN(PTR_ERR(env)); if (mode == CLM_WRITE) { rc = osc_cache_writeback_range(env, obj, start, end, 1, discard); CDEBUG(D_CACHE, "object %p: [%lu -> %lu] %d pages were %s.\n", obj, start, end, rc, discard ? "discarded" : "written back"); if (rc > 0) rc = 0; } rc2 = osc_lock_discard_pages(env, obj, start, end, discard); if (rc == 0 && rc2 < 0) rc = rc2; cl_env_put(env, &refcheck); RETURN(rc); }
static int mdc_lock_flush(const struct lu_env *env, struct osc_object *obj, pgoff_t start, pgoff_t end, enum cl_lock_mode mode, bool discard) { int result = 0; int rc; ENTRY; if (mode == CLM_WRITE) { result = osc_cache_writeback_range(env, obj, start, end, 1, discard); CDEBUG(D_CACHE, "object %p: [%lu -> %lu] %d pages were %s.\n", obj, start, end, result, discard ? "discarded" : "written back"); if (result > 0) result = 0; } rc = mdc_lock_discard_pages(env, obj, start, end, discard); if (result == 0 && rc < 0) result = rc; RETURN(result); }
static int osc_io_fsync_start(const struct lu_env *env, const struct cl_io_slice *slice) { struct cl_io *io = slice->cis_io; struct cl_fsync_io *fio = &io->u.ci_fsync; struct cl_object *obj = slice->cis_obj; struct osc_object *osc = cl2osc(obj); pgoff_t start = cl_index(obj, fio->fi_start); pgoff_t end = cl_index(obj, fio->fi_end); int result = 0; ENTRY; if (fio->fi_end == OBD_OBJECT_EOF) end = CL_PAGE_EOF; result = osc_cache_writeback_range(env, osc, start, end, 0, fio->fi_mode == CL_FSYNC_DISCARD); if (result > 0) { fio->fi_nr_written += result; result = 0; } if (fio->fi_mode == CL_FSYNC_ALL) { int rc; /* we have to wait for writeback to finish before we can * send OST_SYNC RPC. This is bad because it causes extents * to be written osc by osc. However, we usually start * writeback before CL_FSYNC_ALL so this won't have any real * problem. */ rc = osc_cache_wait_range(env, osc, start, end); if (result == 0) result = rc; rc = osc_fsync_ost(env, osc, fio); if (result == 0) result = rc; } RETURN(result); }