cd814ce
From 1be8727ae92a78a5e7fde5ecc6c59740ca2eabe4 Mon Sep 17 00:00:00 2001
cd814ce
From: Abhijith Das <adas@redhat.com>
cd814ce
Date: Tue, 1 Feb 2011 17:16:12 +0100
cd814ce
Subject: [PATCH] Add quotasync tool
cd814ce
cd814ce
Add tool allowing to sync quotas for some / all filesystems.
cd814ce
cd814ce
Signed-off-by: Jan Kara <jack@suse.cz>
cd814ce
cd814ce
Petr Pisar: Remove STRIP from Makefile.in
cd814ce
---
cd814ce
 Makefile.in |    8 ++-
cd814ce
 quotasync.c |  127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cd814ce
 2 files changed, 132 insertions(+), 3 deletions(-)
cd814ce
 create mode 100644 quotasync.c
cd814ce
cd814ce
diff --git a/Makefile.in b/Makefile.in
cd814ce
index aeaa79f..0b343a3 100644
cd814ce
--- a/Makefile.in
cd814ce
+++ b/Makefile.in
cd814ce
@@ -1,5 +1,5 @@
cd814ce
-PROGS         = quotacheck quotaon quota quot repquota warnquota quotastats xqmstats edquota setquota convertquota rpc.rquotad @QUOTA_NETLINK_PROG@
cd814ce
-SOURCES       = bylabel.c common.c convertquota.c edquota.c pot.c quot.c quota.c quotacheck.c quotacheck_v1.c quotacheck_v2.c quotaio.c quotaio_rpc.c quotaio_v1.c quotaio_v2.c quotaio_tree.c quotaio_xfs.c quotaio_meta.c quotaio_generic.c quotaon.c quotaon_xfs.c quotaops.c quotastats.c quotasys.c repquota.c rquota_client.c rquota_server.c rquota_svc.c setquota.c warnquota.c xqmstats.c svc_socket.c
cd814ce
+PROGS         = quotacheck quotaon quota quot repquota warnquota quotastats xqmstats edquota setquota convertquota rpc.rquotad quotasync @QUOTA_NETLINK_PROG@
cd814ce
+SOURCES       = bylabel.c common.c convertquota.c edquota.c pot.c quot.c quota.c quotacheck.c quotacheck_v1.c quotacheck_v2.c quotaio.c quotaio_rpc.c quotaio_v1.c quotaio_v2.c quotaio_tree.c quotaio_xfs.c quotaio_meta.c quotaio_generic.c quotaon.c quotaon_xfs.c quotaops.c quotastats.c quotasys.c repquota.c rquota_client.c rquota_server.c rquota_svc.c setquota.c warnquota.c xqmstats.c svc_socket.c quotasync.c
cd814ce
 CFLAGS        = @CFLAGS@ -D_GNU_SOURCE -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
cd814ce
 CPPFLAGS      = @CPPFLAGS@
cd814ce
 EXT2LIBS      = @EXT2LIBS@
cd814ce
@@ -94,7 +94,7 @@ install: all @INSTMO@
cd814ce
 	-mkdir -p $(ROOTDIR)$(mandir)/man8
cd814ce
 	-$(INSTALL) -m 755 -d $(ROOTDIR)$(includedir)/rpcsvc
cd814ce
 	-$(INSTALL) -m 644 rquota.h rquota.x $(ROOTDIR)$(includedir)/rpcsvc
cd814ce
-	-$(INSTALL) -m $(DEF_SBIN_MODE) quota $(ROOTDIR)$(bindir)
cd814ce
+	-$(INSTALL) -m $(DEF_SBIN_MODE) quota quotasync $(ROOTDIR)$(bindir)
cd814ce
 	-$(INSTALL) -m $(DEF_SBIN_MODE) rpc.rquotad $(ROOTDIR)$(sbindir)
cd814ce
 ifneq ($(NETLINKLIBS),)
cd814ce
 	-$(INSTALL) -m $(DEF_SBIN_MODE) quota_nld $(ROOTDIR)$(sbindir)
cd814ce
@@ -111,6 +111,8 @@ quotacheck: quotacheck.o quotacheck_v1.o quotacheck_v2.o quotaops.o $(LIBOBJS)
cd814ce
 
cd814ce
 quota: quota.o quotaops.o $(LIBOBJS)
cd814ce
 
cd814ce
+quotasync: quotasync.o $(LIBOBJS)
cd814ce
+
cd814ce
 quot: quot.o $(LIBOBJS)
cd814ce
 
cd814ce
 repquota: repquota.o $(LIBOBJS)
