X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_osc.h;h=4c243ed0fa486e01edddf76d79cd530db3c1592c;hb=0df4a140e16dbecfbb7de3ed9d3a185e5ff252e0;hp=ae7a602f032a8a31d3dc9a6bdde939729e6e47e5;hpb=48df66be72c948ab5428a073e52a45ac4252d612;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_osc.h b/lustre/include/lustre_osc.h index ae7a602..4c243ed 100644 --- a/lustre/include/lustre_osc.h +++ b/lustre/include/lustre_osc.h @@ -73,7 +73,6 @@ enum async_flags { struct osc_async_page { int oap_magic; unsigned short oap_cmd; - unsigned short oap_interrupted:1; struct list_head oap_pending_item; struct list_head oap_rpc_item; @@ -135,7 +134,9 @@ struct osc_io { /** true if this io is lockless. */ unsigned int oi_lockless:1, /** true if this io is counted as active IO */ - oi_is_active:1; + oi_is_active:1, + /** true if this io has CAP_SYS_RESOURCE */ + oi_cap_sys_resource:1; /** how many LRU pages are reserved for this IO */ unsigned long oi_lru_reserved; @@ -166,11 +167,9 @@ struct osc_session { struct osc_thread_info { struct ldlm_res_id oti_resname; union ldlm_policy_data oti_policy; - struct cl_lock_descr oti_descr; struct cl_attr oti_attr; - struct lustre_handle oti_handle; - struct cl_page_list oti_plist; struct cl_io oti_io; + struct pagevec oti_pagevec; void *oti_pvec[OTI_PVEC_SIZE]; /** * Fields used by cl_lock_discard_pages(). @@ -342,19 +341,8 @@ static inline void osc_object_unlock(struct osc_object *obj) spin_unlock(&obj->oo_lock); } -static inline int osc_object_is_locked(struct osc_object *obj) -{ -#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) - return spin_is_locked(&obj->oo_lock); -#else - /* - * It is not perfect to return true all the time. - * But since this function is only used for assertion - * and checking, it seems OK. - */ - return 1; -#endif -} +#define assert_osc_object_is_locked(obj) \ + assert_spin_locked(&obj->oo_lock) static inline void osc_object_set_contended(struct osc_object *obj) { @@ -586,15 +574,14 @@ long osc_lru_shrink(const struct lu_env *env, struct client_obd *cli, long target, bool force); /* osc_cache.c */ -int osc_cancel_async_page(const struct lu_env *env, struct osc_page *ops); int osc_set_async_flags(struct osc_object *obj, struct osc_page *opg, u32 async_flags); int osc_prep_async_page(struct osc_object *osc, struct osc_page *ops, struct page *page, loff_t offset); int osc_queue_async_io(const struct lu_env *env, struct cl_io *io, - struct osc_page *ops); -int osc_page_cache_add(const struct lu_env *env, - const struct cl_page_slice *slice, struct cl_io *io); + struct osc_page *ops, cl_commit_cbt cb); +int osc_page_cache_add(const struct lu_env *env, struct osc_page *opg, + struct cl_io *io, cl_commit_cbt cb); int osc_teardown_async_page(const struct lu_env *env, struct osc_object *obj, struct osc_page *ops); int osc_flush_async_page(const struct lu_env *env, struct cl_io *io, @@ -627,13 +614,13 @@ static inline void osc_io_unplug(const struct lu_env *env, (void)osc_io_unplug0(env, cli, osc, 0); } -typedef int (*osc_page_gang_cbt)(const struct lu_env *, struct cl_io *, - struct osc_page *, void *); -int osc_page_gang_lookup(const struct lu_env *env, struct cl_io *io, - struct osc_object *osc, pgoff_t start, pgoff_t end, - osc_page_gang_cbt cb, void *cbdata); -int osc_discard_cb(const struct lu_env *env, struct cl_io *io, - struct osc_page *ops, void *cbdata); +typedef bool (*osc_page_gang_cbt)(const struct lu_env *, struct cl_io *, + struct osc_page *, void *); +bool osc_page_gang_lookup(const struct lu_env *env, struct cl_io *io, + struct osc_object *osc, pgoff_t start, pgoff_t end, + osc_page_gang_cbt cb, void *cbdata); +bool osc_discard_cb(const struct lu_env *env, struct cl_io *io, + struct osc_page *ops, void *cbdata); /* osc_dev.c */ int osc_device_init(const struct lu_env *env, struct lu_device *d, @@ -690,9 +677,9 @@ int osc_io_commit_async(const struct lu_env *env, 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_write_iter_init(const struct lu_env *env, - const struct cl_io_slice *ios); -void osc_io_write_iter_fini(const struct lu_env *env, +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); void osc_io_setattr_end(const struct lu_env *env, @@ -778,9 +765,9 @@ static inline struct cl_object *osc2cl(const struct osc_object *obj) return (struct cl_object *)&obj->oo_cl; } -static inline struct osc_device *obd2osc_dev(const struct obd_device *d) +static inline struct osc_device *obd2osc_dev(const struct obd_device *obd) { - return container_of0(d->obd_lu_dev, struct osc_device, + return container_of0(obd->obd_lu_dev, struct osc_device, od_cl.cd_lu_dev); } @@ -913,9 +900,8 @@ struct osc_extent { /** state of this extent */ enum osc_extent_state oe_state; /** flags for this extent. */ - unsigned int oe_intree:1, /** 0 is write, 1 is read */ - oe_rw:1, + unsigned int oe_rw:1, /** sync extent, queued by osc_queue_sync_pages() */ oe_sync:1, /** set if this extent has partial, sync pages. @@ -938,7 +924,9 @@ struct osc_extent { * called by page WB daemon, or sync write or reading requests. */ oe_urgent:1, /** Non-delay RPC should be used for this extent. */ - oe_ndelay:1; + oe_ndelay:1, + /** direct IO pages */ + oe_dio:1; /** how many grants allocated for this extent. * Grant allocated for this extent. There is no grant allocated * for reading extents and sync write extents. */ @@ -947,11 +935,6 @@ struct osc_extent { unsigned int oe_nr_pages; /** list of pending oap pages. Pages in this list are NOT sorted. */ struct list_head oe_pages; - /** Since an extent has to be written out in atomic, this is used to - * remember the next page need to be locked to write this extent out. - * Not used right now. - */ - struct osc_page *oe_next_page; /** start and end index of this extent, include start and end * themselves. Page offset here is the page index of osc_pages. * oe_start is used as keyword for red-black tree. */