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-12142 clio: fix hang on urgent cached pages
[fs/lustre-release.git]
/
lustre
/
osc
/
osc_io.c
diff --git
a/lustre/osc/osc_io.c
b/lustre/osc/osc_io.c
index
062fbe4
..
b2ec8e7
100644
(file)
--- a/
lustre/osc/osc_io.c
+++ b/
lustre/osc/osc_io.c
@@
-58,11
+58,13
@@
static void osc_io_fini(const struct lu_env *env, const struct cl_io_slice *io)
{
}
-void osc_read_ahead_release(const struct lu_env *env,
void *cbdat
a)
+void osc_read_ahead_release(const struct lu_env *env,
struct cl_read_ahead *r
a)
{
- struct ldlm_lock *dlmlock = cbdata;
+ struct ldlm_lock *dlmlock = ra->cra_dlmlock;
+ struct osc_io *oio = ra->cra_oio;
struct lustre_handle lockh;
+ oio->oi_is_readahead = 0;
ldlm_lock2handle(dlmlock, &lockh);
ldlm_lock_decref(&lockh, LCK_PR);
LDLM_LOCK_PUT(dlmlock);
@@
-73,11
+75,14
@@
static int osc_io_read_ahead(const struct lu_env *env,
const struct cl_io_slice *ios,
pgoff_t start, struct cl_read_ahead *ra)
{
- struct osc_object *osc = cl2osc(ios->cis_obj);
- struct ldlm_lock *dlmlock;
- int result = -ENODATA;
+ struct osc_object *osc = cl2osc(ios->cis_obj);
+ struct osc_io *oio = cl2osc_io(env, ios);
+ struct ldlm_lock *dlmlock;
+ int result = -ENODATA;
+
ENTRY;
+ oio->oi_is_readahead = true;
dlmlock = osc_dlmlock_at_pgoff(env, osc, start, 0);
if (dlmlock != NULL) {
LASSERT(dlmlock->l_ast_data == osc);
@@
-92,7
+97,8
@@
static int osc_io_read_ahead(const struct lu_env *env,
ra->cra_end_idx = cl_index(osc2cl(osc),
dlmlock->l_policy_data.l_extent.end);
ra->cra_release = osc_read_ahead_release;
- ra->cra_cbdata = dlmlock;
+ ra->cra_dlmlock = dlmlock;
+ ra->cra_oio = oio;
if (ra->cra_end_idx != CL_PAGE_EOF)
ra->cra_contention = true;
result = 0;
@@
-398,6
+404,7
@@
int osc_io_iter_init(const struct lu_env *env, const struct cl_io_slice *ios)
struct obd_import *imp = osc_cli(osc)->cl_import;
struct osc_io *oio = osc_env_io(env);
int rc = -EIO;
+
ENTRY;
spin_lock(&imp->imp_lock);
@@
-422,28
+429,6
@@
int osc_io_iter_init(const struct lu_env *env, const struct cl_io_slice *ios)
}
EXPORT_SYMBOL(osc_io_iter_init);
-int osc_io_rw_iter_init(const struct lu_env *env,
- const struct cl_io_slice *ios)
-{
- struct cl_io *io = ios->cis_io;
- struct osc_io *oio = osc_env_io(env);
- struct osc_object *osc = cl2osc(ios->cis_obj);
- unsigned long npages;
- ENTRY;
-
- if (cl_io_is_append(io))
- RETURN(osc_io_iter_init(env, ios));
-
- npages = io->u.ci_rw.crw_count >> PAGE_SHIFT;
- if (io->u.ci_rw.crw_pos & ~PAGE_MASK)
- ++npages;
-
- oio->oi_lru_reserved = osc_lru_reserve(osc_cli(osc), npages);
-
- RETURN(osc_io_iter_init(env, ios));
-}
-EXPORT_SYMBOL(osc_io_rw_iter_init);
-
void osc_io_iter_fini(const struct lu_env *env,
const struct cl_io_slice *ios)
{
@@
-1190,16
+1175,42
@@
void osc_io_lseek_end(const struct lu_env *env,
}
EXPORT_SYMBOL(osc_io_lseek_end);
+int osc_io_lru_reserve(const struct lu_env *env,
+ const struct cl_io_slice *ios,
+ loff_t pos, size_t bytes)
+{
+ struct osc_object *osc = cl2osc(ios->cis_obj);
+ struct osc_io *oio = osc_env_io(env);
+ unsigned long npages = 0;
+ size_t page_offset;
+
+ ENTRY;
+
+ page_offset = pos & ~PAGE_MASK;
+ if (page_offset) {
+ ++npages;
+ if (bytes > PAGE_SIZE - page_offset)
+ bytes -= (PAGE_SIZE - page_offset);
+ else
+ bytes = 0;
+ }
+ npages += (bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ oio->oi_lru_reserved = osc_lru_reserve(osc_cli(osc), npages);
+
+ RETURN(0);
+}
+EXPORT_SYMBOL(osc_io_lru_reserve);
+
static const struct cl_io_operations osc_io_ops = {
.op = {
[CIT_READ] = {
- .cio_iter_init = osc_io_
rw_
iter_init,
+ .cio_iter_init = osc_io_iter_init,
.cio_iter_fini = osc_io_rw_iter_fini,
.cio_start = osc_io_read_start,
.cio_fini = osc_io_fini
},
[CIT_WRITE] = {
- .cio_iter_init = osc_io_
rw_
iter_init,
+ .cio_iter_init = osc_io_iter_init,
.cio_iter_fini = osc_io_rw_iter_fini,
.cio_start = osc_io_write_start,
.cio_end = osc_io_end,
@@
-1242,6
+1253,7
@@
static const struct cl_io_operations osc_io_ops = {
}
},
.cio_read_ahead = osc_io_read_ahead,
+ .cio_lru_reserve = osc_io_lru_reserve,
.cio_submit = osc_io_submit,
.cio_commit_async = osc_io_commit_async,
.cio_extent_release = osc_io_extent_release