--- src/unionfs.c.orig	2015-01-14 10:08:20 UTC
+++ src/unionfs.c
@@ -65,6 +65,13 @@
 #include "conf.h"
 #include "uioctl.h"
 
+// Patch pushed upstream: 
+// https://github.com/rpodgorny/unionfs-fuse/pull/40
+// Remove this as soon as pushed into a release.
+#ifdef IOCPARM_LEN
+#define _IOC_SIZE(nr) IOCPARM_LEN(nr)
+#endif
+
 static struct fuse_opt unionfs_opts[] = {
 	FUSE_OPT_KEY("chroot=%s,", KEY_CHROOT),
 	FUSE_OPT_KEY("cow", KEY_COW),
@@ -92,7 +99,12 @@ static int unionfs_chmod(const char *pat
 	char p[PATHLEN_MAX];
 	if (BUILD_PATH(p, uopt.branches[i].path, path)) RETURN(-ENAMETOOLONG);
 
+// Unsure of origin. Patch needs review.
+#if defined(__FreeBSD__) || defined(__MidnightBSD__)
+	int res = lchmod(p, mode);
+#else
 	int res = chmod(p, mode);
+#endif
 	if (res == -1) RETURN(-errno);
 
 	RETURN(0);
@@ -671,6 +683,9 @@ static int unionfs_truncate(const char *
 	RETURN(0);
 }
 
+// Patch pushed upstream: 
+// https://github.com/rpodgorny/unionfs-fuse/pull/39
+// Remove this as soon as pushed into a release.
 static int unionfs_utimens(const char *path, const struct timespec ts[2]) {
 	DBG("%s\n", path);
 
@@ -685,9 +700,9 @@ static int unionfs_utimens(const char *p
 #else
 	struct timeval tv[2];
 	tv[0].tv_sec = ts[0].tv_sec;
-	tv[0].tv_usec = ts[0].tv_nsec * 1000;
+	tv[0].tv_usec = ts[0].tv_nsec / 1000;
 	tv[1].tv_sec = ts[1].tv_sec;
-	tv[1].tv_usec = ts[1].tv_nsec * 1000;
+	tv[1].tv_usec = ts[1].tv_nsec / 1000;
 	int res = utimes(p, tv);
 #endif
 
