diff options
| author | Christoph Hellwig <hch@lst.de> | 2025-05-15 13:50:56 +0200 |
|---|---|---|
| committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2025-07-14 15:20:28 -0700 |
| commit | 87268f7a4f1fb7243bba5a4aa6199720b54f72dd (patch) | |
| tree | 25316b68701730a1a42045baa8ade0f4a85cfeb1 | |
| parent | 90c9550a8d65fb9b1bf87baf97a04ed91bf61b33 (diff) | |
| download | linux-87268f7a4f1fb7243bba5a4aa6199720b54f72dd.tar.gz linux-87268f7a4f1fb7243bba5a4aa6199720b54f72dd.zip | |
nfs: create a kernel keyring
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>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Link: https://lore.kernel.org/r/20250515115107.33052-3-hch@lst.de
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
| -rw-r--r-- | fs/nfs/inode.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 4c7fa4f2bd5e..60fa0c8ff04e 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -2649,6 +2649,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 */ @@ -2656,6 +2685,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; @@ -2716,6 +2749,7 @@ out7: out9: nfs_sysfs_exit(); out10: + nfs_exit_keyring(); return err; } @@ -2731,6 +2765,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 */ |
