@@ -1902,35 +1902,44 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
19021902
19031903static void loop_handle_cmd (struct loop_cmd * cmd )
19041904{
1905+ struct cgroup_subsys_state * cmd_blkcg_css = cmd -> blkcg_css ;
1906+ struct cgroup_subsys_state * cmd_memcg_css = cmd -> memcg_css ;
19051907 struct request * rq = blk_mq_rq_from_pdu (cmd );
19061908 const bool write = op_is_write (req_op (rq ));
19071909 struct loop_device * lo = rq -> q -> queuedata ;
19081910 int ret = 0 ;
19091911 struct mem_cgroup * old_memcg = NULL ;
1912+ const bool use_aio = cmd -> use_aio ;
19101913
19111914 if (write && (lo -> lo_flags & LO_FLAGS_READ_ONLY )) {
19121915 ret = - EIO ;
19131916 goto failed ;
19141917 }
19151918
1916- if (cmd -> blkcg_css )
1917- kthread_associate_blkcg (cmd -> blkcg_css );
1918- if (cmd -> memcg_css )
1919+ if (cmd_blkcg_css )
1920+ kthread_associate_blkcg (cmd_blkcg_css );
1921+ if (cmd_memcg_css )
19191922 old_memcg = set_active_memcg (
1920- mem_cgroup_from_css (cmd -> memcg_css ));
1923+ mem_cgroup_from_css (cmd_memcg_css ));
19211924
1925+ /*
1926+ * do_req_filebacked() may call blk_mq_complete_request() synchronously
1927+ * or asynchronously if using aio. Hence, do not touch 'cmd' after
1928+ * do_req_filebacked() has returned unless we are sure that 'cmd' has
1929+ * not yet been completed.
1930+ */
19221931 ret = do_req_filebacked (lo , rq );
19231932
1924- if (cmd -> blkcg_css )
1933+ if (cmd_blkcg_css )
19251934 kthread_associate_blkcg (NULL );
19261935
1927- if (cmd -> memcg_css ) {
1936+ if (cmd_memcg_css ) {
19281937 set_active_memcg (old_memcg );
1929- css_put (cmd -> memcg_css );
1938+ css_put (cmd_memcg_css );
19301939 }
19311940 failed :
19321941 /* complete non-aio request */
1933- if (!cmd -> use_aio || ret ) {
1942+ if (!use_aio || ret ) {
19341943 if (ret == - EOPNOTSUPP )
19351944 cmd -> ret = ret ;
19361945 else
0 commit comments