Commit 87df4de8073f922a1f643b9fa6ba0412d5529ecf

Authored by Benny Halevy
Committed by J. Bruce Fields
1 parent 4e65ebf089

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

... ... @@ -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
... ... @@ -88,6 +88,8 @@
88 88 #define NFS4_ACE_GENERIC_EXECUTE 0x001200A0
89 89 #define NFS4_ACE_MASK_ALL 0x001F01FF
90 90  
  91 +#define NFS4_MAX_UINT64 (~(u64)0)
  92 +
91 93 enum nfs4_acl_whotype {
92 94 NFS4_ACL_WHO_NAMED = 0,
93 95 NFS4_ACL_WHO_OWNER,