Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Aug 2011 21:37:33 GMT
From:      Ilya Putsikau <ilya@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 197036 for review
Message-ID:  <201108012137.p71LbXxZ066542@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@197036?ac=10

Change 197036 by ilya@ilya_triton2011 on 2011/08/01 21:36:33

	Use per file system rename lock
	Print 'filehandle not valid' message only if it's meaningful
	Correct setparent in rename, clear node parent reference
	Invalidate buffers for revoked vnode, flush buffers only for files
	Add reclaim_revoked sysctl

Affected files ...

.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_file.c#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_io.c#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_ipc.c#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_ipc.h#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_node.c#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_node.h#2 edit
.. //depot/projects/soc2011/ilya_fuse/fuse/fuse_vnops.c#2 edit

Differences ...

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_file.c#2 (text+ko) ====

@@ -50,11 +50,11 @@
     int oflags = 0;
     int op     = FUSE_OPEN;
 
-    fuse_trace_printf("fuse_filehandle_get(vp=%p, fufh_type=%d)\n",
+    fuse_trace_printf("fuse_filehandle_open(vp=%p, fufh_type=%d)\n",
                       vp, fufh_type);
 
     if (fuse_filehandle_valid(vp, fufh_type)) {
-        panic("FUSE: filehandle_get called despite valid fufh (type=%d)",
+        panic("FUSE: filehandle_open called despite valid fufh (type=%d)",
               fufh_type);
         /* NOTREACHED */
     }
@@ -173,10 +173,8 @@
     struct fuse_filehandle *fufh;
 
     fufh = &(fvdat->fufh[fufh_type]);
-    if (!FUFH_IS_VALID(fufh)) {
-        printf("FUSE: filehandle is not valid (type=%d)\n", fufh_type);
+    if (!FUFH_IS_VALID(fufh))
 	return EBADF;
-    }
     if (fufhp != NULL)
         *fufhp = fufh;
     return 0;

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_io.c#2 (text+ko) ====

@@ -65,7 +65,7 @@
     err = fuse_filehandle_getrw(vp,
         (uio->uio_rw == UIO_READ) ? FUFH_RDONLY : FUFH_WRONLY, &fufh);
     if (err) {
-        DEBUG("fetching filehandle failed\n");
+        printf("FUSE: io dispatch: filehandles are closed\n");
         return err;
     }
 
@@ -562,7 +562,7 @@
     error = fuse_filehandle_getrw(vp,
 	(bp->b_iocmd == BIO_READ) ? FUFH_RDONLY : FUFH_WRONLY, &fufh);
     if (error) {
-        DEBUG("fetching filehandle failed\n");
+        printf("FUSE: strategy: filehandles are closed\n");
         bp->b_ioflags |= BIO_ERROR;
         bp->b_error = error;
         return (error);

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_ipc.c#2 (text+ko) ====

@@ -346,10 +346,7 @@
     TAILQ_INIT(&data->aw_head);
     data->daemoncred = crhold(cred);
     data->daemon_timeout = FUSE_DEFAULT_DAEMON_TIMEOUT;
-
-#ifdef FUSE_EXPLICIT_RENAME_LOCK
     sx_init(&data->rename_lock, "fuse rename lock");
-#endif
 
     return data;
 }
@@ -376,9 +373,7 @@
     /* Driving off stage all that stuff thrown at device... */
     mtx_destroy(&data->ms_mtx);
     mtx_destroy(&data->aw_mtx);
-#ifdef FUSE_EXPLICIT_RENAME_LOCK
     sx_destroy(&data->rename_lock);
-#endif
 
     crfree(data->daemoncred);
 

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_ipc.h#2 (text+ko) ====

@@ -138,9 +138,7 @@
 
     u_long                     ticketer;
 
-#ifdef FUSE_EXPLICIT_RENAME_LOCK
     struct sx                  rename_lock;
-#endif
 
     uint32_t                   fuse_libabi_major;
     uint32_t                   fuse_libabi_minor;

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_node.c#2 (text+ko) ====

@@ -192,7 +192,7 @@
         return err;
     }
 
-    if (dvp != NULL && vnode_vtype(*vpp) == VDIR) {
+    if (dvp != NULL) {
         MPASS((cnp->cn_flags & ISDOTDOT) == 0);
         MPASS(!(cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.'));
         fuse_vnode_setparent(*vpp, dvp);

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_node.h#2 (text+ko) ====

@@ -76,7 +76,7 @@
 static __inline void
 fuse_vnode_setparent(struct vnode *vp, struct vnode *dvp)
 {
-    if (vp->v_type == VDIR) {
+    if (dvp != NULL && vp->v_type == VDIR) {
         MPASS(dvp->v_type == VDIR);
         VTOFUD(vp)->parent_nid = VTOI(dvp);
     }

==== //depot/projects/soc2011/ilya_fuse/fuse/fuse_vnops.c#2 (text+ko) ====

@@ -122,6 +122,10 @@
 SYSCTL_INT(_vfs_fuse, OID_AUTO, lookup_cache_enable, CTLFLAG_RW,
            &fuse_lookup_cache_enable, 0, "");
 
+static int fuse_reclaim_revoked = 1;
+SYSCTL_INT(_vfs_fuse, OID_AUTO, reclaim_revoked, CTLFLAG_RW,
+           &fuse_reclaim_revoked, 0, "");
+
 int fuse_pbuf_freecnt = -1;
 
 #if __FreeBSD_version >= 900011
@@ -551,11 +555,12 @@
     for (type = 0; type < FUFH_MAXTYPE; type++) {
         fufh = &(fvdat->fufh[type]);
         if (FUFH_IS_VALID(fufh)) {
-            if (need_flush) {
+            if (need_flush && vp->v_type == VREG) {
                 if ((VTOFUD(vp)->flag & FN_SIZECHANGE) != 0) {
                     fuse_vnode_savesize(vp, NULL);
                 }
-                if (fuse_data_cache_invalidate)
+                if (fuse_data_cache_invalidate ||
+                        (fvdat->flag & FN_REVOKED) != 0)
                     fuse_io_invalbuf(vp, td);
                 else
                     fuse_io_flushbuf(vp, MNT_WAIT, td);
@@ -565,7 +570,7 @@
         }
     }
 
-    if ((fvdat->flag & FN_REVOKED) != 0) {
+    if ((fvdat->flag & FN_REVOKED) != 0 && fuse_reclaim_revoked) {
         vrecycle(vp, td);
     }
 
@@ -935,9 +940,7 @@
             if (err) {
                 goto out;
             }
-            if (vnode_vtype(vp) == VDIR) {
-                fuse_vnode_setparent(vp, dvp);
-            }
+            fuse_vnode_setparent(vp, dvp);
             *vpp = vp;
         }
 
@@ -1349,6 +1352,7 @@
                                   fvdat->nlookup);
     }
 
+    fuse_vnode_setparent(vp, NULL);
     cache_purge(vp);
     vfs_hash_remove(vp);
     vnode_destroy_vobject(vp);
@@ -1415,6 +1419,7 @@
     struct vnode *tdvp         = ap->a_tdvp;
     struct vnode *tvp          = ap->a_tvp;
     struct componentname *tcnp = ap->a_tcnp;
+    struct fuse_data *data;
 
     int err = 0;
 
@@ -1442,17 +1447,21 @@
      * under the source directory in the file system tree.
      * Linux performs this check at VFS level.
      */
+    data = fuse_get_mpdata(vnode_mount(tdvp));
+    sx_xlock(&data->rename_lock);
     err = fuse_internal_rename(fdvp, fcnp, tdvp, tcnp);
-
     if (err == 0) {
         fuse_invalidate_attr(fdvp);
         if (tdvp != fdvp) {
+            fuse_vnode_setparent(fvp, tdvp);
             fuse_invalidate_attr(tdvp);
         }
+        if (tvp != NULL)
+            fuse_vnode_setparent(tvp, NULL);
     }
+    sx_unlock(&data->rename_lock);
 
     if (tvp != NULL && tvp != fvp) {
-        fuse_vnode_setparent(tvp, tdvp);
         cache_purge(tvp);
     }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108012137.p71LbXxZ066542>