From patchwork Thu Jan 4 17:20:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10145231 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8D2876034B for ; Thu, 4 Jan 2018 17:20:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 71D32223C6 for ; Thu, 4 Jan 2018 17:20:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6678E2874E; Thu, 4 Jan 2018 17:20:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F32ED223C6 for ; Thu, 4 Jan 2018 17:20:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752360AbeADRUs (ORCPT ); Thu, 4 Jan 2018 12:20:48 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:33642 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751656AbeADRUk (ORCPT ); Thu, 4 Jan 2018 12:20:40 -0500 Received: by mail-wr0-f196.google.com with SMTP id p6so2159179wrd.0; Thu, 04 Jan 2018 09:20:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VMiJM0tt4njKkYrWPV+hSvdnsO8lBPiCPYwlU9qiuLQ=; b=h8WwYfNYzZMLm8gQ+a/b4dpAsYtgxSMK9QIGf331fBPqEHKeRDow+wwA/NCmcw7AaP b+M+4Wt6Ub83ihNEiYXwx1/cY7iAxxs/ZU6NdMWmnCICilrmSm+ep81wfgA4jMnPt0yf RkHr5aiy5pPVuo6WGRyuDVW8e5Pq/0HCmodxbXACtn+6m0yCeE32f5xZsKVGvKfXVXy1 EgD9w0QyslfJ58tivVftp8PhViVyt/56+JDhXfP7kcXc8HFqD2uoGMqii/YjN1imFhvb Vn3NpocQoUVFIZYxCU37AzxLRJp6ZDd2JbENWHZn08AiKz1NROORMOIBQ1BntEMBLv5E B1Ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VMiJM0tt4njKkYrWPV+hSvdnsO8lBPiCPYwlU9qiuLQ=; b=NgY9dQNcyFIm5PtUXTNJ92WoxtZuFTkSlLNWV6q7yLVDTt8z4NMoo68jhzyS4lFHeW f4wJqLPRAPpJchBDwZBvsAnY5vPDjqRxm+hviSDgBaWflHwk0P51GGiHrUEzLx+XuXye igXAvrvlWcyC4MnXGDUpMPQzbJ7M536hpdvnijue1l/XGL/hSb1u284yAISh7auRT1DK 9FimGr0r/a8jTxo39EscLG/lNn0pC8+XPcClPyWIDgDaby+vU7q2vCDb5tAyScqhOib5 J9uoAiTeJspGVE2yBRkdVpakwpvtCY+hTERak4pBpQ8t+Vcu+wxxpPKXGVVPxro/Ydjz +VsA== X-Gm-Message-State: AKGB3mKDCjYHrd2jfI55k8CqoPOi4WsWRsgGQev3qGwidQo8yg8Wn3Lg cJox0AAjogfTJ4ODlUdkFig= X-Google-Smtp-Source: ACJfBos14vkpJ2NVNFTk8z/7wSaO+dsXjfAmEMzyC02rbZyxMIOniaQwb1Dbao7Nv9haF7M/0J2R8A== X-Received: by 10.223.158.208 with SMTP id b16mr257284wrf.66.1515086439357; Thu, 04 Jan 2018 09:20:39 -0800 (PST) Received: from localhost.localdomain (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id c6sm2777750wmd.21.2018.01.04.09.20.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 04 Jan 2018 09:20:38 -0800 (PST) From: Amir Goldstein To: Miklos Szeredi Cc: Jeff Layton , "J . Bruce Fields" , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 02/17] ovl: encode pure upper file handles Date: Thu, 4 Jan 2018 19:20:34 +0200 Message-Id: <1515086449-26563-3-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515086449-26563-1-git-send-email-amir73il@gmail.com> References: <1515086449-26563-1-git-send-email-amir73il@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Encode overlay file handles as struct ovl_fh containing the file handle encoding of the real upper inode. Signed-off-by: Amir Goldstein --- fs/overlayfs/Makefile | 3 +- fs/overlayfs/export.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/overlayfs/overlayfs.h | 6 +++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 fs/overlayfs/export.c diff --git a/fs/overlayfs/Makefile b/fs/overlayfs/Makefile index 99373bbc1478..30802347a020 100644 --- a/fs/overlayfs/Makefile +++ b/fs/overlayfs/Makefile @@ -4,4 +4,5 @@ obj-$(CONFIG_OVERLAY_FS) += overlay.o -overlay-objs := super.o namei.o util.o inode.o dir.o readdir.o copy_up.o +overlay-objs := super.o namei.o util.o inode.o dir.o readdir.o copy_up.o \ + export.o diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c new file mode 100644 index 000000000000..58c4f5e8a67e --- /dev/null +++ b/fs/overlayfs/export.c @@ -0,0 +1,98 @@ +/* + * Overlayfs NFS export support. + * + * Amir Goldstein + * + * Copyright (C) 2017 CTERA Networks. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "overlayfs.h" + +int ovl_d_to_fh(struct dentry *dentry, char *buf, int buflen) +{ + struct dentry *upper = ovl_dentry_upper(dentry); + struct dentry *origin = ovl_dentry_lower(dentry); + struct ovl_fh *fh = NULL; + int err; + + /* + * Overlay root dir inode is encoded as an upper file handle upper, + * because root dir dentry is born upper and not indexed. + */ + if (dentry == dentry->d_sb->s_root) + origin = NULL; + + err = -EACCES; + if (!upper || origin) + goto fail; + + /* TODO: encode non pure-upper by origin */ + fh = ovl_encode_fh(upper, true); + + err = -EOVERFLOW; + if (fh->len > buflen) + goto fail; + + memcpy(buf, (char *)fh, fh->len); + err = fh->len; + +out: + kfree(fh); + return err; + +fail: + pr_warn_ratelimited("overlayfs: failed to encode file handle (%pd2, err=%i, buflen=%d, len=%d, type=%d)\n", + dentry, err, buflen, fh ? (int)fh->len : 0, + fh ? fh->type : 0); + goto out; +} + +static int ovl_dentry_to_fh(struct dentry *dentry, u32 *fid, int *max_len) +{ + int res, len = *max_len << 2; + + res = ovl_d_to_fh(dentry, (char *)fid, len); + if (res <= 0) + return FILEID_INVALID; + + len = res; + + /* Round up to dwords */ + *max_len = (len + 3) >> 2; + return OVL_FILEID; +} + +static int ovl_encode_inode_fh(struct inode *inode, u32 *fid, int *max_len, + struct inode *parent) +{ + struct dentry *dentry; + int type; + + /* TODO: encode connectable file handles */ + if (parent) + return FILEID_INVALID; + + dentry = d_find_any_alias(inode); + if (WARN_ON(!dentry)) + return FILEID_INVALID; + + type = ovl_dentry_to_fh(dentry, fid, max_len); + + dput(dentry); + return type; +} + +const struct export_operations ovl_export_operations = { + .encode_fh = ovl_encode_inode_fh, +}; diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index f4b064023826..f6fd999cb98e 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -65,6 +65,9 @@ enum ovl_flag { #error Endianness not defined #endif +/* The type returned by overlay exportfs ops when encoding an ovl_fh handle */ +#define OVL_FILEID 0xfb + /* On-disk and in-memeory format for redirect by file handle */ struct ovl_fh { u8 version; /* 0 */ @@ -333,3 +336,6 @@ int ovl_set_attr(struct dentry *upper, struct kstat *stat); struct ovl_fh *ovl_encode_fh(struct dentry *origin, bool is_upper); int ovl_set_origin(struct dentry *dentry, struct dentry *origin, struct dentry *upper, bool is_upper); + +/* export.c */ +extern const struct export_operations ovl_export_operations;