Whamcloud - gitweb
LU-9679 modules: Use LIST_HEAD for declaring list_heads
[fs/lustre-release.git] / lustre / osc / osc_page.c
index 709e9dd..9dae62a 100644 (file)
@@ -84,20 +84,17 @@ static void osc_page_transfer_add(const struct lu_env *env,
 {
        struct osc_object *obj = cl2osc(opg->ops_cl.cpl_obj);
 
-       /* ops_lru and ops_inflight share the same field, so take it from LRU
-        * first and then use it as inflight. */
        osc_lru_use(osc_cli(obj), opg);
 }
 
-int osc_page_cache_add(const struct lu_env *env,
-                       const struct cl_page_slice *slice, struct cl_io *io)
+int osc_page_cache_add(const struct lu_env *env, struct osc_page *opg,
+                      struct cl_io *io, cl_commit_cbt cb)
 {
-       struct osc_page *opg = cl2osc_page(slice);
        int result;
        ENTRY;
 
        osc_page_transfer_get(opg, "transfer\0cache");
-       result = osc_queue_async_io(env, io, opg);
+       result = osc_queue_async_io(env, io, opg, cb);
        if (result != 0)
                osc_page_transfer_put(env, opg);
        else
@@ -327,6 +324,7 @@ EXPORT_SYMBOL(osc_page_init);
 void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
                     enum cl_req_type crt, int brw_flags)
 {
+       struct osc_io *oio = osc_env_io(env);
        struct osc_async_page *oap = &opg->ops_oap;
 
        LASSERTF(oap->oap_magic == OAP_MAGIC, "Bad oap magic: oap %p, "
@@ -339,7 +337,7 @@ void osc_page_submit(const struct lu_env *env, struct osc_page *opg,
        oap->oap_count     = opg->ops_to - opg->ops_from;
        oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags;
 
-       if (cfs_capable(CFS_CAP_SYS_RESOURCE)) {
+       if (oio->oi_cap_sys_resource) {
                oap->oap_brw_flags |= OBD_BRW_NOQUOTA;
                oap->oap_cmd |= OBD_BRW_NOQUOTA;
        }
@@ -443,7 +441,7 @@ int lru_queue_work(const struct lu_env *env, void *data)
 
 void osc_lru_add_batch(struct client_obd *cli, struct list_head *plist)
 {
-       struct list_head lru = LIST_HEAD_INIT(lru);
+       LIST_HEAD(lru);
        struct osc_async_page *oap;
        long npages = 0;
 
@@ -516,6 +514,8 @@ static void osc_lru_use(struct client_obd *cli, struct osc_page *opg)
        /* If page is being transferred for the first time,
         * ops_lru should be empty */
        if (opg->ops_in_lru) {
+               if (list_empty(&opg->ops_lru))
+                       return;
                spin_lock(&cli->cl_lru_list_lock);
                if (!list_empty(&opg->ops_lru)) {
                        __osc_lru_del(cli, opg);
@@ -528,19 +528,22 @@ static void osc_lru_use(struct client_obd *cli, struct osc_page *opg)
 static void discard_pagevec(const struct lu_env *env, struct cl_io *io,
                                struct cl_page **pvec, int max_index)
 {
-        int i;
+       struct pagevec *pagevec = &osc_env_info(env)->oti_pagevec;
+       int i;
 
-        for (i = 0; i < max_index; i++) {
-                struct cl_page *page = pvec[i];
+       ll_pagevec_init(pagevec, 0);
+       for (i = 0; i < max_index; i++) {
+               struct cl_page *page = pvec[i];
 
                LASSERT(cl_page_is_owned(page, io));
                cl_page_delete(env, page);
                cl_page_discard(env, io, page);
                cl_page_disown(env, io, page);
-                cl_page_put(env, page);
+               cl_pagevec_put(env, page, pagevec);
 
-                pvec[i] = NULL;
-        }
+               pvec[i] = NULL;
+       }
+       pagevec_release(pagevec);
 }
 
 /**