1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-28 07:21:54 +03:00

Group quotas patch from "Heinreichsberger, Helmut" <Helmut.Heinreichsberger@wincor-nixdorf.com>

Jeremy.
This commit is contained in:
Jeremy Allison 0001-01-01 00:00:00 +00:00
parent ec23396452
commit 06c9e91630

View File

@ -94,23 +94,30 @@ typedef struct _LINUX_SMB_DISK_QUOTA {
static int get_smb_linux_xfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QUOTA *dp) static int get_smb_linux_xfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QUOTA *dp)
{ {
int ret = -1; int ret = -1;
#ifdef HAVE_LINUX_XQM_H #ifdef HAVE_LINUX_XQM_H
struct fs_disk_quota D; struct fs_disk_quota D;
ZERO_STRUCT(D);
if ((ret = quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), path, euser_id, (caddr_t)&D))) ZERO_STRUCT(D);
return ret;
dp->bsize = (SMB_BIG_UINT)512; ret = quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), path, euser_id, (caddr_t)&D);
dp->softlimit = (SMB_BIG_UINT)D.d_blk_softlimit;
dp->hardlimit = (SMB_BIG_UINT)D.d_blk_hardlimit; /* As XFS has group quotas, if getting the user quota fails, try getting the group instead. */
dp->ihardlimit = (SMB_BIG_UINT)D.d_ino_hardlimit; if (ret) {
dp->isoftlimit = (SMB_BIG_UINT)D.d_ino_softlimit; ret = quotactl(QCMD(Q_XGETQUOTA,GRPQUOTA), path, getegid(), (caddr_t)&D);
dp->curinodes = (SMB_BIG_UINT)D.d_icount; if (ret)
dp->curblocks = (SMB_BIG_UINT)D.d_bcount; return ret;
}
dp->bsize = (SMB_BIG_UINT)512;
dp->softlimit = (SMB_BIG_UINT)D.d_blk_softlimit;
dp->hardlimit = (SMB_BIG_UINT)D.d_blk_hardlimit;
dp->ihardlimit = (SMB_BIG_UINT)D.d_ino_hardlimit;
dp->isoftlimit = (SMB_BIG_UINT)D.d_ino_softlimit;
dp->curinodes = (SMB_BIG_UINT)D.d_icount;
dp->curblocks = (SMB_BIG_UINT)D.d_bcount;
#endif #endif
return ret; return ret;
} }
/**************************************************************************** /****************************************************************************
@ -119,7 +126,7 @@ static int get_smb_linux_xfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QU
static int get_smb_linux_vfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QUOTA *dp) static int get_smb_linux_vfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QUOTA *dp)
{ {
int ret; int ret = 0;
#ifdef LINUX_QUOTAS_1 #ifdef LINUX_QUOTAS_1
struct dqblk D; struct dqblk D;
ZERO_STRUCT(D); ZERO_STRUCT(D);
@ -133,8 +140,14 @@ static int get_smb_linux_vfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QU
dp->bsize = (SMB_BIG_UINT)QUOTABLOCK_SIZE; dp->bsize = (SMB_BIG_UINT)QUOTABLOCK_SIZE;
#endif #endif
if ((ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), path, euser_id, (caddr_t)&D))) ret = quotactl(QCMD(Q_GETQUOTA,USRQUOTA), path, euser_id, (caddr_t)&D);
return -1;
/* Linux can have group quotas, if getting the user quota fails, try getting the group instead. */
if (ret) {
ret = quotactl(QCMD(Q_GETQUOTA,GRPQUOTA), path, getegid(), (caddr_t)&D);
if (ret)
return ret;
}
dp->softlimit = (SMB_BIG_UINT)D.dqb_bsoftlimit; dp->softlimit = (SMB_BIG_UINT)D.dqb_bsoftlimit;
dp->hardlimit = (SMB_BIG_UINT)D.dqb_bhardlimit; dp->hardlimit = (SMB_BIG_UINT)D.dqb_bhardlimit;
@ -148,7 +161,7 @@ static int get_smb_linux_vfs_quota(char *path, uid_t euser_id, LINUX_SMB_DISK_QU
dp->curblocks = ((SMB_BIG_UINT)D.dqb_curspace)/ dp->bsize; dp->curblocks = ((SMB_BIG_UINT)D.dqb_curspace)/ dp->bsize;
#endif #endif
return 0; return ret;
} }
/**************************************************************************** /****************************************************************************