From patchwork Wed Apr 29 10:02:48 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 26609 Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id DAC4AB7063 for ; Wed, 29 Apr 2009 20:03:04 +1000 (EST) Received: by ozlabs.org (Postfix) id C2C01DDF1E; Wed, 29 Apr 2009 20:03:04 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 5251ADDF1C for ; Wed, 29 Apr 2009 20:03:04 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753751AbZD2KCy (ORCPT ); Wed, 29 Apr 2009 06:02:54 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753600AbZD2KCy (ORCPT ); Wed, 29 Apr 2009 06:02:54 -0400 Received: from cantor2.suse.de ([195.135.220.15]:42080 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752680AbZD2KCw (ORCPT ); Wed, 29 Apr 2009 06:02:52 -0400 Received: from Relay2.suse.de (relay-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 87D448980B; Wed, 29 Apr 2009 12:02:51 +0200 (CEST) Received: by duck.suse.cz (Postfix, from userid 10005) id EBA93251A91; Wed, 29 Apr 2009 12:02:50 +0200 (CEST) From: Jan Kara To: linux-ext4@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, npiggin@suse.de, Jan Kara Subject: [PATCH 2/4] ext2: Allocate space for mmaped file on page fault Date: Wed, 29 Apr 2009 12:02:48 +0200 Message-Id: <1240999370-27502-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1240999370-27502-1-git-send-email-jack@suse.cz> References: <1240999370-27502-1-git-send-email-jack@suse.cz> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org So far we've allocated space at ->writepage() time. This has the disadvantage that when we hit ENOSPC or other error, we cannot do much - either throw away the data or keep the page indefinitely (and loose the data on reboot). So allocate space already when a page is faulted in. Signed-off-by: Jan Kara --- fs/ext2/file.c | 26 +++++++++++++++++++++++++- fs/ext2/inode.c | 1 + 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 45ed071..74b2c3d 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -19,6 +19,8 @@ */ #include +#include +#include #include "ext2.h" #include "xattr.h" #include "acl.h" @@ -38,6 +40,28 @@ static int ext2_release_file (struct inode * inode, struct file * filp) return 0; } +static int ext2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) +{ + return block_page_mkwrite(vma, vmf, ext2_get_block); +} + +static struct vm_operations_struct ext2_file_vm_ops = { + .fault = filemap_fault, + .page_mkwrite = ext2_page_mkwrite, +}; + +static int ext2_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 = &ext2_file_vm_ops; + vma->vm_flags |= VM_CAN_NONLINEAR; + return 0; +} + /* * We have mostly NULL's here: the current defaults are ok for * the ext2 filesystem. @@ -52,7 +76,7 @@ const struct file_operations ext2_file_operations = { #ifdef CONFIG_COMPAT .compat_ioctl = ext2_compat_ioctl, #endif - .mmap = generic_file_mmap, + .mmap = ext2_file_mmap, .open = generic_file_open, .release = ext2_release_file, .fsync = ext2_sync_file, diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index acf6788..8217219 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -816,6 +816,7 @@ const struct address_space_operations ext2_aops = { .sync_page = block_sync_page, .write_begin = ext2_write_begin, .write_end = generic_write_end, + .extend_i_size = block_extend_i_size, .bmap = ext2_bmap, .direct_IO = ext2_direct_IO, .writepages = ext2_writepages,