diff options
Diffstat (limited to 'fs/nfs/pnfs.c')
| -rw-r--r-- | fs/nfs/pnfs.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index c5bd758e5637..3a3a79d6bf15 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
| @@ -360,7 +360,7 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg) | |||
| 360 | } | 360 | } |
| 361 | EXPORT_SYMBOL_GPL(pnfs_put_lseg); | 361 | EXPORT_SYMBOL_GPL(pnfs_put_lseg); |
| 362 | 362 | ||
| 363 | static inline u64 | 363 | static u64 |
| 364 | end_offset(u64 start, u64 len) | 364 | end_offset(u64 start, u64 len) |
| 365 | { | 365 | { |
| 366 | u64 end; | 366 | u64 end; |
| @@ -376,9 +376,9 @@ end_offset(u64 start, u64 len) | |||
| 376 | * start2 end2 | 376 | * start2 end2 |
| 377 | * [----------------) | 377 | * [----------------) |
| 378 | */ | 378 | */ |
| 379 | static inline int | 379 | static bool |
| 380 | lo_seg_contained(struct pnfs_layout_range *l1, | 380 | pnfs_lseg_range_contained(const struct pnfs_layout_range *l1, |
| 381 | struct pnfs_layout_range *l2) | 381 | const struct pnfs_layout_range *l2) |
| 382 | { | 382 | { |
| 383 | u64 start1 = l1->offset; | 383 | u64 start1 = l1->offset; |
| 384 | u64 end1 = end_offset(start1, l1->length); | 384 | u64 end1 = end_offset(start1, l1->length); |
| @@ -395,9 +395,9 @@ lo_seg_contained(struct pnfs_layout_range *l1, | |||
| 395 | * start2 end2 | 395 | * start2 end2 |
| 396 | * [----------------) | 396 | * [----------------) |
| 397 | */ | 397 | */ |
| 398 | static inline int | 398 | static bool |
| 399 | lo_seg_intersecting(struct pnfs_layout_range *l1, | 399 | pnfs_lseg_range_intersecting(const struct pnfs_layout_range *l1, |
| 400 | struct pnfs_layout_range *l2) | 400 | const struct pnfs_layout_range *l2) |
| 401 | { | 401 | { |
| 402 | u64 start1 = l1->offset; | 402 | u64 start1 = l1->offset; |
| 403 | u64 end1 = end_offset(start1, l1->length); | 403 | u64 end1 = end_offset(start1, l1->length); |
| @@ -409,12 +409,12 @@ lo_seg_intersecting(struct pnfs_layout_range *l1, | |||
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | static bool | 411 | static bool |
| 412 | should_free_lseg(struct pnfs_layout_range *lseg_range, | 412 | should_free_lseg(const struct pnfs_layout_range *lseg_range, |
| 413 | struct pnfs_layout_range *recall_range) | 413 | const struct pnfs_layout_range *recall_range) |
| 414 | { | 414 | { |
| 415 | return (recall_range->iomode == IOMODE_ANY || | 415 | return (recall_range->iomode == IOMODE_ANY || |
| 416 | lseg_range->iomode == recall_range->iomode) && | 416 | lseg_range->iomode == recall_range->iomode) && |
| 417 | lo_seg_intersecting(lseg_range, recall_range); | 417 | pnfs_lseg_range_intersecting(lseg_range, recall_range); |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg, | 420 | static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg, |
| @@ -766,6 +766,7 @@ send_layoutget(struct pnfs_layout_hdr *lo, | |||
| 766 | lgp->args.inode = ino; | 766 | lgp->args.inode = ino; |
| 767 | lgp->args.ctx = get_nfs_open_context(ctx); | 767 | lgp->args.ctx = get_nfs_open_context(ctx); |
| 768 | lgp->gfp_flags = gfp_flags; | 768 | lgp->gfp_flags = gfp_flags; |
| 769 | lgp->cred = lo->plh_lc_cred; | ||
| 769 | 770 | ||
| 770 | /* Synchronously retrieve layout information from server and | 771 | /* Synchronously retrieve layout information from server and |
| 771 | * store in lseg. | 772 | * store in lseg. |
| @@ -860,6 +861,7 @@ _pnfs_return_layout(struct inode *ino) | |||
| 860 | lrp->args.inode = ino; | 861 | lrp->args.inode = ino; |
| 861 | lrp->args.layout = lo; | 862 | lrp->args.layout = lo; |
| 862 | lrp->clp = NFS_SERVER(ino)->nfs_client; | 863 | lrp->clp = NFS_SERVER(ino)->nfs_client; |
| 864 | lrp->cred = lo->plh_lc_cred; | ||
| 863 | 865 | ||
| 864 | status = nfs4_proc_layoutreturn(lrp); | 866 | status = nfs4_proc_layoutreturn(lrp); |
| 865 | out: | 867 | out: |
| @@ -984,8 +986,8 @@ out: | |||
| 984 | * are seen first. | 986 | * are seen first. |
| 985 | */ | 987 | */ |
| 986 | static s64 | 988 | static s64 |
| 987 | cmp_layout(struct pnfs_layout_range *l1, | 989 | pnfs_lseg_range_cmp(const struct pnfs_layout_range *l1, |
| 988 | struct pnfs_layout_range *l2) | 990 | const struct pnfs_layout_range *l2) |
| 989 | { | 991 | { |
| 990 | s64 d; | 992 | s64 d; |
| 991 | 993 | ||
| @@ -1012,7 +1014,7 @@ pnfs_layout_insert_lseg(struct pnfs_layout_hdr *lo, | |||
| 1012 | dprintk("%s:Begin\n", __func__); | 1014 | dprintk("%s:Begin\n", __func__); |
| 1013 | 1015 | ||
| 1014 | list_for_each_entry(lp, &lo->plh_segs, pls_list) { | 1016 | list_for_each_entry(lp, &lo->plh_segs, pls_list) { |
| 1015 | if (cmp_layout(&lseg->pls_range, &lp->pls_range) > 0) | 1017 | if (pnfs_lseg_range_cmp(&lseg->pls_range, &lp->pls_range) > 0) |
| 1016 | continue; | 1018 | continue; |
| 1017 | list_add_tail(&lseg->pls_list, &lp->pls_list); | 1019 | list_add_tail(&lseg->pls_list, &lp->pls_list); |
| 1018 | dprintk("%s: inserted lseg %p " | 1020 | dprintk("%s: inserted lseg %p " |
| @@ -1050,7 +1052,7 @@ alloc_init_layout_hdr(struct inode *ino, | |||
| 1050 | INIT_LIST_HEAD(&lo->plh_segs); | 1052 | INIT_LIST_HEAD(&lo->plh_segs); |
| 1051 | INIT_LIST_HEAD(&lo->plh_bulk_destroy); | 1053 | INIT_LIST_HEAD(&lo->plh_bulk_destroy); |
| 1052 | lo->plh_inode = ino; | 1054 | lo->plh_inode = ino; |
| 1053 | lo->plh_lc_cred = get_rpccred(ctx->state->owner->so_cred); | 1055 | lo->plh_lc_cred = get_rpccred(ctx->cred); |
| 1054 | return lo; | 1056 | return lo; |
| 1055 | } | 1057 | } |
| 1056 | 1058 | ||
| @@ -1091,21 +1093,21 @@ out_existing: | |||
| 1091 | * READ READ true | 1093 | * READ READ true |
| 1092 | * READ RW true | 1094 | * READ RW true |
| 1093 | */ | 1095 | */ |
| 1094 | static int | 1096 | static bool |
| 1095 | is_matching_lseg(struct pnfs_layout_range *ls_range, | 1097 | pnfs_lseg_range_match(const struct pnfs_layout_range *ls_range, |
| 1096 | struct pnfs_layout_range *range) | 1098 | const struct pnfs_layout_range *range) |
| 1097 | { | 1099 | { |
| 1098 | struct pnfs_layout_range range1; | 1100 | struct pnfs_layout_range range1; |
| 1099 | 1101 | ||
| 1100 | if ((range->iomode == IOMODE_RW && | 1102 | if ((range->iomode == IOMODE_RW && |
| 1101 | ls_range->iomode != IOMODE_RW) || | 1103 | ls_range->iomode != IOMODE_RW) || |
| 1102 | !lo_seg_intersecting(ls_range, range)) | 1104 | !pnfs_lseg_range_intersecting(ls_range, range)) |
| 1103 | return 0; | 1105 | return 0; |
| 1104 | 1106 | ||
| 1105 | /* range1 covers only the first byte in the range */ | 1107 | /* range1 covers only the first byte in the range */ |
| 1106 | range1 = *range; | 1108 | range1 = *range; |
| 1107 | range1.length = 1; | 1109 | range1.length = 1; |
| 1108 | return lo_seg_contained(ls_range, &range1); | 1110 | return pnfs_lseg_range_contained(ls_range, &range1); |
| 1109 | } | 1111 | } |
| 1110 | 1112 | ||
| 1111 | /* | 1113 | /* |
| @@ -1121,7 +1123,7 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo, | |||
| 1121 | 1123 | ||
| 1122 | list_for_each_entry(lseg, &lo->plh_segs, pls_list) { | 1124 | list_for_each_entry(lseg, &lo->plh_segs, pls_list) { |
| 1123 | if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) && | 1125 | if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) && |
| 1124 | is_matching_lseg(&lseg->pls_range, range)) { | 1126 | pnfs_lseg_range_match(&lseg->pls_range, range)) { |
| 1125 | ret = pnfs_get_lseg(lseg); | 1127 | ret = pnfs_get_lseg(lseg); |
| 1126 | break; | 1128 | break; |
| 1127 | } | 1129 | } |
