]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ntfs/aops.c
uml: fix x86_64 core dump crash
[linux-2.6-omap-h63xx.git] / fs / ntfs / aops.c
index 7b2c8f4f6a6f7aba6e5012f37e5e8836d0e04f0f..6e5c2534f4bc806b965957254a6bea80af646c62 100644 (file)
@@ -86,17 +86,15 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
                }
                /* Check for the current buffer head overflowing. */
                if (unlikely(file_ofs + bh->b_size > init_size)) {
-                       u8 *kaddr;
                        int ofs;
 
                        ofs = 0;
                        if (file_ofs < init_size)
                                ofs = init_size - file_ofs;
-                       kaddr = kmap_atomic(page, KM_BIO_SRC_IRQ);
-                       memset(kaddr + bh_offset(bh) + ofs, 0,
-                                       bh->b_size - ofs);
-                       kunmap_atomic(kaddr, KM_BIO_SRC_IRQ);
-                       flush_dcache_page(page);
+                       local_irq_save(flags);
+                       zero_user_page(page, bh_offset(bh) + ofs,
+                                        bh->b_size - ofs, KM_BIO_SRC_IRQ);
+                       local_irq_restore(flags);
                }
        } else {
                clear_buffer_uptodate(bh);
@@ -143,11 +141,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
                recs = PAGE_CACHE_SIZE / rec_size;
                /* Should have been verified before we got here... */
                BUG_ON(!recs);
+               local_irq_save(flags);
                kaddr = kmap_atomic(page, KM_BIO_SRC_IRQ);
                for (i = 0; i < recs; i++)
                        post_read_mst_fixup((NTFS_RECORD*)(kaddr +
                                        i * rec_size), rec_size);
                kunmap_atomic(kaddr, KM_BIO_SRC_IRQ);
+               local_irq_restore(flags);
                flush_dcache_page(page);
                if (likely(page_uptodate && !PageError(page)))
                        SetPageUptodate(page);
@@ -241,8 +241,7 @@ static int ntfs_read_block(struct page *page)
        rl = NULL;
        nr = i = 0;
        do {
-               u8 *kaddr;
-               int err;
+               int err = 0;
 
                if (unlikely(buffer_uptodate(bh)))
                        continue;
@@ -250,7 +249,6 @@ static int ntfs_read_block(struct page *page)
                        arr[nr++] = bh;
                        continue;
                }
-               err = 0;
                bh->b_bdev = vol->sb->s_bdev;
                /* Is the block within the allowed limits? */
                if (iblock < lblock) {
@@ -336,10 +334,7 @@ handle_hole:
                bh->b_blocknr = -1UL;
                clear_buffer_mapped(bh);
 handle_zblock:
-               kaddr = kmap_atomic(page, KM_USER0);
-               memset(kaddr + i * blocksize, 0, blocksize);
-               kunmap_atomic(kaddr, KM_USER0);
-               flush_dcache_page(page);
+               zero_user_page(page, i * blocksize, blocksize, KM_USER0);
                if (likely(!err))
                        set_buffer_uptodate(bh);
        } while (i++, iblock++, (bh = bh->b_this_page) != head);
@@ -456,10 +451,7 @@ retry_readpage:
         * ok to ignore the compressed flag here.
         */
        if (unlikely(page->index > 0)) {
-               kaddr = kmap_atomic(page, KM_USER0);
-               memset(kaddr, 0, PAGE_CACHE_SIZE);
-               flush_dcache_page(page);
-               kunmap_atomic(kaddr, KM_USER0);
+               zero_user_page(page, 0, PAGE_CACHE_SIZE, KM_USER0);
                goto done;
        }
        if (!NInoAttr(ni))
@@ -786,14 +778,10 @@ lock_retry_remap:
                 * uptodate so it can get discarded by the VM.
                 */
                if (err == -ENOENT || lcn == LCN_ENOENT) {
-                       u8 *kaddr;
-
                        bh->b_blocknr = -1;
                        clear_buffer_dirty(bh);
-                       kaddr = kmap_atomic(page, KM_USER0);
-                       memset(kaddr + bh_offset(bh), 0, blocksize);
-                       kunmap_atomic(kaddr, KM_USER0);
-                       flush_dcache_page(page);
+                       zero_user_page(page, bh_offset(bh), blocksize,
+                                       KM_USER0);
                        set_buffer_uptodate(bh);
                        err = 0;
                        continue;
@@ -1418,10 +1406,8 @@ retry_writepage:
                if (page->index >= (i_size >> PAGE_CACHE_SHIFT)) {
                        /* The page straddles i_size. */
                        unsigned int ofs = i_size & ~PAGE_CACHE_MASK;
-                       kaddr = kmap_atomic(page, KM_USER0);
-                       memset(kaddr + ofs, 0, PAGE_CACHE_SIZE - ofs);
-                       kunmap_atomic(kaddr, KM_USER0);
-                       flush_dcache_page(page);
+                       zero_user_page(page, ofs, PAGE_CACHE_SIZE - ofs,
+                                       KM_USER0);
                }
                /* Handle mst protected attributes. */
                if (NInoMstProtected(ni))