It turned out that it's better to have a standaline I/O context
for glimpse request. In that case, it's easier for glimpse to try
a new mirror if the current one is out of access.
Another problem in this patch is to zero cl_io data structure if
the I/O starts from OSC layer.
Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com>
Change-Id: Ieeac36d4af38bc04a01affb9e6d3d129bceeb74e
Reviewed-on: https://review.whamcloud.com/29082
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
+ * glimpse. An io context to acquire glimpse lock.
+ */
+ CIT_GLIMPSE,
+ /**
* Miscellaneous io. This is used for occasional io activity that
* doesn't fit into other types. Currently this is used for:
*
* Miscellaneous io. This is used for occasional io activity that
* doesn't fit into other types. Currently this is used for:
*
* - VM induced page write-out. An io context for writing page out
* for memory cleansing;
*
* - VM induced page write-out. An io context for writing page out
* for memory cleansing;
*
- * - glimpse. An io context to acquire glimpse lock.
- *
* - grouplock. An io context to acquire group lock.
*
* CIT_MISC io is used simply as a context in which locks and pages
* - grouplock. An io context to acquire group lock.
*
* CIT_MISC io is used simply as a context in which locks and pages
*/
struct lu_env *env = NULL;
struct cl_io *io = NULL;
*/
struct lu_env *env = NULL;
struct cl_io *io = NULL;
- result = cl_io_get(inode, &env, &io, &refcheck);
- if (result > 0) {
- again:
+ result = cl_io_get(inode, &env, &io, &refcheck);
+ if (result <= 0)
+ RETURN(result);
+
+ do {
+ io->ci_need_restart = 0;
io->ci_verify_layout = 1;
io->ci_verify_layout = 1;
- result = cl_io_init(env, io, CIT_MISC, io->ci_obj);
+ result = cl_io_init(env, io, CIT_GLIMPSE, io->ci_obj);
if (result > 0)
/*
* nothing to do for this io. This currently happens
if (result > 0)
/*
* nothing to do for this io. This currently happens
result = io->ci_result;
else if (result == 0)
result = cl_glimpse_lock(env, io, inode, io->ci_obj,
result = io->ci_result;
else if (result == 0)
result = cl_glimpse_lock(env, io, inode, io->ci_obj,
OBD_FAIL_TIMEOUT(OBD_FAIL_GLIMPSE_DELAY, 2);
OBD_FAIL_TIMEOUT(OBD_FAIL_GLIMPSE_DELAY, 2);
- cl_io_fini(env, io);
- if (unlikely(io->ci_need_restart))
- goto again;
- cl_env_put(env, &refcheck);
- }
+ cl_io_fini(env, io);
+ } while (unlikely(io->ci_need_restart));
+
+ cl_env_put(env, &refcheck);
.cio_start = vvp_io_fsync_start,
.cio_fini = vvp_io_fini
},
.cio_start = vvp_io_fsync_start,
.cio_fini = vvp_io_fini
},
+ [CIT_GLIMPSE] = {
+ .cio_fini = vvp_io_fini
+ },
[CIT_MISC] = {
.cio_fini = vvp_io_fini
},
[CIT_MISC] = {
.cio_fini = vvp_io_fini
},
PFID(lu_object_fid(&obj->co_lu)), result);
}
PFID(lu_object_fid(&obj->co_lu)), result);
}
+ io->ci_result = result < 0 ? result : 0;
case CIT_MISC:
lio->lis_pos = 0;
lio->lis_endpos = OBD_OBJECT_EOF;
case CIT_MISC:
lio->lis_pos = 0;
lio->lis_endpos = OBD_OBJECT_EOF;
io->u.ci_ladvise.li_flags = parent->u.ci_ladvise.li_flags;
break;
}
io->u.ci_ladvise.li_flags = parent->u.ci_ladvise.li_flags;
break;
}
+ case CIT_GLIMPSE:
+ case CIT_MISC:
.cio_start = lov_io_start,
.cio_end = lov_io_end
},
.cio_start = lov_io_start,
.cio_end = lov_io_end
},
+ [CIT_GLIMPSE] = {
+ .cio_fini = lov_io_fini,
+ },
[CIT_MISC] = {
.cio_fini = lov_io_fini
}
[CIT_MISC] = {
.cio_fini = lov_io_fini
}
[CIT_LADVISE] = {
.cio_fini = lov_empty_io_fini
},
[CIT_LADVISE] = {
.cio_fini = lov_empty_io_fini
},
+ [CIT_GLIMPSE] = {
+ .cio_fini = lov_empty_io_fini
+ },
[CIT_MISC] = {
.cio_fini = lov_empty_io_fini
}
[CIT_MISC] = {
.cio_fini = lov_empty_io_fini
}
default:
LBUG();
case CIT_MISC:
default:
LBUG();
case CIT_MISC:
case CIT_READ:
result = 0;
break;
case CIT_READ:
result = 0;
break;
result = -EOPNOTSUPP;
break;
case CIT_MISC:
result = -EOPNOTSUPP;
break;
case CIT_MISC:
case CIT_FSYNC:
case CIT_LADVISE:
case CIT_DATA_VERSION:
case CIT_FSYNC:
case CIT_LADVISE:
case CIT_DATA_VERSION:
/* Check ignore layout change conf */
LASSERT(ergo(io->ci_ignore_layout || !io->ci_verify_layout,
!io->ci_need_restart));
/* Check ignore layout change conf */
LASSERT(ergo(io->ci_ignore_layout || !io->ci_verify_layout,
!io->ci_need_restart));
break;
case CIT_LADVISE:
break;
break;
case CIT_LADVISE:
break;
if (IS_ERR(env))
RETURN(PTR_ERR(env));
if (IS_ERR(env))
RETURN(PTR_ERR(env));
- io = &osc_env_info(env)->oti_io;
+ io = osc_env_thread_io(env);
io->ci_obj = cl_object_top(osc2cl(obj));
io->ci_ignore_layout = 1;
rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
io->ci_obj = cl_object_top(osc2cl(obj));
io->ci_ignore_layout = 1;
rc = cl_io_init(env, io, CIT_MISC, io->ci_obj);
pgoff_t start, pgoff_t end, bool discard)
{
struct osc_thread_info *info = osc_env_info(env);
pgoff_t start, pgoff_t end, bool discard)
{
struct osc_thread_info *info = osc_env_info(env);
- struct cl_io *io = &info->oti_io;
+ struct cl_io *io = osc_env_thread_io(env);
osc_page_gang_cbt cb;
int res;
int result;
osc_page_gang_cbt cb;
int res;
int result;
extern struct lu_device_type osc_device_type;
extern struct lu_device_type osc_device_type;
+static inline struct cl_io *osc_env_thread_io(const struct lu_env *env)
+{
+ struct cl_io *io = &osc_env_info(env)->oti_io;
+
+ memset(io, 0, sizeof(*io));
+ return io;
+}
+
static inline int osc_is_object(const struct lu_object *obj)
{
return obj->lo_dev->ld_type == &osc_device_type;
static inline int osc_is_object(const struct lu_object *obj)
{
return obj->lo_dev->ld_type == &osc_device_type;
struct osc_object *oscobj,
struct ldlm_extent *extent)
{
struct osc_object *oscobj,
struct ldlm_extent *extent)
{
- struct cl_io *io = &osc_env_info(env)->oti_io;
+ struct cl_io *io = osc_env_thread_io(env);
struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
pgoff_t page_index;
int result;
struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
pgoff_t page_index;
int result;
}
pvec = (struct cl_page **)osc_env_info(env)->oti_pvec;
}
pvec = (struct cl_page **)osc_env_info(env)->oti_pvec;
- io = &osc_env_info(env)->oti_io;
+ io = osc_env_thread_io(env);
spin_lock(&cli->cl_lru_list_lock);
if (force)
spin_lock(&cli->cl_lru_list_lock);
if (force)