To use this patch, run these commands for a successful build:
patch -p1 <patches/adaptec_acl_mods.diff
./prepare-source
./configure --enable-acl-support
make
Philip Lowman wrote:
> Attached is a small patch which allows the preservation of the delete,
> chmod, and chown bits which Adaptec has added to XFS on their SnapOS NAS
> units. This is nice for backing up files between different NAS units
> and preserving all of the Samba ACLs.
>
> I'm not sure how useful this patch will be because I'm not sure if any
> other NAS vendors have standardized on their extensions to POSIX ACLs to
> support Samba in the same manner that Adaptec has. FWIW, though, this
> will allow you to preserve acls when copying between different Adaptec
> based NAS units running SnapOS.
I (Wayne) tweaked the patch to work with the latest source.
Todo:
Fix a bug that could lose some bits when stripping some (supposedly)
superfluous ACL info.
based-on: d73762eea3f15f2c56bb3fa9394ad1883c25c949
diff --git a/lib/sysacls.c b/lib/sysacls.c
--- a/lib/sysacls.c
+++ b/lib/sysacls.c
@@ -31,6 +31,18 @@
#endif
#define DEBUG(x,y)
+/* These are custom ACL bits used by Adaptec's modifications
+ * to XFS on their SnapOS units. */
+#ifndef ACL_DELETE
+#define ACL_DELETE 8
+#endif
+#ifndef ACL_CHMOD
+#define ACL_CHMOD 16
+#endif
+#ifndef ACL_CHOWN
+#define ACL_CHOWN 32
+#endif
+
void SAFE_FREE(void *mem)
{
if (mem)
@@ -100,6 +112,9 @@ int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *b
return -1;
*bits_p = (acl_get_perm(permset, ACL_READ) ? 4 : 0)
+ | (acl_get_perm(permset, ACL_CHOWN) ? 32 : 0)
+ | (acl_get_perm(permset, ACL_CHMOD) ? 16 : 0)
+ | (acl_get_perm(permset, ACL_DELETE) ? 8 : 0)
| (acl_get_perm(permset, ACL_WRITE) ? 2 : 0)
| (acl_get_perm(permset, ACL_EXECUTE) ? 1 : 0);
@@ -144,6 +159,12 @@ int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)
if ((rc = acl_get_permset(entry, &permset)) != 0)
return rc;
acl_clear_perms(permset);
+ if (bits & 32)
+ acl_add_perm(permset, ACL_CHOWN);
+ if (bits & 16)
+ acl_add_perm(permset, ACL_CHMOD);
+ if (bits & 8)
+ acl_add_perm(permset, ACL_DELETE);
if (bits & 4)
acl_add_perm(permset, ACL_READ);
if (bits & 2)
diff --git a/lib/sysacls.h b/lib/sysacls.h
--- a/lib/sysacls.h
+++ b/lib/sysacls.h
@@ -59,8 +59,8 @@
#define SMB_ACL_TYPE_ACCESS ACL_TYPE_ACCESS
#define SMB_ACL_TYPE_DEFAULT ACL_TYPE_DEFAULT
-#define SMB_ACL_VALID_NAME_BITS (4 | 2 | 1)
-#define SMB_ACL_VALID_OBJ_BITS (4 | 2 | 1)
+#define SMB_ACL_VALID_NAME_BITS (32 | 16 | 8 | 4 | 2 | 1)
+#define SMB_ACL_VALID_OBJ_BITS (32 | 16 | 8 | 4 | 2 | 1)
#define SMB_ACL_NEED_SORT