summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_default.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2009-10-01 17:22:03 +0000
committertrasz <trasz@FreeBSD.org>2009-10-01 17:22:03 +0000
commitd5661d631d28fee99ac0a8758c56535ac2c9b01b (patch)
treef2b6e2088bb410fc3239074022c9d70c3c255caf /sys/kern/vfs_default.c
parentc6a1085feffa5fcd9040272aeae30e7f2466f754 (diff)
downloadFreeBSD-src-d5661d631d28fee99ac0a8758c56535ac2c9b01b.zip
FreeBSD-src-d5661d631d28fee99ac0a8758c56535ac2c9b01b.tar.gz
Provide default implementation for VOP_ACCESS(9), so that filesystems which
want to provide VOP_ACCESSX(9) don't have to implement both. Note that this commit makes implementation of either of these two mandatory. Reviewed by: kib
Diffstat (limited to 'sys/kern/vfs_default.c')
-rw-r--r--sys/kern/vfs_default.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 86ab01e..b80d03d 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -83,12 +83,17 @@ static int dirent_exists(struct vnode *vp, const char *dirname,
*
* If there is no specific entry here, we will return EOPNOTSUPP.
*
+ * Note that every filesystem has to implement either vop_access
+ * or vop_accessx; failing to do so will result in immediate crash
+ * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(),
+ * which calls vop_stdaccess() etc.
*/
struct vop_vector default_vnodeops = {
.vop_default = NULL,
.vop_bypass = VOP_EOPNOTSUPP,
+ .vop_access = vop_stdaccess,
.vop_accessx = vop_stdaccessx,
.vop_advlock = vop_stdadvlock,
.vop_advlockasync = vop_stdadvlockasync,
@@ -326,6 +331,16 @@ out:
}
int
+vop_stdaccess(struct vop_access_args *ap)
+{
+
+ KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN |
+ VAPPEND)) == 0, ("invalid bit in accmode"));
+
+ return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td));
+}
+
+int
vop_stdaccessx(struct vop_accessx_args *ap)
{
int error;
OpenPOWER on IntegriCloud