OSDN Git Service

staging/lustre/osc: split different type of IO
authorAlexander Boyko <alexander_boyko@xyratex.com>
Mon, 2 Feb 2015 02:52:01 +0000 (21:52 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Feb 2015 09:27:16 +0000 (17:27 +0800)
Do not allow different type of pages at the same rpc.

Signed-off-by: Alexander Boyko <alexander_boyko@xyratex.com>
Signed-off-by: Vitaly Fertman <vitaly_fertman@xyratex.com>
Xyratex-bug-id: MRP-859
Reviewed-on: http://review.whamcloud.com/10930
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3192
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/osc/osc_cache.c

index 370e6d4..7022ed4 100644 (file)
@@ -1820,6 +1820,9 @@ static int try_to_add_extent_for_io(struct client_obd *cli,
                                    int *pc, unsigned int *max_pages)
 {
        struct osc_extent *tmp;
+       struct osc_async_page *oap = list_first_entry(&ext->oe_pages,
+                                                     struct osc_async_page,
+                                                     oap_pending_item);
 
        EASSERT((ext->oe_state == OES_CACHE || ext->oe_state == OES_LOCK_DONE),
                ext);
@@ -1829,6 +1832,10 @@ static int try_to_add_extent_for_io(struct client_obd *cli,
                return 0;
 
        list_for_each_entry(tmp, rpclist, oe_link) {
+               struct osc_async_page *oap2;
+
+               oap2 = list_first_entry(&tmp->oe_pages, struct osc_async_page,
+                                       oap_pending_item);
                EASSERT(tmp->oe_owner == current, tmp);
 #if 0
                if (overlapped(tmp, ext)) {
@@ -1836,6 +1843,11 @@ static int try_to_add_extent_for_io(struct client_obd *cli,
                        EASSERT(0, ext);
                }
 #endif
+               if (oap2cl_page(oap)->cp_type != oap2cl_page(oap2)->cp_type) {
+                       CDEBUG(D_CACHE, "Do not permit different type of IO"
+                                       " for a same RPC\n");
+                       return 0;
+               }
 
                if (tmp->oe_srvlock != ext->oe_srvlock ||
                    !tmp->oe_grants != !ext->oe_grants)