Page MenuHomeFreeBSD

D42672.id130401.diff
No OneTemporary

D42672.id130401.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,38 @@
}
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);
+ if (!prison_isalive(pr)) {
+ sx_sunlock(&allprison_lock);
+ crfree(cr);
+ return;
+ }
+ MNT_ILOCK(outmp);
+ if (outmp->mnt_exjail == NULL) {
+ outmp->mnt_exjail = cr;
+ atomic_add_int(&pr->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
Wed, Jul 29, 8:14 PM (5 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35713708
Default Alt Text
D42672.id130401.diff (1 KB)

Event Timeline