Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp275413pxb; Wed, 23 Mar 2022 18:09:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwuuejvbySIouWsJzgeX6TMKwde9a05/E0OtPXNeicOklKlXcBw6FjH+qYLMXlv8zfoyQ+P X-Received: by 2002:aa7:de10:0:b0:419:430c:9b3d with SMTP id h16-20020aa7de10000000b00419430c9b3dmr3669414edv.366.1648084162062; Wed, 23 Mar 2022 18:09:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648084162; cv=none; d=google.com; s=arc-20160816; b=mlAA6s/7kaXDE4KQQBLd/IjBFWtOuKts8XKozwqGfb/uT9SlfcRFDzOdZNRVmLNWrn y3baK7Hxiz2/n+09vcH5l2mWCwg6nnduEbbdS3feQAubAG7zkKVfUuAQL8778/OKbQ+n 4QdVaHR+9DIx6jgbbld/teIaNjeg5G6NJ87XPPaOSBOLN6IfdZJCUl1BeHUMP/TwdNf3 FvVPYYBILVfWp9P/268R+qqoL+rt5rmBjNsYiwfd2JCmM6AK8lHleH8l1+g75vuPA8vc oi/2hPz4XNA22G24kYxZQIrayF5cKE316MO6t5hRtAJ7bBvENCeKQA4kX757YJfdZAvw /kmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=eAyNH4wHahFOhm+zgai3xclVy6EyuGKHSrHsU5x0qyo=; b=wfS2N31VV64atgvCpm8uvMoWFT/dmdTtF4Z0e5OB9/sk+oQ9vmULbrbuCKiMpAVPS5 SIEhfhw6pbo7BVvWN/tiTKIeV8FJHwa6q4BrNEEBW6kLr9WaW3eoDbwng0IO/s9Jp7MV 4rN17EqG69jMTOgKkY9YAzfeRgwn2yp1qL52v6bh7AqeERM6CtBMIrCKKiYfWnhHDXh5 kdSVlEqEHimux41XDGkBQFBKiqgHHd4cTBnsZDbNh3x9PyEgMMEa11T8OeN/xz38nvKh zjrimr5YdOus0kC4QMcK7QvenI1HTgBh08+3dYSLPk8LR2u6E1jaGc/1Z8/1nKS/3b1W /Ymw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZjT7EqP2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f6-20020a50a6c6000000b00418c2b5bf2bsi17153493edc.525.2022.03.23.18.08.54; Wed, 23 Mar 2022 18:09:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ZjT7EqP2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237796AbiCVOTm (ORCPT + 99 others); Tue, 22 Mar 2022 10:19:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236425AbiCVOPC (ORCPT ); Tue, 22 Mar 2022 10:15:02 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 897FA7E58B; Tue, 22 Mar 2022 07:13:29 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 141F8B81D09; Tue, 22 Mar 2022 14:13:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C87DC340EC; Tue, 22 Mar 2022 14:13:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647958406; bh=iLkvBa+V0BMaNG2nEhYdHTRgI1w2kPvxlx563FyeLnQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZjT7EqP2GnQqp+78hEJ8axXerbDvcXbVeUi6H2ibmTtnY3pkIo2rGJSvbWo8bk5KQ kXlbfNPOPBRqKfvGJQ8UUa3hrU2dfBw8wJmKb/4jIzzXpu8esvIDkL6FtAVTkpvlBX rTs04sJ+wMLokmvzuKDRZcyvi1bDSIvBYwhb9FYB7VJoTflMBrVbVH9FgvTq0SzCEy oQxqv9Uvo/3oyWuds4dQ5VApu84/yva8c53SfQeoQefVt4+3MdRmnQgC8LmGl/ws1c CY6zLWblSpYsAwrxkgMT1GiSCigfcO8YTfmUWoj4MbyP3SkS5Jl9EtkWcSdbjeRT30 HuLZrCq25rNtQ== From: Jeff Layton To: idryomov@gmail.com, xiubli@redhat.com Cc: ceph-devel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-fscrypt@vger.kernel.org, linux-kernel@vger.kernel.org, lhenriques@suse.de Subject: [RFC PATCH v11 08/51] ceph: add support for fscrypt_auth/fscrypt_file to cap messages Date: Tue, 22 Mar 2022 10:12:33 -0400 Message-Id: <20220322141316.41325-9-jlayton@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220322141316.41325-1-jlayton@kernel.org> References: <20220322141316.41325-1-jlayton@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for new version 12 cap messages that carry the new fscrypt_auth and fscrypt_file fields from the inode. Signed-off-by: Jeff Layton --- fs/ceph/caps.c | 76 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 7d8ef67a1032..b0b7688331b4 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -13,6 +13,7 @@ #include "super.h" #include "mds_client.h" #include "cache.h" +#include "crypto.h" #include #include @@ -1214,15 +1215,12 @@ struct cap_msg_args { umode_t mode; bool inline_data; bool wake; + u32 fscrypt_auth_len; + u32 fscrypt_file_len; + u8 fscrypt_auth[sizeof(struct ceph_fscrypt_auth)]; // for context + u8 fscrypt_file[sizeof(u64)]; // for size }; -/* - * cap struct size + flock buffer size + inline version + inline data size + - * osd_epoch_barrier + oldest_flush_tid - */ -#define CAP_MSG_SIZE (sizeof(struct ceph_mds_caps) + \ - 4 + 8 + 4 + 4 + 8 + 4 + 4 + 4 + 8 + 8 + 4) - /* Marshal up the cap msg to the MDS */ static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg) { @@ -1238,7 +1236,7 @@ static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg) arg->size, arg->max_size, arg->xattr_version, arg->xattr_buf ? (int)arg->xattr_buf->vec.iov_len : 0); - msg->hdr.version = cpu_to_le16(10); + msg->hdr.version = cpu_to_le16(12); msg->hdr.tid = cpu_to_le64(arg->flush_tid); fc = msg->front.iov_base; @@ -1309,6 +1307,21 @@ static void encode_cap_msg(struct ceph_msg *msg, struct cap_msg_args *arg) /* Advisory flags (version 10) */ ceph_encode_32(&p, arg->flags); + + /* dirstats (version 11) - these are r/o on the client */ + ceph_encode_64(&p, 0); + ceph_encode_64(&p, 0); + +#if IS_ENABLED(CONFIG_FS_ENCRYPTION) + /* fscrypt_auth and fscrypt_file (version 12) */ + ceph_encode_32(&p, arg->fscrypt_auth_len); + ceph_encode_copy(&p, arg->fscrypt_auth, arg->fscrypt_auth_len); + ceph_encode_32(&p, arg->fscrypt_file_len); + ceph_encode_copy(&p, arg->fscrypt_file, arg->fscrypt_file_len); +#else /* CONFIG_FS_ENCRYPTION */ + ceph_encode_32(&p, 0); + ceph_encode_32(&p, 0); +#endif /* CONFIG_FS_ENCRYPTION */ } /* @@ -1430,8 +1443,37 @@ static void __prep_cap(struct cap_msg_args *arg, struct ceph_cap *cap, } } arg->flags = flags; +#if IS_ENABLED(CONFIG_FS_ENCRYPTION) + if (ci->fscrypt_auth_len && + WARN_ON_ONCE(ci->fscrypt_auth_len != sizeof(struct ceph_fscrypt_auth))) { + /* Don't set this if it isn't right size */ + arg->fscrypt_auth_len = 0; + } else { + arg->fscrypt_auth_len = ci->fscrypt_auth_len; + memcpy(arg->fscrypt_auth, ci->fscrypt_auth, + min_t(size_t, ci->fscrypt_auth_len, sizeof(arg->fscrypt_auth))); + } + /* FIXME: use this to track "real" size */ + arg->fscrypt_file_len = 0; +#endif /* CONFIG_FS_ENCRYPTION */ } +#define CAP_MSG_FIXED_FIELDS (sizeof(struct ceph_mds_caps) + \ + 4 + 8 + 4 + 4 + 8 + 4 + 4 + 4 + 8 + 8 + 4 + 8 + 8 + 4 + 4) + +#if IS_ENABLED(CONFIG_FS_ENCRYPTION) +static inline int cap_msg_size(struct cap_msg_args *arg) +{ + return CAP_MSG_FIXED_FIELDS + arg->fscrypt_auth_len + + arg->fscrypt_file_len; +} +#else +static inline int cap_msg_size(struct cap_msg_args *arg) +{ + return CAP_MSG_FIXED_FIELDS; +} +#endif /* CONFIG_FS_ENCRYPTION */ + /* * Send a cap msg on the given inode. * @@ -1442,7 +1484,7 @@ static void __send_cap(struct cap_msg_args *arg, struct ceph_inode_info *ci) struct ceph_msg *msg; struct inode *inode = &ci->vfs_inode; - msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, CAP_MSG_SIZE, GFP_NOFS, false); + msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, cap_msg_size(arg), GFP_NOFS, false); if (!msg) { pr_err("error allocating cap msg: ino (%llx.%llx) flushing %s tid %llu, requeuing cap.\n", ceph_vinop(inode), ceph_cap_string(arg->dirty), @@ -1468,10 +1510,6 @@ static inline int __send_flush_snap(struct inode *inode, struct cap_msg_args arg; struct ceph_msg *msg; - msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, CAP_MSG_SIZE, GFP_NOFS, false); - if (!msg) - return -ENOMEM; - arg.session = session; arg.ino = ceph_vino(inode).ino; arg.cid = 0; @@ -1509,6 +1547,18 @@ static inline int __send_flush_snap(struct inode *inode, arg.flags = 0; arg.wake = false; + /* + * No fscrypt_auth changes from a capsnap. It will need + * to update fscrypt_file on size changes (TODO). + */ + arg.fscrypt_auth_len = 0; + arg.fscrypt_file_len = 0; + + msg = ceph_msg_new(CEPH_MSG_CLIENT_CAPS, cap_msg_size(&arg), + GFP_NOFS, false); + if (!msg) + return -ENOMEM; + encode_cap_msg(msg, &arg); ceph_con_send(&arg.session->s_con, msg); return 0; -- 2.35.1