Whamcloud - gitweb
LU-2797 osc: GPF in osc_send_oap_rpc
authorBruno Faccini <bruno.faccini@intel.com>
Wed, 24 Apr 2013 17:07:05 +0000 (19:07 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 20 May 2013 18:12:36 +0000 (14:12 -0400)
Due to cl_loi_list_lock release in osc_send_oap_rpc(), this
leaves a window where lov_oinfo may be freed/poisoned between both
write/read steps/calls of osc_send_oap_rpc() in osc_check_rpcs(),
thus it needs to be refreshed.

Signed-off-by: Bruno Faccini <bruno.faccini@intel.com>
Change-Id: Id3056c1fca91bade65b6d2b556b6b47a3d3d089e
Reviewed-on: http://review.whamcloud.com/6089
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Johann Lombardi <johann.lombardi@intel.com>
lustre/osc/osc_request.c

index 8e572a7..3544db0 100644 (file)
@@ -2847,6 +2847,14 @@ void osc_check_rpcs(const struct lu_env *env, struct client_obd *cli)
                         else if (rc == 0)
                                 race_counter++;
                 }
+
+               /* Refresh loi just in case it has been freed during
+                * cl_loi_list_lock release in osc_send_oap_rpc().
+                */
+               loi = osc_next_loi(cli);
+               if (loi == NULL)
+                       break;
+
                 if (lop_makes_rpc(cli, &loi->loi_read_lop, OBD_BRW_READ)) {
                         rc = osc_send_oap_rpc(env, cli, loi, OBD_BRW_READ,
                                               &loi->loi_read_lop);