Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Add functions to open devices by device number or path.
details: https://anonhg.NetBSD.org/src/rev/7e7bd52134ab
branches: trunk
changeset: 460917:7e7bd52134ab
user: mlelstv <mlelstv%NetBSD.org@localhost>
date: Sun Nov 10 06:47:30 2019 +0000
description:
Add functions to open devices by device number or path.
diffstat:
sys/kern/vfs_vnops.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-
sys/sys/vnode.h | 6 ++++-
2 files changed, 60 insertions(+), 3 deletions(-)
diffs (102 lines):
diff -r 032590976922 -r 7e7bd52134ab sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c Sun Nov 10 00:54:57 2019 +0000
+++ b/sys/kern/vfs_vnops.c Sun Nov 10 06:47:30 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_vnops.c,v 1.201 2019/09/15 20:24:25 christos Exp $ */
+/* $NetBSD: vfs_vnops.c,v 1.202 2019/11/10 06:47:30 mlelstv Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.201 2019/09/15 20:24:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.202 2019/11/10 06:47:30 mlelstv Exp $");
#include "veriexec.h"
@@ -1189,3 +1189,56 @@
return VOCALL(fifo_vnodeop_p, ap->a_desc->vdesc_offset, v);
}
+
+/*
+ * Open block device by device number
+ */
+int
+vn_bdev_open(dev_t dev, struct vnode **vpp, struct lwp *l)
+{
+ int error;
+
+ if ((error = bdevvp(dev, vpp)) != 0)
+ return error;
+
+ if ((error = VOP_OPEN(*vpp, FREAD | FWRITE, l->l_cred)) != 0) {
+ vrele(*vpp);
+ return error;
+ }
+ mutex_enter((*vpp)->v_interlock);
+ (*vpp)->v_writecount++;
+ mutex_exit((*vpp)->v_interlock);
+
+ return 0;
+}
+
+/*
+ * Lookup the provided name in the filesystem. If the file exists,
+ * is a valid block device, and isn't being used by anyone else,
+ * set *vpp to the file's vnode.
+ */
+int
+vn_bdev_openpath(struct pathbuf *pb, struct vnode **vpp, struct lwp *l)
+{
+ struct nameidata nd;
+ struct vnode *vp;
+ dev_t dev;
+ enum vtype vt;
+ int error;
+
+ NDINIT(&nd, LOOKUP, FOLLOW, pb);
+ if ((error = vn_open(&nd, FREAD | FWRITE, 0)) != 0)
+ return error;
+
+ vp = nd.ni_vp;
+ dev = vp->v_rdev;
+ vt = vp->v_type;
+
+ VOP_UNLOCK(vp);
+ (void) vn_close(vp, FREAD | FWRITE, l->l_cred);
+
+ if (vt != VBLK)
+ return ENOTBLK;
+
+ return vn_bdev_open(dev, vpp, l);
+}
diff -r 032590976922 -r 7e7bd52134ab sys/sys/vnode.h
--- a/sys/sys/vnode.h Sun Nov 10 00:54:57 2019 +0000
+++ b/sys/sys/vnode.h Sun Nov 10 06:47:30 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.h,v 1.282 2019/09/26 20:57:19 christos Exp $ */
+/* $NetBSD: vnode.h,v 1.283 2019/11/10 06:47:30 mlelstv Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -490,6 +490,7 @@
struct file;
struct filedesc;
struct nameidata;
+struct pathbuf;
struct proc;
struct stat;
struct uio;
@@ -550,6 +551,9 @@
int vn_extattr_rm(struct vnode *, int, int, const char *, struct lwp *);
void vn_ra_allocctx(struct vnode *);
int vn_fifo_bypass(void *);
+int vn_bdev_open(dev_t, struct vnode **, struct lwp *);
+int vn_bdev_openpath(struct pathbuf *pb, struct vnode **, struct lwp *);
+
#ifdef DIAGNOSTIC
static __inline bool
Home |
Main Index |
Thread Index |
Old Index