[PATCH 11/17] ntfs: convert ntfs_map_page to read_kmap_page

Nate Diller
2007-04-12T02:53:19Z

Replace ntfs_map_page() and ntfs_unmap_page() using the new read_kmap_page()
and put_kmapped_page() calls, and their locking variants, and remove
unneeded PageError checking.

Signed-off-by: Nate Diller <nate.diller@gmail.com>

---

diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/aops.h linux-2.6.21-rc5-mm4-test/fs/ntfs/aops.h
--- linux-2.6.21-rc5-mm4/fs/ntfs/aops.h 2007-04-05 17:14:25.000000000 -0700
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/aops.h 2007-04-06 01:59:19.000000000 -0700
@@ -31,73 +31,6 @@

#include "inode.h"

-/**
- * ntfs_unmap_page - release a page that was mapped using ntfs_map_page()
- * @page: the page to release
- *
- * Unpin, unmap and release a page that was obtained from ntfs_map_page().
- */
-static inline void ntfs_unmap_page(struct page *page)
-{
- kunmap(page);
- page_cache_release(page);
-}
-
-/**
- * ntfs_map_page - map a page into accessible memory, reading it if necessary
- * @mapping: address space for which to obtain the page
- * @index: index into the page cache for @mapping of the page to map
- *
- * Read a page from the page cache of the address space @mapping at position
- * @index, where @index is in units of PAGE_CACHE_SIZE, and not in bytes.
- *
- * If the page is not in memory it is loaded from disk first using the readpage
- * method defined in the address space operations of @mapping and the page is
- * added to the page cache of @mapping in the process.
- *
- * If the page belongs to an mst protected attribute and it is marked as such
- * in its ntfs inode (NInoMstProtected()) the mst fixups are applied but no
- * error checking is performed. This means the caller has to verify whether
- * the ntfs record(s) contained in the page are valid or not using one of the
- * ntfs_is_XXXX_record{,p}() macros, where XXXX is the record type you are
- * expecting to see. (For details of the macros, see fs/ntfs/layout.h.)
- *
- * If the page is in high memory it is mapped into memory directly addressible
- * by the kernel.
- *
- * Finally the page count is incremented, thus pinning the page into place.
- *
- * The above means that page_address(page) can be used on all pages obtained
- * with ntfs_map_page() to get the kernel virtual address of the page.
- *
- * When finished with the page, the caller has to call ntfs_unmap_page() to
- * unpin, unmap and release the page.
- *
- * Note this does not grant exclusive access. If such is desired, the caller
- * must provide it independently of the ntfs_{un}map_page() calls by using
- * a {rw_}semaphore or other means of serialization. A spin lock cannot be
- * used as ntfs_map_page() can block.
- *
- * The unlocked and uptodate page is returned on success or an encoded error
- * on failure. Caller has to test for error using the IS_ERR() macro on the
- * return value. If that evaluates to 'true', the negative error code can be
- * obtained using PTR_ERR() on the return value of ntfs_map_page().
- */
-static inline struct page *ntfs_map_page(struct address_space *mapping,
- unsigned long index)
-{
- struct page *page = read_mapping_page(mapping, index, NULL);
-
- if (!IS_ERR(page)) {
- kmap(page);
- if (!PageError(page))
- return page;
- ntfs_unmap_page(page);
- return ERR_PTR(-EIO);
- }
- return page;
-}
-
#ifdef NTFS_RW

