PERFORCE change 195355 for review

Ilya Putsikau ilya at FreeBSD.org
Sun Jun 26 09:54:29 UTC 2011


http://p4web.freebsd.org/@@195355?ac=10

Change 195355 by ilya at ilya_triton2011 on 2011/06/26 09:53:37

	Add fuse_isdeadfs checks, check LINK_MAX in vnop_link, IO_NDELAY in vnop_close
	Handle not initialized session in vnop_access

Affected files ...

.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 edit
.. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 edit

Differences ...

==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 (text+ko) ====

@@ -129,6 +129,10 @@
         /* NOTREACHED */
     }
 
+    if (fuse_isdeadfs(vp)) {
+        goto out;
+    }
+
     if (vnode_isdir(vp)) {
         op = FUSE_RELEASEDIR;
         isdir = 1;

==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 (text+ko) ====

@@ -109,9 +109,8 @@
 
 static __inline__
 int
-fuse_isdeadfs(struct vnode *vp)
+fuse_isdeadfs_mp(struct mount *mp)
 {
-    struct mount *mp = vnode_mount(vp);
     struct fuse_data *data = fuse_get_mpdata(mp);
 
     return (data->dataflags & FSESS_DEAD);
@@ -119,11 +118,16 @@
 
 static __inline__
 int
-fuse_isdeadfs_mp(struct mount *mp)
+fuse_isdeadfs(struct vnode *vp)
 {
-    struct fuse_data *data = fuse_get_mpdata(mp);
+    return fuse_isdeadfs_mp(vnode_mount(vp));
+}
 
-    return (data->dataflags & FSESS_DEAD);
+static __inline__
+int
+fuse_isdeadfs_fs(struct vnode *vp)
+{
+    return fuse_isdeadfs_mp(vnode_mount(vp));
 }
 
 /* access */

==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 (text+ko) ====

@@ -47,4 +47,6 @@
 
 #endif
 
+#define FUSE_LINK_MAX                      LINK_MAX
+
 #endif /* _FUSE_PARAM_H_ */

==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 (text+ko) ====

@@ -47,6 +47,7 @@
 #include "fuse_internal.h"
 #include "fuse_ipc.h"
 #include "fuse_node.h"
+#include "fuse_param.h"
 #include "fuse_io.h"
 
 #include <sys/priv.h>
@@ -140,9 +141,11 @@
 {
     struct vnode *vp      = ap->a_vp;
     int           accmode = ap->a_accmode;
+    struct ucred *cred    = ap->a_cred;
 
     struct fuse_access_param facp;
     struct fuse_vnode_data *fvdat = VTOFUD(vp);
+    struct fuse_data *data = fuse_get_mpdata(vnode_mount(vp));
 
     fuse_trace_printf_vnop();
 
@@ -153,6 +156,16 @@
         return EBADF;
     }
 
+    if (!(data->dataflags & FSESS_INITED)) {
+        if (vnode_isvroot(vp)) {
+            if (priv_check_cred(cred, PRIV_VFS_ADMIN, 0) ||
+               (fuse_match_cred(data->daemoncred, cred) == 0)) {
+                return 0;
+            }
+        }
+        return EBADF;
+    }
+
     if (vnode_islnk(vp)) {
         return 0;
     }
@@ -186,7 +199,11 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
+        return 0;
+    }
+
+    if (fflag & IO_NDELAY) {
         return 0;
     }
 
@@ -242,7 +259,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(dvp)) {
+    if (fuse_isdeadfs_fs(dvp)) {
         panic("FUSE: fuse_vnop_create(): called on a dead file system");
     }
 
@@ -386,7 +403,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return 0;
     }
 
@@ -557,6 +574,8 @@
     struct vnode         *tdvp    = ap->a_tdvp;
     struct componentname *cnp     = ap->a_cnp;
 
+    struct vattr      *vap = VTOVA(vp);
+
     struct fuse_dispatcher fdi;
     struct fuse_entry_out *feo;
     struct fuse_link_in    fli;
@@ -565,14 +584,18 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
-        panic("fuse_vnop_link(): called on a dead file system");
+    if (fuse_isdeadfs_fs(vp)) {
+        panic("FUSE: fuse_vnop_link(): called on a dead file system");
     }
 
     if (vnode_mount(tdvp) != vnode_mount(vp)) {
         return EXDEV;
     }
 
+    if (vap->va_nlink >= FUSE_LINK_MAX) {
+        return EMLINK;
+    }
+
     fli.oldnodeid = VTOI(vp);
 
     fdisp_init(&fdi, 0);
@@ -1039,7 +1062,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(dvp)) {
+    if (fuse_isdeadfs_fs(dvp)) {
         panic("FUSE: fuse_vnop_mkdir(): called on a dead file system");
     }
 
@@ -1077,7 +1100,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(dvp)) {
+    if (fuse_isdeadfs_fs(dvp)) {
         panic("fuse_vnop_mknod(): called on a dead file system");
     }
 
@@ -1193,7 +1216,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return EIO;
     }
 
@@ -1226,7 +1249,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return EBADF;
     }
 
@@ -1283,7 +1306,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return EBADF;
     }
 
@@ -1376,7 +1399,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs_fs(vp)) {
         panic("FUSE: fuse_vnop_remove(): called on a dead file system");
     }
 
@@ -1420,8 +1443,8 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(fdvp)) {
-        panic("fuse_vnop_rename(): called on a dead file system");
+    if (fuse_isdeadfs_fs(fdvp)) {
+        panic("FUSE: fuse_vnop_rename(): called on a dead file system");
     }
 
     if (fvp->v_mount != tdvp->v_mount ||
@@ -1491,8 +1514,8 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(ap->a_vp)) {
-        panic("fuse_vnop_rmdir(): called on a dead file system");
+    if (fuse_isdeadfs_fs(vp)) {
+        panic("FUSE: fuse_vnop_rmdir(): called on a dead file system");
     }
 
     if (VTOFUD(vp) == VTOFUD(dvp)) {
@@ -1555,7 +1578,7 @@
      * ...
      */
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return EBADF;
     }
 
@@ -1740,6 +1763,10 @@
     int err;
     size_t len;
 
+    if (fuse_isdeadfs_fs(dvp)) {
+        panic("FUSE: fuse_vnop_symlink(): called on a dead file system");
+    }
+
     /*
      * Unlike the other creator type calls, here we have to create a message
      * where the name of the new entry comes first, and the data describing
@@ -1783,7 +1810,7 @@
 
     fuse_trace_printf_vnop();
 
-    if (fuse_isdeadfs_nop(vp)) {
+    if (fuse_isdeadfs(vp)) {
         return EIO;
     }
 


More information about the p4-projects mailing list