Merge tag 'pull-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[platform/kernel/linux-starfive.git] / fs / nfs / pnfs.c
index 2613b7e..a5db515 100644 (file)
@@ -710,6 +710,7 @@ pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
                            u32 seq)
 {
        struct pnfs_layout_segment *lseg, *next;
+       struct nfs_server *server = NFS_SERVER(lo->plh_inode);
        int remaining = 0;
 
        dprintk("%s:Begin lo %p\n", __func__, lo);
@@ -722,8 +723,10 @@ pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
                                "offset %llu length %llu\n", __func__,
                                lseg, lseg->pls_range.iomode, lseg->pls_seq,
                                lseg->pls_range.offset, lseg->pls_range.length);
-                       if (!mark_lseg_invalid(lseg, tmp_list))
-                               remaining++;
+                       if (mark_lseg_invalid(lseg, tmp_list))
+                               continue;
+                       remaining++;
+                       pnfs_lseg_cancel_io(server, lseg);
                }
        dprintk("%s:Return %i\n", __func__, remaining);
        return remaining;
@@ -1908,7 +1911,7 @@ static int pnfs_prepare_to_retry_layoutget(struct pnfs_layout_hdr *lo)
        pnfs_layoutcommit_inode(lo->plh_inode, false);
        return wait_on_bit_action(&lo->plh_flags, NFS_LAYOUT_RETURN,
                                   nfs_wait_bit_killable,
-                                  TASK_KILLABLE);
+                                  TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
 }
 
 static void nfs_layoutget_begin(struct pnfs_layout_hdr *lo)
@@ -2485,6 +2488,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
                                u32 seq)
 {
        struct pnfs_layout_segment *lseg, *next;
+       struct nfs_server *server = NFS_SERVER(lo->plh_inode);
        int remaining = 0;
 
        dprintk("%s:Begin lo %p\n", __func__, lo);
@@ -2507,6 +2511,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
                                continue;
                        remaining++;
                        set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
+                       pnfs_lseg_cancel_io(server, lseg);
                }
 
        if (remaining) {
@@ -3192,7 +3197,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
                status = wait_on_bit_lock_action(&nfsi->flags,
                                NFS_INO_LAYOUTCOMMITTING,
                                nfs_wait_bit_killable,
-                               TASK_KILLABLE);
+                               TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
                if (status)
                        goto out;
        }