#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#include <pwd.h>
-#include <grp.h>
#include "pot.h"
#include "common.h"
#include "quotaio.h"
#include "quotasys.h"
#include "dqblk_xfs.h"
+#include "quotaio_generic.h"
#define XFS_USRQUOTA(h) ((h)->qh_type == USRQUOTA && \
(h)->qh_info.u.xfs_mdqi.qs_flags & XFS_QUOTA_UDQ_ACCT)
return 0;
xfs_util2kerndqblk(&xdqblk, &dquot->dq_dqb);
- xdqblk.d_fieldmask |= FS_DQ_LIMIT_MASK;
+ xdqblk.d_flags |= XFS_USRQUOTA(h) ? XFS_USER_QUOTA : XFS_GROUP_QUOTA;
+ xdqblk.d_id = id;
+ if (strcmp(h->qh_fstype, MNTTYPE_GFS2) == 0) {
+ if (flags & COMMIT_LIMITS) /* warn/limit */
+ xdqblk.d_fieldmask |= FS_DQ_BSOFT | FS_DQ_BHARD;
+ if (flags & COMMIT_USAGE) /* block usage */
+ xdqblk.d_fieldmask |= FS_DQ_BCOUNT;
+ } else {
+ xdqblk.d_fieldmask |= FS_DQ_LIMIT_MASK;
+ }
+
qcmd = QCMD(Q_XFS_SETQLIM, h->qh_type);
if (quotactl(qcmd, h->qh_quotadev, id, (void *)&xdqblk) < 0) {
;
/*
* xfs_scan_dquots helper - processes a single dquot
*/
-static int xfs_scan_dquot(struct quota_handle *h,
- struct xfs_kern_dqblk *d,
- char *name, struct dquot *dq,
- int (*process_dquot) (struct dquot *dquot, char *dqname))
+static int xfs_get_dquot(struct dquot *dq)
{
- int qcmd = QCMD(Q_XFS_GETQUOTA, h->qh_type);
-
- memset(d, 0, sizeof(struct xfs_kern_dqblk));
-
- if (quotactl(qcmd, h->qh_quotadev, dq->dq_id, (void *)d) < 0) {
- return 0;
+ struct xfs_kern_dqblk d;
+ int qcmd = QCMD(Q_XFS_GETQUOTA, dq->dq_h->qh_type);
+ int ret;
+
+ memset(&d, 0, sizeof(d));
+ ret = quotactl(qcmd, dq->dq_h->qh_quotadev, dq->dq_id, (void *)&d);
+ if (ret < 0) {
+ if (errno == ENOENT)
+ return 0;
+ return -1;
}
- if (d->d_blk_hardlimit == 0 &&
- d->d_blk_softlimit == 0 &&
- d->d_ino_hardlimit == 0 &&
- d->d_ino_softlimit == 0 && d->d_bcount == 0 && d->d_icount == 0) return 0;
- xfs_kern2utildqblk(&dq->dq_dqb, d);
- return process_dquot(dq, name);
+ xfs_kern2utildqblk(&dq->dq_dqb, &d);
+ return 0;
}
/*
*/
static int xfs_scan_dquots(struct quota_handle *h, int (*process_dquot) (struct dquot *dquot, char *dqname))
{
- struct dquot *dq;
- struct xfs_kern_dqblk d;
- int rd = 0;
-
if (!XFS_USRQUOTA(h) && !XFS_GRPQUOTA(h))
- return rd;
-
- dq = get_empty_dquot();
- dq->dq_h = h;
- if (h->qh_type == USRQUOTA) {
- struct passwd *usr;
-
- setpwent();
- while ((usr = getpwent()) != NULL) {
- dq->dq_id = usr->pw_uid;
- rd = xfs_scan_dquot(h, &d, usr->pw_name, dq, process_dquot);
- if (rd < 0)
- break;
- }
- endpwent();
- }
- else { /* GRPQUOTA */
- struct group *grp;
-
- setgrent();
- while ((grp = getgrent()) != NULL) {
- dq->dq_id = grp->gr_gid;
- rd = xfs_scan_dquot(h, &d, grp->gr_name, dq, process_dquot);
- if (rd < 0)
- break;
- }
- endgrent();
- }
+ return 0;
- free(dq);
- return rd;
+ return generic_scan_dquots(h, process_dquot, xfs_get_dquot);
}
/*