Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-9679 modules: Use LIST_HEAD for declaring list_heads
[fs/lustre-release.git]
/
lustre
/
osc
/
osc_page.c
diff --git
a/lustre/osc/osc_page.c
b/lustre/osc/osc_page.c
index
5762af2
..
9dae62a
100644
(file)
--- a/
lustre/osc/osc_page.c
+++ b/
lustre/osc/osc_page.c
@@
-84,20
+84,17
@@
static void osc_page_transfer_add(const struct lu_env *env,
{
struct osc_object *obj = cl2osc(opg->ops_cl.cpl_obj);
- /* ops_lru and ops_inflight share the same field, so take it from LRU
- * first and then use it as inflight. */
osc_lru_use(osc_cli(obj), opg);
}
-int osc_page_cache_add(const struct lu_env *env,
-
const struct cl_page_slice *slice, struct cl_io *io
)
+int osc_page_cache_add(const struct lu_env *env,
struct osc_page *opg,
+
struct cl_io *io, cl_commit_cbt cb
)
{
- struct osc_page *opg = cl2osc_page(slice);
int result;
ENTRY;
osc_page_transfer_get(opg, "transfer\0cache");
- result = osc_queue_async_io(env, io, opg);
+ result = osc_queue_async_io(env, io, opg
, cb
);
if (result != 0)
osc_page_transfer_put(env, opg);
else
@@
-119,12
+116,12
@@
static const char *osc_list(struct list_head *head)
return list_empty(head) ? "-" : "+";
}
-static inline
cfs_time_t
osc_submit_duration(struct osc_page *opg)
+static inline
s64
osc_submit_duration(struct osc_page *opg)
{
-
if (opg->ops_submit_time
== 0)
-
return 0;
+
if (ktime_to_ns(opg->ops_submit_time)
== 0)
+ return 0;
-
return (cfs_time_current() -
opg->ops_submit_time);
+
return ktime_ms_delta(ktime_get(),
opg->ops_submit_time);
}
static int osc_page_print(const struct lu_env *env,
@@
-139,7
+136,7
@@
static int osc_page_print(const struct lu_env *env,
return (*printer)(env, cookie, LUSTRE_OSC_NAME"-page@%p %lu: "
"1< %#x %d %u %s %s > "
"2< %lld %u %u %#x %#x | %p %p %p > "
- "3< %d %l
u
%d > "
+ "3< %d %l
ld
%d > "
"4< %d %d %d %lu %s | %s %s %s %s > "
"5< %s %s %s %s | %d %s | %d %s %s>\n",
opg, osc_index(opg),
@@
-196,12
+193,17
@@
static void osc_page_delete(const struct lu_env *env,
osc_lru_del(osc_cli(obj), opg);
if (slice->cpl_page->cp_type == CPT_CACHEABLE) {
- void *value;
+ void *value
= NULL
;
spin_lock(&obj->oo_tree_lock);
- value = radix_tree_delete(&obj->oo_tree, osc_index(opg));
- if (value != NULL)
- --obj->oo_npages;
+ if (opg->ops_intree) {
+ value = radix_tree_delete(&obj->oo_tree,
+ osc_index(opg));
+ if (value != NULL) {
+ --obj->oo_npages;
+ opg->ops_intree = 0;
+ }
+ }
spin_unlock(&obj->oo_tree_lock);
LASSERT(ergo(value != NULL, value == opg));
@@
-250,12
+252,22
@@
static int osc_page_flush(const struct lu_env *env,
RETURN(rc);
}
+static void osc_page_touch(const struct lu_env *env,
+ const struct cl_page_slice *slice, size_t to)
+{
+ struct osc_page *opg = cl2osc_page(slice);
+ struct cl_object *obj = opg->ops_cl.cpl_obj;
+
+ osc_page_touch_at(env, obj, osc_index(opg), to);
+}
+
static const struct cl_page_operations osc_page_ops = {
.cpo_print = osc_page_print,
.cpo_delete = osc_page_delete,
.cpo_clip = osc_page_clip,
.cpo_cancel = osc_page_cancel,
- .cpo_flush = osc_page_flush
+ .cpo_flush = osc_page_flush,
+ .cpo_page_touch = osc_page_touch,
};
int osc_page_init(const struct lu_env *env, struct cl_object *obj,
@@
-290,8
+302,10
@@
int osc_page_init(const struct lu_env *env, struct cl_object *obj,
spin_lock(&osc->oo_tree_lock);
result = radix_tree_insert(&osc->oo_tree,
index, opg);
- if (result == 0)
+ if (result == 0)
{
++osc->oo_npages;
+ opg->ops_intree = 1;
+ }
spin_unlock(&osc->oo_tree_lock);
radix_tree_preload_end();
@@
-310,6
+324,7
@@
EXPORT_SYMBOL(osc_page_init);
void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
enum cl_req_type crt, int brw_flags)
{
+ struct osc_io *oio = osc_env_io(env);
struct osc_async_page *oap = &opg->ops_oap;
LASSERTF(oap->oap_magic == OAP_MAGIC, "Bad oap magic: oap %p, "
@@
-322,12
+337,12
@@
void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
oap->oap_count = opg->ops_to - opg->ops_from;
oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags;
- if (
cfs_capable(CFS_CAP_SYS_RESOURCE)
) {
+ if (
oio->oi_cap_sys_resource
) {
oap->oap_brw_flags |= OBD_BRW_NOQUOTA;
oap->oap_cmd |= OBD_BRW_NOQUOTA;
}
- opg->ops_submit_time =
cfs_time_curren
t();
+ opg->ops_submit_time =
ktime_ge
t();
osc_page_transfer_get(opg, "transfer\0imm");
osc_page_transfer_add(env, opg, crt);
}
@@
-426,7
+441,7
@@
int lru_queue_work(const struct lu_env *env, void *data)
void osc_lru_add_batch(struct client_obd *cli, struct list_head *plist)
{
-
struct list_head lru = LIST_HEAD_INIT
(lru);
+
LIST_HEAD
(lru);
struct osc_async_page *oap;
long npages = 0;
@@
-499,6
+514,8
@@
static void osc_lru_use(struct client_obd *cli, struct osc_page *opg)
/* If page is being transferred for the first time,
* ops_lru should be empty */
if (opg->ops_in_lru) {
+ if (list_empty(&opg->ops_lru))
+ return;
spin_lock(&cli->cl_lru_list_lock);
if (!list_empty(&opg->ops_lru)) {
__osc_lru_del(cli, opg);
@@
-511,19
+528,22
@@
static void osc_lru_use(struct client_obd *cli, struct osc_page *opg)
static void discard_pagevec(const struct lu_env *env, struct cl_io *io,
struct cl_page **pvec, int max_index)
{
- int i;
+ struct pagevec *pagevec = &osc_env_info(env)->oti_pagevec;
+ int i;
- for (i = 0; i < max_index; i++) {
- struct cl_page *page = pvec[i];
+ ll_pagevec_init(pagevec, 0);
+ for (i = 0; i < max_index; i++) {
+ struct cl_page *page = pvec[i];
LASSERT(cl_page_is_owned(page, io));
cl_page_delete(env, page);
cl_page_discard(env, io, page);
cl_page_disown(env, io, page);
-
cl_page_put(env, page
);
+
cl_pagevec_put(env, page, pagevec
);
- pvec[i] = NULL;
- }
+ pvec[i] = NULL;
+ }
+ pagevec_release(pagevec);
}
/**