Module Name: src
Committed By: mlelstv
Date: Mon Jan 6 09:45:49 UTC 2025
Modified Files:
src/sys/miscfs/specfs: spec_vnops.c
Log Message:
Use correct type function for block and character devices.
Use DIOCGMEDIASSIZE ioctl when no partition info is available
to generate st_size information. This helps dk(4) and dm(4) devices.
To generate a diff of this commit:
cvs rdiff -u -r1.218 -r1.219 src/sys/miscfs/specfs/spec_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.218 src/sys/miscfs/specfs/spec_vnops.c:1.219
--- src/sys/miscfs/specfs/spec_vnops.c:1.218 Sat Apr 22 15:32:49 2023
+++ src/sys/miscfs/specfs/spec_vnops.c Mon Jan 6 09:45:49 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: spec_vnops.c,v 1.218 2023/04/22 15:32:49 riastradh Exp $ */
+/* $NetBSD: spec_vnops.c,v 1.219 2025/01/06 09:45:49 mlelstv Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.218 2023/04/22 15:32:49 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.219 2025/01/06 09:45:49 mlelstv Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -727,11 +727,11 @@ spec_open(void *v)
enum kauth_device_req req;
specnode_t *sn, *sn1;
specdev_t *sd;
+ int dtype;
spec_ioctl_t ioctl;
u_int gen = 0;
const char *name = NULL;
bool needclose = false;
- struct partinfo pi;
KASSERT(VOP_ISLOCKED(vp) == LK_EXCLUSIVE);
KASSERTMSG(vp->v_type == VBLK || vp->v_type == VCHR, "type=%d",
@@ -1038,11 +1038,28 @@ spec_open(void *v)
* forbidden to devsw_detach until closed). So it is safe to
* query cdev_type unconditionally here.
*/
- if (cdev_type(dev) == D_DISK) {
- ioctl = vp->v_type == VCHR ? cdev_ioctl : bdev_ioctl;
- if ((*ioctl)(dev, DIOCGPARTINFO, &pi, FREAD, curlwp) == 0)
- uvm_vnp_setsize(vp,
- (voff_t)pi.pi_secsize * pi.pi_size);
+ switch (vp->v_type) {
+ case VCHR:
+ ioctl = cdev_ioctl;
+ dtype = cdev_type(dev);
+ break;
+ default:
+ ioctl = bdev_ioctl;
+ dtype = bdev_type(dev);
+ break;
+ }
+ if (dtype == D_DISK) {
+ struct partinfo pi;
+ off_t sz;
+
+ error = (*ioctl)(dev, DIOCGPARTINFO, &pi, FREAD, curlwp);
+ if (error == 0)
+ sz = (off_t)pi.pi_size * pi.pi_secsize;
+ else if (error == ENOTTY)
+ error = (*ioctl)(dev, DIOCGMEDIASIZE, &sz, FREAD, curlwp);
+
+ if (error == 0)
+ uvm_vnp_setsize(vp, (voff_t)sz);
}
/* Success! */