[SCM] Samba Shared Repository - branch v4-4-test updated

Karolin Seeger kseeger at samba.org
Wed Jun 1 14:25:06 UTC 2016


The branch, v4-4-test has been updated
       via  445e678 smbd: dfree - ignore quota if not enforced
       via  b0f7275 selftest: add disk-free quota tests
       via  76abfe7 vfs_fake_dfq: add more mocking options
      from  8f142c8 s3:selftest add a test for rpcclient --pw-nt-hash option

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-4-test


- Log -----------------------------------------------------------------
commit 445e678626dc2a97c8d03d5515fef741fb8a1352
Author: Uri Simchoni <uri at samba.org>
Date:   Wed Apr 27 23:22:25 2016 +0300

    smbd: dfree - ignore quota if not enforced
    
    When calculating free disk space, do not take user quota
    into account if quota is globally not enforced on the file
    system.
    
    This is meant to fix a specific problem with XFS. One might
    say "why don't you fix the XFS-specific code instead?". The
    reason for that is that getting and setting quota must not
    be affected by whether quota is actually enforced. NTFS has
    the same notion of separating quota accounting (and being
    able to configure / retrieve configured quota), from quota
    enforcement.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11937
    
    Signed-off-by: Uri Simchoni <uri at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Sat May 28 00:09:05 CEST 2016 on sn-devel-144
    
    (cherry picked from commit 42151f6fa25fefc8a6ae7388ca85379c07c93e1e)
    
    Autobuild-User(v4-4-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-4-test): Wed Jun  1 16:23:59 CEST 2016 on sn-devel-144

commit b0f727534b062e3c2d73a18cbe039860999e30c5
Author: Uri Simchoni <uri at samba.org>
Date:   Thu May 26 22:52:09 2016 +0300

    selftest: add disk-free quota tests
    
    Add a test for situation where quota accounting is enabled
    but quota enforcement is disabled (disk-free should not take
    quota into account)
    
    Add a test for situation where overall quota status reporting
    (whether or not it's enforcing) is not supported - as with NFS.
    In that case it must be assumed that if quota is configured, then
    it is also enforced (as with NFS).
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11937
    
    Signed-off-by: Uri Simchoni <uri at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    (cherry picked from commit de2d624d071c338b356824d3b30ab2c9075c8528)

commit 76abfe79178a73e74485000129f065ab41fd6b51
Author: Uri Simchoni <uri at samba.org>
Date:   Thu May 26 21:59:38 2016 +0300

    vfs_fake_dfq: add more mocking options
    
    Add support for mocking FS user/group quotas (default quota and
    quota flags).
    
    Make the default block size 4096 instead of 0. This
    turns the default into "no quota" instead of "punt to
    lower VFS module" (that is, if the mock module is asked
    to retrieve quota of a user/group/default for which there
    is no config).
    
    Add support for ENOSYS error
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=11937
    
    Signed-off-by: Uri Simchoni <uri at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    (cherry picked from commit b5ac30e96ede7a68bc191b983b068b62cbc160ec)

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_fake_dfq.c           | 15 ++++++++++++++-
 source3/script/tests/test_dfree_quota.sh | 12 ++++++++++++
 source3/smbd/quotas.c                    | 32 +++++++++++++++++++++++++++++++-
 3 files changed, 57 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_fake_dfq.c b/source3/modules/vfs_fake_dfq.c
index e476e16..bf49860 100644
--- a/source3/modules/vfs_fake_dfq.c
+++ b/source3/modules/vfs_fake_dfq.c
@@ -110,6 +110,12 @@ static int dfq_get_quota(struct vfs_handle_struct *handle, const char *path,
 		section = talloc_asprintf(talloc_tos(), "g%llu",
 					  (unsigned long long)id.gid);
 		break;
+	case SMB_USER_FS_QUOTA_TYPE:
+		section = talloc_strdup(talloc_tos(), "udflt");
+		break;
+	case SMB_GROUP_FS_QUOTA_TYPE:
+		section = talloc_strdup(talloc_tos(), "gdflt");
+		break;
 	default:
 		break;
 	}
@@ -118,7 +124,7 @@ static int dfq_get_quota(struct vfs_handle_struct *handle, const char *path,
 		goto dflt;
 	}
 
-	bsize = dfq_load_param(snum, rpath, section, "block size", 0);
+	bsize = dfq_load_param(snum, rpath, section, "block size", 4096);
 	if (bsize == 0) {
 		goto dflt;
 	}
@@ -129,6 +135,12 @@ static int dfq_get_quota(struct vfs_handle_struct *handle, const char *path,
 		goto out;
 	}
 
