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