NFSv4.1: pnfs_layout_io_set_failed must clear invalid lsegs
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 21 Sep 2012 01:19:43 +0000 (21:19 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 28 Sep 2012 20:03:11 +0000 (16:03 -0400)
If pnfs_layout_io_test_failed() authorises a retry of the failed layoutgets,
we should clear the existing layout segments so that we start afresh. Do
this in pnfs_layout_io_set_failed().

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pnfs.c

index 6834fa1..9ee3bd7 100644 (file)
@@ -265,10 +265,18 @@ static void
 pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
 {
        struct inode *inode = lo->plh_inode;
+       struct pnfs_layout_range range = {
+               .iomode = iomode,
+               .offset = 0,
+               .length = NFS4_MAX_UINT64,
+       };
+       LIST_HEAD(head);
 
        spin_lock(&inode->i_lock);
        pnfs_layout_set_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
+       pnfs_mark_matching_lsegs_invalid(lo, &head, &range);
        spin_unlock(&inode->i_lock);
+       pnfs_free_lseg_list(&head);
        dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
                        iomode == IOMODE_RW ?  "RW" : "READ");
 }