aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijeyalakshumi Koteeswaran <kvinupriya@gmail.com>2024-03-18 19:26:29 +0000
committerKa Ho Ng <khng@FreeBSD.org>2024-03-18 21:12:18 +0000
commit60bc9617e79e99bdf670304923f3baed4b749ad3 (patch)
tree38bf1bf621770df65c3e3bbf04db0ae68e230500
parente34ea0196f4497d3f3939025aff3a89ee77b652e (diff)
downloadsrc-60bc9617e79e99bdf670304923f3baed4b749ad3.tar.gz
src-60bc9617e79e99bdf670304923f3baed4b749ad3.zip
kerneldump: add livedump_start_vnode(9)
livedump_start_vnode(9) is introduced such that the live minidump on the system could take a vnode. This interface could be used to extend support for the existing framework in downstream. Bump __FreeBSD_version for introducing livedump_start_vnode(9). Sponsored by: Juniper Networks, Inc. Reviewed by: khng Differential Revision: https://reviews.freebsd.org/D43471
-rw-r--r--sys/kern/kern_vnodedumper.c32
-rw-r--r--sys/sys/kerneldump.h1
-rw-r--r--sys/sys/param.h2
3 files changed, 25 insertions, 10 deletions
diff --git a/sys/kern/kern_vnodedumper.c b/sys/kern/kern_vnodedumper.c
index 0104369b9d67..5a2c255390cc 100644
--- a/sys/kern/kern_vnodedumper.c
+++ b/sys/kern/kern_vnodedumper.c
@@ -61,11 +61,8 @@ int
livedump_start(int fd, int flags, uint8_t compression)
{
#if MINIDUMP_PAGE_TRACKING == 1
- struct dumperinfo di, *livedi;
- struct diocskerneldump_arg kda;
- struct vnode *vp;
struct file *fp;
- void *rl_cookie;
+ struct vnode *vp;
int error;
error = priv_check(curthread, PRIV_KMEM_READ);
@@ -84,8 +81,27 @@ livedump_start(int fd, int flags, uint8_t compression)
error = EBADF;
goto drop;
}
+ error = livedump_start_vnode(vp, flags, compression);
+ if (error != 0)
+ goto drop;
+drop:
+ fdrop(fp, curthread);
+ return (error);
+#else
+ return (EOPNOTSUPP);
+#endif /* MINIDUMP_PAGE_TRACKING == 1 */
+}
- /* Set up a new dumper. */
+int
+livedump_start_vnode(struct vnode *vp, int flags, uint8_t compression)
+{
+#if MINIDUMP_PAGE_TRACKING == 1
+ struct dumperinfo di, *livedi;
+ struct diocskerneldump_arg kda;
+ void *rl_cookie;
+ int error;
+
+ /* Set up a new dumper. */
bzero(&di, sizeof(di));
di.dumper_start = vnode_dumper_start;
di.dumper = vnode_dump;
@@ -97,13 +113,13 @@ livedump_start(int fd, int flags, uint8_t compression)
kda.kda_compression = compression;
error = dumper_create(&di, "livedump", &kda, &livedi);
if (error != 0)
- goto drop;
+ return (error);
/* Only allow one livedump to proceed at a time. */
if (sx_try_xlock(&livedump_sx) == 0) {
dumper_destroy(livedi);
error = EBUSY;
- goto drop;
+ return (error);
}
/* To be used by the callback functions. */
@@ -126,8 +142,6 @@ out:
vn_rangelock_unlock(vp, rl_cookie);
sx_xunlock(&livedump_sx);
dumper_destroy(livedi);
-drop:
- fdrop(fp, curthread);
return (error);
#else
return (EOPNOTSUPP);
diff --git a/sys/sys/kerneldump.h b/sys/sys/kerneldump.h
index 46f05b3c130d..1f03c4b9c2d5 100644
--- a/sys/sys/kerneldump.h
+++ b/sys/sys/kerneldump.h
@@ -161,6 +161,7 @@ void dumpsys_pb_progress(size_t);
extern int do_minidump;
int livedump_start(int, int, uint8_t);
+int livedump_start_vnode(struct vnode *, int, uint8_t);
/* Live minidump events */
typedef void (*livedump_start_fn)(void *arg, int *errorp);
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 4369aba9bb46..d56255431ba2 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -73,7 +73,7 @@
* cannot include sys/param.h and should only be updated here.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1500015
+#define __FreeBSD_version 1500016
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,