From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Jeff Layton <jlayton@poochiereds.net>,
"J . Bruce Fields" <bfields@fieldses.org>,
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 [thread overview]
Message-ID: <1515086449-26563-3-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1515086449-26563-1-git-send-email-amir73il@gmail.com>
Encode overlay file handles as struct ovl_fh containing the file handle
encoding of the real upper inode.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
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 <amir73il@gmail.com>
+ *
+ * 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 <linux/fs.h>
+#include <linux/cred.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+#include <linux/xattr.h>
+#include <linux/exportfs.h>
+#include <linux/ratelimit.h>
+#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;
--
2.7.4
next prev parent reply other threads:[~2018-01-04 17:20 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-04 17:20 [PATCH v2 00/17] Overlayfs NFS export support Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 01/17] ovl: document NFS export Amir Goldstein
2018-01-11 16:06 ` Miklos Szeredi
2018-01-11 16:26 ` Amir Goldstein
2018-01-12 15:43 ` Miklos Szeredi
2018-01-12 15:49 ` Miklos Szeredi
2018-01-12 18:50 ` Amir Goldstein
2018-01-13 8:54 ` Amir Goldstein
2018-01-04 17:20 ` Amir Goldstein [this message]
2018-01-18 10:31 ` [PATCH v2 02/17] ovl: encode pure upper file handles Miklos Szeredi
2018-01-04 17:20 ` [PATCH v2 03/17] ovl: decode " Amir Goldstein
2018-01-18 14:09 ` Miklos Szeredi
2018-01-18 14:34 ` Amir Goldstein
2018-01-18 14:39 ` Miklos Szeredi
2018-01-18 19:49 ` Amir Goldstein
2018-01-18 20:10 ` Miklos Szeredi
2018-01-18 20:35 ` Amir Goldstein
2018-01-18 22:57 ` Amir Goldstein
2018-01-19 0:23 ` Amir Goldstein
2018-01-19 10:39 ` Miklos Szeredi
2018-01-19 11:07 ` Amir Goldstein
2018-01-19 20:10 ` Amir Goldstein
2018-01-24 10:34 ` Miklos Szeredi
2018-01-24 11:04 ` Amir Goldstein
2018-01-24 11:18 ` Amir Goldstein
2018-01-24 11:55 ` Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 04/17] ovl: decode connected upper dir " Amir Goldstein
2018-01-05 12:33 ` Amir Goldstein
2018-01-05 15:18 ` J . Bruce Fields
2018-01-05 15:34 ` Amir Goldstein
2018-01-15 11:41 ` Miklos Szeredi
2018-01-15 11:33 ` Miklos Szeredi
2018-01-15 12:20 ` Amir Goldstein
2018-01-15 14:56 ` Miklos Szeredi
2018-01-17 11:18 ` Amir Goldstein
2018-01-17 12:20 ` Amir Goldstein
2018-01-17 13:29 ` Amir Goldstein
2018-01-17 15:42 ` Miklos Szeredi
2018-01-17 16:34 ` Amir Goldstein
2018-01-17 21:36 ` Amir Goldstein
2018-01-18 8:22 ` Miklos Szeredi
2018-01-18 8:47 ` Amir Goldstein
2018-01-18 9:12 ` Miklos Szeredi
2018-01-18 10:28 ` Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 05/17] ovl: encode non-indexed upper " Amir Goldstein
2018-01-15 11:58 ` Miklos Szeredi
2018-01-15 12:07 ` Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 06/17] ovl: copy up before encoding dir file handle when ofs->numlower > 1 Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 07/17] ovl: encode lower file handles Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 08/17] ovl: decode lower non-dir " Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 09/17] ovl: decode indexed " Amir Goldstein
2018-01-18 13:11 ` Miklos Szeredi
2018-01-04 17:20 ` [PATCH v2 10/17] ovl: decode lower file handles of unlinked but open files Amir Goldstein
2018-01-16 9:16 ` Miklos Szeredi
2018-01-16 9:37 ` Amir Goldstein
2018-01-16 10:10 ` Miklos Szeredi
2018-01-16 10:40 ` Amir Goldstein
2018-01-16 11:07 ` Miklos Szeredi
2018-01-17 21:05 ` Amir Goldstein
2018-01-18 14:18 ` Amir Goldstein
2018-02-27 11:35 ` Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 11/17] ovl: decode indexed dir file handles Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 12/17] ovl: decode pure lower " Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 13/17] ovl: hash directory inodes for NFS export Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 14/17] ovl: lookup connected ancestor of dir in inode cache Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 15/17] ovl: lookup indexed ancestor of lower dir Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 16/17] ovl: wire up NFS export support Amir Goldstein
2018-01-04 17:20 ` [PATCH v2 17/17] nfsd: encode stat->mtime for getattr instead of inode->i_mtime Amir Goldstein
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1515086449-26563-3-git-send-email-amir73il@gmail.com \
--to=amir73il@gmail.com \
--cc=bfields@fieldses.org \
--cc=jlayton@poochiereds.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-unionfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.