cd814ce
diff --git a/quotasync.c b/quotasync.c
cd814ce
new file mode 100644
cd814ce
index 0000000..0ce44c9
cd814ce
--- /dev/null
cd814ce
+++ b/quotasync.c
cd814ce
@@ -0,0 +1,127 @@
cd814ce
+#include <stdio.h>
cd814ce
+#include <stdlib.h>
cd814ce
+#include <unistd.h>
cd814ce
+#include <fcntl.h>
cd814ce
+#include <string.h>
cd814ce
+#include <errno.h>
cd814ce
+#include <getopt.h>
cd814ce
+
cd814ce
+#include "pot.h"
cd814ce
+#include "common.h"
cd814ce
+#include "quotasys.h"
cd814ce
+#include "quotaio.h"
cd814ce
+
cd814ce
+#define FL_USER 1		/* sync user quotas */
cd814ce
+#define FL_GROUP 2		/* sync group quotas */
cd814ce
+#define FL_ALL 4		/* sync quotas on all filesystems */
cd814ce
+
cd814ce
+int flags, fmt = -1;
cd814ce
+char **mnt;
cd814ce
+int mntcnt;
cd814ce
+char *progname;
cd814ce
+
cd814ce
+static void usage(void)
cd814ce
+{
cd814ce
+	errstr(_("Utility for syncing quotas.\nUsage:\n%s [-ug] -a | mntpoint...\n\n"), progname);
cd814ce
+	fprintf(stderr, _("Bugs to %s\n"), MY_EMAIL);
cd814ce
+	exit(1);
cd814ce
+}
cd814ce
+
cd814ce
+static void parse_options(int argcnt, char **argstr)
cd814ce
+{
cd814ce
+	int ret;
cd814ce
+	struct option long_opts[] = {
cd814ce
+		{ "user", 0, NULL, 'u' },
cd814ce
+		{ "group", 0, NULL, 'g' },
cd814ce
+		{ "all", 0, NULL, 'a' },
cd814ce
+		{ "version", 0, NULL, 'V' },
cd814ce
+		{ "help", 0, NULL, 'h' },
cd814ce
+		{ NULL, 0, NULL, 0 }
cd814ce
+	};
cd814ce
+
cd814ce
+	while ((ret = getopt_long(argcnt, argstr, "ahugV", long_opts, NULL)) != -1) {
cd814ce
+		switch (ret) {
cd814ce
+			case '?':
cd814ce
+			case 'h':
cd814ce
+				usage();
cd814ce
+			case 'V':
cd814ce
+				version();
cd814ce
+				exit(0);
cd814ce
+			case 'u':
cd814ce
+				flags |= FL_USER;
cd814ce
+				break;
cd814ce
+			case 'g':
cd814ce
+				flags |= FL_GROUP;
cd814ce
+				break;
cd814ce
+			case 'a':
cd814ce
+				flags |= FL_ALL;
cd814ce
+				break;
cd814ce
+		}
cd814ce
+	}
cd814ce
+
cd814ce
+	if ((flags & FL_ALL && optind != argcnt) ||
cd814ce
+	    (!(flags & FL_ALL) && optind == argcnt)) {
cd814ce
+		fputs(_("Bad number of arguments.\n"), stderr);
cd814ce
+		usage();
cd814ce
+	}
cd814ce
+	if (!(flags & FL_ALL)) {
cd814ce
+		mnt = argstr + optind;
cd814ce
+		mntcnt = argcnt - optind;
cd814ce
+	}
cd814ce
+	if (!(flags & (FL_USER | FL_GROUP)))
cd814ce
+		flags |= FL_USER;
cd814ce
+}
cd814ce
+
cd814ce
+static int sync_one(int type, char *dev)
cd814ce
+{
cd814ce
+	int qcmd = QCMD(Q_SYNC, type);
cd814ce
+
cd814ce
+	return quotactl(qcmd, dev, 0, NULL);
cd814ce
+}
cd814ce
+
cd814ce
+int syncquotas(int type)
cd814ce
+{
cd814ce
+	struct quota_handle **handles, *h;
cd814ce
+	int i, ret = 0;
cd814ce
+
cd814ce
+	if (flags & FL_ALL) {
cd814ce
+		if (sync_one(type, NULL) < 0)
cd814ce
+			errstr(_("%s quota sync failed: %s\n"), type2name(type),
cd814ce
+					strerror(errno));
cd814ce
+		return -1;
cd814ce
+	}
cd814ce
+
cd814ce
+	handles = create_handle_list(mntcnt, mnt, type, fmt,
cd814ce
+				     IOI_READONLY, MS_LOCALONLY | MS_NO_AUTOFS);
cd814ce
+
cd814ce
+	for (i = 0; handles[i]; i++) {
cd814ce
+		h = handles[i];
cd814ce
+		if (sync_one(type, h->qh_quotadev)) {
cd814ce
+			errstr(_("%s quota sync failed for %s: %s\n"),
cd814ce
+				type2name(type), h->qh_quotadev, strerror(errno));
cd814ce
+			ret = -1;
cd814ce
+		}
cd814ce
+	}
cd814ce
+	dispose_handle_list(handles);
cd814ce
+
cd814ce
+	return ret;
cd814ce
+}
cd814ce
+
cd814ce
+int main(int argc, char **argv)
cd814ce
+{
cd814ce
+	int ret = 0;
cd814ce
+
cd814ce
+	gettexton();
cd814ce
+	progname = basename(argv[0]);
cd814ce
+
cd814ce
+	parse_options(argc, argv);
cd814ce
+	init_kernel_interface();
cd814ce
+
cd814ce
+	if (flags & FL_USER)
cd814ce
+		if (syncquotas(USRQUOTA))
cd814ce
+			ret = 1;
cd814ce
+	if (flags & FL_GROUP)
cd814ce
+		if (syncquotas(GRPQUOTA))
cd814ce
+			ret = 1;
cd814ce
+	return ret;
cd814ce
+}
cd814ce
-- 
cd814ce
1.7.4
cd814ce