aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenny Halevy <bhalevy@panasas.com>2011-05-20 04:45:05 -0400
committerBoaz Harrosh <bharrosh@panasas.com>2011-05-29 05:09:47 -0400
commit67d51f65bde233b17de304baec4f7c4d086471fe (patch)
treed9a5e9f93e9ab85e04350166a94a521c780da229
parent3b6445a6f68b839d1b437756b9c72312e33339b2 (diff)
NFSv4.1: use struct nfs_client to qualify deviceid
deviceids are unique per server, per layout type. Therefore, in the global cache in the files layout driver deviceids from different servers may clash so we need to qualify them with a struct nfs_client that represents the nfs server that returned the deviceid. Introduced in 2.6.39 commit ea8eecdd "NFSv4.1 move deviceid cache to filelayout driver" Signed-off-by: Benny Halevy <bhalevy@panasas.com>
-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();