Merge tag 'selinux-pr-20210830' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / fs / nfs / read.c
index d2b6dce..9f39e0a 100644 (file)
@@ -74,8 +74,7 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
 }
 EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
 
-static void nfs_pageio_complete_read(struct nfs_pageio_descriptor *pgio,
-                                    struct inode *inode)
+static void nfs_pageio_complete_read(struct nfs_pageio_descriptor *pgio)
 {
        struct nfs_pgio_mirror *pgm;
        unsigned long npages;
@@ -86,9 +85,9 @@ static void nfs_pageio_complete_read(struct nfs_pageio_descriptor *pgio,
        WARN_ON_ONCE(pgio->pg_mirror_count != 1);
 
        pgm = &pgio->pg_mirrors[0];
-       NFS_I(inode)->read_io += pgm->pg_bytes_written;
+       NFS_I(pgio->pg_inode)->read_io += pgm->pg_bytes_written;
        npages = (pgm->pg_bytes_written + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       nfs_add_stats(inode, NFSIOS_READPAGES, npages);
+       nfs_add_stats(pgio->pg_inode, NFSIOS_READPAGES, npages);
 }
 
 
@@ -363,22 +362,23 @@ int nfs_readpage(struct file *file, struct page *page)
        } else
                desc.ctx = get_nfs_open_context(nfs_file_open_context(file));
 
+       xchg(&desc.ctx->error, 0);
        if (!IS_SYNC(inode)) {
                ret = nfs_readpage_from_fscache(desc.ctx, inode, page);
                if (ret == 0)
-                       goto out;
+                       goto out_wait;
        }
 
-       xchg(&desc.ctx->error, 0);
        nfs_pageio_init_read(&desc.pgio, inode, false,
                             &nfs_async_read_completion_ops);
 
        ret = readpage_async_filler(&desc, page);
+       if (ret)
+               goto out;
 
-       if (!ret)
-               nfs_pageio_complete_read(&desc.pgio, inode);
-
+       nfs_pageio_complete_read(&desc.pgio);
        ret = desc.pgio.pg_error < 0 ? desc.pgio.pg_error : 0;
+out_wait:
        if (!ret) {
                ret = wait_on_page_locked_killable(page);
                if (!PageUptodate(page) && !ret)
@@ -430,7 +430,7 @@ int nfs_readpages(struct file *file, struct address_space *mapping,
 
        ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
 
-       nfs_pageio_complete_read(&desc.pgio, inode);
+       nfs_pageio_complete_read(&desc.pgio);
 
 read_complete:
        put_nfs_open_context(desc.ctx);