From: "Aneesh Kumar K.V" Subject: [PATCH] ext3: Use page_mkwrite vma_operations to get mmap write notification. Date: Mon, 24 Mar 2008 22:34:56 +0530 Message-ID: <1206378298-10341-2-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1206378298-10341-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Cc: linux-ext4@vger.kernel.org, "Aneesh Kumar K.V" To: cmm@us.ibm.com, akpm@linux-foundation.org Return-path: Received: from E23SMTP01.au.ibm.com ([202.81.18.162]:60644 "EHLO e23smtp01.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752437AbYCXRFK (ORCPT ); Mon, 24 Mar 2008 13:05:10 -0400 Received: from sd0109e.au.ibm.com (d23rh905.au.ibm.com [202.81.18.225]) by e23smtp01.au.ibm.com (8.13.1/8.13.1) with ESMTP id m2OH5vDk014270 for ; Tue, 25 Mar 2008 04:05:57 +1100 Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by sd0109e.au.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m2OH8pTW267870 for ; Tue, 25 Mar 2008 04:08:51 +1100 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m2OH549R001990 for ; Tue, 25 Mar 2008 04:05:04 +1100 In-Reply-To: <1206378298-10341-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: We would like to get notified when we are doing a write on mmap section. The changes are needed to handle ENOSPC when writing to an mmap section of files with holes. Signed-off-by: Aneesh Kumar K.V --- fs/ext3/file.c | 19 ++++++++++++++++++- fs/ext3/inode.c | 5 +++++ include/linux/ext3_fs.h | 1 + 3 files changed, 24 insertions(+), 1 deletions(-) diff --git a/fs/ext3/file.c b/fs/ext3/file.c index acc4913..09e22e4 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c @@ -106,6 +106,23 @@ force_commit: return ret; } +static struct vm_operations_struct ext3_file_vm_ops = { + .fault = filemap_fault, + .page_mkwrite = ext3_page_mkwrite, +}; + +static int ext3_file_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct address_space *mapping = file->f_mapping; + + if (!mapping->a_ops->readpage) + return -ENOEXEC; + file_accessed(file); + vma->vm_ops = &ext3_file_vm_ops; + vma->vm_flags |= VM_CAN_NONLINEAR; + return 0; +} + const struct file_operations ext3_file_operations = { .llseek = generic_file_llseek, .read = do_sync_read, @@ -116,7 +133,7 @@ const struct file_operations ext3_file_operations = { #ifdef CONFIG_COMPAT .compat_ioctl = ext3_compat_ioctl, #endif - .mmap = generic_file_mmap, + .mmap = ext3_file_mmap, .open = generic_file_open, .release = ext3_release_file, .fsync = ext3_sync_file, diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index eb95670..2293506 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -3306,3 +3306,8 @@ int ext3_change_inode_journal_flag(struct inode *inode, int val) return err; } + +int ext3_page_mkwrite(struct vm_area_struct *vma, struct page *page) +{ + return block_page_mkwrite(vma, page, ext3_get_block); +} diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 36c5403..715c35e 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h @@ -836,6 +836,7 @@ extern void ext3_truncate (struct inode *); extern void ext3_set_inode_flags(struct inode *); extern void ext3_get_inode_flags(struct ext3_inode_info *); extern void ext3_set_aops(struct inode *inode); +extern int ext3_page_mkwrite(struct vm_area_struct *vma, struct page *page); /* ioctl.c */ extern int ext3_ioctl (struct inode *, struct file *, unsigned int, -- 1.5.5.rc0.16.g02b00.dirty