ceph: wait for OSD requests' callbacks to finish when unmounting
[platform/kernel/linux-starfive.git] / fs / ceph / addr.c
index 95ff849..f486307 100644 (file)
@@ -285,6 +285,7 @@ static void finish_netfs_read(struct ceph_osd_request *req)
        }
        netfs_subreq_terminated(subreq, err, false);
        iput(req->r_inode);
+       ceph_dec_osd_stopping_blocker(fsc->mdsc);
 }
 
 static bool ceph_netfs_issue_op_inline(struct netfs_io_subrequest *subreq)
@@ -414,6 +415,10 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
        } else {
                osd_req_op_extent_osd_iter(req, 0, &iter);
        }
+       if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
+               err = -EIO;
+               goto out;
+       }
        req->r_callback = finish_netfs_read;
        req->r_priv = subreq;
        req->r_inode = inode;
@@ -910,6 +915,7 @@ static void writepages_finish(struct ceph_osd_request *req)
        else
                kfree(osd_data->pages);
        ceph_osdc_put_request(req);
+       ceph_dec_osd_stopping_blocker(fsc->mdsc);
 }
 
 /*
@@ -1218,6 +1224,10 @@ new_request:
                BUG_ON(len < ceph_fscrypt_page_offset(pages[locked_pages - 1]) +
                             thp_size(pages[locked_pages - 1]) - offset);
 
+               if (!ceph_inc_osd_stopping_blocker(fsc->mdsc)) {
+                       rc = -EIO;
+                       goto release_folios;
+               }
                req->r_callback = writepages_finish;
                req->r_inode = inode;