fix unpaired rcu lock in prepend_path()
authorLi Zhong <zhong@linux.vnet.ibm.com>
Wed, 13 Nov 2013 07:21:51 +0000 (15:21 +0800)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 13 Nov 2013 12:43:10 +0000 (07:43 -0500)
Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index 1f24cd6..eacc853 100644 (file)
@@ -2924,6 +2924,7 @@ static int prepend_path(const struct path *path,
 restart_mnt:
        read_seqbegin_or_lock(&mount_lock, &m_seq);
        seq = 0;
+       rcu_read_lock();
 restart:
        bptr = *buffer;
        blen = *buflen;
@@ -2971,6 +2972,9 @@ restart:
                goto restart;
        }
        done_seqretry(&rename_lock, seq);
+
+       if (!(m_seq & 1))
+               rcu_read_unlock();
        if (need_seqretry(&mount_lock, m_seq)) {
                m_seq = 1;
                goto restart_mnt;