Re: [PATCH] NFSv4: use unique client identifiers in network namespaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 27 Feb 2022, at 18:50, NeilBrown wrote:

On Wed, 09 Feb 2022, Benjamin Coddington wrote:
On 8 Feb 2022, at 15:27, Trond Myklebust wrote:

On Tue, 2022-02-08 at 15:03 -0500, Benjamin Coddington wrote:
In order to differentiate client state, assign a random uuid to the
uniquifing portion of the client identifier when a network namespace
is
created.  Containers may still override this value if they wish to
maintain
stable client identifiers by writing to
/sys/fs/nfs/net/client/identifier,
either by udev rules or other means.

Signed-off-by: Benjamin Coddington <bcodding@xxxxxxxxxx>
---
 fs/nfs/sysfs.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
index 8cb70755e3c9..9b811323fd7f 100644
--- a/fs/nfs/sysfs.c
+++ b/fs/nfs/sysfs.c
@@ -167,6 +167,18 @@ static struct nfs_netns_client
*nfs_netns_client_alloc(struct kobject *parent,
        return NULL;
 }
 
+static void assign_unique_clientid(struct nfs_netns_client *clp)
+{
+       unsigned char client_uuid[16];
+       char *uuid_str = kmalloc(UUID_STRING_LEN + 1,
GFP_KERNEL);
+
+       if (uuid_str) {
+               generate_random_uuid(client_uuid);
+               sprintf(uuid_str, "%pU", client_uuid);
+               rcu_assign_pointer(clp->identifier,
uuid_str);
+       }
+}
+
 void nfs_netns_sysfs_setup(struct nfs_net *netns, struct net *net)
 {
        struct nfs_netns_client *clp;
@@ -174,6 +186,8 @@ void nfs_netns_sysfs_setup(struct nfs_net *netns,
struct net *net)
        clp = nfs_netns_client_alloc(nfs_client_kobj, net);
        if (clp) {
                netns->nfs_client = clp;
+               if (net != &init_net)
+                       assign_unique_clientid(clp);

Why shouldn't this go in nfs_netns_client_alloc? At this point you've
already published the pointer in netns, so you're prone to races.

No reason it shouldn't, I'll put it there if that's what you want.

I thought that's why it was RCU-ed, and figured we'd just do it before
the
uevent.

Also, why the exclusion of init_net?

Because we're unique enough if we're not in a network namespace, and any additional uniqueness we might need (due to NAT, or cloned VMs) /should/
be
getting from udev, as you envisioned.  That way, if we are getting
uniquified, its from a source that's likely persistent/deterministic.
If we
just generate a random uniquifier, its going to be different next boot
if
there's no udev rule and userspace helpers. That's going to make things
a
lot worse for simple setups.

I liked this patch at first, but I no longer think it is a good idea.

It is quite possible today for containers to provide sufficient
uniqueness simply by setting a unique hostname before the first NFS
mount.
Quite possibly some containers already do this, and are working
perfectly.

If we add new randomness, the they will get a different identifier on
each boot.  This is bad for exactly the same reason that it is bad for
"net == &init_net".

i.e.  I believe this patch could cause a regression for working sites.
The regression may not be immediately obvious, but it may still be
there.
For this reason, I think this patch should be dropped.

I agree, Trond please drop this patch.

Ben




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux