summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorVladimir Saveliev <vs@namesys.com>2007-02-03 02:38:47 +0100
committerAdrian Bunk <bunk@stusta.de>2007-02-03 02:38:47 +0100
commit4f3f184b37afd4683a828217234efb0a296eff88 (patch)
tree065209558ea51a3e92dd3cbaa6d92e1ed5fceef9 /include
parent1bd73c60d5d9c9d80ebdad644b79f8a96e5d825f (diff)
downloadlinux-stable-4f3f184b37afd4683a828217234efb0a296eff88.tar.gz
linux-stable-4f3f184b37afd4683a828217234efb0a296eff88.tar.bz2
linux-stable-4f3f184b37afd4683a828217234efb0a296eff88.zip
reiserfs: avoid tail packing if an inode was ever mmapped
This patch fixes a confusion reiserfs has for a long time. On release file operation reiserfs used to try to pack file data stored in last incomplete page of some files into metadata blocks. After packing the page got cleared with clear_page_dirty. It did not take into account that the page may be mmaped into other process's address space. Recent replacement for clear_page_dirty cancel_dirty_page found the confusion with sanity check that page has to be not mapped. The patch fixes the confusion by making reiserfs avoid tail packing if an inode was ever mmapped. reiserfs_mmap and reiserfs_file_release are serialized with mutex in reiserfs specific inode. reiserfs_mmap locks the mutex and sets a bit in reiserfs specific inode flags. reiserfs_file_release checks the bit having the mutex locked. If bit is set - tail packing is avoided. This eliminates a possibility that mmapped page gets cancel_page_dirty-ed. Signed-off-by: Vladimir Saveliev <vs@namesys.com> Signed-off-by: Adrian Bunk <bunk@stusta.de>
Diffstat (limited to 'include')
-rw-r--r--include/linux/reiserfs_fs_i.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/reiserfs_fs_i.h b/include/linux/reiserfs_fs_i.h
index 149be8d9a0c9..547bbf3a1190 100644
--- a/include/linux/reiserfs_fs_i.h
+++ b/include/linux/reiserfs_fs_i.h
@@ -25,6 +25,7 @@ typedef enum {
i_link_saved_truncate_mask = 0x0020,
i_has_xattr_dir = 0x0040,
i_data_log = 0x0080,
+ i_ever_mapped = 0x0100
} reiserfs_inode_flags;
struct reiserfs_inode_info {
@@ -52,6 +53,7 @@ struct reiserfs_inode_info {
** flushed */
unsigned long i_trans_id;
struct reiserfs_journal_list *i_jl;
+ struct mutex i_mmap;
struct posix_acl *i_acl_access;
struct posix_acl *i_acl_default;