--- samba-4.14.0rc4/source3/modules/nfs4_acls.c	2021-01-21 14:20:40.000000000 +0100
+++ samba-4.14.0rc4-liu/source3/modules/nfs4_acls.c	2021-03-01 21:36:04.788576000 +0100
@@ -106,12 +106,16 @@
 	}
 
 	params->map_full_control = lp_acl_map_full_control(SNUM(conn));
+	
+	params->force_attrib_write = lp_parm_bool(SNUM(conn), SMBACL4_PARAM_TYPE_NAME,
+		"force_attrib_write", false);
 
-	DEBUG(10, ("mode:%s, do_chown:%s, acedup: %s map full control:%s\n",
+	DEBUG(10, ("mode:%s, do_chown:%s, acedup: %s, map full control:%s, fbsd write attr mode:%s\n",
 		enum_smbacl4_modes[params->mode].name,
 		params->do_chown ? "true" : "false",
 		enum_smbacl4_acedups[params->acedup].name,
-		params->map_full_control ? "true" : "false"));
+		params->map_full_control ? "true" : "false",
+		params->force_attrib_write ? "true" : "false"));
 
 	return 0;
 }
@@ -410,6 +414,23 @@
 		DEBUG(10, ("Windows mapped ace flags: 0x%x => 0x%x\n",
 		      ace->aceFlags, win_ace_flags));
 
+		/* https://bugzilla.samba.org/show_bug.cgi?id=13809
+		   Windows won't grant write access unless it also have write access on attrib so
+		   let's fake it. This is needed since the unix mode bits emulation of ZFS on FreeBSD
+		   creates an ACL without WRITE_ATTRIBUTES and WRITE_NAMED_ATTRS for group@/other@ entries.
+		*/
+		if (params->force_attrib_write) {
+			if (ace->aceMask & SMB_ACE4_WRITE_DATA) {
+				ace->aceMask |= (SMB_ACE4_WRITE_ATTRIBUTES|SMB_ACE4_WRITE_NAMED_ATTRS);
+			}
+			/*
+			if ((ace->aceMask & SMB_ACE4_READ_DATA) == 0) {
+				ace->aceMask &= ~(SMB_ACE4_READ_ATTRIBUTES|SMB_ACE4_READ_NAMED_ATTRS);
+			}
+			*/
+			DEBUG(10, ("Changing ACL, adding mask for win-compability." \
+				   " New mask: %x\n", ace->aceMask));
+		}
 		mask = ace->aceMask;
 
 		/* Mapping of owner@ and group@ to creator owner and
--- samba-4.14.0rc4/source3/modules/nfs4_acls.h	2021-01-21 14:20:40.000000000 +0100
+++ samba-4.14.0rc4-liu/source3/modules/nfs4_acls.h	2021-03-01 17:29:32.751080000 +0100
@@ -113,6 +113,7 @@
 	bool do_chown;
 	enum smbacl4_acedup_enum acedup;
 	bool map_full_control;
+	bool force_attrib_write;
 };
 
 int smbacl4_get_vfs_params(struct connection_struct *conn,
