Merge tag 'v6.1-rockchip-dtsfixes1' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / fs / netfs / buffered_read.c
index 0ce5358..7679a68 100644 (file)
@@ -17,9 +17,9 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
 {
        struct netfs_io_subrequest *subreq;
        struct folio *folio;
-       unsigned int iopos, account = 0;
        pgoff_t start_page = rreq->start / PAGE_SIZE;
        pgoff_t last_page = ((rreq->start + rreq->len) / PAGE_SIZE) - 1;
+       size_t account = 0;
        bool subreq_failed = false;
 
        XA_STATE(xas, &rreq->mapping->i_pages, start_page);
@@ -39,18 +39,23 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
         */
        subreq = list_first_entry(&rreq->subrequests,
                                  struct netfs_io_subrequest, rreq_link);
-       iopos = 0;
        subreq_failed = (subreq->error < 0);
 
        trace_netfs_rreq(rreq, netfs_rreq_trace_unlock);
 
        rcu_read_lock();
        xas_for_each(&xas, folio, last_page) {
-               unsigned int pgpos = (folio_index(folio) - start_page) * PAGE_SIZE;
-               unsigned int pgend = pgpos + folio_size(folio);
+               loff_t pg_end;
                bool pg_failed = false;
 
+               if (xas_retry(&xas, folio))
+                       continue;
+
+               pg_end = folio_pos(folio) + folio_size(folio) - 1;
+
                for (;;) {
+                       loff_t sreq_end;
+
                        if (!subreq) {
                                pg_failed = true;
                                break;
@@ -58,11 +63,11 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
                        if (test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags))
                                folio_start_fscache(folio);
                        pg_failed |= subreq_failed;
-                       if (pgend < iopos + subreq->len)
+                       sreq_end = subreq->start + subreq->len - 1;
+                       if (pg_end < sreq_end)
                                break;
 
                        account += subreq->transferred;
-                       iopos += subreq->len;
                        if (!list_is_last(&subreq->rreq_link, &rreq->subrequests)) {
                                subreq = list_next_entry(subreq, rreq_link);
                                subreq_failed = (subreq->error < 0);
@@ -70,7 +75,8 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
                                subreq = NULL;
                                subreq_failed = false;
                        }
-                       if (pgend == iopos)
+
+                       if (pg_end == sreq_end)
                                break;
                }