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 | } |