*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*/
/*
* lustre/include/lustre_osc.h
/** true if this io is counted as active IO */
oi_is_active:1,
/** true if this io has CAP_SYS_RESOURCE */
- oi_cap_sys_resource:1;
+ oi_cap_sys_resource:1,
+ /** true if this io issued by readahead */
+ oi_is_readahead:1;
/** how many LRU pages are reserved for this IO */
unsigned long oi_lru_reserved;
*/
pgoff_t oti_next_index;
pgoff_t oti_fn_index; /* first non-overlapped index */
+ pgoff_t oti_ng_index; /* negative lock caching */
struct cl_sync_io oti_anchor;
struct cl_req_attr oti_req_attr;
struct lu_buf oti_ladvise_buf;
if (enqflags & CEF_NONBLOCK)
result |= LDLM_FL_BLOCK_NOWAIT;
if (enqflags & CEF_GLIMPSE)
- result |= LDLM_FL_HAS_INTENT;
+ result |= LDLM_FL_HAS_INTENT|LDLM_FL_CBPENDING;
if (enqflags & CEF_DISCARD_DATA)
result |= LDLM_FL_AST_DISCARD_DATA;
if (enqflags & CEF_PEEK)
* Return the lock even if it is being canceled.
*/
OSC_DAP_FL_CANCELING = BIT(1),
+ /**
+ * check ast data is present, requested to cancel cb
+ */
+ OSC_DAP_FL_AST = BIT(2),
+ /**
+ * look at right region for the desired lock
+ */
+ OSC_DAP_FL_RIGHT = BIT(3),
};
/*
* An offset within page from which next transfer starts. This is used
* by cl_page_clip() to submit partial page transfers.
*/
- int ops_from;
+ unsigned int ops_from:PAGE_SHIFT,
/**
- * An offset within page at which next transfer ends.
+ * An offset within page at which next transfer ends(inclusive).
*
* \see osc_page::ops_from.
*/
- int ops_to;
+ ops_to:PAGE_SHIFT,
/**
* Boolean, true iff page is under transfer. Used for sanity checking.
*/
- unsigned ops_transfer_pinned:1,
+ ops_transfer_pinned:1,
/**
* in LRU?
*/
const struct cl_io_slice *ios,
struct cl_page_list *qin, int from, int to,
cl_commit_cbt cb);
+void osc_io_extent_release(const struct lu_env *env,
+ const struct cl_io_slice *ios);
int osc_io_iter_init(const struct lu_env *env, const struct cl_io_slice *ios);
void osc_io_iter_fini(const struct lu_env *env,
const struct cl_io_slice *ios);
-int osc_io_rw_iter_init(const struct lu_env *env,
- const struct cl_io_slice *ios);
void osc_io_rw_iter_fini(const struct lu_env *env,
const struct cl_io_slice *ios);
int osc_io_fault_start(const struct lu_env *env, const struct cl_io_slice *ios);
struct cl_fsync_io *fio);
void osc_io_fsync_end(const struct lu_env *env,
const struct cl_io_slice *slice);
-void osc_read_ahead_release(const struct lu_env *env, void *cbdata);
+void osc_read_ahead_release(const struct lu_env *env, struct cl_read_ahead *ra);
+int osc_io_lseek_start(const struct lu_env *env,
+ const struct cl_io_slice *slice);
+void osc_io_lseek_end(const struct lu_env *env,
+ const struct cl_io_slice *slice);
+int osc_io_lru_reserve(const struct lu_env *env, const struct cl_io_slice *ios,
+ loff_t pos, size_t count);
/* osc_lock.c */
void osc_lock_to_lockless(const struct lu_env *env, struct osc_lock *ols,
static inline struct osc_device *lu2osc_dev(const struct lu_device *d)
{
- return container_of0(d, struct osc_device, od_cl.cd_lu_dev);
+ return container_of_safe(d, struct osc_device, od_cl.cd_lu_dev);
}
static inline struct obd_export *osc_export(const struct osc_object *obj)
static inline struct osc_object *cl2osc(const struct cl_object *obj)
{
- return container_of0(obj, struct osc_object, oo_cl);
+ return container_of_safe(obj, struct osc_object, oo_cl);
}
static inline struct cl_object *osc2cl(const struct osc_object *obj)
static inline struct osc_device *obd2osc_dev(const struct obd_device *obd)
{
- return container_of0(obd->obd_lu_dev, struct osc_device,
- od_cl.cd_lu_dev);
+ return container_of_safe(obd->obd_lu_dev, struct osc_device,
+ od_cl.cd_lu_dev);
}
static inline struct lu_device *osc2lu_dev(struct osc_device *osc)
static inline struct osc_object *lu2osc(const struct lu_object *obj)
{
- return container_of0(obj, struct osc_object, oo_cl.co_lu);
+ return container_of_safe(obj, struct osc_object, oo_cl.co_lu);
}
static inline struct osc_io *cl2osc_io(const struct lu_env *env,
const struct cl_io_slice *slice)
{
- struct osc_io *oio = container_of0(slice, struct osc_io, oi_cl);
+ struct osc_io *oio = container_of(slice, struct osc_io, oi_cl);
LINVRNT(oio == osc_env_io(env));
return oio;
static inline struct osc_page *cl2osc_page(const struct cl_page_slice *slice)
{
- return container_of0(slice, struct osc_page, ops_cl);
+ return container_of_safe(slice, struct osc_page, ops_cl);
}
static inline struct osc_page *oap2osc(struct osc_async_page *oap)
{
- return container_of0(oap, struct osc_page, ops_oap);
+ return container_of_safe(oap, struct osc_page, ops_oap);
}
static inline pgoff_t osc_index(struct osc_page *opg)
static inline struct osc_lock *cl2osc_lock(const struct cl_lock_slice *slice)
{
- return container_of0(slice, struct osc_lock, ols_cl);
+ return container_of_safe(slice, struct osc_lock, ols_cl);
}
static inline int osc_io_srvlock(struct osc_io *oio)