From patchwork Sat Apr 6 10:05:52 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marco X-Patchwork-Id: 2836839 Return-Path: X-Original-To: patchwork-ocfs2-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id BF6859FA17 for ; Thu, 1 Aug 2013 07:28:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A8A8220273 for ; Thu, 1 Aug 2013 07:28:22 +0000 (UTC) Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 89607202A7 for ; Thu, 1 Aug 2013 07:28:20 +0000 (UTC) Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r717S1oi001658 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 1 Aug 2013 07:28:02 GMT Received: from oss.oracle.com (oss-external.oracle.com [137.254.96.51]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r717S0qv003655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 1 Aug 2013 07:28:00 GMT Received: from localhost ([127.0.0.1] helo=oss.oracle.com) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1V4nIm-0005dn-1K; Thu, 01 Aug 2013 00:28:00 -0700 Received: from ucsinet21.oracle.com ([156.151.31.93]) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1UOQ7P-0006Qy-Qp for ocfs2-devel@oss.oracle.com; Sat, 06 Apr 2013 03:13:09 -0700 Received: from userp1030.oracle.com (userp1030.oracle.com [156.151.31.80]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r36AD5RT028192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 6 Apr 2013 10:13:05 GMT Received: from mail-ee0-f52.google.com (mail-ee0-f52.google.com [74.125.83.52]) by userp1030.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r36AD3hf010283 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Sat, 6 Apr 2013 10:13:04 GMT Received: by mail-ee0-f52.google.com with SMTP id d17so1620516eek.11 for ; Sat, 06 Apr 2013 03:13:02 -0700 (PDT) X-Received: by 10.14.175.71 with SMTP id y47mr28079615eel.18.1365243182757; Sat, 06 Apr 2013 03:13:02 -0700 (PDT) Received: from [80.183.108.112] (host112-108-dynamic.183-80-r.retail.telecomitalia.it. [80.183.108.112]) by mx.google.com with ESMTPS id m46sm20061220eeo.16.2013.04.06.03.12.56 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 06 Apr 2013 03:13:02 -0700 (PDT) Message-ID: <515FF380.5020406@gmail.com> Date: Sat, 06 Apr 2013 12:05:52 +0200 From: Marco Stornelli User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: linux-fsdevel@vger.kernel.org X-Flow-Control-Info: class=Pass-to-MM reputation=ipRisk-All ip=74.125.83.52 ct-class=R6 ct-vol1=0 ct-vol2=0 ct-vol3=0 ct-risk=68 ct-spam1=0 ct-spam2=0 ct-bulk=0 rcpts=1 size=5790 X-Sendmail-CM-Score: 0.00% X-Sendmail-CM-Analysis: v=2.0 cv=KsBkKBqN c=1 sm=1 a=5GFLTAULrCfpE7gGIRtdUg==:17 a=jeJY-ZdqjKYA:10 a=0ABEhHX71d8A:10 a=nDghuxUhq_wA:10 a=Q9fys5e9bTEA:10 a=pGLkceISAAAA:8 a=zWTIGvFph8kA:10 a=TTamU51fNvMs17NKPToA:9 a=PUjeQqilurYA:10 a=MSl-tDqOz04A:10 a=Y9eKm/tynC cYH7EwTx1kBw==:117 X-Sendmail-CT-Classification: not spam X-Sendmail-CT-RefID: str=0001.0A090202.515FF531.001B, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-Mailman-Approved-At: Thu, 01 Aug 2013 00:27:57 -0700 Cc: Chris Mason , Jan Kara , Mike Snitzer , linux-mm@kvack.org, Andreas Dilger , KONISHI Ryusuke , Alasdair G Kergon , linux-nilfs@vger.kernel.org, cluster-devel@redhat.com, linux-ext4@vger.kernel.org, Matthew Wilcox , Mark Fasheh , Alexander Viro , Jaegeuk Kim , Steven Whitehouse , "Theodore Ts'o" , Marco Stornelli , linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-btrfs@vger.kernel.org, ocfs2-devel@oss.oracle.com Subject: [Ocfs2-devel] [PATCH 3/4] fsfreeze: manage kill signal when sb_start_pagefault is called X-BeenThere: ocfs2-devel@oss.oracle.com X-Mailman-Version: 2.1.9 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: ocfs2-devel-bounces@oss.oracle.com Errors-To: ocfs2-devel-bounces@oss.oracle.com X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,KHOP_BIG_TO_CC,RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In every place where sb_start_pagefault was called now we must manage the error code and return VM_FAULT_RETRY. Signed-off-by: Marco Stornelli --- fs/btrfs/inode.c | 4 +++- fs/buffer.c | 4 +++- fs/ext4/inode.c | 4 +++- fs/f2fs/file.c | 4 +++- fs/gfs2/file.c | 4 +++- fs/nilfs2/file.c | 4 +++- fs/ocfs2/mmap.c | 4 +++- include/linux/fs.h | 6 ++++-- mm/filemap.c | 7 +++++-- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 09c58a3..a6166f4 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -7559,7 +7559,9 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) u64 page_start; u64 page_end; - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); if (!ret) { ret = file_update_time(vma->vm_file); diff --git a/fs/buffer.c b/fs/buffer.c index b4dcb34..6d3d2cc 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2383,7 +2383,9 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, int ret; struct super_block *sb = file_inode(vma->vm_file)->i_sb; - sb_start_pagefault(sb); + ret = sb_start_pagefault(sb); + if (ret) + return VM_FAULT_RETRY; /* * Update file times before taking page lock. We may end up failing the diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index b3a5213..efc47f6 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5023,7 +5023,9 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) get_block_t *get_block; int retries = 0; - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; file_update_time(vma->vm_file); /* Delalloc case is easy... */ if (test_opt(inode->i_sb, DELALLOC) && diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 958a46d..cce4147 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -37,7 +37,9 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, f2fs_balance_fs(sbi); - sb_start_pagefault(inode->i_sb); + err = sb_start_pagefault(inode->i_sb); + if (err) + return VM_FAULT_RETRY; mutex_lock_op(sbi, DATA_NEW); diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index d79c2da..071e777 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -396,7 +396,9 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) loff_t size; int ret; - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; /* Update file times before taking page lock */ file_update_time(vma->vm_file); diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index 08fdb77..1c7678a 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c @@ -74,7 +74,9 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info))) return VM_FAULT_SIGBUS; /* -ENOSPC */ - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; lock_page(page); if (page->mapping != inode->i_mapping || page_offset(page) >= i_size_read(inode) || !PageUptodate(page)) { diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 10d66c7..f0973ae 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -136,7 +136,9 @@ static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) sigset_t oldset; int ret; - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; ocfs2_block_signals(&oldset); /* diff --git a/include/linux/fs.h b/include/linux/fs.h index 03921d6..550574e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1407,6 +1407,8 @@ static inline int sb_start_write_trylock(struct super_block *sb) * sb_start_pagefault - get write access to a superblock from a page fault * @sb: the super we write to * + * It returns zero when no error occured, the error code otherwise. + * * When a process starts handling write page fault, it should embed the * operation into sb_start_pagefault() - sb_end_pagefault() pair to get * exclusion against file system freezing. This is needed since the page fault @@ -1422,9 +1424,9 @@ static inline int sb_start_write_trylock(struct super_block *sb) * mmap_sem * -> sb_start_pagefault */ -static inline void sb_start_pagefault(struct super_block *sb) +static inline int sb_start_pagefault(struct super_block *sb) { - __sb_start_write_wait(sb, SB_FREEZE_PAGEFAULT, false); + __sb_start_write_wait(sb, SB_FREEZE_PAGEFAULT, true); } /* diff --git a/mm/filemap.c b/mm/filemap.c index b238671..acf8d97 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1712,9 +1712,11 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) { struct page *page = vmf->page; struct inode *inode = file_inode(vma->vm_file); - int ret = VM_FAULT_LOCKED; + int ret = 0; - sb_start_pagefault(inode->i_sb); + ret = sb_start_pagefault(inode->i_sb); + if (ret) + return VM_FAULT_RETRY; file_update_time(vma->vm_file); lock_page(page); if (page->mapping != inode->i_mapping) { @@ -1727,6 +1729,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) * progress, we are guaranteed that writeback during freezing will * see the dirty page and writeprotect it again. */ + ret = VM_FAULT_LOCKED; set_page_dirty(page); wait_for_stable_page(page); out: