*/
CIT_FSYNC,
/**
+ * 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:
*
* - 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
*/
struct lu_env *env = NULL;
struct cl_io *io = NULL;
- __u16 refcheck;
+ __u16 refcheck;
int result;
ENTRY;
- 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;
- 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
result = io->ci_result;
else if (result == 0)
result = cl_glimpse_lock(env, io, inode, io->ci_obj,
- agl);
+ agl);
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);
RETURN(result);
}
.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
},
PFID(lu_object_fid(&obj->co_lu)), result);
}
+ io->ci_result = result < 0 ? result : 0;
RETURN(result);
}
break;
}
+ case CIT_GLIMPSE:
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;
}
+ case CIT_GLIMPSE:
+ case CIT_MISC:
default:
break;
}
.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_LADVISE] = {
.cio_fini = lov_empty_io_fini
},
+ [CIT_GLIMPSE] = {
+ .cio_fini = lov_empty_io_fini
+ },
[CIT_MISC] = {
.cio_fini = lov_empty_io_fini
}
default:
LBUG();
case CIT_MISC:
+ case CIT_GLIMPSE:
case CIT_READ:
result = 0;
break;
result = -EOPNOTSUPP;
break;
case CIT_MISC:
+ case CIT_GLIMPSE:
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));
+ case CIT_GLIMPSE:
break;
case CIT_LADVISE:
break;
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);
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;
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;
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;
}
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)