aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4filelayoutdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/nfs4filelayoutdev.c')
-rw-r--r--fs/nfs/nfs4filelayoutdev.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index f594ca35a996..68143c162e3b 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -606,6 +606,21 @@ nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j)
606 return flseg->fh_array[i]; 606 return flseg->fh_array[i];
607} 607}
608 608
609static void
610filelayout_mark_devid_negative(struct nfs4_file_layout_dsaddr *dsaddr,
611 int err, u32 ds_addr)
612{
613 u32 *p = (u32 *)&dsaddr->deviceid;
614
615 printk(KERN_ERR "NFS: data server %x connection error %d."
616 " Deviceid [%x%x%x%x] marked out of use.\n",
617 ds_addr, err, p[0], p[1], p[2], p[3]);
618
619 spin_lock(&filelayout_deviceid_lock);
620 dsaddr->flags |= NFS4_DEVICE_ID_NEG_ENTRY;
621 spin_unlock(&filelayout_deviceid_lock);
622}
623
609struct nfs4_pnfs_ds * 624struct nfs4_pnfs_ds *
610nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx) 625nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
611{ 626{
@@ -619,13 +634,18 @@ nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx)
619 } 634 }
620 635
621 if (!ds->ds_clp) { 636 if (!ds->ds_clp) {
637 struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode);
622 int err; 638 int err;
623 639
624 err = nfs4_ds_connect(NFS_SERVER(lseg->pls_layout->plh_inode), 640 if (dsaddr->flags & NFS4_DEVICE_ID_NEG_ENTRY) {
625 dsaddr->ds_list[ds_idx]); 641 /* Already tried to connect, don't try again */
642 dprintk("%s Deviceid marked out of use\n", __func__);
643 return NULL;
644 }
645 err = nfs4_ds_connect(s, ds);
626 if (err) { 646 if (err) {
627 printk(KERN_ERR "%s nfs4_ds_connect error %d\n", 647 filelayout_mark_devid_negative(dsaddr, err,
628 __func__, err); 648 ntohl(ds->ds_ip_addr));
629 return NULL; 649 return NULL;
630 } 650 }
631 } 651 }