cifs - Race between IP address change and sget()?
From: David Howells
Date: Mon Apr 20 2020 - 18:14:50 EST
Paulo Alcantara <pc@xxxxxx> wrote:
> >> > What happens if the IP address the superblock is going to changes, then
> >> > another mount is made back to the original IP address? Does the second
> >> > mount just pick the original superblock?
> >>
> >> It is going to transparently reconnect to the new ip address, SMB share,
> >> and cifs superblock is kept unchanged. We, however, update internal
> >> TCP_Server_Info structure to reflect new destination ip address.
> >>
> >> For the second mount, since the hostname (extracted out of the UNC path
> >> at mount time) resolves to a new ip address and that address was saved
> >> earlier in TCP_Server_Info structure during reconnect, we will end up
> >> reusing same cifs superblock as per fs/cifs/connect.c:cifs_match_super().
> >
> > Would that be a bug?
>
> Probably.
>
> I'm not sure how that code is supposed to work, TBH.
Hmmm... I think there may be a race here then - but I'm not sure it can be
avoided or if it matters.
Since the address is part of the primary key to sget() for cifs, changing the
IP address will change the primary key. Jeff tells me that this is governed
by a spinlock taken by cifs_match_super(). However, sget() may be busy
attaching a new mount to the old superblock under the sb_lock core vfs lock,
having already found a match.
Should the change of parameters made by cifs be effected with sb_lock held to
try and avoid ending up using the wrong superblock?
However, because the TCP_Server_Info is apparently updated, it looks like my
original concern is not actually a problem (the idea that if a mounted server
changes its IP address and then a new server comes online at the old IP
address, it might end up sharing superblocks because the IP address is part of
the key).
David