aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/nfs4filelayout.c2
-rw-r--r--fs/nfs/nfs4filelayout.h3
-rw-r--r--fs/nfs/nfs4filelayoutdev.c9
3 files changed, 7 insertions, 7 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index dd6ccf007673..571c1b032e9d 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -440,7 +440,7 @@ filelayout_check_layout(struct pnfs_layout_hdr *lo,
440 } 440 }
441 441
442 /* find and reference the deviceid */ 442 /* find and reference the deviceid */
443 dsaddr = nfs4_fl_find_get_deviceid(id); 443 dsaddr = nfs4_fl_find_get_deviceid(NFS_SERVER(lo->plh_inode)->nfs_client, id);
444 if (dsaddr == NULL) { 444 if (dsaddr == NULL) {
445 dsaddr = get_device_info(lo->plh_inode, id, gfp_flags); 445 dsaddr = get_device_info(lo->plh_inode, id, gfp_flags);
446 if (dsaddr == NULL) 446 if (dsaddr == NULL)
diff --git a/fs/nfs/nfs4filelayout.h b/fs/nfs/nfs4filelayout.h
index 2b461d77b43a..301b95568bd2 100644
--- a/fs/nfs/nfs4filelayout.h
+++ b/fs/nfs/nfs4filelayout.h
@@ -60,6 +60,7 @@ struct nfs4_pnfs_ds {
60 60
61struct nfs4_file_layout_dsaddr { 61struct nfs4_file_layout_dsaddr {
62 struct hlist_node node; 62 struct hlist_node node;
63 struct nfs_client *nfs_client;
63 struct nfs4_deviceid deviceid; 64 struct nfs4_deviceid deviceid;
64 atomic_t ref; 65 atomic_t ref;
65 unsigned long flags; 66 unsigned long flags;
@@ -101,7 +102,7 @@ u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j);
101struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, 102struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg,
102 u32 ds_idx); 103 u32 ds_idx);
103extern struct nfs4_file_layout_dsaddr * 104extern struct nfs4_file_layout_dsaddr *
104nfs4_fl_find_get_deviceid(struct nfs4_deviceid *dev_id); 105nfs4_fl_find_get_deviceid(struct nfs_client *, struct nfs4_deviceid *dev_id);
105extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); 106extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
106struct nfs4_file_layout_dsaddr * 107struct nfs4_file_layout_dsaddr *
107get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags); 108get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags);
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index db07c7af1395..42e326637271 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -431,7 +431,7 @@ decode_device(struct inode *ino, struct pnfs_device *pdev, gfp_t gfp_flags)
431 dsaddr->stripe_indices = stripe_indices; 431 dsaddr->stripe_indices = stripe_indices;
432 stripe_indices = NULL; 432 stripe_indices = NULL;
433 dsaddr->ds_num = num; 433 dsaddr->ds_num = num;
434 434 dsaddr->nfs_client = NFS_SERVER(ino)->nfs_client;
435 memcpy(&dsaddr->deviceid, &pdev->dev_id, sizeof(pdev->dev_id)); 435 memcpy(&dsaddr->deviceid, &pdev->dev_id, sizeof(pdev->dev_id));
436 436
437 for (i = 0; i < dsaddr->ds_num; i++) { 437 for (i = 0; i < dsaddr->ds_num; i++) {
@@ -516,7 +516,7 @@ decode_and_add_device(struct inode *inode, struct pnfs_device *dev, gfp_t gfp_fl
516 } 516 }
517 517
518 spin_lock(&filelayout_deviceid_lock); 518 spin_lock(&filelayout_deviceid_lock);
519 d = nfs4_fl_find_get_deviceid(&new->deviceid); 519 d = nfs4_fl_find_get_deviceid(new->nfs_client, &new->deviceid);
520 if (d) { 520 if (d) {
521 spin_unlock(&filelayout_deviceid_lock); 521 spin_unlock(&filelayout_deviceid_lock);
522 nfs4_fl_free_deviceid(new); 522 nfs4_fl_free_deviceid(new);
@@ -610,16 +610,15 @@ nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr)
610} 610}
611 611
612struct nfs4_file_layout_dsaddr * 612struct nfs4_file_layout_dsaddr *
613nfs4_fl_find_get_deviceid(struct nfs4_deviceid *id) 613nfs4_fl_find_get_deviceid(struct nfs_client *clp, struct nfs4_deviceid *id)
614{ 614{
615 struct nfs4_file_layout_dsaddr *d; 615 struct nfs4_file_layout_dsaddr *d;
616 struct hlist_node *n; 616 struct hlist_node *n;
617 long hash = nfs4_fl_deviceid_hash(id); 617 long hash = nfs4_fl_deviceid_hash(id);
618 618
619
620 rcu_read_lock(); 619 rcu_read_lock();
621 hlist_for_each_entry_rcu(d, n, &filelayout_deviceid_cache[hash], node) { 620 hlist_for_each_entry_rcu(d, n, &filelayout_deviceid_cache[hash], node) {
622 if (!memcmp(&d->deviceid, id, sizeof(*id))) { 621 if (d->nfs_client == clp && !memcmp(&d->deviceid, id, sizeof(*id))) {
623 if (!atomic_inc_not_zero(&d->ref)) 622 if (!atomic_inc_not_zero(&d->ref))
624 goto fail; 623 goto fail;
625 rcu_read_unlock(); 624 rcu_read_unlock();