From: NeilBrown <[email protected]>

Proposed locking changes will mean that calling d_drop() could
effectively unlock the name allowing a parallel lookup to proceed.
For this reason it could only be called *after* the attempt to create a
symlink (in this case) has completed (whether successfully or not).

So move the d_drop() to after the venus_symlink() call.

Signed-off-by: NeilBrown <[email protected]>
---
 fs/coda/dir.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/fs/coda/dir.c b/fs/coda/dir.c
index c64b8cd81568..70eb6042fdaa 100644
--- a/fs/coda/dir.c
+++ b/fs/coda/dir.c
@@ -244,13 +244,13 @@ static int coda_symlink(struct mnt_idmap *idmap,
        if (symlen > CODA_MAXPATHLEN)
                return -ENAMETOOLONG;
 
+       error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len,
+                             symname, symlen);
        /*
-        * This entry is now negative. Since we do not create
+        * This entry is still negative. Since we did not create
         * an inode for the entry we have to drop it.
         */
        d_drop(de);
-       error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len,
-                             symname, symlen);
 
        /* mtime is no good anymore */
        if (!error)
-- 
2.50.0.107.gf914562f5916.dirty


Reply via email to