diff options
author | Andy Adamson <andros@netapp.com> | 2012-04-27 17:53:42 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-19 17:54:18 -0400 |
commit | 554d458d79fa34acc73bc5128ba7bbf6b3007dfd (patch) | |
tree | e3b433888cfb494e234bb0a068563591f83cdcc2 /fs/nfs/nfs4filelayoutdev.c | |
parent | e73e6c9e85ed91187c1d21cb9238e86a116bf3db (diff) |
NFSv4.1: cleanup filelayout invalid deviceid handling
Move the invalid deviceid test into nfs4_fl_prepare_ds, called by the
filelayout read, write, and commit routines. NFS4_DEVICE_ID_NEG_ENTRY
is no longer needed.
Remove redundant printk's - filelayout_mark_devid_invalid prints a KERN_WARNING.
An invalid device prevents pNFS io.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4filelayoutdev.c')
-rw-r--r-- | fs/nfs/nfs4filelayoutdev.c | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c index c9cff9adb2d3..7e0be3e331d7 100644 --- a/fs/nfs/nfs4filelayoutdev.c +++ b/fs/nfs/nfs4filelayoutdev.c | |||
@@ -791,48 +791,33 @@ nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j) | |||
791 | return flseg->fh_array[i]; | 791 | return flseg->fh_array[i]; |
792 | } | 792 | } |
793 | 793 | ||
794 | static void | ||
795 | filelayout_mark_devid_negative(struct nfs4_file_layout_dsaddr *dsaddr, | ||
796 | int err, const char *ds_remotestr) | ||
797 | { | ||
798 | u32 *p = (u32 *)&dsaddr->id_node.deviceid; | ||
799 | |||
800 | printk(KERN_ERR "NFS: data server %s connection error %d." | ||
801 | " Deviceid [%x%x%x%x] marked out of use.\n", | ||
802 | ds_remotestr, err, p[0], p[1], p[2], p[3]); | ||
803 | |||
804 | spin_lock(&nfs4_ds_cache_lock); | ||
805 | dsaddr->flags |= NFS4_DEVICE_ID_NEG_ENTRY; | ||
806 | spin_unlock(&nfs4_ds_cache_lock); | ||
807 | } | ||
808 | |||
809 | struct nfs4_pnfs_ds * | 794 | struct nfs4_pnfs_ds * |
810 | nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx) | 795 | nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx) |
811 | { | 796 | { |
812 | struct nfs4_file_layout_dsaddr *dsaddr = FILELAYOUT_LSEG(lseg)->dsaddr; | 797 | struct nfs4_file_layout_dsaddr *dsaddr = FILELAYOUT_LSEG(lseg)->dsaddr; |
813 | struct nfs4_pnfs_ds *ds = dsaddr->ds_list[ds_idx]; | 798 | struct nfs4_pnfs_ds *ds = dsaddr->ds_list[ds_idx]; |
799 | struct nfs4_deviceid_node *devid = FILELAYOUT_DEVID_NODE(lseg); | ||
800 | |||
801 | if (filelayout_test_devid_invalid(devid)) | ||
802 | return NULL; | ||
814 | 803 | ||
815 | if (ds == NULL) { | 804 | if (ds == NULL) { |
816 | printk(KERN_ERR "NFS: %s: No data server for offset index %d\n", | 805 | printk(KERN_ERR "NFS: %s: No data server for offset index %d\n", |
817 | __func__, ds_idx); | 806 | __func__, ds_idx); |
818 | return NULL; | 807 | goto mark_dev_invalid; |
819 | } | 808 | } |
820 | 809 | ||
821 | if (!ds->ds_clp) { | 810 | if (!ds->ds_clp) { |
822 | struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode); | 811 | struct nfs_server *s = NFS_SERVER(lseg->pls_layout->plh_inode); |
823 | int err; | 812 | int err; |
824 | 813 | ||
825 | if (dsaddr->flags & NFS4_DEVICE_ID_NEG_ENTRY) { | ||
826 | /* Already tried to connect, don't try again */ | ||
827 | dprintk("%s Deviceid marked out of use\n", __func__); | ||
828 | return NULL; | ||
829 | } | ||
830 | err = nfs4_ds_connect(s, ds); | 814 | err = nfs4_ds_connect(s, ds); |
831 | if (err) { | 815 | if (err) |
832 | filelayout_mark_devid_negative(dsaddr, err, | 816 | goto mark_dev_invalid; |
833 | ds->ds_remotestr); | ||
834 | return NULL; | ||
835 | } | ||
836 | } | 817 | } |
837 | return ds; | 818 | return ds; |
819 | |||
820 | mark_dev_invalid: | ||
821 | filelayout_mark_devid_invalid(devid); | ||
822 | return NULL; | ||
838 | } | 823 | } |