Replace reiserfs_get_page() and reiserfs_put_page() using the new read_kmap_page() and put_kmapped_page() calls and their locking variants. Also, propagate the gfp_mask() deadlock comment to callsites. Signed-off-by: Nate Diller <nate.diller@xxxxxxxxx> --- diff -urpN -X dontdiff linux-2.6.21-rc5-mm4/fs/reiserfs/xattr.c linux-2.6.21-rc5-mm4-test/fs/reiserfs/xattr.c --- linux-2.6.21-rc5-mm4/fs/reiserfs/xattr.c 2007-04-05 17:14:25.000000000 -0700 +++ linux-2.6.21-rc5-mm4-test/fs/reiserfs/xattr.c 2007-04-06 14:41:34.000000000 -0700 @@ -438,33 +438,6 @@ int xattr_readdir(struct file *file, fil return res; } -/* Internal operations on file data */ -static inline void reiserfs_put_page(struct page *page) -{ - kunmap(page); - page_cache_release(page); -} - -static struct page *reiserfs_get_page(struct inode *dir, unsigned long n) -{ - struct address_space *mapping = dir->i_mapping; - struct page *page; - /* We can deadlock if we try to free dentries, - and an unlink/rmdir has just occured - GFP_NOFS avoids this */ - mapping_set_gfp_mask(mapping, GFP_NOFS); - page = read_mapping_page(mapping, n, NULL); - if (!IS_ERR(page)) { - kmap(page); - if (PageError(page)) - goto fail; - } - return page; - - fail: - reiserfs_put_page(page); - return ERR_PTR(-EIO); -} - static inline __u32 xattr_hash(const char *msg, int len) { return csum_partial(msg, len, 0); @@ -537,13 +510,15 @@ reiserfs_xattr_set(struct inode *inode, else chunk = buffer_size - buffer_pos; - page = reiserfs_get_page(xinode, file_pos >> PAGE_CACHE_SHIFT); + /* We can deadlock if we try to free dentries, + and an unlink/rmdir has just occured - GFP_NOFS avoids this */ + mapping_set_gfp_mask(mapping, GFP_NOFS); + page = __read_kmap_page(mapping, file_pos >> PAGE_CACHE_SHIFT); if (IS_ERR(page)) { err = PTR_ERR(page); goto out_filp; } - lock_page(page); data = page_address(page); if (file_pos == 0) { @@ -566,8 +541,7 @@ reiserfs_xattr_set(struct inode *inode, page_offset + chunk + skip); } - unlock_page(page); - reiserfs_put_page(page); + put_locked_page(page); buffer_pos += chunk; file_pos += chunk; skip = 0; @@ -646,13 +620,15 @@ reiserfs_xattr_get(const struct inode *i else chunk = isize - file_pos; - page = reiserfs_get_page(xinode, file_pos >> PAGE_CACHE_SHIFT); + /* We can deadlock if we try to free dentries, + and an unlink/rmdir has just occured - GFP_NOFS avoids this */ + mapping_set_gfp_mask(xinode->i_mapping, GFP_NOFS); + page = __read_kmap_page(xinode->i_mapping, file_pos >> PAGE_CACHE_SHIFT); if (IS_ERR(page)) { err = PTR_ERR(page); goto out_dput; } - lock_page(page); data = page_address(page); if (file_pos == 0) { struct reiserfs_xattr_header *rxh = @@ -661,8 +637,7 @@ reiserfs_xattr_get(const struct inode *i chunk -= skip; /* Magic doesn't match up.. */ if (rxh->h_magic != cpu_to_le32(REISERFS_XATTR_MAGIC)) { - unlock_page(page); - reiserfs_put_page(page); + put_locked_page(page); reiserfs_warning(inode->i_sb, "Invalid magic for xattr (%s) " "associated with %k", name, @@ -673,8 +648,7 @@ reiserfs_xattr_get(const struct inode *i hash = le32_to_cpu(rxh->h_hash); } memcpy(buffer + buffer_pos, data + skip, chunk); - unlock_page(page); - reiserfs_put_page(page); + put_locked_page(page); file_pos += chunk; buffer_pos += chunk; skip = 0; - To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html