From: David Howells <dhowells@redhat.com>
To: viro@zeniv.linux.org.uk
Cc: dhowells@redhat.com, raven@themaw.net, mszeredi@redhat.com,
christian@brauner.io, linux-api@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-nfs@vger.kernel.org
Subject: Re: [PATCH 19/19] nfs: Add example filesystem information [ver #16]
Date: Tue, 18 Feb 2020 18:12:59 +0000 [thread overview]
Message-ID: <3306459.1582049579@warthog.procyon.org.uk> (raw)
In-Reply-To: <158204564600.3299825.1942403408111770890.stgit@warthog.procyon.org.uk>
Oops. I forgot to add a couple of files before committing. Here's the
corrected patch.
David
---
nfs: Add example filesystem information
Add the ability to list NFS server addresses and hostname, timestamp
information and capabilities as an example.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: linux-nfs@vger.kernel.org
---
fs/nfs/Makefile | 1
fs/nfs/fsinfo.c | 225 +++++++++++++++++++++++++++++++++++++++++++
fs/nfs/internal.h | 8 +
fs/nfs/nfs4super.c | 1
fs/nfs/super.c | 1
include/uapi/linux/fsinfo.h | 29 +++++
include/uapi/linux/windows.h | 35 ++++++
samples/vfs/test-fsinfo.c | 40 +++++++
8 files changed, 340 insertions(+)
diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
index 2433c3e03cfa..20fbc9596833 100644
--- a/fs/nfs/Makefile
+++ b/fs/nfs/Makefile
@@ -13,6 +13,7 @@ nfs-y := client.o dir.o file.o getroot.o inode.o super.o \
nfs-$(CONFIG_ROOT_NFS) += nfsroot.o
nfs-$(CONFIG_SYSCTL) += sysctl.o
nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o
+nfs-$(CONFIG_FSINFO) += fsinfo.o
obj-$(CONFIG_NFS_V2) += nfsv2.o
nfsv2-y := nfs2super.o proc.o nfs2xdr.o
diff --git a/fs/nfs/fsinfo.c b/fs/nfs/fsinfo.c
new file mode 100644
index 000000000000..22f7e6a16cb4
--- /dev/null
+++ b/fs/nfs/fsinfo.c
@@ -0,0 +1,225 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Filesystem information for NFS
+ *
+ * Copyright (C) 2020 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ */
+
+#include <linux/nfs_fs.h>
+#include <linux/windows.h>
+#include "internal.h"
+
+static const struct fsinfo_timestamp_info nfs_timestamp_info = {
+ .atime = {
+ .minimum = 0,
+ .maximum = UINT_MAX,
+ .gran_mantissa = 1,
+ .gran_exponent = 0,
+ },
+ .mtime = {
+ .minimum = 0,
+ .maximum = UINT_MAX,
+ .gran_mantissa = 1,
+ .gran_exponent = 0,
+ },
+ .ctime = {
+ .minimum = 0,
+ .maximum = UINT_MAX,
+ .gran_mantissa = 1,
+ .gran_exponent = 0,
+ },
+ .btime = {
+ .minimum = 0,
+ .maximum = UINT_MAX,
+ .gran_mantissa = 1,
+ .gran_exponent = 0,
+ },
+};
+
+static int nfs_fsinfo_get_timestamp_info(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ struct fsinfo_timestamp_info *r = ctx->buffer;
+ unsigned long long nsec;
+ unsigned int rem, mant;
+ int exp = -9;
+
+ *r = nfs_timestamp_info;
+
+ nsec = server->time_delta.tv_nsec;
+ nsec += server->time_delta.tv_sec * 1000000000ULL;
+ if (nsec == 0)
+ goto out;
+
+ do {
+ mant = nsec;
+ rem = do_div(nsec, 10);
+ if (rem)
+ break;
+ exp++;
+ } while (nsec);
+
+ r->atime.gran_mantissa = mant;
+ r->atime.gran_exponent = exp;
+ r->btime.gran_mantissa = mant;
+ r->btime.gran_exponent = exp;
+ r->ctime.gran_mantissa = mant;
+ r->ctime.gran_exponent = exp;
+ r->mtime.gran_mantissa = mant;
+ r->mtime.gran_exponent = exp;
+
+out:
+ return sizeof(*r);
+}
+
+static int nfs_fsinfo_get_info(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ const struct nfs_client *clp = server->nfs_client;
+ struct fsinfo_nfs_info *r = ctx->buffer;
+
+ r->version = clp->rpc_ops->version;
+ r->minor_version = clp->cl_minorversion;
+ r->transport_proto = clp->cl_proto;
+ return sizeof(*r);
+}
+
+static int nfs_fsinfo_get_server_name(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ const struct nfs_client *clp = server->nfs_client;
+
+ return fsinfo_string(clp->cl_hostname, ctx);
+}
+
+static int nfs_fsinfo_get_server_addresses(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ const struct nfs_client *clp = server->nfs_client;
+ struct fsinfo_nfs_server_address *addr = ctx->buffer;
+ int ret;
+
+ ret = 1 * sizeof(*addr);
+ if (ret <= ctx->buf_size)
+ memcpy(&addr[0].address, &clp->cl_addr, clp->cl_addrlen);
+ return ret;
+
+}
+
+static int nfs_fsinfo_get_gssapi_name(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ const struct nfs_client *clp = server->nfs_client;
+
+ return fsinfo_string(clp->cl_acceptor, ctx);
+}
+
+static int nfs_fsinfo_get_limits(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ struct fsinfo_limits *lim = ctx->buffer;
+
+ lim->max_file_size.hi = 0;
+ lim->max_file_size.lo = server->maxfilesize;
+ lim->max_ino.hi = 0;
+ lim->max_ino.lo = U64_MAX;
+ lim->max_hard_links = UINT_MAX;
+ lim->max_uid = UINT_MAX;
+ lim->max_gid = UINT_MAX;
+ lim->max_filename_len = NAME_MAX - 1;
+ lim->max_symlink_len = PATH_MAX - 1;
+ return sizeof(*lim);
+}
+
+static int nfs_fsinfo_get_supports(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ struct fsinfo_supports *sup = ctx->buffer;
+
+ /* Don't set STATX_INO as i_ino is fabricated and may not be unique. */
+
+ if (!(server->caps & NFS_CAP_MODE))
+ sup->stx_mask |= STATX_TYPE | STATX_MODE;
+ if (server->caps & NFS_CAP_OWNER)
+ sup->stx_mask |= STATX_UID;
+ if (server->caps & NFS_CAP_OWNER_GROUP)
+ sup->stx_mask |= STATX_GID;
+ if (server->caps & NFS_CAP_ATIME)
+ sup->stx_mask |= STATX_ATIME;
+ if (server->caps & NFS_CAP_CTIME)
+ sup->stx_mask |= STATX_CTIME;
+ if (server->caps & NFS_CAP_MTIME)
+ sup->stx_mask |= STATX_MTIME;
+ if (server->attr_bitmask[0] & FATTR4_WORD0_SIZE)
+ sup->stx_mask |= STATX_SIZE;
+ if (server->attr_bitmask[1] & FATTR4_WORD1_NUMLINKS)
+ sup->stx_mask |= STATX_NLINK;
+
+ if (server->attr_bitmask[0] & FATTR4_WORD0_ARCHIVE)
+ sup->win_file_attrs |= ATTR_ARCHIVE;
+ if (server->attr_bitmask[0] & FATTR4_WORD0_HIDDEN)
+ sup->win_file_attrs |= ATTR_HIDDEN;
+ if (server->attr_bitmask[1] & FATTR4_WORD1_SYSTEM)
+ sup->win_file_attrs |= ATTR_SYSTEM;
+
+ sup->stx_attributes = STATX_ATTR_AUTOMOUNT;
+ return sizeof(*sup);
+}
+
+static int nfs_fsinfo_get_features(struct path *path, struct fsinfo_context *ctx)
+{
+ const struct nfs_server *server = NFS_SB(path->dentry->d_sb);
+ struct fsinfo_features *ft = ctx->buffer;
+
+ fsinfo_set_feature(ft, FSINFO_FEAT_IS_NETWORK_FS);
+ fsinfo_set_feature(ft, FSINFO_FEAT_AUTOMOUNTS);
+ fsinfo_set_feature(ft, FSINFO_FEAT_O_SYNC);
+ fsinfo_set_feature(ft, FSINFO_FEAT_O_DIRECT);
+ fsinfo_set_feature(ft, FSINFO_FEAT_ADV_LOCKS);
+ fsinfo_set_feature(ft, FSINFO_FEAT_DEVICE_FILES);
+ fsinfo_set_feature(ft, FSINFO_FEAT_UNIX_SPECIALS);
+ if (server->nfs_client->rpc_ops->version == 4) {
+ fsinfo_set_feature(ft, FSINFO_FEAT_LEASES);
+ fsinfo_set_feature(ft, FSINFO_FEAT_IVER_ALL_CHANGE);
+ }
+
+ if (server->caps & NFS_CAP_OWNER)
+ fsinfo_set_feature(ft, FSINFO_FEAT_UIDS);
+ if (server->caps & NFS_CAP_OWNER_GROUP)
+ fsinfo_set_feature(ft, FSINFO_FEAT_GIDS);
+ if (!(server->caps & NFS_CAP_MODE))
+ fsinfo_set_feature(ft, FSINFO_FEAT_NO_UNIX_MODE);
+ if (server->caps & NFS_CAP_ACLS)
+ fsinfo_set_feature(ft, FSINFO_FEAT_HAS_ACL);
+ if (server->caps & NFS_CAP_SYMLINKS)
+ fsinfo_set_feature(ft, FSINFO_FEAT_SYMLINKS);
+ if (server->caps & NFS_CAP_HARDLINKS)
+ fsinfo_set_feature(ft, FSINFO_FEAT_HARD_LINKS);
+ if (server->caps & NFS_CAP_ATIME)
+ fsinfo_set_feature(ft, FSINFO_FEAT_HAS_ATIME);
+ if (server->caps & NFS_CAP_CTIME)
+ fsinfo_set_feature(ft, FSINFO_FEAT_HAS_CTIME);
+ if (server->caps & NFS_CAP_MTIME)
+ fsinfo_set_feature(ft, FSINFO_FEAT_HAS_MTIME);
+
+ if (server->attr_bitmask[0] & FATTR4_WORD0_CASE_INSENSITIVE)
+ fsinfo_set_feature(ft, FSINFO_FEAT_NAME_CASE_INDEP);
+ if ((server->attr_bitmask[0] & FATTR4_WORD0_ARCHIVE) ||
+ (server->attr_bitmask[0] & FATTR4_WORD0_HIDDEN) ||
+ (server->attr_bitmask[1] & FATTR4_WORD1_SYSTEM))
+ fsinfo_set_feature(ft, FSINFO_FEAT_WINDOWS_ATTRS);
+
+ return sizeof(*ft);
+}
+
+const struct fsinfo_attribute nfs_fsinfo_attributes[] = {
+ FSINFO_VSTRUCT (FSINFO_ATTR_TIMESTAMP_INFO, nfs_fsinfo_get_timestamp_info),
+ FSINFO_VSTRUCT (FSINFO_ATTR_LIMITS, nfs_fsinfo_get_limits),
+ FSINFO_VSTRUCT (FSINFO_ATTR_SUPPORTS, nfs_fsinfo_get_supports),
+ FSINFO_VSTRUCT (FSINFO_ATTR_FEATURES, nfs_fsinfo_get_features),
+ FSINFO_VSTRUCT (FSINFO_ATTR_NFS_INFO, nfs_fsinfo_get_info),
+ FSINFO_STRING (FSINFO_ATTR_NFS_SERVER_NAME, nfs_fsinfo_get_server_name),
+ FSINFO_LIST (FSINFO_ATTR_NFS_SERVER_ADDRESSES, nfs_fsinfo_get_server_addresses),
+ FSINFO_STRING (FSINFO_ATTR_NFS_GSSAPI_NAME, nfs_fsinfo_get_gssapi_name),
+ {}
+};
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index f80c47d5ff27..4ddf0da25740 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -10,6 +10,7 @@
#include <linux/sunrpc/addr.h>
#include <linux/nfs_page.h>
#include <linux/wait_bit.h>
+#include <linux/fsinfo.h>
#define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)
@@ -247,6 +248,13 @@ extern const struct svc_version nfs4_callback_version4;
/* fs_context.c */
extern struct file_system_type nfs_fs_type;
+/* fsinfo.c */
+#ifdef CONFIG_FSINFO
+extern const struct fsinfo_attribute nfs_fsinfo_attributes[];
+#else
+#define nfs_fsinfo_attributes NULL
+#endif
+
/* pagelist.c */
extern int __init nfs_init_nfspagecache(void);
extern void nfs_destroy_nfspagecache(void);
diff --git a/fs/nfs/nfs4super.c b/fs/nfs/nfs4super.c
index 1475f932d7da..1b75144e24f4 100644
--- a/fs/nfs/nfs4super.c
+++ b/fs/nfs/nfs4super.c
@@ -26,6 +26,7 @@ static const struct super_operations nfs4_sops = {
.write_inode = nfs4_write_inode,
.drop_inode = nfs_drop_inode,
.statfs = nfs_statfs,
+ .fsinfo_attributes = nfs_fsinfo_attributes,
.evict_inode = nfs4_evict_inode,
.umount_begin = nfs_umount_begin,
.show_options = nfs_show_options,
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index dada09b391c6..fbc2cf5f803b 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -76,6 +76,7 @@ const struct super_operations nfs_sops = {
.write_inode = nfs_write_inode,
.drop_inode = nfs_drop_inode,
.statfs = nfs_statfs,
+ .fsinfo_attributes = nfs_fsinfo_attributes,
.evict_inode = nfs_evict_inode,
.umount_begin = nfs_umount_begin,
.show_options = nfs_show_options,
diff --git a/include/uapi/linux/fsinfo.h b/include/uapi/linux/fsinfo.h
index da9a6f48ec5b..7c97d65333ec 100644
--- a/include/uapi/linux/fsinfo.h
+++ b/include/uapi/linux/fsinfo.h
@@ -40,6 +40,11 @@
#define FSINFO_ATTR_EXT4_TIMESTAMPS 0x400 /* Ext4 superblock timestamps */
+#define FSINFO_ATTR_NFS_INFO 0x500 /* Information about an NFS mount */
+#define FSINFO_ATTR_NFS_SERVER_NAME 0x501 /* Name of the server (string) */
+#define FSINFO_ATTR_NFS_SERVER_ADDRESSES 0x502 /* List of addresses of the server */
+#define FSINFO_ATTR_NFS_GSSAPI_NAME 0x503 /* GSSAPI acceptor name */
+
/*
* Optional fsinfo() parameter structure.
*
@@ -339,4 +344,28 @@ struct fsinfo_ext4_timestamps {
#define FSINFO_ATTR_EXT4_TIMESTAMPS__STRUCT struct fsinfo_ext4_timestamps
+/*
+ * Information struct for fsinfo(FSINFO_ATTR_NFS_INFO).
+ *
+ * Get information about an NFS mount.
+ */
+struct fsinfo_nfs_info {
+ __u32 version;
+ __u32 minor_version;
+ __u32 transport_proto;
+};
+
+#define FSINFO_ATTR_NFS_INFO__STRUCT struct fsinfo_nfs_info
+
+/*
+ * Information struct for fsinfo(FSINFO_ATTR_NFS_SERVER_ADDRESSES).
+ *
+ * Get the addresses of the server for an NFS mount.
+ */
+struct fsinfo_nfs_server_address {
+ struct __kernel_sockaddr_storage address;
+};
+
+#define FSINFO_ATTR_NFS_SERVER_ADDRESSES__STRUCT struct fsinfo_nfs_server_address
+
#endif /* _UAPI_LINUX_FSINFO_H */
diff --git a/include/uapi/linux/windows.h b/include/uapi/linux/windows.h
new file mode 100644
index 000000000000..17efb9a40529
--- /dev/null
+++ b/include/uapi/linux/windows.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * Common windows attributes
+ */
+#ifndef _UAPI_LINUX_WINDOWS_H
+#define _UAPI_LINUX_WINDOWS_H
+
+/*
+ * File Attribute flags
+ */
+#define ATTR_READONLY 0x0001
+#define ATTR_HIDDEN 0x0002
+#define ATTR_SYSTEM 0x0004
+#define ATTR_VOLUME 0x0008
+#define ATTR_DIRECTORY 0x0010
+#define ATTR_ARCHIVE 0x0020
+#define ATTR_DEVICE 0x0040
+#define ATTR_NORMAL 0x0080
+#define ATTR_TEMPORARY 0x0100
+#define ATTR_SPARSE 0x0200
+#define ATTR_REPARSE 0x0400
+#define ATTR_COMPRESSED 0x0800
+#define ATTR_OFFLINE 0x1000 /* ie file not immediately available -
+ on offline storage */
+#define ATTR_NOT_CONTENT_INDEXED 0x2000
+#define ATTR_ENCRYPTED 0x4000
+#define ATTR_POSIX_SEMANTICS 0x01000000
+#define ATTR_BACKUP_SEMANTICS 0x02000000
+#define ATTR_DELETE_ON_CLOSE 0x04000000
+#define ATTR_SEQUENTIAL_SCAN 0x08000000
+#define ATTR_RANDOM_ACCESS 0x10000000
+#define ATTR_NO_BUFFERING 0x20000000
+#define ATTR_WRITE_THROUGH 0x80000000
+
+#endif /* _UAPI_LINUX_WINDOWS_H */
diff --git a/samples/vfs/test-fsinfo.c b/samples/vfs/test-fsinfo.c
index 53251ee98d1c..68652db686e8 100644
--- a/samples/vfs/test-fsinfo.c
+++ b/samples/vfs/test-fsinfo.c
@@ -393,6 +393,40 @@ static void dump_ext4_fsinfo_timestamps(void *reply, unsigned int size)
printf("\tlast-err: %s\n", dump_ext4_time(buffer, r->last_error_time));
}
+static void dump_nfs_fsinfo_info(void *reply, unsigned int size)
+{
+ struct fsinfo_nfs_info *r = reply;
+
+ printf("ver=%u.%u proto=%u\n", r->version, r->minor_version, r->transport_proto);
+}
+
+static void dump_nfs_fsinfo_server_addresses(void *reply, unsigned int size)
+{
+ struct fsinfo_nfs_server_address *r = reply;
+ struct sockaddr_storage *ss = (struct sockaddr_storage *)&r->address;
+ struct sockaddr_in6 *sin6;
+ struct sockaddr_in *sin;
+ char buf[1024];
+
+ switch (ss->ss_family) {
+ case AF_INET:
+ sin = (struct sockaddr_in *)ss;
+ if (!inet_ntop(AF_INET, &sin->sin_addr, buf, sizeof(buf)))
+ break;
+ printf("%5u %s\n", ntohs(sin->sin_port), buf);
+ return;
+ case AF_INET6:
+ sin6 = (struct sockaddr_in6 *)ss;
+ if (!inet_ntop(AF_INET6, &sin6->sin6_addr, buf, sizeof(buf)))
+ break;
+ printf("%5u %s\n", ntohs(sin6->sin6_port), buf);
+ return;
+ default:
+ printf("family=%u\n", ss->ss_family);
+ return;
+ }
+}
+
static void dump_string(void *reply, unsigned int size)
{
char *s = reply, *p;
@@ -424,6 +458,8 @@ static void dump_string(void *reply, unsigned int size)
#define dump_fsinfo_generic_mount_point dump_string
#define dump_afs_cell_name dump_string
#define dump_afs_server_name dump_string
+#define dump_nfs_fsinfo_server_name dump_string
+#define dump_nfs_fsinfo_gssapi_name dump_string
/*
*
@@ -468,6 +504,10 @@ static const struct fsinfo_attribute fsinfo_attributes[] = {
FSINFO_STRING (FSINFO_ATTR_AFS_SERVER_NAME, afs_server_name),
FSINFO_LIST_N (FSINFO_ATTR_AFS_SERVER_ADDRESSES, afs_fsinfo_server_address),
FSINFO_VSTRUCT (FSINFO_ATTR_EXT4_TIMESTAMPS, ext4_fsinfo_timestamps),
+ FSINFO_VSTRUCT (FSINFO_ATTR_NFS_INFO, nfs_fsinfo_info),
+ FSINFO_STRING (FSINFO_ATTR_NFS_SERVER_NAME, nfs_fsinfo_server_name),
+ FSINFO_LIST (FSINFO_ATTR_NFS_SERVER_ADDRESSES, nfs_fsinfo_server_addresses),
+ FSINFO_STRING (FSINFO_ATTR_NFS_GSSAPI_NAME, nfs_fsinfo_gssapi_name),
{}
};
next prev parent reply other threads:[~2020-02-18 18:13 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-18 17:04 [PATCH 00/19] VFS: Filesystem information and notifications [ver #16] David Howells
2020-02-18 17:05 ` [PATCH 01/19] vfs: syscall: Add fsinfo() to query filesystem information " David Howells
2020-02-19 16:31 ` Darrick J. Wong
2020-02-19 20:07 ` Jann Horn
2020-02-20 10:34 ` David Howells
2020-02-20 15:48 ` Darrick J. Wong
2020-02-20 11:03 ` David Howells
2020-02-20 14:54 ` Jann Horn
2020-02-20 15:31 ` Darrick J. Wong
2020-02-18 17:05 ` [PATCH 02/19] fsinfo: Add syscalls to other arches " David Howells
2020-02-21 14:51 ` Christian Brauner
2020-02-21 18:10 ` Geert Uytterhoeven
2020-02-18 17:05 ` [PATCH 03/19] fsinfo: Provide a bitmap of supported features " David Howells
2020-02-19 16:37 ` Darrick J. Wong
2020-02-20 12:22 ` David Howells
2020-02-18 17:05 ` [PATCH 04/19] vfs: Add mount change counter " David Howells
2020-02-21 14:48 ` Christian Brauner
2020-02-18 17:05 ` [PATCH 05/19] vfs: Introduce a non-repeating system-unique superblock ID " David Howells
2020-02-19 16:53 ` Darrick J. Wong
2020-02-20 12:45 ` David Howells
2020-02-18 17:05 ` [PATCH 06/19] vfs: Allow fsinfo() to look up a mount object by " David Howells
2020-02-21 15:09 ` Christian Brauner
2020-02-18 17:05 ` [PATCH 07/19] vfs: Allow mount information to be queried by fsinfo() " David Howells
2020-02-18 17:05 ` [PATCH 08/19] vfs: fsinfo sample: Mount listing program " David Howells
2020-02-18 17:06 ` [PATCH 09/19] fsinfo: Allow the mount topology propogation flags to be retrieved " David Howells
2020-02-18 17:06 ` [PATCH 10/19] fsinfo: Add API documentation " David Howells
2020-02-18 17:06 ` [PATCH 11/19] afs: Support fsinfo() " David Howells
2020-02-19 21:01 ` Jann Horn
2020-02-20 12:58 ` David Howells
2020-02-20 14:58 ` Jann Horn
2020-02-21 13:26 ` David Howells
2020-02-18 17:06 ` [PATCH 12/19] security: Add hooks to rule on setting a superblock or mount watch " David Howells
2020-02-18 17:06 ` [PATCH 13/19] vfs: Add a mount-notification facility " David Howells
2020-02-19 22:40 ` Jann Horn
2020-02-19 22:55 ` Jann Horn
2020-02-21 12:24 ` David Howells
2020-02-21 15:49 ` Jann Horn
2020-02-21 17:06 ` David Howells
2020-02-21 17:36 ` seq_lock and lockdep_is_held() assertions Jann Horn
2020-02-21 18:02 ` John Stultz
2020-02-18 17:06 ` [PATCH 14/19] notifications: sample: Display mount tree change notifications [ver #16] David Howells
2020-02-18 17:06 ` [PATCH 15/19] vfs: Add superblock " David Howells
2020-02-19 23:08 ` Jann Horn
2020-02-21 14:23 ` David Howells
2020-02-21 15:44 ` Jann Horn
2020-02-21 16:33 ` David Howells
2020-02-21 16:41 ` Jann Horn
2020-02-21 17:11 ` David Howells
2020-02-18 17:06 ` [PATCH 16/19] fsinfo: Provide superblock notification counter " David Howells
2020-02-18 17:07 ` [PATCH 17/19] notifications: sample: Display superblock notifications " David Howells
2020-02-18 17:07 ` [PATCH 18/19] ext4: Add example fsinfo information " David Howells
2020-02-19 17:04 ` Darrick J. Wong
2020-02-20 0:53 ` kbuild test robot
2020-02-20 0:53 ` kbuild test robot
2020-02-21 14:43 ` David Howells
2020-02-21 16:26 ` Darrick J. Wong
2020-02-18 17:07 ` [PATCH 19/19] nfs: Add example filesystem " David Howells
2020-02-20 2:13 ` kbuild test robot
2020-02-20 2:13 ` kbuild test robot
2020-02-20 2:20 ` kbuild test robot
2020-02-20 2:20 ` kbuild test robot
2020-02-18 18:12 ` David Howells [this message]
2020-02-19 10:23 ` [PATCH 00/19] VFS: Filesystem information and notifications " Stefan Metzmacher
2020-02-19 14:46 ` Christian Brauner
2020-02-19 15:50 ` Darrick J. Wong
2020-02-20 4:42 ` Ian Kent
2020-02-20 9:09 ` Christian Brauner
2020-02-20 11:30 ` Ian Kent
2020-02-19 16:16 ` David Howells
2020-02-21 12:57 ` David Howells
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=3306459.1582049579@warthog.procyon.org.uk \
--to=dhowells@redhat.com \
--cc=christian@brauner.io \
--cc=linux-api@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=mszeredi@redhat.com \
--cc=raven@themaw.net \
--cc=viro@zeniv.linux.org.uk \
/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.