extern void mark_ntfs_record_dirty(struct page *page, const unsigned int ofs);
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/bitmap.c linux-2.6.21-rc5-mm4-test/fs/ntfs/bitmap.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/bitmap.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/bitmap.c 2007-04-06 12:40:53.000000000 -0700
@@ -72,7 +72,7 @@ int __ntfs_bitmap_set_bits_in_run(struct

/* Get the page containing the first bit (@start_bit). */
mapping = vi->i_mapping;
- page = ntfs_map_page(mapping, index);
+ page = read_kmap_page(mapping, index);
if (IS_ERR(page)) {
if (!is_rollback)
ntfs_error(vi->i_sb, "Failed to map first page (error "
@@ -123,8 +123,8 @@ int __ntfs_bitmap_set_bits_in_run(struct
/* Update @index and get the next page. */
flush_dcache_page(page);
set_page_dirty(page);
- ntfs_unmap_page(page);
- page = ntfs_map_page(mapping, ++index);
+ put_kmapped_page(page);
+ page = read_kmap_page(mapping, ++index);
if (IS_ERR(page))
goto rollback;
kaddr = page_address(page);
@@ -159,7 +159,7 @@ done:
/* We are done. Unmap the page and return success. */
flush_dcache_page(page);
set_page_dirty(page);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
ntfs_debug("Done.");
return 0;
rollback:
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/dir.c linux-2.6.21-rc5-mm4-test/fs/ntfs/dir.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/dir.c 2007-04-05 17:14:25.000000000 -0700
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/dir.c 2007-04-06 12:40:53.000000000 -0700
@@ -317,7 +317,7 @@ descend_into_child_node:
* of PAGE_CACHE_SIZE and map the page cache page, reading it from
* disk if necessary.
*/
- page = ntfs_map_page(ia_mapping, vcn <<
+ page = __read_kmap_page(ia_mapping, vcn <<
dir_ni->itype.index.vcn_size_bits >> PAGE_CACHE_SHIFT);
if (IS_ERR(page)) {
ntfs_error(sb, "Failed to map directory index page, error %ld.",
@@ -325,7 +325,6 @@ descend_into_child_node:
err = PTR_ERR(page);
goto err_out;
}
- lock_page(page);
kaddr = (u8*)page_address(page);
fast_descend_into_child_node:
/* Get to the index allocation block. */
@@ -446,8 +445,7 @@ found_it2:
*res = NULL;
}
mref = le64_to_cpu(ie->data.dir.indexed_file);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
return mref;
}
/*
@@ -479,8 +477,7 @@ found_it2:
"this message to "
"linux-ntfs-dev@lists."
"sourceforge.net.");
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto dir_err_out;
}

@@ -562,8 +559,7 @@ found_it2:
vol->cluster_size_bits >>
PAGE_CACHE_SHIFT)
goto fast_descend_into_child_node;
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto descend_into_child_node;
}
ntfs_error(sb, "Negative child node vcn in directory inode "
@@ -576,15 +572,13 @@ found_it2:
* associated with it.
*/
if (name) {
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
return name->mref;
}
ntfs_debug("Entry not found.");
err = -ENOENT;
unm_err_out:
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
err_out:
if (!err)
err = -EIO;
@@ -795,7 +789,7 @@ descend_into_child_node:
* of PAGE_CACHE_SIZE and map the page cache page, reading it from
* disk if necessary.
*/
- page = ntfs_map_page(ia_mapping, vcn <<
+ page = __read_kmap_page(ia_mapping, vcn <<
dir_ni->itype.index.vcn_size_bits >> PAGE_CACHE_SHIFT);
if (IS_ERR(page)) {
ntfs_error(sb, "Failed to map directory index page, error %ld.",
@@ -803,7 +797,6 @@ descend_into_child_node:
err = PTR_ERR(page);
goto err_out;
}
- lock_page(page);
kaddr = (u8*)page_address(page);
fast_descend_into_child_node:
/* Get to the index allocation block. */
@@ -907,8 +900,7 @@ fast_descend_into_child_node:
vol->upcase, vol->upcase_len)) {
found_it2:
mref = le64_to_cpu(ie->data.dir.indexed_file);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
return mref;
}
/*
@@ -971,8 +963,7 @@ found_it2:
vol->cluster_size_bits >>
PAGE_CACHE_SHIFT)
goto fast_descend_into_child_node;
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto descend_into_child_node;
}
ntfs_error(sb, "Negative child node vcn in directory inode "
@@ -983,8 +974,7 @@ found_it2:
ntfs_debug("Entry not found.");
err = -ENOENT;
unm_err_out:
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
err_out:
if (!err)
err = -EIO;
@@ -1271,7 +1261,7 @@ get_next_bmp_page:
(unsigned long long)bmp_pos >> (3 + PAGE_CACHE_SHIFT),
(unsigned long long)bmp_pos &
(unsigned long long)((PAGE_CACHE_SIZE * 8) - 1));
- bmp_page = ntfs_map_page(bmp_mapping,
+ bmp_page = read_kmap_page(bmp_mapping,
bmp_pos >> (3 + PAGE_CACHE_SHIFT));
if (IS_ERR(bmp_page)) {
ntfs_error(sb, "Reading index bitmap failed.");
@@ -1289,7 +1279,7 @@ find_next_index_buffer:
* page, and put away the old one.
*/
if (unlikely((cur_bmp_pos >> 3) >= PAGE_CACHE_SIZE)) {
- ntfs_unmap_page(bmp_page);
+ put_kmapped_page(bmp_page);
bmp_pos += PAGE_CACHE_SIZE * 8;
cur_bmp_pos = 0;
goto get_next_bmp_page;
@@ -1306,22 +1296,20 @@ find_next_index_buffer:
if ((prev_ia_pos & (s64)PAGE_CACHE_MASK) !=
(ia_pos & (s64)PAGE_CACHE_MASK)) {
prev_ia_pos = ia_pos;
- if (likely(ia_page != NULL)) {
- unlock_page(ia_page);
- ntfs_unmap_page(ia_page);
- }
+ if (likely(ia_page != NULL))
+ put_locked_page(ia_page);
+
/*
* Map the page cache page containing the current ia_pos,
* reading it from disk if necessary.
*/
- ia_page = ntfs_map_page(ia_mapping, ia_pos >> PAGE_CACHE_SHIFT);
+ ia_page = __read_kmap_page(ia_mapping, ia_pos >> PAGE_CACHE_SHIFT);
if (IS_ERR(ia_page)) {
ntfs_error(sb, "Reading index allocation data failed.");
err = PTR_ERR(ia_page);
ia_page = NULL;
goto err_out;
}
- lock_page(ia_page);
kaddr = (u8*)page_address(ia_page);
}
/* Get the current index buffer. */
@@ -1422,19 +1410,18 @@ find_next_index_buffer:
filldir);
if (rc) {
/* @ia_page is already unlocked in this case. */
- ntfs_unmap_page(ia_page);
- ntfs_unmap_page(bmp_page);
+ put_kmapped_page(ia_page);
+ put_kmapped_page(bmp_page);
iput(bmp_vi);
goto abort;
}
}
goto find_next_index_buffer;
unm_EOD:
- if (ia_page) {
- unlock_page(ia_page);
- ntfs_unmap_page(ia_page);
- }
- ntfs_unmap_page(bmp_page);
+ if (ia_page)
+ put_locked_page(ia_page);
+
+ put_kmapped_page(bmp_page);
iput(bmp_vi);
EOD:
/* We are finished, set fpos to EOD. */
@@ -1453,14 +1440,12 @@ done:
return 0;
err_out:
if (bmp_page) {
- ntfs_unmap_page(bmp_page);
+ put_kmapped_page(bmp_page);
iput_err_out:
iput(bmp_vi);
}
- if (ia_page) {
- unlock_page(ia_page);
- ntfs_unmap_page(ia_page);
- }
+ if (ia_page)
+ put_locked_page(ia_page);
kfree(ir);
kfree(name);
if (ctx)
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/index.c linux-2.6.21-rc5-mm4-test/fs/ntfs/index.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/index.c 2007-04-05 17:13:11.000000000 -0700
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/index.c 2007-04-06 01:59:19.000000000 -0700
@@ -64,8 +64,7 @@ void ntfs_index_ctx_put(ntfs_index_conte
struct page *page = ictx->page;
if (page) {
BUG_ON(!PageLocked(page));
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
}
}
}
@@ -273,7 +272,7 @@ descend_into_child_node:
* of PAGE_CACHE_SIZE and map the page cache page, reading it from
* disk if necessary.
*/
- page = ntfs_map_page(ia_mapping, vcn <<
+ page = __read_kmap_page(ia_mapping, vcn <<
idx_ni->itype.index.vcn_size_bits >> PAGE_CACHE_SHIFT);
if (IS_ERR(page)) {
ntfs_error(sb, "Failed to map index page, error %ld.",
@@ -281,7 +280,6 @@ descend_into_child_node:
err = PTR_ERR(page);
goto err_out;
}
- lock_page(page);
kaddr = (u8*)page_address(page);
fast_descend_into_child_node:
/* Get to the index allocation block. */
@@ -429,15 +427,13 @@ ia_done:
vol->cluster_size_bits >>
PAGE_CACHE_SHIFT)
goto fast_descend_into_child_node;
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto descend_into_child_node;
}
ntfs_error(sb, "Negative child node vcn in inode 0x%lx.",
idx_ni->mft_no);
unm_err_out:
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
err_out:
if (!err)
err = -EIO;
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/lcnalloc.c linux-2.6.21-rc5-mm4-test/fs/ntfs/lcnalloc.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/lcnalloc.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/lcnalloc.c 2007-04-06 01:59:19.000000000 -0700
@@ -280,9 +280,9 @@ runlist_element *ntfs_cluster_alloc(ntfs
set_page_dirty(page);
need_writeback = 0;
}
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
}
- page = ntfs_map_page(mapping, last_read_pos >>
+ page = read_kmap_page(mapping, last_read_pos >>
PAGE_CACHE_SHIFT);
if (IS_ERR(page)) {
err = PTR_ERR(page);
@@ -748,7 +748,7 @@ out:
set_page_dirty(page);
need_writeback = 0;
}
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
}
if (likely(!err)) {
up_write(&vol->lcnbmp_lock);
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/logfile.c linux-2.6.21-rc5-mm4-test/fs/ntfs/logfile.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/logfile.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/logfile.c 2007-04-06 01:59:19.000000000 -0700
@@ -396,7 +396,7 @@ static int ntfs_check_and_load_restart_p
idx = (pos + size) >> PAGE_CACHE_SHIFT;
BUG_ON((pos + size) & ~PAGE_CACHE_MASK);
do {
- page = ntfs_map_page(vi->i_mapping, idx);
+ page = read_kmap_page(vi->i_mapping, idx);
if (IS_ERR(page)) {
ntfs_error(vi->i_sb, "Error mapping $LogFile "
"page (index %lu).", idx);
@@ -407,7 +407,7 @@ static int ntfs_check_and_load_restart_p
}
size = min_t(int, to_read, PAGE_CACHE_SIZE);
memcpy((u8*)trp + have_read, page_address(page), size);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
have_read += size;
to_read -= size;
idx++;
@@ -541,8 +541,8 @@ bool ntfs_check_logfile(struct inode *lo
pgoff_t idx = pos >> PAGE_CACHE_SHIFT;
if (!page || page->index != idx) {
if (page)
- ntfs_unmap_page(page);
- page = ntfs_map_page(mapping, idx);
+ put_kmapped_page(page);
+ page = read_kmap_page(mapping, idx);
if (IS_ERR(page)) {
ntfs_error(vol->sb, "Error mapping $LogFile "
"page (index %lu).", idx);
@@ -602,7 +602,7 @@ bool ntfs_check_logfile(struct inode *lo
* find a valid one further in the file.
*/
if (err != -EINVAL) {
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
goto err_out;
}
/* Continue looking. */
@@ -610,7 +610,7 @@ bool ntfs_check_logfile(struct inode *lo
pos = NTFS_BLOCK_SIZE >> 1;
}
if (page)
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
if (logfile_is_empty) {
NVolSetLogFileEmpty(vol);
is_empty:
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/mft.c linux-2.6.21-rc5-mm4-test/fs/ntfs/mft.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/mft.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/mft.c 2007-04-06 01:59:19.000000000 -0700
@@ -80,7 +80,7 @@ static inline MFT_RECORD *map_mft_record
}
}
/* Read, map, and pin the page. */
- page = ntfs_map_page(mft_vi->i_mapping, index);
+ page = read_kmap_page(mft_vi->i_mapping, index);
if (likely(!IS_ERR(page))) {
/* Catch multi sector transfer fixup errors. */
if (likely(ntfs_is_mft_recordp((le32*)(page_address(page) +
@@ -91,7 +91,7 @@ static inline MFT_RECORD *map_mft_record
}
ntfs_error(vol->sb, "Mft record 0x%lx is corrupt. "
"Run chkdsk.", ni->mft_no);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
page = ERR_PTR(-EIO);
NVolSetErrors(vol);
}
@@ -192,7 +192,7 @@ static inline void unmap_mft_record_page
BUG_ON(!ni->page);

// TODO: If dirty, blah...
- ntfs_unmap_page(ni->page);
+ put_kmapped_page(ni->page);
ni->page = NULL;
ni->page_ofs = 0;
return;
@@ -486,14 +486,13 @@ int ntfs_sync_mft_mirror(ntfs_volume *vo
goto err_out;
}
/* Get the page containing the mirror copy of the mft record @m. */
- page = ntfs_map_page(vol->mftmirr_ino->i_mapping, mft_no >>
+ page = __read_kmap_page(vol->mftmirr_ino->i_mapping, mft_no >>
(PAGE_CACHE_SHIFT - vol->mft_record_size_bits));
if (IS_ERR(page)) {
ntfs_error(vol->sb, "Failed to map mft mirror page.");
err = PTR_ERR(page);
goto err_out;
}
- lock_page(page);
BUG_ON(!PageUptodate(page));
ClearPageUptodate(page);
/* Offset of the mft mirror record inside the page. */
@@ -618,8 +617,7 @@ int ntfs_sync_mft_mirror(ntfs_volume *vo
post_write_mst_fixup((NTFS_RECORD*)kmirr);
flush_dcache_page(page);
SetPageUptodate(page);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
if (likely(!err)) {
ntfs_debug("Done.");
} else {
@@ -1189,7 +1187,7 @@ static int ntfs_mft_bitmap_find_and_allo
* for a zero bit.
*/
if (size) {
- page = ntfs_map_page(mftbmp_mapping,
+ page = read_kmap_page(mftbmp_mapping,
ofs >> PAGE_CACHE_SHIFT);
if (unlikely(IS_ERR(page))) {
ntfs_error(vol->sb, "Failed to read mft "
@@ -1211,13 +1209,13 @@ static int ntfs_mft_bitmap_find_and_allo
if (b < 8 && b >= (bit & 7)) {
ll = data_pos + (bit & ~7ull) + b;
if (unlikely(ll > (1ll << 32))) {
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
return -ENOSPC;
}
*byte |= 1 << b;
flush_dcache_page(page);
set_page_dirty(page);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
ntfs_debug("Done. (Found and "
"allocated mft record "
"0x%llx.)",
@@ -1229,7 +1227,7 @@ static int ntfs_mft_bitmap_find_and_allo
"data_pos 0x%llx, bit 0x%llx", size,
(long long)data_pos, (long long)bit);
data_pos += size;
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
/*
* If the end of the pass has not been reached yet,
* continue searching the mft bitmap for a zero bit.
@@ -1327,7 +1325,7 @@ static int ntfs_mft_bitmap_extend_alloca
* to us.
*/
ll = lcn >> 3;
- page = ntfs_map_page(vol->lcnbmp_ino->i_mapping,
+ page = read_kmap_page(vol->lcnbmp_ino->i_mapping,
ll >> PAGE_CACHE_SHIFT);
if (IS_ERR(page)) {
up_write(&mftbmp_ni->runlist.lock);
@@ -1343,7 +1341,7 @@ static int ntfs_mft_bitmap_extend_alloca
flush_dcache_page(page);
set_page_dirty(page);
up_write(&vol->lcnbmp_lock);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
/* Update the mft bitmap runlist. */
rl->length++;
rl[1].vcn++;
@@ -1351,7 +1349,7 @@ static int ntfs_mft_bitmap_extend_alloca
ntfs_debug("Appending one cluster to mft bitmap.");
} else {
up_write(&vol->lcnbmp_lock);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
/* Allocate a cluster from the DATA_ZONE. */
rl2 = ntfs_cluster_alloc(vol, rl[1].vcn, 1, lcn, DATA_ZONE,
true);
@@ -2117,13 +2115,12 @@ static int ntfs_mft_record_format(const
}
}
/* Read, map, and pin the page containing the mft record. */
- page = ntfs_map_page(mft_vi->i_mapping, index);
+ page = __read_kmap_page(mft_vi->i_mapping, index);
if (unlikely(IS_ERR(page))) {
ntfs_error(vol->sb, "Failed to map page containing mft record "
"to format 0x%llx.", (long long)mft_no);
return PTR_ERR(page);
}
- lock_page(page);
BUG_ON(!PageUptodate(page));
ClearPageUptodate(page);
m = (MFT_RECORD*)((u8*)page_address(page) + ofs);
@@ -2132,20 +2129,18 @@ static int ntfs_mft_record_format(const
ntfs_error(vol->sb, "Failed to layout mft record 0x%llx.",
(long long)mft_no);
SetPageUptodate(page);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
return err;
}
flush_dcache_page(page);
SetPageUptodate(page);
- unlock_page(page);
/*
* Make sure the mft record is written out to disk. We could use
* ilookup5() to check if an inode is in icache and so on but this is
* unnecessary as ntfs_writepage() will write the dirty record anyway.
*/
mark_ntfs_record_dirty(page, ofs);
- ntfs_unmap_page(page);
+ put_locked_page(page);
ntfs_debug("Done.");
return 0;
}
@@ -2518,14 +2513,13 @@ mft_rec_already_initialized:
index = bit << vol->mft_record_size_bits >> PAGE_CACHE_SHIFT;
ofs = (bit << vol->mft_record_size_bits) & ~PAGE_CACHE_MASK;
/* Read, map, and pin the page containing the mft record. */
- page = ntfs_map_page(vol->mft_ino->i_mapping, index);
+ page = __read_kmap_page(vol->mft_ino->i_mapping, index);
if (unlikely(IS_ERR(page))) {
ntfs_error(vol->sb, "Failed to map page containing allocated "
"mft record 0x%llx.", (long long)bit);
err = PTR_ERR(page);
goto undo_mftbmp_alloc;
}
- lock_page(page);
BUG_ON(!PageUptodate(page));
ClearPageUptodate(page);
m = (MFT_RECORD*)((u8*)page_address(page) + ofs);
@@ -2541,8 +2535,7 @@ mft_rec_already_initialized:
(long long)bit);
err = -EIO;
SetPageUptodate(page);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
NVolSetErrors(vol);
goto undo_mftbmp_alloc;
}
@@ -2560,8 +2553,7 @@ mft_rec_already_initialized:
ntfs_error(vol->sb, "Failed to layout allocated mft "
"record 0x%llx.", (long long)bit);
SetPageUptodate(page);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto undo_mftbmp_alloc;
}
if (seq_no)
@@ -2599,8 +2591,7 @@ mft_rec_already_initialized:
flush_dcache_page(page);
/* Make sure the mft record is written out to disk. */
mark_ntfs_record_dirty(page, ofs);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto undo_mftbmp_alloc;
}
/*
@@ -2611,12 +2602,11 @@ mft_rec_already_initialized:
* the mft record.
*/
mark_ntfs_record_dirty(page, ofs);
- unlock_page(page);
/*
* Need to unmap the page since map_extent_mft_record() mapped
* it as well so we have it mapped twice at the moment.
*/
- ntfs_unmap_page(page);
+ put_locked_page(page);
} else {
/*
* Allocate a new VFS inode and set it up. NOTE: @vi->i_nlink
@@ -2632,8 +2622,7 @@ mft_rec_already_initialized:
flush_dcache_page(page);
/* Make sure the mft record is written out to disk. */
mark_ntfs_record_dirty(page, ofs);
- unlock_page(page);
- ntfs_unmap_page(page);
+ put_locked_page(page);
goto undo_mftbmp_alloc;
}
vi->i_ino = bit;
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/super.c linux-2.6.21-rc5-mm4-test/fs/ntfs/super.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/super.c 2007-04-05 17:14:25.000000000 -0700
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/super.c 2007-04-06 12:40:53.000000000 -0700
@@ -1078,11 +1078,11 @@ static bool check_mft_mirror(ntfs_volume
/* Switch pages if necessary. */
if (!(i % mrecs_per_page)) {
if (index) {
- ntfs_unmap_page(mft_page);
- ntfs_unmap_page(mirr_page);
+ put_kmapped_page(mft_page);
+ put_kmapped_page(mirr_page);
}
/* Get the $MFT page. */
- mft_page = ntfs_map_page(vol->mft_ino->i_mapping,
+ mft_page = read_kmap_page(vol->mft_ino->i_mapping,
index);
if (IS_ERR(mft_page)) {
ntfs_error(sb, "Failed to read $MFT.");
@@ -1090,7 +1090,7 @@ static bool check_mft_mirror(ntfs_volume
}
kmft = page_address(mft_page);
/* Get the $MFTMirr page. */
- mirr_page = ntfs_map_page(vol->mftmirr_ino->i_mapping,
+ mirr_page = read_kmap_page(vol->mftmirr_ino->i_mapping,
index);
if (IS_ERR(mirr_page)) {
ntfs_error(sb, "Failed to read $MFTMirr.");
@@ -1107,9 +1107,9 @@ static bool check_mft_mirror(ntfs_volume
"transfer detected in mft "
"record %i.", i);
mm_unmap_out:
- ntfs_unmap_page(mirr_page);
+ put_kmapped_page(mirr_page);
mft_unmap_out:
- ntfs_unmap_page(mft_page);
+ put_kmapped_page(mft_page);
return false;
}
}
@@ -1143,8 +1143,8 @@ mft_unmap_out:
kmirr += vol->mft_record_size;
} while (++i < vol->mftmirr_size);
/* Release the last pages. */
- ntfs_unmap_page(mft_page);
- ntfs_unmap_page(mirr_page);
+ put_kmapped_page(mft_page);
+ put_kmapped_page(mirr_page);

/* Construct the mft mirror runlist by hand. */
rl2[0].vcn = 0;
@@ -1289,7 +1289,7 @@ static int check_windows_hibernation_sta
goto iput_out;
}
ni = NTFS_I(vi);
- page = ntfs_map_page(vi->i_mapping, 0);
+ page = read_kmap_page(vi->i_mapping, 0);
if (IS_ERR(page)) {
ntfs_error(vol->sb, "Failed to read from hiberfil.sys.");
ret = PTR_ERR(page);
@@ -1319,7 +1319,7 @@ static int check_windows_hibernation_sta
"volume.");
ret = 0;
unm_iput_out:
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
iput_out:
iput(vi);
return ret;
@@ -1509,7 +1509,7 @@ not_enabled:
return false;
}
/* Read the USN_HEADER from $DATA/$Max. */
- page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0);
+ page = read_kmap_page(vol->usnjrnl_max_ino->i_mapping, 0);
if (IS_ERR(page)) {
ntfs_error(vol->sb, "Failed to read from $UsnJrnl/$DATA/$Max "
"attribute.");
@@ -1523,7 +1523,7 @@ not_enabled:
"maximum size (0x%llx). $UsnJrnl is corrupt.",
(long long)sle64_to_cpu(uh->allocation_delta),
(long long)sle64_to_cpu(uh->maximum_size));
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
return false;
}
/*
@@ -1534,7 +1534,7 @@ not_enabled:
i_size_read(vol->usnjrnl_j_ino))) {
if (likely(sle64_to_cpu(uh->lowest_valid_usn) ==
i_size_read(vol->usnjrnl_j_ino))) {
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
ntfs_debug("$UsnJrnl is enabled but nothing has been "
"logged since it was last stamped. "
"Treating this as if the volume does "
@@ -1547,10 +1547,10 @@ not_enabled:
"is corrupt.",
(long long)sle64_to_cpu(uh->lowest_valid_usn),
i_size_read(vol->usnjrnl_j_ino));
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
return false;
}
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
ntfs_debug("Done.");
return true;
}
@@ -1592,12 +1592,12 @@ static bool load_and_init_attrdef(ntfs_v
while (index < max_index) {
/* Read the attrdef table and copy it into the linear buffer. */
read_partial_attrdef_page:
- page = ntfs_map_page(ino->i_mapping, index);
+ page = read_kmap_page(ino->i_mapping, index);
if (IS_ERR(page))
goto free_iput_failed;
memcpy((u8*)vol->attrdef + (index++ << PAGE_CACHE_SHIFT),
page_address(page), size);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
};
if (size == PAGE_CACHE_SIZE) {
size = i_size & ~PAGE_CACHE_MASK;
@@ -1661,12 +1661,12 @@ static bool load_and_init_upcase(ntfs_vo
while (index < max_index) {
/* Read the upcase table and copy it into the linear buffer. */
read_partial_upcase_page:
- page = ntfs_map_page(ino->i_mapping, index);
+ page = read_kmap_page(ino->i_mapping, index);
if (IS_ERR(page))
goto iput_upcase_failed;
memcpy((char*)vol->upcase + (index++ << PAGE_CACHE_SHIFT),
page_address(page), size);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
};
if (size == PAGE_CACHE_SIZE) {
size = i_size & ~PAGE_CACHE_MASK;
diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/ntfs/usnjrnl.c linux-2.6.21-rc5-mm4-test/fs/ntfs/usnjrnl.c
--- linux-2.6.21-rc5-mm4/fs/ntfs/usnjrnl.c 2006-11-29 13:57:37.000000000 -0800
+++ linux-2.6.21-rc5-mm4-test/fs/ntfs/usnjrnl.c 2007-04-06 01:59:19.000000000 -0700
@@ -52,7 +52,7 @@ bool ntfs_stamp_usnjrnl(ntfs_volume *vol
struct page *page;
USN_HEADER *uh;

- page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0);
+ page = read_kmap_page(vol->usnjrnl_max_ino->i_mapping, 0);
if (IS_ERR(page)) {
ntfs_error(vol->sb, "Failed to read from "
"$UsnJrnl/$DATA/$Max attribute.");
@@ -73,7 +73,7 @@ bool ntfs_stamp_usnjrnl(ntfs_volume *vol
uh->journal_id = stamp;
flush_dcache_page(page);
set_page_dirty(page);
- ntfs_unmap_page(page);
+ put_kmapped_page(page);
/* Set the flag so we do not have to do it again on remount. */
NVolSetUsnJrnlStamped(vol);
}