tech-kern archive

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

Re: PUFFS race on parent mtime update



Emmanuel Dreyfus <manu%netbsd.org@localhost> wrote:

> The patch below seems to fix the problem: update parent directory mtime/ctime
> cache when 
> - creating or removing an object
> - renaming an object (update both source and destination)
> 
> Opinion?

Update fixing an error in rename

Index: sys/fs/puffs/puffs_node.c
===================================================================
RCS file: /cvsroot/src/sys/fs/puffs/puffs_node.c,v
retrieving revision 1.23.2.2
diff -U 4 -r1.23.2.2 puffs_node.c
--- sys/fs/puffs/puffs_node.c   12 Aug 2012 12:59:50 -0000      1.23.2.2
+++ sys/fs/puffs/puffs_node.c   5 Sep 2014 04:32:10 -0000
@@ -248,8 +248,11 @@
 
        if (PUFFS_USE_NAMECACHE(pmp))
                cache_enter(dvp, vp, cnp);
 
+        puffs_updatenode(VPTOPP(dvp),
+                         PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME, 0);
+
        return 0;
 }
 
 void
Index: sys/fs/puffs/puffs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/puffs/puffs_vnops.c,v
retrieving revision 1.163.2.4
diff -U 4 -r1.163.2.4 puffs_vnops.c
--- sys/fs/puffs/puffs_vnops.c  12 Aug 2012 13:13:20 -0000      1.163.2.4
+++ sys/fs/puffs/puffs_vnops.c  5 Sep 2014 04:32:11 -0000
@@ -1791,8 +1798,11 @@
        error = puffs_msg_wait2(pmp, park_remove, dpn, pn);
 
        PUFFS_MSG_RELEASE(remove);
 
+       puffs_updatenode(VPTOPP(dvp),
+                        PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME, 0);
+
        RELEPN_AND_VP(dvp, dpn);
        RELEPN_AND_VP(vp, pn);
 
        error = checkerr(pmp, error, __func__);
@@ -1909,8 +1919,11 @@
        error = puffs_msg_wait2(pmp, park_rmdir, dpn, pn);
 
        PUFFS_MSG_RELEASE(rmdir);
 
+       puffs_updatenode(VPTOPP(dvp),
+                        PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME, 0);
+
        /* XXX: some call cache_purge() *for both vnodes* here, investigate */
        RELEPN_AND_VP(dvp, dpn);
        RELEPN_AND_VP(vp, pn);
 
@@ -1954,10 +1967,13 @@
        /*
         * XXX: stay in touch with the cache.  I don't like this, but
         * don't have a better solution either.  See also puffs_rename().
         */
-       if (error == 0)
+       if (error == 0) {
                puffs_updatenode(pn, PUFFS_UPDATECTIME, 0);
+               puffs_updatenode(VPTOPP(dvp),
+                                PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME, 0);
+       }
 
        RELEPN_AND_VP(dvp, dpn);
        puffs_releasenode(pn);
 
@@ -2121,8 +2137,14 @@
         * don't have a better solution either.  See also puffs_link().
         */
        if (error == 0) {
                puffs_updatenode(fpn, PUFFS_UPDATECTIME, 0);
+               puffs_updatenode(VPTOPP(fdvp),
+                                PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME, 0);
+               if (fdvp != tdvp)
+                       puffs_updatenode(VPTOPP(tdvp),
+                                        PUFFS_UPDATECTIME|PUFFS_UPDATEMTIME,
+                                        0);
 
                if (PUFFS_USE_DOTDOTCACHE(pmp) &&
                    (VPTOPP(fvp)->pn_parent != tdvp))
                        update_parent(fvp, tdvp);

-- 
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index