Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2: nilfs2: fix whitespace coding style issues nilfs2: fix oops due to a bad aops initialization nilfs2: fix data loss in mmap page write for hole blocks
This commit is contained in:
@@ -72,10 +72,9 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
/*
|
/*
|
||||||
* check to see if the page is mapped already (no holes)
|
* check to see if the page is mapped already (no holes)
|
||||||
*/
|
*/
|
||||||
if (PageMappedToDisk(page)) {
|
if (PageMappedToDisk(page))
|
||||||
unlock_page(page);
|
|
||||||
goto mapped;
|
goto mapped;
|
||||||
}
|
|
||||||
if (page_has_buffers(page)) {
|
if (page_has_buffers(page)) {
|
||||||
struct buffer_head *bh, *head;
|
struct buffer_head *bh, *head;
|
||||||
int fully_mapped = 1;
|
int fully_mapped = 1;
|
||||||
@@ -90,7 +89,6 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
|
|
||||||
if (fully_mapped) {
|
if (fully_mapped) {
|
||||||
SetPageMappedToDisk(page);
|
SetPageMappedToDisk(page);
|
||||||
unlock_page(page);
|
|
||||||
goto mapped;
|
goto mapped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,16 +103,17 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
return VM_FAULT_SIGBUS;
|
return VM_FAULT_SIGBUS;
|
||||||
|
|
||||||
ret = block_page_mkwrite(vma, vmf, nilfs_get_block);
|
ret = block_page_mkwrite(vma, vmf, nilfs_get_block);
|
||||||
if (unlikely(ret)) {
|
if (ret != VM_FAULT_LOCKED) {
|
||||||
nilfs_transaction_abort(inode->i_sb);
|
nilfs_transaction_abort(inode->i_sb);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits));
|
||||||
nilfs_transaction_commit(inode->i_sb);
|
nilfs_transaction_commit(inode->i_sb);
|
||||||
|
|
||||||
mapped:
|
mapped:
|
||||||
SetPageChecked(page);
|
SetPageChecked(page);
|
||||||
wait_on_page_writeback(page);
|
wait_on_page_writeback(page);
|
||||||
return 0;
|
return VM_FAULT_LOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct vm_operations_struct nilfs_file_vm_ops = {
|
static const struct vm_operations_struct nilfs_file_vm_ops = {
|
||||||
|
@@ -114,19 +114,19 @@ enum {
|
|||||||
* Macros to check inode numbers
|
* Macros to check inode numbers
|
||||||
*/
|
*/
|
||||||
#define NILFS_MDT_INO_BITS \
|
#define NILFS_MDT_INO_BITS \
|
||||||
((unsigned int)(1 << NILFS_DAT_INO | 1 << NILFS_CPFILE_INO | \
|
((unsigned int)(1 << NILFS_DAT_INO | 1 << NILFS_CPFILE_INO | \
|
||||||
1 << NILFS_SUFILE_INO | 1 << NILFS_IFILE_INO | \
|
1 << NILFS_SUFILE_INO | 1 << NILFS_IFILE_INO | \
|
||||||
1 << NILFS_ATIME_INO | 1 << NILFS_SKETCH_INO))
|
1 << NILFS_ATIME_INO | 1 << NILFS_SKETCH_INO))
|
||||||
|
|
||||||
#define NILFS_SYS_INO_BITS \
|
#define NILFS_SYS_INO_BITS \
|
||||||
((unsigned int)(1 << NILFS_ROOT_INO) | NILFS_MDT_INO_BITS)
|
((unsigned int)(1 << NILFS_ROOT_INO) | NILFS_MDT_INO_BITS)
|
||||||
|
|
||||||
#define NILFS_FIRST_INO(sb) (((struct the_nilfs *)sb->s_fs_info)->ns_first_ino)
|
#define NILFS_FIRST_INO(sb) (((struct the_nilfs *)sb->s_fs_info)->ns_first_ino)
|
||||||
|
|
||||||
#define NILFS_MDT_INODE(sb, ino) \
|
#define NILFS_MDT_INODE(sb, ino) \
|
||||||
((ino) < NILFS_FIRST_INO(sb) && (NILFS_MDT_INO_BITS & (1 << (ino))))
|
((ino) < NILFS_FIRST_INO(sb) && (NILFS_MDT_INO_BITS & (1 << (ino))))
|
||||||
#define NILFS_VALID_INODE(sb, ino) \
|
#define NILFS_VALID_INODE(sb, ino) \
|
||||||
((ino) >= NILFS_FIRST_INO(sb) || (NILFS_SYS_INO_BITS & (1 << (ino))))
|
((ino) >= NILFS_FIRST_INO(sb) || (NILFS_SYS_INO_BITS & (1 << (ino))))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct nilfs_transaction_info: context information for synchronization
|
* struct nilfs_transaction_info: context information for synchronization
|
||||||
@@ -285,7 +285,7 @@ extern void nilfs_destroy_inode(struct inode *);
|
|||||||
extern void nilfs_error(struct super_block *, const char *, const char *, ...)
|
extern void nilfs_error(struct super_block *, const char *, const char *, ...)
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute__ ((format (printf, 3, 4)));
|
||||||
extern void nilfs_warning(struct super_block *, const char *, const char *, ...)
|
extern void nilfs_warning(struct super_block *, const char *, const char *, ...)
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute__ ((format (printf, 3, 4)));
|
||||||
extern struct nilfs_super_block *
|
extern struct nilfs_super_block *
|
||||||
nilfs_read_super_block(struct super_block *, u64, int, struct buffer_head **);
|
nilfs_read_super_block(struct super_block *, u64, int, struct buffer_head **);
|
||||||
extern int nilfs_store_magic_and_option(struct super_block *,
|
extern int nilfs_store_magic_and_option(struct super_block *,
|
||||||
|
@@ -495,12 +495,14 @@ unsigned nilfs_page_count_clean_buffers(struct page *page,
|
|||||||
void nilfs_mapping_init(struct address_space *mapping,
|
void nilfs_mapping_init(struct address_space *mapping,
|
||||||
struct backing_dev_info *bdi)
|
struct backing_dev_info *bdi)
|
||||||
{
|
{
|
||||||
|
static const struct address_space_operations empty_aops;
|
||||||
|
|
||||||
mapping->host = NULL;
|
mapping->host = NULL;
|
||||||
mapping->flags = 0;
|
mapping->flags = 0;
|
||||||
mapping_set_gfp_mask(mapping, GFP_NOFS);
|
mapping_set_gfp_mask(mapping, GFP_NOFS);
|
||||||
mapping->assoc_mapping = NULL;
|
mapping->assoc_mapping = NULL;
|
||||||
mapping->backing_dev_info = bdi;
|
mapping->backing_dev_info = bdi;
|
||||||
mapping->a_ops = NULL;
|
mapping->a_ops = &empty_aops;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user