Page MenuHomeFreeBSD

D42672.id130355.diff
No OneTemporary

D42672.id130355.diff

diff --git a/sys/kern/vfs_mount.c.zfssnap b/sys/kern/vfs_mount.c
--- a/sys/kern/vfs_mount.c.zfssnap
+++ b/sys/kern/vfs_mount.c
@@ -3141,3 +3141,41 @@
}
mtx_unlock(&mountlist_mtx);
}
+
+/*
+ * Clone the mnt_exjail field to a new mount point.
+ */
+void
+vfs_exjail_clone(struct mount *inmp, struct mount *outmp)
+{
+ struct ucred *cr;
+ struct prison *pr;
+
+ MNT_ILOCK(inmp);
+ cr = inmp->mnt_exjail;
+ if (cr != NULL) {
+ crhold(cr);
+ MNT_IUNLOCK(inmp);
+ pr = cr->cr_prison;
+ sx_slock(&allprison_lock);
+ mtx_lock(&pr->pr_mtx);
+ if (!prison_isalive(pr)) {
+ mtx_unlock(&pr->pr_mtx);
+ sx_sunlock(&allprison_lock);
+ crfree(cr);
+ return;
+ }
+ mtx_unlock(&pr->pr_mtx);
+ MNT_ILOCK(outmp);
+ if (outmp->mnt_exjail == NULL) {
+ outmp->mnt_exjail = cr;
+ atomic_add_int(&cr->cr_prison->pr_exportcnt, 1);
+ cr = NULL;
+ }
+ MNT_IUNLOCK(outmp);
+ sx_sunlock(&allprison_lock);
+ if (cr != NULL)
+ crfree(cr);
+ } else
+ MNT_IUNLOCK(inmp);
+}
diff --git a/sys/sys/mount.h.zfssnap b/sys/sys/mount.h
--- a/sys/sys/mount.h.zfssnap
+++ b/sys/sys/mount.h
@@ -1017,6 +1017,7 @@
(struct mount *, struct netexport *, struct export_args *);
void vfs_periodic(struct mount *, int);
int vfs_busy(struct mount *, int);
+void vfs_exjail_clone(struct mount *, struct mount *);
void vfs_exjail_delete(struct prison *);
int vfs_export /* process mount export info */
(struct mount *, struct export_args *, bool);

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 14, 4:29 AM (11 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29651423
Default Alt Text
D42672.id130355.diff (1 KB)

Event Timeline