Commit 87df4de8073f922a1f643b9fa6ba0412d5529ecf
Committed by
J. Bruce Fields
1 parent
4e65ebf089
Exists in
master
and in
7 other branches
nfsd: last_byte_offset
refactor the nfs4 server lock code to use last_byte_offset to compute the last byte covered by the lock. Check for overflow so that the last byte is set to NFS4_MAX_UINT64 if offset + len wraps around. Also, use NFS4_MAX_UINT64 for ~(u64)0 where appropriate. Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Showing 2 changed files with 28 additions and 16 deletions Side-by-side Diff
fs/nfsd/nfs4state.c
... | ... | @@ -2416,6 +2416,26 @@ |
2416 | 2416 | #define LOCK_HASH_SIZE (1 << LOCK_HASH_BITS) |
2417 | 2417 | #define LOCK_HASH_MASK (LOCK_HASH_SIZE - 1) |
2418 | 2418 | |
2419 | +static inline u64 | |
2420 | +end_offset(u64 start, u64 len) | |
2421 | +{ | |
2422 | + u64 end; | |
2423 | + | |
2424 | + end = start + len; | |
2425 | + return end >= start ? end: NFS4_MAX_UINT64; | |
2426 | +} | |
2427 | + | |
2428 | +/* last octet in a range */ | |
2429 | +static inline u64 | |
2430 | +last_byte_offset(u64 start, u64 len) | |
2431 | +{ | |
2432 | + u64 end; | |
2433 | + | |
2434 | + BUG_ON(!len); | |
2435 | + end = start + len; | |
2436 | + return end > start ? end - 1: NFS4_MAX_UINT64; | |
2437 | +} | |
2438 | + | |
2419 | 2439 | #define lockownerid_hashval(id) \ |
2420 | 2440 | ((id) & LOCK_HASH_MASK) |
2421 | 2441 | |
... | ... | @@ -2519,8 +2539,8 @@ |
2519 | 2539 | deny->ld_clientid.cl_id = 0; |
2520 | 2540 | } |
2521 | 2541 | deny->ld_start = fl->fl_start; |
2522 | - deny->ld_length = ~(u64)0; | |
2523 | - if (fl->fl_end != ~(u64)0) | |
2542 | + deny->ld_length = NFS4_MAX_UINT64; | |
2543 | + if (fl->fl_end != NFS4_MAX_UINT64) | |
2524 | 2544 | deny->ld_length = fl->fl_end - fl->fl_start + 1; |
2525 | 2545 | deny->ld_type = NFS4_READ_LT; |
2526 | 2546 | if (fl->fl_type != F_RDLCK) |
... | ... | @@ -2617,7 +2637,7 @@ |
2617 | 2637 | static int |
2618 | 2638 | check_lock_length(u64 offset, u64 length) |
2619 | 2639 | { |
2620 | - return ((length == 0) || ((length != ~(u64)0) && | |
2640 | + return ((length == 0) || ((length != NFS4_MAX_UINT64) && | |
2621 | 2641 | LOFF_OVERFLOW(offset, length))); |
2622 | 2642 | } |
2623 | 2643 | |
... | ... | @@ -2737,11 +2757,7 @@ |
2737 | 2757 | file_lock.fl_lmops = &nfsd_posix_mng_ops; |
2738 | 2758 | |
2739 | 2759 | file_lock.fl_start = lock->lk_offset; |
2740 | - if ((lock->lk_length == ~(u64)0) || | |
2741 | - LOFF_OVERFLOW(lock->lk_offset, lock->lk_length)) | |
2742 | - file_lock.fl_end = ~(u64)0; | |
2743 | - else | |
2744 | - file_lock.fl_end = lock->lk_offset + lock->lk_length - 1; | |
2760 | + file_lock.fl_end = last_byte_offset(lock->lk_offset, lock->lk_length); | |
2745 | 2761 | nfs4_transform_lock_offset(&file_lock); |
2746 | 2762 | |
2747 | 2763 | /* |
... | ... | @@ -2858,10 +2874,7 @@ |
2858 | 2874 | file_lock.fl_lmops = &nfsd_posix_mng_ops; |
2859 | 2875 | |
2860 | 2876 | file_lock.fl_start = lockt->lt_offset; |
2861 | - if ((lockt->lt_length == ~(u64)0) || LOFF_OVERFLOW(lockt->lt_offset, lockt->lt_length)) | |
2862 | - file_lock.fl_end = ~(u64)0; | |
2863 | - else | |
2864 | - file_lock.fl_end = lockt->lt_offset + lockt->lt_length - 1; | |
2877 | + file_lock.fl_end = last_byte_offset(lockt->lt_offset, lockt->lt_length); | |
2865 | 2878 | |
2866 | 2879 | nfs4_transform_lock_offset(&file_lock); |
2867 | 2880 | |
... | ... | @@ -2917,10 +2930,7 @@ |
2917 | 2930 | file_lock.fl_lmops = &nfsd_posix_mng_ops; |
2918 | 2931 | file_lock.fl_start = locku->lu_offset; |
2919 | 2932 | |
2920 | - if ((locku->lu_length == ~(u64)0) || LOFF_OVERFLOW(locku->lu_offset, locku->lu_length)) | |
2921 | - file_lock.fl_end = ~(u64)0; | |
2922 | - else | |
2923 | - file_lock.fl_end = locku->lu_offset + locku->lu_length - 1; | |
2933 | + file_lock.fl_end = last_byte_offset(locku->lu_offset, locku->lu_length); | |
2924 | 2934 | nfs4_transform_lock_offset(&file_lock); |
2925 | 2935 | |
2926 | 2936 | /* |
include/linux/nfs4.h