From patchwork Mon Sep 5 01:22:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wang Guang X-Patchwork-Id: 665591 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sSBmc6dFLz9svs for ; Mon, 5 Sep 2016 11:22:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754625AbcIEBWh (ORCPT ); Sun, 4 Sep 2016 21:22:37 -0400 Received: from mx5.zte.com.cn ([63.217.80.70]:50360 "EHLO mx5.zte.com.cn" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754150AbcIEBWg (ORCPT ); Sun, 4 Sep 2016 21:22:36 -0400 Received: from mse01.zte.com.cn (unknown [10.30.3.20]) by Websense Email Security Gateway with ESMTP id C0728CFCAB76B; Mon, 5 Sep 2016 09:22:31 +0800 (CST) Received: from notes_smtp.zte.com.cn ([10.30.1.239]) by mse01.zte.com.cn with ESMTP id u851Lbf1047632; Mon, 5 Sep 2016 09:21:37 +0800 (GMT-8) (envelope-from wang.guang55@zte.com.cn) To: tytso@mit.edu Cc: linux-ext4@vger.kernel.org MIME-Version: 1.0 Subject: bugfix for mmaped pages in mpage_release_unused_pages() X-KeepSent: 437C2FCD:10711776-48258025:00052949; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.3 September 15, 2011 Message-ID: From: wang.guang55@zte.com.cn Date: Mon, 5 Sep 2016 09:22:20 +0800 X-MIMETrack: Serialize by Router on notes_smtp/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2016-09-05 09:21:26, Serialize complete at 2016-09-05 09:21:26 X-MAIL: mse01.zte.com.cn u851Lbf1047632 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org [PATCH]ext4: bugfix for mmaped pages in mpage_release_unused_pages() ext4: bugfix for mmaped pages in mpage_release_unused_pages() Pages clear buffers after ext4 delayed block allocation failed, However, it does not clean its pte_dirty flag. if the pages unmap ,in cording to the pte_dirty , unmap_page_range may try to call __set_page_dirty, which may lead to the bugon at mpage_prepare_extent_to_map:head = page_buffers(page);. This patch just call clear_page_dirty_for_io to clean pte_dirty at mpage_release_unused_pages for pages mmaped. Steps to reproduce the bug: (1) mmap a file in ext4 addr = (char *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); memset(addr, 'i', 4096); (2) return EIO at ext4_writepages->mpage_map_and_submit_extent->mpage_map_one_extent Cause the log: ext4_msg(sb, KERN_CRIT, "Delayed block allocation failed for " "inode %lu at logical offset %llu with" " max blocks %u with error %d", inode->i_ino, (unsigned long long)map->m_lblk, (unsigned)map->m_len, -err); (3)Unmap the addr cause warning at __set_page_dirty:WARN_ON_ONCE(warn && !PageUptodate(page)); (4) wait for a minute,then bugon happen. From 3eab887a55424fc2c27553b7bfe32330df83f7b8 From: wangguang Date: Mon, 29 Aug 2016 14:54:58 -0700 Subject: [PATCH] bugfix for mmaped pages in mpage_release_unused_pages() Signed-off-by: wangguang 王广 Operation System Production Dept . 操作系统产品部 创新*突破*集约化 Add:成都市高新区天府大道中段800号中兴通讯大厦xxx室 Tel:13678197402 --- old/fs/ext4/inode.c 2016-08-29 12:15:25.150764447 -0400 +++ new/fs/ext4/inode.c 2016-08-29 13:01:58.683559198 -0400 @@ -1649,6 +1649,8 @@ static void mpage_release_unused_pages(s BUG_ON(!PageLocked(page)); BUG_ON(PageWriteback(page)); if (invalidate) { + if (page_mapped(page)) + clear_page_dirty_for_io(page); block_invalidatepage(page, 0, PAGE_SIZE); ClearPageUptodate(page); }