This patch introduces the concept of a 'soft' reference count for a vfsmount.What is this against? What are mntgroupput and mntgroupget? Why does soft put decrement mnt_count which isn't increment by soft get? How do soft references allow userland umount? I don't see soft references used anywhere...
This type of reference count allows for references to be held on mountpoints
that do not affect their busy states for userland unmounting. Some might
argue that this is wrong because 'when I unmount a filesystem, I want the
resources associated with it to go away too', but this way of thinking was
deprecated with the addition of namespaces and --bind back in the 2.4 series.
A future addition may see a callback mechanism so that in kernel users can
use a given mountpoint and have it deregistered some way (quota and
accounting come to mind).
These soft reference counts are used by a later patch that adds an interface
for holding and manipulating mountpoints using filedescriptors.
Signed-off-by: Mike Waychison <michael.waychison@xxxxxxx>
+static inline struct vfsmount *mntsoftget(struct vfsmount *mnt)
+{
+ if (mnt) {
+ read_lock(&vfsmountref_lock);
+ atomic_inc(&mnt->mnt_softcount);
+ mntgroupget(mnt);
+ read_unlock(&vfsmountref_lock);
+ }
+ return mnt;
+}
+
+static inline void mntsoftput(struct vfsmount *mnt)
+{
+ struct vfsmount *cleanup;
+ might_sleep();
+ if (mnt) {
+ if (atomic_dec_and_test(&mnt->mnt_count))
+ __mntput(mnt);
+ read_lock(&vfsmountref_lock);
+ cleanup = mntgroupput(mnt);
+ atomic_dec(&mnt->mnt_softcount);
+ read_unlock(&vfsmountref_lock);
+ if (cleanup)
+ __mntgroupput(cleanup);
+ }
+}
+
extern void free_vfsmnt(struct vfsmount *mnt);