diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4filelayout.c | 2 | ||||
-rw-r--r-- | fs/nfs/nfs4filelayout.h | 3 | ||||
-rw-r--r-- | fs/nfs/nfs4filelayoutdev.c | 9 |
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 | ||
61 | struct nfs4_file_layout_dsaddr { | 61 | struct 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); | |||
101 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, | 102 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, |
102 | u32 ds_idx); | 103 | u32 ds_idx); |
103 | extern struct nfs4_file_layout_dsaddr * | 104 | extern struct nfs4_file_layout_dsaddr * |
104 | nfs4_fl_find_get_deviceid(struct nfs4_deviceid *dev_id); | 105 | nfs4_fl_find_get_deviceid(struct nfs_client *, struct nfs4_deviceid *dev_id); |
105 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); | 106 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
106 | struct nfs4_file_layout_dsaddr * | 107 | struct nfs4_file_layout_dsaddr * |
107 | get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags); | 108 | get_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 | ||
612 | struct nfs4_file_layout_dsaddr * | 612 | struct nfs4_file_layout_dsaddr * |
613 | nfs4_fl_find_get_deviceid(struct nfs4_deviceid *id) | 613 | nfs4_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(); |