From cb9b02a24e9937ac280eeb1c55bf9c8e22779d2e Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Sat, 25 Oct 2008 12:05:26 +0300 Subject: [PATCH] Fixed 2 bugs in vma_merge_object(). Looks like it had never been called before. --- tasks/mm0/src/fault.c | 6 +++--- tasks/mm0/src/file.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tasks/mm0/src/fault.c b/tasks/mm0/src/fault.c index d267286..0450ecf 100644 --- a/tasks/mm0/src/fault.c +++ b/tasks/mm0/src/fault.c @@ -148,7 +148,7 @@ int vma_merge_object(struct vm_object *redundant) /* The redundant shadow object */ struct vm_object *front; /* Shadow in front of redundant */ struct vm_obj_link *last_link; - struct page *p1, *p2; + struct page *p1, *p2, *n; /* Check link and shadow count is really 1 */ BUG_ON(redundant->nlinks != 1); @@ -159,10 +159,10 @@ int vma_merge_object(struct vm_object *redundant) struct vm_object, shref); /* Move all non-intersecting pages to front shadow. */ - list_for_each_entry(p1, &redundant->page_cache, list) { + list_for_each_entry_safe(p1, n, &redundant->page_cache, list) { /* Page doesn't exist in front, move it there */ if (!(p2 = find_page(front, p1->offset))) { - list_del(&p1->list); + list_del_init(&p1->list); spin_lock(&p1->lock); p1->owner = front; spin_unlock(&p1->lock); diff --git a/tasks/mm0/src/file.c b/tasks/mm0/src/file.c index dbff94e..fbabf2e 100644 --- a/tasks/mm0/src/file.c +++ b/tasks/mm0/src/file.c @@ -194,6 +194,7 @@ int insert_page_olist(struct page *this, struct vm_object *vmo) list_add_tail(&this->list, &vmo->page_cache); return 0; } + /* Else find the right interval */ list_for_each_entry(before, &vmo->page_cache, list) { after = list_entry(before->list.next, struct page, list);