aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2022-12-28 18:13:01 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2022-12-29 20:55:39 +0000
commit37b9fb169686e867987c8a1a9868f81137b9df2b (patch)
tree254d1aa0bc05e70c725033de0baf1560b155b1f8 /sys/kern/kern_descrip.c
parent4ac8f4067096a9d4a00e41cd53bd5c4fa295fd15 (diff)
downloadsrc-37b9fb169686e867987c8a1a9868f81137b9df2b.tar.gz
src-37b9fb169686e867987c8a1a9868f81137b9df2b.zip
Add descrip_check_write_mp() helper
... which verifies that given file table does not have file descriptors referencing vnodes on the specified mount point. It is up to the caller to ensure that the check is not racy. Reviewed by: mckusick Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D37896
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r--sys/kern/kern_descrip.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 63a7f8b2a6d7..0be59e930dd4 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -4172,6 +4172,29 @@ mountcheckdirs(struct vnode *olddp, struct vnode *newdp)
vrele(olddp);
}
+int
+descrip_check_write_mp(struct filedesc *fdp, struct mount *mp)
+{
+ struct file *fp;
+ struct vnode *vp;
+ int error, i;
+
+ error = 0;
+ FILEDESC_SLOCK(fdp);
+ FILEDESC_FOREACH_FP(fdp, i, fp) {
+ if (fp->f_type != DTYPE_VNODE ||
+ (atomic_load_int(&fp->f_flag) & FWRITE) == 0)
+ continue;
+ vp = fp->f_vnode;
+ if (vp->v_mount == mp) {
+ error = EDEADLK;
+ break;
+ }
+ }
+ FILEDESC_SUNLOCK(fdp);
+ return (error);
+}
+
struct filedesc_to_leader *
filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp,
struct proc *leader)