Received: by 10.213.65.68 with SMTP id h4csp302060imn; Fri, 30 Mar 2018 21:18:04 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+u3LKVMY5qmOaPV3rUk/mloC4siy9NrGNwIgDLRwgu9Gma+Hjv5R+bUsjjkxSXiY2HsItk X-Received: by 2002:a17:902:a501:: with SMTP id s1-v6mr1647857plq.201.1522469884521; Fri, 30 Mar 2018 21:18:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522469884; cv=none; d=google.com; s=arc-20160816; b=ITihkXfnhUIg/OsshdsFkBh1Pyi9LBlSQNpPz4DFUDxQinnLZQQs7fvprrnhtmK/ht BPTxeRyjL8rbTZhMTgRCdH4pJ350kDUwgHR+MIC+Rsx07UvT9NnlLR/W9oknnaza2sZ5 awpvvPvdD93e4M6GuTrAHggTIZXsf7zVj0OI6GaSMMtoFbsdWje3K+yswm2m064xfSkI JlOW2iWf3xZzwazHBXUp8LNl+rv1qm1W9LXZLuwo8gkni0fReb/czjZ9DAYdqhhTCK3m xAZZyywKhcOnGIXQEWLW/e2pCAufq0CQDE6AeD/K/BusNKNA6NGyyoFxwNmDKqwNVjcm vWPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject:arc-authentication-results; bh=JsEUEvAMaGSQOb1wrwILZvSCWQIHV/J3CVLXpM0rMK4=; b=XCEjrYHx7/4E+1LDcgxAUFsXka0PNoIl8tw+c9nkxjFbVZVE28CeCgGstwEaT0c5uG XRmE9nITyawVFse8UH4irKwc6zAV5AUmmK0bWCjVLuqyA0820fUcy0Af4IBZXW/pKa9N t5lwtDgMa5+DELX/PTTxi651BJiiwrVm/RyDjcfjgaivtKBWDPKQ0EuUt1ocY0xNNb2q fHtziEAEw2dmusS9Sh3hahnq6kFKSLuQgwA7qKzuf00vBZbWjqUoK+IyPcSDhOy8JuiQ QtfhrpUvWk/FX0dGkvkWAO43hRG1FwL/QzHMhYzeHGcggdJ9k6e0LJ0JDpYqN28UhOgr lgrA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b59-v6si9748645plb.530.2018.03.30.21.17.51; Fri, 30 Mar 2018 21:18:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752068AbeCaEMf (ORCPT + 99 others); Sat, 31 Mar 2018 00:12:35 -0400 Received: from mga06.intel.com ([134.134.136.31]:31108 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751580AbeCaEMc (ORCPT ); Sat, 31 Mar 2018 00:12:32 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Mar 2018 21:12:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,383,1517904000"; d="scan'208";a="29892951" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.16]) by orsmga008.jf.intel.com with ESMTP; 30 Mar 2018 21:12:31 -0700 Subject: [PATCH v8 05/18] ext4, dax: introduce ext4_dax_aops From: Dan Williams To: linux-nvdimm@lists.01.org Cc: Theodore Ts'o , Andreas Dilger , linux-ext4@vger.kernel.org, Jan Kara , david@fromorbit.com, hch@lst.de, linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org, jack@suse.cz, snitzer@redhat.com Date: Fri, 30 Mar 2018 21:02:36 -0700 Message-ID: <152246895649.36038.5391043415273091960.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <152246892890.36038.18436540150980653229.stgit@dwillia2-desk3.amr.corp.intel.com> References: <152246892890.36038.18436540150980653229.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-2-gc94f MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation for the dax implementation to start associating dax pages to inodes via page->mapping, we need to provide a 'struct address_space_operations' instance for dax. Otherwise, direct-I/O triggers incorrect page cache assumptions and warnings. Cc: "Theodore Ts'o" Cc: Andreas Dilger Cc: linux-ext4@vger.kernel.org Cc: Jan Kara Signed-off-by: Dan Williams --- fs/ext4/inode.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index c94780075b04..249a97b19181 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2725,12 +2725,6 @@ static int ext4_writepages(struct address_space *mapping, percpu_down_read(&sbi->s_journal_flag_rwsem); trace_ext4_writepages(inode, wbc); - if (dax_mapping(mapping)) { - ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev, - wbc); - goto out_writepages; - } - /* * No pages to write? This is mainly a kludge to avoid starting * a transaction for special inodes like journal inode on last iput() @@ -2955,6 +2949,27 @@ static int ext4_writepages(struct address_space *mapping, return ret; } +static int ext4_dax_writepages(struct address_space *mapping, + struct writeback_control *wbc) +{ + int ret; + long nr_to_write = wbc->nr_to_write; + struct inode *inode = mapping->host; + struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); + + if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) + return -EIO; + + percpu_down_read(&sbi->s_journal_flag_rwsem); + trace_ext4_writepages(inode, wbc); + + ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev, wbc); + trace_ext4_writepages_result(inode, wbc, ret, + nr_to_write - wbc->nr_to_write); + percpu_up_read(&sbi->s_journal_flag_rwsem); + return ret; +} + static int ext4_nonda_switch(struct super_block *sb) { s64 free_clusters, dirty_clusters; @@ -3857,10 +3872,6 @@ static ssize_t ext4_direct_IO(struct kiocb *iocb, struct iov_iter *iter) if (ext4_has_inline_data(inode)) return 0; - /* DAX uses iomap path now */ - if (WARN_ON_ONCE(IS_DAX(inode))) - return 0; - trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); if (iov_iter_rw(iter) == READ) ret = ext4_direct_IO_read(iocb, iter); @@ -3946,6 +3957,13 @@ static const struct address_space_operations ext4_da_aops = { .error_remove_page = generic_error_remove_page, }; +static const struct address_space_operations ext4_dax_aops = { + .writepages = ext4_dax_writepages, + .direct_IO = noop_direct_IO, + .set_page_dirty = noop_set_page_dirty, + .invalidatepage = noop_invalidatepage, +}; + void ext4_set_aops(struct inode *inode) { switch (ext4_inode_journal_mode(inode)) { @@ -3958,7 +3976,9 @@ void ext4_set_aops(struct inode *inode) default: BUG(); } - if (test_opt(inode->i_sb, DELALLOC)) + if (IS_DAX(inode)) + inode->i_mapping->a_ops = &ext4_dax_aops; + else if (test_opt(inode->i_sb, DELALLOC)) inode->i_mapping->a_ops = &ext4_da_aops; else inode->i_mapping->a_ops = &ext4_aops;