AFS: Fix afs_prepare_write()
[sfrench/cifs-2.6.git] / fs / afs / write.c
index 83ff29262816c77fd6559c6d4e25f255fc24bfd7..a03b92a0fe1db9240d7b3ff4d1ffc0a92a222193 100644 (file)
@@ -122,7 +122,7 @@ static int afs_prepare_page(struct afs_vnode *vnode, struct page *page,
        if (offset == 0 && to == PAGE_SIZE)
                return 0;
 
-       p = kmap(page);
+       p = kmap_atomic(page, KM_USER0);
 
        i_size = i_size_read(&vnode->vfs_inode);
        pos = (loff_t) page->index << PAGE_SHIFT;
@@ -133,7 +133,7 @@ static int afs_prepare_page(struct afs_vnode *vnode, struct page *page,
                        memset(p, 0, offset);
                if (to < PAGE_SIZE)
                        memset(p + to, 0, PAGE_SIZE - to);
-               kunmap(page);
+               kunmap_atomic(p, KM_USER0);
                return 0;
        }
 
@@ -152,7 +152,7 @@ static int afs_prepare_page(struct afs_vnode *vnode, struct page *page,
                        memset(p + eof, 0, PAGE_SIZE - eof);
        }
 
-       kunmap(p);
+       kunmap_atomic(p, KM_USER0);
 
        ret = 0;
        if (offset > 0 || eof > to) {
@@ -206,7 +206,6 @@ int afs_prepare_write(struct file *file, struct page *page,
                        _leave(" = %d [prep]", ret);
                        return ret;
                }
-               SetPageUptodate(page);
        }
 
 try_again:
@@ -311,8 +310,8 @@ int afs_commit_write(struct file *file, struct page *page,
                spin_unlock(&vnode->writeback_lock);
        }
 
+       SetPageUptodate(page);
        set_page_dirty(page);
-
        if (PageDirty(page))
                _debug("dirtied");
 
@@ -395,8 +394,9 @@ static int afs_write_back_from_locked_page(struct afs_writeback *wb,
                if (n == 0)
                        goto no_more;
                if (pages[0]->index != start) {
-                       for (n--; n >= 0; n--)
-                               put_page(pages[n]);
+                       do {
+                               put_page(pages[--n]);
+                       } while (n > 0);
                        goto no_more;
                }
 
@@ -489,14 +489,6 @@ int afs_writepage(struct page *page, struct writeback_control *wbc)
 
        _enter("{%lx},", page->index);
 
-       if (wbc->sync_mode != WB_SYNC_NONE)
-               wait_on_page_writeback(page);
-
-       if (PageWriteback(page) || !PageDirty(page)) {
-               unlock_page(page);
-               return 0;
-       }
-
        wb = (struct afs_writeback *) page_private(page);
        ASSERT(wb != NULL);
 
@@ -677,7 +669,7 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
        pagevec_init(&pv, 0);
 
        do {
-               _debug("attach %lx-%lx", first, last);
+               _debug("done %lx-%lx", first, last);
 
                count = last - first + 1;
                if (count > PAGEVEC_SIZE)
@@ -709,7 +701,7 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
                }
 
                __pagevec_release(&pv);
-       } while (first < last);
+       } while (first <= last);
 
        _leave("");
 }