- if (lock->l_granted_mode == mode) {
- if (lock->l_data.l_flock.end <
- (new->l_data.l_flock.start - 1))
- continue;
-
- if (lock->l_data.l_flock.start >
- (new->l_data.l_flock.end + 1))
- break;
-
- if (lock->l_data.l_flock.start >
- new->l_data.l_flock.start)
- lock->l_data.l_flock.start =
- new->l_data.l_flock.start;
- else
- new->l_data.l_flock.start =
- lock->l_data.l_flock.start;
-
- if (lock->l_data.l_flock.end <
- new->l_data.l_flock.end)
- lock->l_data.l_flock.end =
- new->l_data.l_flock.end;
- else
- new->l_data.l_flock.end =
- lock->l_data.l_flock.end;
-
- if (added) {
- ldlm_flock_destroy(lock, *flags);
- } else {
+ if (lock->l_granted_mode == mode) {
+ /* If the modes are the same then we need to process
+ * locks that overlap OR adjoin the new lock. The extra
+ * logic condition is necessary to deal with arithmetic
+ * overflow and underflow. */
+ if ((new->l_policy_data.l_flock.start >
+ (lock->l_policy_data.l_flock.end + 1))
+ && (lock->l_policy_data.l_flock.end !=
+ OBD_OBJECT_EOF))
+ continue;
+
+ if ((new->l_policy_data.l_flock.end <
+ (lock->l_policy_data.l_flock.start - 1))
+ && (lock->l_policy_data.l_flock.start != 0))
+ break;
+
+ if (new->l_policy_data.l_flock.start <
+ lock->l_policy_data.l_flock.start) {
+ lock->l_policy_data.l_flock.start =
+ new->l_policy_data.l_flock.start;
+ } else {
+ new->l_policy_data.l_flock.start =
+ lock->l_policy_data.l_flock.start;
+ }
+
+ if (new->l_policy_data.l_flock.end >
+ lock->l_policy_data.l_flock.end) {
+ lock->l_policy_data.l_flock.end =
+ new->l_policy_data.l_flock.end;
+ } else {
+ new->l_policy_data.l_flock.end =
+ lock->l_policy_data.l_flock.end;
+ }
+
+ if (added) {
+ ldlm_flock_destroy(lock, mode, *flags);
+ } else {