]> www.infradead.org Git - users/hch/misc.git/commitdiff
nfs: create a kernel keyring nfs-tls-options
authorChristoph Hellwig <hch@lst.de>
Tue, 6 May 2025 07:55:40 +0000 (09:55 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 13 May 2025 08:53:20 +0000 (10:53 +0200)
Create a kernel .nfs keyring similar to the nvme .nvme one.  Unlike for
a userspace-created keyrind, tlshd is a possesor of the keys with this
and thus the keys don't need user read permissions.

Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/nfs/inode.c

index 119e447758b994b34e55e7b28fd4f34fa089e2e1..e7a519f5b6bcccef637302a35aa5ba17bf24a25f 100644 (file)
@@ -2571,6 +2571,35 @@ static struct pernet_operations nfs_net_ops = {
        .size = sizeof(struct nfs_net),
 };
 
+#ifdef CONFIG_KEYS
+static struct key *nfs_keyring;
+
+static int __init nfs_init_keyring(void)
+{
+       nfs_keyring = keyring_alloc(".nfs",
+                            GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
+                            current_cred(),
+                            (KEY_POS_ALL & ~KEY_POS_SETATTR) |
+                            (KEY_USR_ALL & ~KEY_USR_SETATTR),
+                            KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+       return PTR_ERR_OR_ZERO(nfs_keyring);
+}
+
+static void __exit nfs_exit_keyring(void)
+{
+       key_put(nfs_keyring);
+}
+#else
+static inline int nfs_init_keyring(void)
+{
+       return 0;
+}
+
+static inline void nfs_exit_keyring(void)
+{
+}
+#endif /* CONFIG_KEYS */
+
 /*
  * Initialize NFS
  */
@@ -2578,6 +2607,10 @@ static int __init init_nfs_fs(void)
 {
        int err;
 
+       err = nfs_init_keyring();
+       if (err)
+               return err;
+
        err = nfs_sysfs_init();
        if (err < 0)
                goto out10;
@@ -2638,6 +2671,7 @@ out7:
 out9:
        nfs_sysfs_exit();
 out10:
+       nfs_exit_keyring();
        return err;
 }
 
@@ -2653,6 +2687,7 @@ static void __exit exit_nfs_fs(void)
        nfs_fs_proc_exit();
        nfsiod_stop();
        nfs_sysfs_exit();
+       nfs_exit_keyring();
 }
 
 /* Not quite true; I just maintain it */