+	if (dfq_load_param(snum, rpath, section, "nosys", 0) != 0) {
+		errno = ENOSYS;
+		rc = -1;
+		goto out;
+	}
+
 	ZERO_STRUCTP(qt);
 
 	qt->bsize = bsize;
@@ -140,6 +152,7 @@ static int dfq_get_quota(struct vfs_handle_struct *handle, const char *path,
 	qt->isoftlimit =
 	    dfq_load_param(snum, rpath, section, "inode soft limit", 0);
 	qt->curinodes = dfq_load_param(snum, rpath, section, "cur inodes", 0);
+	qt->qflags = dfq_load_param(snum, rpath, section, "qflags", QUOTAS_DENY_DISK);
 
 	if (dfq_load_param(snum, rpath, section, "edquot", 0) != 0) {
 		errno = EDQUOT;
diff --git a/source3/script/tests/test_dfree_quota.sh b/source3/script/tests/test_dfree_quota.sh
index 5392d3d..26199cc 100755
--- a/source3/script/tests/test_dfree_quota.sh
+++ b/source3/script/tests/test_dfree_quota.sh
@@ -64,6 +64,12 @@ trygrp1:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 55
 trygrp2:df:block size = 4096:disk free = 10:disk size = 80
 trygrp2:u$uid:block size = 4096:hard limit = 0:soft limit = 0:cur blocks = 41
 trygrp2:g$gid:block size = 4096:hard limit = 60:soft limit = 60:cur blocks = 56
+notenforce:df:block size = 4096:disk free = 10:disk size = 80
+notenforce:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
+notenforce:udflt:block size = 4096:qflags = 0
+nfs:df:block size = 4096:disk free = 10:disk size = 80
+nfs:u$uid:block size = 4096:hard limit = 40:soft limit = 40:cur blocks = 37
+nfs:udflt:nosys = 1
 ABC
 }
 
@@ -170,5 +176,11 @@ test_smbclient_dfree "Test quota->dfree inode hard limit" "subdir1" "ihlimit sub
 test_smbclient_dfree "Test quota->dfree err try group" "subdir1" "trygrp1 subdir1" "240 1024. 20" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
 test_smbclient_dfree "Test quota->dfree no-quota try group" "subdir1" "trygrp2 subdir1" "240 1024. 16" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
 
+#quota configured but not enforced
+test_smbclient_dfree "Test dfree share root quota not enforced" "." "notenforce ." "320 1024. 40" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
+
+#FS quota not implemented (NFS case)
+test_smbclient_dfree "Test dfree share root FS quota not implemented" "." "nfs ." "160 1024. 12" -U$USERNAME%$PASSWORD --option=clientmaxprotocol=SMB3 || failed=`expr $failed + 1`
+
 setup_conf
 exit $failed
diff --git a/source3/smbd/quotas.c b/source3/smbd/quotas.c
index 8e41416..d71b0a0 100644
--- a/source3/smbd/quotas.c
+++ b/source3/smbd/quotas.c
@@ -683,9 +683,24 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
 	SMB_DISK_QUOTA D;
 	unid_t id;
 
-	id.uid = geteuid();
+	/*
+	 * First of all, check whether user quota is
+	 * enforced. If the call fails, assume it is
+	 * not enforced.
+	 */
+	ZERO_STRUCT(D);
+	id.uid = -1;
+	r = SMB_VFS_GET_QUOTA(conn, path, SMB_USER_FS_QUOTA_TYPE, id, &D);
+	if (r == -1 && errno != ENOSYS) {
+		goto try_group_quota;
+	}
+	if (r == 0 && (D.qflags & QUOTAS_DENY_DISK) == 0) {
+		goto try_group_quota;
+	}
 
 	ZERO_STRUCT(D);
+	id.uid = geteuid();
+
 	r = SMB_VFS_GET_QUOTA(conn, path, SMB_USER_QUOTA_TYPE, id, &D);
 
 	/* Use softlimit to determine disk space, except when it has been exceeded */
@@ -722,6 +737,21 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
 	return True;
 	
 try_group_quota:
+	/*
+	 * First of all, check whether group quota is
+	 * enforced. If the call fails, assume it is
+	 * not enforced.
+	 */
+	ZERO_STRUCT(D);
+	id.gid = -1;
+	r = SMB_VFS_GET_QUOTA(conn, path, SMB_GROUP_FS_QUOTA_TYPE, id, &D);
+	if (r == -1 && errno != ENOSYS) {
+		return false;
+	}
+	if (r == 0 && (D.qflags & QUOTAS_DENY_DISK) == 0) {
+		return false;
+	}
+
 	id.gid = getegid();
 
 	ZERO_STRUCT(D);


-- 
Samba Shared Repository



More information about the samba-cvs mailing list