Two fixes. Added missong logic & case in lock split code.
authorJeremy Allison <jra@samba.org>
Fri, 5 May 2000 02:17:39 +0000 (02:17 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 5 May 2000 02:17:39 +0000 (02:17 +0000)
Fixed range split into two, as DLIST_ADD has the wrong semantics...
Jeremy.
(This used to be commit 82681edda14dcc3d58bb303cfac5452072de67df)

source3/locking/posix.c

index f7468aac4b5263ac00f499dd465f872f5424be7d..0ab46f9ca44682a01cea12769e661a31994cb93d 100644 (file)
@@ -1113,7 +1113,8 @@ BECOMES....
                                ul_curr = ul_curr->next;
 
                        } else if ( (ul_curr->start < lock->start) &&
-                                               (ul_curr->start + ul_curr->size > lock->start) ) {
+                                               (ul_curr->start + ul_curr->size > lock->start) &&
+                                               (ul_curr->start + ul_curr->size <= lock->start + lock->size) ) {
 
                                /*
                                 * This unlock overlaps the existing lock range at the low end.
@@ -1171,9 +1172,6 @@ BECOMES.....
                                ul_new->start = lock->start + lock->size;
                                ul_new->size = ul_curr->start + ul_curr->size - ul_new->start;
 
-                               /* Add into the dlink list after the ul_curr point - NOT at ulhead. */
-                               DLIST_ADD(ul_curr, ul_new);
-
                                /* Truncate the ul_curr. */
                                ul_curr->size = lock->start - ul_curr->start;
 
@@ -1181,6 +1179,16 @@ BECOMES.....
 new: start=%.0f,size=%.0f\n", (double)ul_curr->start, (double)ul_curr->size,
                                                                (double)ul_new->start, (double)ul_new->size ));
 
+                               /*
+                                * Add into the dlink list after the ul_curr point - NOT at ulhead. 
+                                * Note we can't use DLINK_ADD here as this inserts at the head of the given list.
+                                */
+
+                               ul_new->prev = ul_curr;
+                               ul_new->next = ul_curr->next;
+                               ul_curr->next = ul_new;
+
+                               /* And move after the link we added. */
                                ul_curr = ul_new->next;
 
                        } else {