Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp774770ybk; Wed, 20 May 2020 11:36:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTl8EprgBveKK4fKk1PpBHbve8tMEzRVHVWM3fsHQj+4ydj617jlBEfqQmSIgnCGC0H9jz X-Received: by 2002:a17:906:aeca:: with SMTP id me10mr378419ejb.367.1589999810194; Wed, 20 May 2020 11:36:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589999810; cv=none; d=google.com; s=arc-20160816; b=skgEH5xPTjUFXl8AE6/E522sMgfjpuYlXYgxO7XWB/2W+OuHSf5vcOlnDZfFQ8yU50 /mujIVdLx4PAVOhjx+3y3Doxysw/JWwXgAUVDBjWsc4vh4WmJuMp0JFLQX2Y5qbp2stM m8lWfAobh6l/nJRaEGQEnG04vSBD+rZuzV9Q+dEgbS6MYHD02EZ2THO3E1d6sAN1+yoP mQG/uMBRsLbqjH1bcI2q7VsLH1NOthWKsJUaakCtcxqOepSB9nFAjuv7DugaK9e6hkcR CaLAU6ydePXltm5XuzC/cSCw2oHtQJqjzTMzFo6wRvo78csRsAPxXz5rGVts84946CDy 3lng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:ironport-sdr:ironport-sdr; bh=fgDbrPPe70htA/YA2FghOlKrw8bUFoYk5wdUHUhpKk4=; b=UIJfCCvBDiyiR27BdRqYIFfEfpFx7uBrV6qlu3Xdg6SIgjGb6cs1JLEnlKmU80ugoR YDiapgGdb3ccg4b3ESQ+uk1a0+B39TeBzEsALG7XKQGEb0ptWXDhD0KK0kI2TBU9PjGa H6ml41jQpRYBvcurHBlBycz9Q2rr7NjVAwRa6yscoDIxwCswQ6iw8TltgpvK3yYd+GFq Tssb26ETXU4XD/CX9uffsV5HoK3AuRR4USZwZXfVqCkHbT2gekXBbXXo6towoXwxitFz h3bDdCb1xdWG1vkWmurzMKP6/+nFIP4d07QyxFfE1I7Sy2g8vCS6qM1xSA1ZQ0m8T1ZM UcWQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s9si2175789eju.20.2020.05.20.11.36.20; Wed, 20 May 2020 11:36:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726861AbgETSeG (ORCPT + 99 others); Wed, 20 May 2020 14:34:06 -0400 Received: from mga01.intel.com ([192.55.52.88]:49544 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726510AbgETSeG (ORCPT ); Wed, 20 May 2020 14:34:06 -0400 IronPort-SDR: /qoIdQ/3yGZM96X46ViR/C7Cc6fpUBgO/EA11MPzp/Gb6da8I32bmhG9TSBplu6JlgcYmN+x51 z24UjS4MsqGg== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2020 11:34:05 -0700 IronPort-SDR: inQU0SeZy+ZsfOc31YVmUroqAI4RRp1d+ieKKViNm60J3QwGRSI8o5y+0O9z0a8O8nijdjftaE ICZ166qYICFw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,414,1583222400"; d="scan'208";a="412121303" Received: from iweiny-desk2.sc.intel.com ([10.3.52.147]) by orsmga004.jf.intel.com with ESMTP; 20 May 2020 11:34:04 -0700 Date: Wed, 20 May 2020 11:34:04 -0700 From: Ira Weiny To: Jan Kara Cc: linux-ext4@vger.kernel.org, Andreas Dilger , "Theodore Y. Ts'o" , Eric Biggers , Al Viro , Dan Williams , Dave Chinner , Christoph Hellwig , Jeff Moyer , "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH V3 7/8] fs/ext4: Introduce DAX inode flag Message-ID: <20200520183404.GE3660833@iweiny-DESK2.sc.intel.com> References: <20200520055753.3733520-1-ira.weiny@intel.com> <20200520055753.3733520-8-ira.weiny@intel.com> <20200520141138.GE30597@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200520141138.GE30597@quack2.suse.cz> User-Agent: Mutt/1.11.1 (2018-12-01) Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org On Wed, May 20, 2020 at 04:11:38PM +0200, Jan Kara wrote: > On Tue 19-05-20 22:57:52, ira.weiny@intel.com wrote: > > From: Ira Weiny > > > > Add a flag to preserve FS_XFLAG_DAX in the ext4 inode. > > > > Set the flag to be user visible and changeable. Set the flag to be > > inherited. Allow applications to change the flag at any time with the > > exception of if VERITY or ENCRYPT is set. > > > > Disallow setting VERITY or ENCRYPT if DAX is set. > > > > Finally, on regular files, flag the inode to not be cached to facilitate > > changing S_DAX on the next creation of the inode. > > > > Signed-off-by: Ira Weiny > > The patch looks good to me. You can add: > > Reviewed-by: Jan Kara > > One comment below: > > > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > > index 5ba65eb0e2ef..be9713e898eb 100644 > > --- a/fs/ext4/super.c > > +++ b/fs/ext4/super.c > > @@ -1323,6 +1323,9 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len, > > if (WARN_ON_ONCE(IS_DAX(inode) && i_size_read(inode))) > > return -EINVAL; > > AFAIU this check is here so that fscrypt_inherit_context() is able call us > and we can clear S_DAX flag. Basically yes that is true. It is IMO somewhat convoluted because I think ext4 probably could have prevented S_DAX from being set in __ext4_new_inode() in the first place. But that is a clean up I was not prepared to make last night. > So can't we rather move this below the > EXT4_INODE_DAX check and change this to > > IS_DAX(inode) && !(inode->i_flags & I_NEW) > > ? Because as I'm reading the code now, this should never trigger? I agree this should never trigger. But I don't see how the order of the checks maters much. But changing this to !new is probably worth doing to make it clear what we really mean here. I think that is a follow on patch. In addition, if we don't set S_DAX at all in __ext4_new_inode() this check could then be what I had originally with the warn on. if (WARN_ON_ONCE(IS_DAX(inode))) ... ... because it would be considered a bug to be setting DAX on inodes which are going to be encrypted.. Ira Something like this: (compiled only) commit 6cd5aed3cd9e2c10e3fb7c6dd23918580532f256 (HEAD -> lck-4071-b13-v4) Author: Ira Weiny Date: Wed May 20 11:32:50 2020 -0700 RFC: do not set S_DAX on an inode which is going to be encrypted diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 7941c140723f..be80cb639d74 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -844,6 +844,9 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir, return ERR_PTR(-ENOMEM); ei = EXT4_I(inode); + if (encrypt) + ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT); + /* * Initialize owners and quota early so that we don't have to account * for quota initialization worst case in standard inode creating @@ -1165,6 +1168,7 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir, err = fscrypt_inherit_context(dir, inode, handle, true); if (err) goto fail_free_drop; + ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); } if (!(ei->i_flags & EXT4_EA_INODE_FL)) { diff --git a/fs/ext4/super.c b/fs/ext4/super.c index be9713e898eb..099b87864f55 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1320,7 +1320,10 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len, if (inode->i_ino == EXT4_ROOT_INO) return -EPERM; - if (WARN_ON_ONCE(IS_DAX(inode) && i_size_read(inode))) + /* S_DAX should never be set here because encryption is not compatible + * with DAX + */ + if (WARN_ON_ONCE(IS_DAX(inode))) return -EINVAL; if (ext4_test_inode_flag(inode, EXT4_INODE_DAX)) @@ -1337,22 +1340,11 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len, * being set on an existing inode in its own transaction. Only in the * latter case should the "retry on ENOSPC" logic be used. */ - if (handle) { res = ext4_xattr_set_handle(handle, inode, EXT4_XATTR_INDEX_ENCRYPTION, EXT4_XATTR_NAME_ENCRYPTION_CONTEXT, ctx, len, 0); - if (!res) { - ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT); - ext4_clear_inode_state(inode, - EXT4_STATE_MAY_INLINE_DATA); - /* - * Update inode->i_flags - S_ENCRYPTED will be enabled, - * S_DAX may be disabled - */ - ext4_set_inode_flags(inode, false); - } return res; }