On Tue, 2020-08-04 at 12:41 +0200, Miklos Szeredi wrote: > On Mon, Aug 03, 2020 at 02:37:16PM +0100, David Howells wrote: > > Add a uniquifier ID to struct mount that is effectively unique over > > the > > kernel lifetime to deal around mnt_id values being reused. This > > can then > > be exported through fsinfo() to allow detection of replacement > > mounts that > > happen to end up with the same mount ID. > > > > The normal mount handle is still used for referring to a particular > > mount. > > > > The mount notification is then changed to convey these unique mount > > IDs > > rather than the mount handle. > > > > Signed-off-by: David Howells <dhowells@xxxxxxxxxx> > > --- > > > > fs/mount.h | 3 +++ > > fs/mount_notify.c | 4 ++-- > > fs/namespace.c | 3 +++ > > 3 files changed, 8 insertions(+), 2 deletions(-) > > > > diff --git a/fs/mount.h b/fs/mount.h > > index 85456a5f5a3a..1037781be055 100644 > > --- a/fs/mount.h > > +++ b/fs/mount.h > > @@ -79,6 +79,9 @@ struct mount { > > int mnt_expiry_mark; /* true if marked for > > expiry */ > > struct hlist_head mnt_pins; > > struct hlist_head mnt_stuck_children; > > +#ifdef CONFIG_FSINFO > > + u64 mnt_unique_id; /* ID unique over lifetime of > > kernel */ > > +#endif > > Not sure if it's worth making conditional. > > > #ifdef CONFIG_MOUNT_NOTIFICATIONS > > struct watch_list *mnt_watchers; /* Watches on dentries within > > this mount */ > > #endif > > diff --git a/fs/mount_notify.c b/fs/mount_notify.c > > index 44f570e4cebe..d8ba66ed5f77 100644 > > --- a/fs/mount_notify.c > > +++ b/fs/mount_notify.c > > @@ -90,7 +90,7 @@ void notify_mount(struct mount *trigger, > > n.watch.type = WATCH_TYPE_MOUNT_NOTIFY; > > n.watch.subtype = subtype; > > n.watch.info = info_flags | watch_sizeof(n); > > - n.triggered_on = trigger->mnt_id; > > + n.triggered_on = trigger->mnt_unique_id; > > > > switch (subtype) { > > case NOTIFY_MOUNT_EXPIRY: > > @@ -102,7 +102,7 @@ void notify_mount(struct mount *trigger, > > case NOTIFY_MOUNT_UNMOUNT: > > case NOTIFY_MOUNT_MOVE_FROM: > > case NOTIFY_MOUNT_MOVE_TO: > > - n.auxiliary_mount = aux->mnt_id; > > + n.auxiliary_mount = aux->mnt_unique_id; > > Hmm, so we now have two ID's: > > - one can be used to look up the mount > - one is guaranteed to be unique > > With this change the mount cannot be looked up with > FSINFO_FLAGS_QUERY_MOUNT, > right? > > Should we be merging the two ID's into a single one which has both > properties? I'd been thinking we would probably need to change to 64 bit ids for a while now and I thought that was what was going to happen. We'll need to change libmount and current code but better early on than later. Ian > > > break; > > > > default: > > diff --git a/fs/namespace.c b/fs/namespace.c > > index b2b9920ffd3c..1db8a64cd76f 100644 > > --- a/fs/namespace.c > > +++ b/fs/namespace.c > > @@ -115,6 +115,9 @@ static int mnt_alloc_id(struct mount *mnt) > > if (res < 0) > > return res; > > mnt->mnt_id = res; > > +#ifdef CONFIG_FSINFO > > + mnt->mnt_unique_id = atomic64_inc_return(&vfs_unique_counter); > > +#endif > > return 0; > > } > > > > > >