[PATCH 2/2] Resolve mntput_no_expire issues.

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

 



In testing the mnt_count typo fix, I hit a few BUG_ON/WARN_ON messages
in the mntput_no_expire code.

The first issue was a race against the MNT_MOUNTED flag, where if after
the optimistic lock free check is done, someone changes the value, we
might BUG_ON after getting the lock.  The fix is after getting the lock,
re-check the MNT_MOUNTED bit and drop the lock and try again if its
changed.

The second issue was a call to smp_processor_id() in add_mnt_count()
that was done while preemptable. This was missed in my earlier commit
070976b5b038218900648ea4cc88786d5dfcd58d.

Signed-off-by: John Stultz <johnstul@xxxxxxxxxx>

diff --git a/fs/namespace.c b/fs/namespace.c
index 35c56c2..d8dcabb 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -752,6 +752,7 @@ void mntput_no_expire(struct vfsmount *mnt)
 {
 	int cpu = get_cpu();
 	put_cpu();
+repeat:
 	if (likely(mnt->mnt_flags & MNT_MOUNTED)) {
 		vfsmount_read_lock(cpu);
 		if (unlikely(!(mnt->mnt_flags & MNT_MOUNTED))) {
@@ -766,9 +767,11 @@ void mntput_no_expire(struct vfsmount *mnt)
 		return;
 	}
 
-repeat:
 	vfsmount_write_lock();
-	BUG_ON(mnt->mnt_flags & MNT_MOUNTED);
+	if (unlikely((mnt->mnt_flags & MNT_MOUNTED))) {
+		vfsmount_write_unlock();
+		goto repeat;
+	}
 	preempt_disable();
 	dec_mnt_count(mnt);
 	preempt_enable();
@@ -781,7 +784,9 @@ repeat:
 		__mntput(mnt);
 		return;
 	}
+	preempt_disable();
 	add_mnt_count(mnt, mnt->mnt_pinned + 1);
+	preempt_enable();
 	mnt->mnt_pinned = 0;
 	vfsmount_write_unlock();
 	acct_auto_close_mnt(mnt);


--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux