util-linux package update
Signed-off-by: basebuilder_pel7ppc64bebuilder0 <basebuilder@powerel.org>master
parent
f3811ac703
commit
463d4feef9
|
@ -0,0 +1,22 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/kill.c.kzak util-linux-2.23.2/misc-utils/kill.c
|
||||||
|
--- util-linux-2.23.2/misc-utils/kill.c.kzak 2013-06-13 09:46:10.448650861 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/kill.c 2014-09-25 10:08:27.879359310 +0200
|
||||||
|
@@ -48,6 +48,7 @@
|
||||||
|
#include <ctype.h> /* for isdigit() */
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
|
||||||
|
#include "c.h"
|
||||||
|
#include "nls.h"
|
||||||
|
@@ -279,8 +280,9 @@ int main (int argc, char *argv[])
|
||||||
|
the rest of the arguments should be process ids and names.
|
||||||
|
kill them. */
|
||||||
|
for (errors = 0; (arg = *argv) != NULL; argv++) {
|
||||||
|
+ errno = 0;
|
||||||
|
pid = strtol (arg, &ep, 10);
|
||||||
|
- if (! *ep)
|
||||||
|
+ if (errno == 0 && ep && *ep == '\0' && arg < ep)
|
||||||
|
errors += kill_verbose (arg, pid, numsig);
|
||||||
|
else {
|
||||||
|
struct proc_processes *ps = proc_open_processes();
|
|
@ -0,0 +1,11 @@
|
||||||
|
diff -up util-linux-2.23.2/login-utils/login.c.kzak util-linux-2.23.2/login-utils/login.c
|
||||||
|
--- util-linux-2.23.2/login-utils/login.c.kzak 2013-07-30 10:39:26.222738397 +0200
|
||||||
|
+++ util-linux-2.23.2/login-utils/login.c 2013-09-09 09:01:39.923225757 +0200
|
||||||
|
@@ -502,7 +502,7 @@ static void log_lastlog(struct login_con
|
||||||
|
if (!cxt->pwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- fd = open(_PATH_LASTLOG, O_RDWR, 0);
|
||||||
|
+ fd = open(_PATH_LASTLOG, O_RDWR | O_CREAT, 0);
|
||||||
|
if (fd < 0)
|
||||||
|
return;
|
|
@ -0,0 +1,149 @@
|
||||||
|
diff -up util-linux-2.23.2/term-utils/agetty.c.kzak util-linux-2.23.2/term-utils/agetty.c
|
||||||
|
--- util-linux-2.23.2/term-utils/agetty.c.kzak 2013-07-30 11:14:18.124912322 +0200
|
||||||
|
+++ util-linux-2.23.2/term-utils/agetty.c 2013-09-09 09:07:46.406689270 +0200
|
||||||
|
@@ -132,13 +132,20 @@ struct options {
|
||||||
|
int delay; /* Sleep seconds before prompt */
|
||||||
|
int nice; /* Run login with this priority */
|
||||||
|
int numspeed; /* number of baud rates to try */
|
||||||
|
+ int clocal; /* CLOCAL_MODE_* */
|
||||||
|
speed_t speeds[MAX_SPEED]; /* baud rates to be tried */
|
||||||
|
};
|
||||||
|
|
||||||
|
+enum {
|
||||||
|
+ CLOCAL_MODE_AUTO = 0,
|
||||||
|
+ CLOCAL_MODE_ALWAYS,
|
||||||
|
+ CLOCAL_MODE_NEVER
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
#define F_PARSE (1<<0) /* process modem status messages */
|
||||||
|
#define F_ISSUE (1<<1) /* display /etc/issue */
|
||||||
|
#define F_RTSCTS (1<<2) /* enable RTS/CTS flow control */
|
||||||
|
-#define F_LOCAL (1<<3) /* force local */
|
||||||
|
+
|
||||||
|
#define F_INITSTRING (1<<4) /* initstring is set */
|
||||||
|
#define F_WAITCRLF (1<<5) /* wait for CR or LF */
|
||||||
|
#define F_CUSTISSUE (1<<6) /* give alternative issue file */
|
||||||
|
@@ -235,10 +242,13 @@ static void login_options_to_argv(char *
|
||||||
|
static char *fakehost;
|
||||||
|
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
-#define debug(s) do { fprintf(dbf,s); fflush(dbf); } while (0)
|
||||||
|
+# ifndef DEBUG_OUTPUT
|
||||||
|
+# define DEBUG_OUTPUT "/dev/ttyp0"
|
||||||
|
+# endif
|
||||||
|
+# define debug(s) do { fprintf(dbf,s); fflush(dbf); } while (0)
|
||||||
|
FILE *dbf;
|
||||||
|
#else
|
||||||
|
-#define debug(s) do { ; } while (0)
|
||||||
|
+# define debug(s) do { ; } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
@@ -270,7 +280,7 @@ int main(int argc, char **argv)
|
||||||
|
sigaction(SIGINT, &sa, &sa_int);
|
||||||
|
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
- dbf = fopen("/dev/ttyp0", "w");
|
||||||
|
+ dbf = fopen(DEBUG_OUTPUT, "w");
|
||||||
|
for (int i = 1; i < argc; i++)
|
||||||
|
debug(argv[i]);
|
||||||
|
#endif /* DEBUGGING */
|
||||||
|
@@ -311,8 +321,10 @@ int main(int argc, char **argv)
|
||||||
|
strlen(options.initstring));
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!serial_tty_option(&options, F_LOCAL))
|
||||||
|
- /* Go to blocking write mode unless -L is specified. */
|
||||||
|
+ if (options.flags & F_VCONSOLE || options.clocal != CLOCAL_MODE_ALWAYS)
|
||||||
|
+ /* Go to blocking mode unless -L is specified, this change
|
||||||
|
+ * affects stdout, stdin and stderr as all the file descriptors
|
||||||
|
+ * are created by dup(). */
|
||||||
|
fcntl(STDOUT_FILENO, F_SETFL,
|
||||||
|
fcntl(STDOUT_FILENO, F_GETFL, 0) & ~O_NONBLOCK);
|
||||||
|
|
||||||
|
@@ -420,6 +432,12 @@ int main(int argc, char **argv)
|
||||||
|
options.tty);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef DEBUGGING
|
||||||
|
+ fprintf(dbf, "read %c\n", ch);
|
||||||
|
+ if (close_stream(dbf) != 0)
|
||||||
|
+ log_err("write failed: %s", DEBUG_OUTPUT);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* Let the login program take care of password validation. */
|
||||||
|
execv(options.login, login_argv);
|
||||||
|
log_err(_("%s: can't exec %s: %m"), options.tty, login_argv[0]);
|
||||||
|
@@ -534,7 +552,7 @@ static void parse_args(int argc, char **
|
||||||
|
{ "init-string", required_argument, 0, 'I' },
|
||||||
|
{ "noclear", no_argument, 0, 'J' },
|
||||||
|
{ "login-program", required_argument, 0, 'l' },
|
||||||
|
- { "local-line", no_argument, 0, 'L' },
|
||||||
|
+ { "local-line", optional_argument, 0, 'L' },
|
||||||
|
{ "extract-baud", no_argument, 0, 'm' },
|
||||||
|
{ "skip-login", no_argument, 0, 'n' },
|
||||||
|
{ "nonewline", no_argument, 0, 'N' },
|
||||||
|
@@ -603,7 +621,18 @@ static void parse_args(int argc, char **
|
||||||
|
op->login = optarg;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
- op->flags |= F_LOCAL;
|
||||||
|
+ /* -L and -L=always have the same meaning */
|
||||||
|
+ op->clocal = CLOCAL_MODE_ALWAYS;
|
||||||
|
+ if (optarg) {
|
||||||
|
+ if (strcmp(optarg, "=always") == 0)
|
||||||
|
+ op->clocal = CLOCAL_MODE_ALWAYS;
|
||||||
|
+ else if (strcmp(optarg, "=never") == 0)
|
||||||
|
+ op->clocal = CLOCAL_MODE_NEVER;
|
||||||
|
+ else if (strcmp(optarg, "=auto") == 0)
|
||||||
|
+ op->clocal = CLOCAL_MODE_AUTO;
|
||||||
|
+ else
|
||||||
|
+ log_err(_("unssuported --local-line mode argument"));
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
op->flags |= F_PARSE;
|
||||||
|
@@ -1090,8 +1119,19 @@ static void termio_init(struct options *
|
||||||
|
cfsetispeed(tp, ispeed);
|
||||||
|
cfsetospeed(tp, ospeed);
|
||||||
|
|
||||||
|
- if (op->flags & F_LOCAL)
|
||||||
|
- tp->c_cflag |= CLOCAL;
|
||||||
|
+ /* The default is to follow setting from kernel, but it's possible
|
||||||
|
+ * to explicitly remove/add CLOCAL flag by -L[=<mode>]*/
|
||||||
|
+ switch (op->clocal) {
|
||||||
|
+ case CLOCAL_MODE_ALWAYS:
|
||||||
|
+ tp->c_cflag |= CLOCAL; /* -L or -L=always */
|
||||||
|
+ break;
|
||||||
|
+ case CLOCAL_MODE_NEVER:
|
||||||
|
+ tp->c_cflag &= ~CLOCAL; /* -L=never */
|
||||||
|
+ break;
|
||||||
|
+ case CLOCAL_MODE_AUTO: /* -L=auto */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#ifdef HAVE_STRUCT_TERMIOS_C_LINE
|
||||||
|
tp->c_line = 0;
|
||||||
|
#endif
|
||||||
|
@@ -1412,9 +1452,10 @@ static char *get_logname(struct options
|
||||||
|
|
||||||
|
if (read(STDIN_FILENO, &c, 1) < 1) {
|
||||||
|
|
||||||
|
- /* Do not report trivial like EINTR/EIO errors. */
|
||||||
|
+ /* The terminal could be open with O_NONBLOCK when
|
||||||
|
+ * -L (force CLOCAL) is specified... */
|
||||||
|
if (errno == EINTR || errno == EAGAIN) {
|
||||||
|
- usleep(1000);
|
||||||
|
+ usleep(250000);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (errno) {
|
||||||
|
@@ -1648,7 +1689,7 @@ static void __attribute__ ((__noreturn__
|
||||||
|
fputs(_(" -i, --noissue do not display issue file\n"), out);
|
||||||
|
fputs(_(" -I, --init-string <string> set init string\n"), out);
|
||||||
|
fputs(_(" -l, --login-program <file> specify login program\n"), out);
|
||||||
|
- fputs(_(" -L, --local-line force local line\n"), out);
|
||||||
|
+ fputs(_(" -L, --local-line[=<mode>] cotrol local line flag\n"), out);
|
||||||
|
fputs(_(" -m, --extract-baud extract baud rate during connect\n"), out);
|
||||||
|
fputs(_(" -n, --skip-login do not prompt for login\n"), out);
|
||||||
|
fputs(_(" -o, --login-options <opts> options that are passed to login\n"), out);
|
|
@ -0,0 +1,176 @@
|
||||||
|
diff -up util-linux-2.23.2/include/pathnames.h.kzak util-linux-2.23.2/include/pathnames.h
|
||||||
|
--- util-linux-2.23.2/include/pathnames.h.kzak 2013-07-30 10:39:26.201738190 +0200
|
||||||
|
+++ util-linux-2.23.2/include/pathnames.h 2013-09-12 13:05:35.928359383 +0200
|
||||||
|
@@ -63,6 +63,7 @@
|
||||||
|
|
||||||
|
/* used in term-utils/agetty.c */
|
||||||
|
#define _PATH_ISSUE "/etc/issue"
|
||||||
|
+#define _PATH_OS_RELEASE "/etc/os-release"
|
||||||
|
#define _PATH_NUMLOCK_ON _PATH_LOCALSTATEDIR "/numlock-on"
|
||||||
|
|
||||||
|
#define _PATH_LOGINDEFS "/etc/login.defs"
|
||||||
|
diff -up util-linux-2.23.2/term-utils/agetty.8.kzak util-linux-2.23.2/term-utils/agetty.8
|
||||||
|
--- util-linux-2.23.2/term-utils/agetty.8.kzak 2013-07-30 10:58:20.889261333 +0200
|
||||||
|
+++ util-linux-2.23.2/term-utils/agetty.8 2013-09-12 13:05:35.928359383 +0200
|
||||||
|
@@ -310,6 +310,14 @@ Insert the current date.
|
||||||
|
.TP
|
||||||
|
s
|
||||||
|
Insert the system name, the name of the operating system. Same as `uname \-s'.
|
||||||
|
+See also \\S escape code.
|
||||||
|
+.TP
|
||||||
|
+S or S{VARIABLE}
|
||||||
|
+Insert the VARIABLE data from \fI/etc/os-release\fP. If the VARIABLE argument
|
||||||
|
+is not specified then use PRETTY_NAME from the file or the system name (see \\s).
|
||||||
|
+This escape code allows to keep \fI/etc/issue\fP distribution and release
|
||||||
|
+independent. Note that \\S{ANSI_COLOR} is converted to the real terminal
|
||||||
|
+escape sequence.
|
||||||
|
.TP
|
||||||
|
l
|
||||||
|
Insert the name of the current tty line.
|
||||||
|
@@ -368,11 +376,14 @@ the system status file.
|
||||||
|
.B /etc/issue
|
||||||
|
printed before the login prompt.
|
||||||
|
.TP
|
||||||
|
+.B /etc/os-release
|
||||||
|
+operating system identification data.
|
||||||
|
+.TP
|
||||||
|
.B /dev/console
|
||||||
|
problem reports (if syslog(3) is not used).
|
||||||
|
.TP
|
||||||
|
.B /etc/inittab
|
||||||
|
-\fIinit\fP(8) configuration file.
|
||||||
|
+\fIinit\fP(8) configuration file for SysV-style init daemon.
|
||||||
|
.SH BUGS
|
||||||
|
.ad
|
||||||
|
.fi
|
||||||
|
diff -up util-linux-2.23.2/term-utils/agetty.c.kzak util-linux-2.23.2/term-utils/agetty.c
|
||||||
|
--- util-linux-2.23.2/term-utils/agetty.c.kzak 2013-09-12 13:05:35.927359379 +0200
|
||||||
|
+++ util-linux-2.23.2/term-utils/agetty.c 2013-09-12 13:05:35.929359388 +0200
|
||||||
|
@@ -129,6 +129,7 @@ struct options {
|
||||||
|
char *issue; /* alternative issue file */
|
||||||
|
char *erasechars; /* string with erase chars */
|
||||||
|
char *killchars; /* string with kill chars */
|
||||||
|
+ char *osrelease; /* /etc/os-release data */
|
||||||
|
int delay; /* Sleep seconds before prompt */
|
||||||
|
int nice; /* Run login with this priority */
|
||||||
|
int numspeed; /* number of baud rates to try */
|
||||||
|
@@ -431,7 +432,8 @@ int main(int argc, char **argv)
|
||||||
|
log_warn(_("%s: can't change process priority: %m"),
|
||||||
|
options.tty);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ if (options.osrelease)
|
||||||
|
+ free(options.osrelease);
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
fprintf(dbf, "read %c\n", ch);
|
||||||
|
if (close_stream(dbf) != 0)
|
||||||
|
@@ -1279,6 +1281,84 @@ static char *xgetdomainname(void)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static char *read_os_release(struct options *op, const char *varname)
|
||||||
|
+{
|
||||||
|
+ int fd = -1;
|
||||||
|
+ struct stat st;
|
||||||
|
+ size_t varsz = strlen(varname);
|
||||||
|
+ char *p, *buf = NULL, *ret = NULL;
|
||||||
|
+
|
||||||
|
+ /* read the file only once */
|
||||||
|
+ if (!op->osrelease) {
|
||||||
|
+ fd = open(_PATH_OS_RELEASE, O_RDONLY);
|
||||||
|
+ if (fd == -1) {
|
||||||
|
+ log_warn(_("cannot open: %s: %m"), _PATH_OS_RELEASE);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (fstat(fd, &st) < 0 || st.st_size > 4 * 1024 * 1024)
|
||||||
|
+ goto done;
|
||||||
|
+
|
||||||
|
+ op->osrelease = malloc(st.st_size + 1);
|
||||||
|
+ if (!op->osrelease)
|
||||||
|
+ log_err(_("failed to allocate memory: %m"));
|
||||||
|
+ if (read_all(fd, op->osrelease, st.st_size) != (ssize_t) st.st_size) {
|
||||||
|
+ free(op->osrelease);
|
||||||
|
+ op->osrelease = NULL;
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+ op->osrelease[st.st_size] = 0;
|
||||||
|
+ }
|
||||||
|
+ buf = strdup(op->osrelease);
|
||||||
|
+ if (!buf)
|
||||||
|
+ log_err(_("failed to allocate memory: %m"));
|
||||||
|
+ p = buf;
|
||||||
|
+
|
||||||
|
+ for (;;) {
|
||||||
|
+ char *eol, *eon;
|
||||||
|
+
|
||||||
|
+ p += strspn(p, "\n\r");
|
||||||
|
+ p += strspn(p, " \t\n\r");
|
||||||
|
+ if (!*p)
|
||||||
|
+ break;
|
||||||
|
+ if (strspn(p, "#;\n") != 0) {
|
||||||
|
+ p += strcspn(p, "\n\r");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (strncmp(p, varname, varsz) != 0) {
|
||||||
|
+ p += strcspn(p, "\n\r");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ p += varsz;
|
||||||
|
+ p += strspn(p, " \t\n\r=\"");
|
||||||
|
+ eol = p + strcspn(p, "\n\r");
|
||||||
|
+ *eol = '\0';
|
||||||
|
+ eon = eol-1;
|
||||||
|
+ while (eon > p) {
|
||||||
|
+ if (*eon == '\t' || *eon == ' ') {
|
||||||
|
+ eon--;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (*eon == '"') {
|
||||||
|
+ *eon = '\0';
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ if (ret)
|
||||||
|
+ free(ret);
|
||||||
|
+ ret = strdup(p);
|
||||||
|
+ if (!ret)
|
||||||
|
+ log_err(_("failed to allocate memory: %m"));
|
||||||
|
+ p = eol + 1;
|
||||||
|
+ }
|
||||||
|
+done:
|
||||||
|
+ free(buf);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ close(fd);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Show login prompt, optionally preceded by /etc/issue contents. */
|
||||||
|
static void do_prompt(struct options *op, struct termios *tp)
|
||||||
|
{
|
||||||
|
@@ -1968,6 +2048,24 @@ static void output_special_char(unsigned
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+ case 'S':
|
||||||
|
+ {
|
||||||
|
+ char *var = NULL, varname[64];
|
||||||
|
+
|
||||||
|
+ if (get_escape_argument(fp, varname, sizeof(varname)))
|
||||||
|
+ var = read_os_release(op, varname);
|
||||||
|
+ else if (!(var = read_os_release(op, "PRETTY_NAME")))
|
||||||
|
+ var = uts.sysname;
|
||||||
|
+ if (var) {
|
||||||
|
+ if (strcmp(varname, "ANSI_COLOR") == 0)
|
||||||
|
+ printf("\033[%sm", var);
|
||||||
|
+ else
|
||||||
|
+ printf("%s", var);
|
||||||
|
+ if (var != uts.sysname)
|
||||||
|
+ free(var);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
case 'u':
|
||||||
|
case 'U':
|
||||||
|
{
|
|
@ -0,0 +1,41 @@
|
||||||
|
From 7ab32ae64d05f018c171ba1525bc337805d84391 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Fri, 11 Oct 2013 11:16:23 +0200
|
||||||
|
Subject: [PATCH] blockdev: add note about --setbsz usability
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
disk-utils/blockdev.8 | 4 +++-
|
||||||
|
disk-utils/blockdev.c | 2 +-
|
||||||
|
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/disk-utils/blockdev.8 b/disk-utils/blockdev.8
|
||||||
|
index 2b3d64c..f4282da 100644
|
||||||
|
--- a/disk-utils/blockdev.8
|
||||||
|
+++ b/disk-utils/blockdev.8
|
||||||
|
@@ -68,7 +68,9 @@ Get size in 512-byte sectors.
|
||||||
|
.IP "\fB\-\-rereadpt\fP"
|
||||||
|
Reread partition table
|
||||||
|
.IP "\fB\-\-setbsz\fP \fIbytes\fP"
|
||||||
|
-Set blocksize.
|
||||||
|
+Set blocksize. Note that the block size is specific to the current file
|
||||||
|
+descriptor opening the block device, so the change of block size only persists
|
||||||
|
+for as long as blockdev has the device open, and is lost once blockdev exits.
|
||||||
|
.IP "\fB\-\-setfra\fP \fIsectors\fP"
|
||||||
|
Set filesystem readahead (same like --setra on 2.6 kernels).
|
||||||
|
.IP "\fB\-\-setra\fP \fIsectors\fP"
|
||||||
|
diff --git a/disk-utils/blockdev.c b/disk-utils/blockdev.c
|
||||||
|
index 4543818..d030217 100644
|
||||||
|
--- a/disk-utils/blockdev.c
|
||||||
|
+++ b/disk-utils/blockdev.c
|
||||||
|
@@ -127,7 +127,7 @@ static const struct bdc bdcms[] =
|
||||||
|
.argname = "<bytes>",
|
||||||
|
.argtype = ARG_INT,
|
||||||
|
.flags = FL_NORESULT,
|
||||||
|
- .help = N_("set blocksize")
|
||||||
|
+ .help = N_("set blocksize on file descriptor opening the block device")
|
||||||
|
},{
|
||||||
|
IOCTL_ENTRY(BLKGETSIZE),
|
||||||
|
.name = "--getsize",
|
||||||
|
--
|
||||||
|
1.8.3.1
|
|
@ -0,0 +1,21 @@
|
||||||
|
diff -up util-linux-2.23.2/disk-utils/fsck.c.kzak util-linux-2.23.2/disk-utils/fsck.c
|
||||||
|
--- util-linux-2.23.2/disk-utils/fsck.c.kzak 2013-06-13 09:46:10.377650254 +0200
|
||||||
|
+++ util-linux-2.23.2/disk-utils/fsck.c 2014-03-25 12:46:59.525939425 +0100
|
||||||
|
@@ -437,10 +437,14 @@ static void load_fs_info(void)
|
||||||
|
if (mnt_table_parse_fstab(fstab, path)) {
|
||||||
|
if (!path)
|
||||||
|
path = mnt_get_fstab_path();
|
||||||
|
- if (errno)
|
||||||
|
- warn(_("%s: failed to parse fstab"), path);
|
||||||
|
- else
|
||||||
|
- warnx(_("%s: failed to parse fstab"), path);
|
||||||
|
+
|
||||||
|
+ /* don't print error when there is no fstab at all */
|
||||||
|
+ if (access(path, F_OK) == 0) {
|
||||||
|
+ if (errno)
|
||||||
|
+ warn(_("%s: failed to parse fstab"), path);
|
||||||
|
+ else
|
||||||
|
+ warnx(_("%s: failed to parse fstab"), path);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
From 44baaedaffee029dca76796b933412d97a19dff6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Mon, 9 Sep 2013 10:57:50 +0200
|
||||||
|
Subject: [PATCH] libfdisk: fix SIGFPE
|
||||||
|
|
||||||
|
#0 recount_geometry at libfdisk/src/alignment.c:143
|
||||||
|
#1 fdisk_discover_geometry at libfdisk/src/alignment.c:205
|
||||||
|
#2 fdisk_context_assign_device at libfdisk/src/context.c:173
|
||||||
|
#3 print_partition_table_from_option at fdisks/fdisk.c:924
|
||||||
|
|
||||||
|
References: https://bugzilla.redhat.com/show_bug.cgi?id=1005566
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
libfdisk/src/alignment.c | 9 +++++----
|
||||||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libfdisk/src/alignment.c b/libfdisk/src/alignment.c
|
||||||
|
index ac44e73..4d4ab48 100644
|
||||||
|
--- a/libfdisk/src/alignment.c
|
||||||
|
+++ b/libfdisk/src/alignment.c
|
||||||
|
@@ -193,11 +193,12 @@ int fdisk_discover_geometry(struct fdisk_context *cxt)
|
||||||
|
|
||||||
|
/* what the kernel/bios thinks the geometry is */
|
||||||
|
blkdev_get_geometry(cxt->dev_fd, &h, &s);
|
||||||
|
- if (!h && !s) {
|
||||||
|
- /* unable to discover geometry, use default values */
|
||||||
|
- s = 63;
|
||||||
|
+
|
||||||
|
+ /* defaults */
|
||||||
|
+ if (!h)
|
||||||
|
h = 255;
|
||||||
|
- }
|
||||||
|
+ if (!s)
|
||||||
|
+ s = 63;
|
||||||
|
|
||||||
|
/* obtained heads and sectors */
|
||||||
|
cxt->geom.heads = h;
|
||||||
|
--
|
||||||
|
1.8.1.4
|
|
@ -0,0 +1,80 @@
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/tab.c.kzak util-linux-2.23.2/libmount/src/tab.c
|
||||||
|
--- util-linux-2.23.2/libmount/src/tab.c.kzak 2013-07-30 10:39:26.218738358 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/tab.c 2014-09-25 10:53:43.525269554 +0200
|
||||||
|
@@ -47,6 +47,8 @@
|
||||||
|
#include "strutils.h"
|
||||||
|
#include "loopdev.h"
|
||||||
|
|
||||||
|
+static int is_mountinfo(struct libmnt_table *tb);
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* mnt_new_table:
|
||||||
|
*
|
||||||
|
@@ -233,7 +235,7 @@ int mnt_table_get_root_fs(struct libmnt_
|
||||||
|
assert(tb);
|
||||||
|
assert(root);
|
||||||
|
|
||||||
|
- if (!tb || !root)
|
||||||
|
+ if (!tb || !root || !is_mountinfo(tb))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
DBG(TAB, mnt_debug_h(tb, "lookup root fs"));
|
||||||
|
@@ -241,8 +243,6 @@ int mnt_table_get_root_fs(struct libmnt_
|
||||||
|
mnt_reset_iter(&itr, MNT_ITER_FORWARD);
|
||||||
|
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
|
||||||
|
int id = mnt_fs_get_parent_id(fs);
|
||||||
|
- if (!id)
|
||||||
|
- break; /* @tab is not mountinfo file? */
|
||||||
|
|
||||||
|
if (!*root || id < root_id) {
|
||||||
|
*root = fs;
|
||||||
|
@@ -250,7 +250,7 @@ int mnt_table_get_root_fs(struct libmnt_
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- return root_id ? 0 : -EINVAL;
|
||||||
|
+ return *root ? 0 : -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -271,15 +271,13 @@ int mnt_table_next_child_fs(struct libmn
|
||||||
|
struct libmnt_fs *fs;
|
||||||
|
int parent_id, lastchld_id = 0, chld_id = 0;
|
||||||
|
|
||||||
|
- if (!tb || !itr || !parent)
|
||||||
|
+ if (!tb || !itr || !parent || !is_mountinfo(tb))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
DBG(TAB, mnt_debug_h(tb, "lookup next child of '%s'",
|
||||||
|
mnt_fs_get_target(parent)));
|
||||||
|
|
||||||
|
parent_id = mnt_fs_get_id(parent);
|
||||||
|
- if (!parent_id)
|
||||||
|
- return -EINVAL;
|
||||||
|
|
||||||
|
/* get ID of the previously returned child */
|
||||||
|
if (itr->head && itr->p != itr->head) {
|
||||||
|
@@ -310,7 +308,7 @@ int mnt_table_next_child_fs(struct libmn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!chld_id)
|
||||||
|
+ if (!*chld)
|
||||||
|
return 1; /* end of iterator */
|
||||||
|
|
||||||
|
/* set the iterator to the @chld for the next call */
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/findmnt.c.kzak util-linux-2.23.2/misc-utils/findmnt.c
|
||||||
|
--- util-linux-2.23.2/misc-utils/findmnt.c.kzak 2013-07-30 11:07:35.138395654 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/findmnt.c 2014-09-25 10:49:50.953050560 +0200
|
||||||
|
@@ -826,8 +826,9 @@ static int tab_is_tree(struct libmnt_tab
|
||||||
|
if (!itr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (mnt_table_next_fs(tb, itr, &fs) == 0)
|
||||||
|
- rc = mnt_fs_get_id(fs) > 0 && mnt_fs_get_parent_id(fs) > 0;
|
||||||
|
+ rc = (mnt_table_next_fs(tb, itr, &fs) == 0 &&
|
||||||
|
+ mnt_fs_is_kernel(fs) &&
|
||||||
|
+ mnt_fs_get_root(fs));
|
||||||
|
|
||||||
|
mnt_free_iter(itr);
|
||||||
|
return rc;
|
|
@ -0,0 +1,39 @@
|
||||||
|
From 3f420a49dd4d0c413b635dd621aa34eebce2d3d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Mon, 5 Aug 2013 13:58:01 +0200
|
||||||
|
Subject: [PATCH] libmount: canonicalize for conversion from loopdev backing
|
||||||
|
file
|
||||||
|
|
||||||
|
# mount foo.img /mnt
|
||||||
|
# umount foo.img
|
||||||
|
umount: foo.img: not mounted
|
||||||
|
|
||||||
|
The loopdev code (and sysfs backing_file) uses absolute paths, but
|
||||||
|
libmount does not canonicalize the path before lookup for the backing file.
|
||||||
|
|
||||||
|
References: https://bugzilla.redhat.com/show_bug.cgi?id=950497
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
libmount/src/context_umount.c | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c
|
||||||
|
index 2b791c4..b02902c 100644
|
||||||
|
--- a/libmount/src/context_umount.c
|
||||||
|
+++ b/libmount/src/context_umount.c
|
||||||
|
@@ -161,7 +161,12 @@ try_loopdev:
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (stat(tgt, &st) == 0 && S_ISREG(st.st_mode)) {
|
||||||
|
- int count = loopdev_count_by_backing_file(tgt, &loopdev);
|
||||||
|
+ int count;
|
||||||
|
+
|
||||||
|
+ cn_tgt = mnt_resolve_path(tgt, cache);
|
||||||
|
+ count = loopdev_count_by_backing_file(cn_tgt, &loopdev);
|
||||||
|
+ if (!cache)
|
||||||
|
+ free(cn_tgt);
|
||||||
|
if (count == 1) {
|
||||||
|
DBG(CXT, mnt_debug_h(cxt,
|
||||||
|
"umount: %s --> %s (retry)", tgt, loopdev));
|
||||||
|
--
|
||||||
|
1.8.1.4
|
|
@ -0,0 +1,24 @@
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/context_umount.c.kzak util-linux-2.23.2/libmount/src/context_umount.c
|
||||||
|
--- util-linux-2.23.2/libmount/src/context_umount.c.kzak 2013-10-07 11:43:10.990598629 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/context_umount.c 2013-10-07 11:46:01.051031431 +0200
|
||||||
|
@@ -423,6 +423,8 @@ static int evaluate_permissions(struct l
|
||||||
|
if (optstr && !mnt_optstr_get_option(optstr,
|
||||||
|
"user", &mtab_user, &sz) && sz)
|
||||||
|
ok = !strncmp(curr_user, mtab_user, sz);
|
||||||
|
+
|
||||||
|
+ free(curr_user);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/utils.c.kzak util-linux-2.23.2/libmount/src/utils.c
|
||||||
|
--- util-linux-2.23.2/libmount/src/utils.c.kzak 2013-07-30 11:15:27.391515623 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/utils.c 2013-10-07 11:43:27.209924834 +0200
|
||||||
|
@@ -159,7 +159,7 @@ int mnt_chdir_to_parent(const char *targ
|
||||||
|
if (!last || !*last)
|
||||||
|
memcpy(*filename, ".", 2);
|
||||||
|
else
|
||||||
|
- memcpy(*filename, last, strlen(last) + 1);
|
||||||
|
+ memmove(*filename, last, strlen(last) + 1);
|
||||||
|
} else
|
||||||
|
free(buf);
|
||||||
|
return 0;
|
|
@ -0,0 +1,62 @@
|
||||||
|
diff -up util-linux-2.23.2/include/loopdev.h.kzak util-linux-2.23.2/include/loopdev.h
|
||||||
|
--- util-linux-2.23.2/include/loopdev.h.kzak 2013-06-13 09:46:10.397650425 +0200
|
||||||
|
+++ util-linux-2.23.2/include/loopdev.h 2014-01-14 11:11:48.427643690 +0100
|
||||||
|
@@ -149,6 +149,7 @@ extern void loopcxt_enable_debug(struct
|
||||||
|
extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
|
||||||
|
__attribute__ ((warn_unused_result));
|
||||||
|
extern int loopcxt_has_device(struct loopdev_cxt *lc);
|
||||||
|
+extern int loopcxt_add_device(struct loopdev_cxt *lc);
|
||||||
|
extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
|
||||||
|
extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
|
||||||
|
extern struct sysfs_cxt *loopcxt_get_sysfs(struct loopdev_cxt *lc);
|
||||||
|
diff -up util-linux-2.23.2/lib/loopdev.c.kzak util-linux-2.23.2/lib/loopdev.c
|
||||||
|
--- util-linux-2.23.2/lib/loopdev.c.kzak 2013-07-30 11:19:20.143600300 +0200
|
||||||
|
+++ util-linux-2.23.2/lib/loopdev.c 2014-01-14 11:11:48.428643700 +0100
|
||||||
|
@@ -1298,6 +1298,36 @@ int loopcxt_delete_device(struct loopdev
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int loopcxt_add_device(struct loopdev_cxt *lc)
|
||||||
|
+{
|
||||||
|
+ int rc = -EINVAL;
|
||||||
|
+ int ctl, nr = -1;
|
||||||
|
+ const char *p, *dev = loopcxt_get_device(lc);
|
||||||
|
+
|
||||||
|
+ if (!dev)
|
||||||
|
+ goto done;
|
||||||
|
+
|
||||||
|
+ if (!(lc->flags & LOOPDEV_FL_CONTROL)) {
|
||||||
|
+ rc = -ENOSYS;
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ p = strrchr(dev, '/');
|
||||||
|
+ if (!p || (sscanf(p, "/loop%d", &nr) != 1 && sscanf(p, "/%d", &nr) != 1)
|
||||||
|
+ || nr < 0)
|
||||||
|
+ goto done;
|
||||||
|
+
|
||||||
|
+ ctl = open(_PATH_DEV_LOOPCTL, O_RDWR|O_CLOEXEC);
|
||||||
|
+ if (ctl >= 0) {
|
||||||
|
+ DBG(lc, loopdev_debug("add_device %d", nr));
|
||||||
|
+ rc = ioctl(ctl, LOOP_CTL_ADD, nr);
|
||||||
|
+ close(ctl);
|
||||||
|
+ }
|
||||||
|
+done:
|
||||||
|
+ DBG(lc, loopdev_debug("add_device done [rc=%d]", rc));
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Note that LOOP_CTL_GET_FREE ioctl is supported since kernel 3.1. In older
|
||||||
|
* kernels we have to check all loop devices to found unused one.
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/losetup.c.kzak util-linux-2.23.2/sys-utils/losetup.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/losetup.c.kzak 2013-07-30 11:20:16.987117853 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/losetup.c 2014-01-14 11:11:48.428643700 +0100
|
||||||
|
@@ -600,6 +600,8 @@ int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int hasdev = loopcxt_has_device(&lc);
|
||||||
|
|
||||||
|
+ if (hasdev && !is_loopdev(loopcxt_get_device(&lc)))
|
||||||
|
+ loopcxt_add_device(&lc);
|
||||||
|
do {
|
||||||
|
const char *errpre;
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff -up util-linux-2.23.2/lib/loopdev.c.kzak util-linux-2.23.2/lib/loopdev.c
|
||||||
|
--- util-linux-2.23.2/lib/loopdev.c.kzak 2014-09-25 10:16:23.521897462 +0200
|
||||||
|
+++ util-linux-2.23.2/lib/loopdev.c 2014-09-25 10:23:38.852050990 +0200
|
||||||
|
@@ -1129,6 +1129,12 @@ static int loopcxt_check_size(struct loo
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* It's block device, so, align to 512-byte sectors */
|
||||||
|
+ if (expected_size % 512) {
|
||||||
|
+ DBG(lc, loopdev_debug("expected size misaligned to 512-byte sectors"));
|
||||||
|
+ expected_size = (expected_size >> 9) << 9;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (expected_size != size) {
|
||||||
|
DBG(lc, loopdev_debug("warning: loopdev and expected "
|
||||||
|
"size dismatch (%ju/%ju)",
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/losetup.c.kzak util-linux-2.23.2/sys-utils/losetup.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/losetup.c.kzak 2014-09-25 10:16:23.521897462 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/losetup.c 2014-09-25 10:23:38.852050990 +0200
|
||||||
|
@@ -632,11 +632,7 @@ int main(int argc, char **argv)
|
||||||
|
/* errors */
|
||||||
|
errpre = hasdev && loopcxt_get_fd(&lc) < 0 ?
|
||||||
|
loopcxt_get_device(&lc) : file;
|
||||||
|
- if (errno == ERANGE && offset && offset % 512)
|
||||||
|
- warnx(_("%s: failed to set up loop device, "
|
||||||
|
- "offset is not 512-byte aligned."), errpre);
|
||||||
|
- else
|
||||||
|
- warn(_("%s: failed to set up loop device"), errpre);
|
||||||
|
+ warn(_("%s: failed to set up loop device"), errpre);
|
||||||
|
break;
|
||||||
|
} while (hasdev == 0);
|
|
@ -0,0 +1,130 @@
|
||||||
|
From 5cc378e4cdeb957b405e0264a09295eda7d75ff7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Scott Moser <smoser@ubuntu.com>
|
||||||
|
Date: Mon, 13 Jan 2014 15:32:49 -0500
|
||||||
|
Subject: [PATCH] partx: fix --update ranges and out of order tables
|
||||||
|
|
||||||
|
partx --update DEVICE NUMBER
|
||||||
|
was broken in 2 cases:
|
||||||
|
* if NUMBER != 1
|
||||||
|
* if the partition table was "out of order".
|
||||||
|
Ie, where sda2 came after sda3.
|
||||||
|
|
||||||
|
References: https://bugs.launchpad.net/ubuntu/+source/cloud-utils/+bug/1244662
|
||||||
|
Signed-off-by: Scott Moser <smoser@ubuntu.com>
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
disk-utils/partx.c | 75 ++++++++++++++++++++++++++++++++++++------------------
|
||||||
|
1 file changed, 50 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/disk-utils/partx.c b/disk-utils/partx.c
|
||||||
|
index 880d779..df03e59 100644
|
||||||
|
--- a/disk-utils/partx.c
|
||||||
|
+++ b/disk-utils/partx.c
|
||||||
|
@@ -412,10 +412,41 @@ static void upd_parts_warnx(const char *device, int first, int last)
|
||||||
|
device, first, last);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * get_partition_by_partno:
|
||||||
|
+ * @ls: partitions list
|
||||||
|
+ * @n: the partition number (e.g. 'N' from sda'N')
|
||||||
|
+ *
|
||||||
|
+ * This does not assume any order of the input blkid_partlist.
|
||||||
|
+ * And correctly handles "out of order" partition tables.
|
||||||
|
+ * partition N is located after partition N+1 on the disk.
|
||||||
|
+ *
|
||||||
|
+ * Returns: partition object or NULL in case or error.
|
||||||
|
+ */
|
||||||
|
+blkid_partition get_partition_by_partno(blkid_partlist ls, int n)
|
||||||
|
+{
|
||||||
|
+ int i, nparts;
|
||||||
|
+ blkid_partition par;
|
||||||
|
+ if (!ls)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ nparts = blkid_partlist_numof_partitions(ls);
|
||||||
|
+ if (nparts < 0)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < nparts; i++) {
|
||||||
|
+ par = blkid_partlist_get_partition(ls, i);
|
||||||
|
+ if (n == blkid_partition_get_partno(par)) {
|
||||||
|
+ return par;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int upd_parts(int fd, const char *device, dev_t devno,
|
||||||
|
blkid_partlist ls, int lower, int upper)
|
||||||
|
{
|
||||||
|
- int i, n, an, nparts, rc = 0, errfirst = 0, errlast = 0, err;
|
||||||
|
+ int n, nparts, rc = 0, errfirst = 0, errlast = 0, err;
|
||||||
|
blkid_partition par;
|
||||||
|
uintmax_t start, size;
|
||||||
|
|
||||||
|
@@ -441,18 +472,16 @@ static int upd_parts(int fd, const char *device, dev_t devno,
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (i = 0, n = lower; n <= upper; n++) {
|
||||||
|
- par = blkid_partlist_get_partition(ls, i);
|
||||||
|
- an = blkid_partition_get_partno(par);
|
||||||
|
-
|
||||||
|
- if (lower && n < lower)
|
||||||
|
- continue;
|
||||||
|
- if (upper && n > upper)
|
||||||
|
+ for (n = lower; n <= upper; n++) {
|
||||||
|
+ par = get_partition_by_partno(ls, n);
|
||||||
|
+ if (!par) {
|
||||||
|
+ if (verbose)
|
||||||
|
+ warn(_("%s: no partition #%d"), device, n);
|
||||||
|
continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
start = blkid_partition_get_start(par);
|
||||||
|
size = blkid_partition_get_size(par);
|
||||||
|
-
|
||||||
|
if (blkid_partition_is_extended(par))
|
||||||
|
/*
|
||||||
|
* Let's follow the Linux kernel and reduce
|
||||||
|
@@ -463,25 +492,21 @@ static int upd_parts(int fd, const char *device, dev_t devno,
|
||||||
|
err = partx_del_partition(fd, n);
|
||||||
|
if (err == -1 && errno == ENXIO)
|
||||||
|
err = 0; /* good, it already doesn't exist */
|
||||||
|
- if (an == n)
|
||||||
|
+ if (err == -1 && errno == EBUSY)
|
||||||
|
{
|
||||||
|
- if (i < nparts)
|
||||||
|
- i++;
|
||||||
|
- if (err == -1 && errno == EBUSY)
|
||||||
|
- {
|
||||||
|
- /* try to resize */
|
||||||
|
- err = partx_resize_partition(fd, n, start, size);
|
||||||
|
- if (verbose)
|
||||||
|
- printf(_("%s: partition #%d resized\n"), device, n);
|
||||||
|
- if (err == 0)
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- if (err == 0 && partx_add_partition(fd, n, start, size) == 0) {
|
||||||
|
- if (verbose)
|
||||||
|
- printf(_("%s: partition #%d added\n"), device, n);
|
||||||
|
+ /* try to resize */
|
||||||
|
+ err = partx_resize_partition(fd, n, start, size);
|
||||||
|
+ if (verbose)
|
||||||
|
+ printf(_("%s: partition #%d resized\n"), device, n);
|
||||||
|
+ if (err == 0)
|
||||||
|
continue;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
+ if (err == 0 && partx_add_partition(fd, n, start, size) == 0) {
|
||||||
|
+ if (verbose)
|
||||||
|
+ printf(_("%s: partition #%d added\n"), device, n);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (err == 0)
|
||||||
|
continue;
|
||||||
|
rc = -1;
|
||||||
|
--
|
||||||
|
1.9.3
|
|
@ -0,0 +1,15 @@
|
||||||
|
diff -up util-linux-2.23.2/fdisks/sfdisk.c.kzak util-linux-2.23.2/fdisks/sfdisk.c
|
||||||
|
--- util-linux-2.23.2/fdisks/sfdisk.c.kzak 2013-07-30 10:39:26.200738180 +0200
|
||||||
|
+++ util-linux-2.23.2/fdisks/sfdisk.c 2013-10-07 11:52:10.701445115 +0200
|
||||||
|
@@ -3201,9 +3201,9 @@ do_fdisk(char *dev) {
|
||||||
|
ignore_result( fgets(answer, sizeof(answer), stdin) );
|
||||||
|
if (answer[0] == 'q' || answer[0] == 'Q') {
|
||||||
|
errx(EXIT_FAILURE, _("Quitting - nothing changed"));
|
||||||
|
- } else if (rpmatch(answer) == 1) {
|
||||||
|
- continue;
|
||||||
|
} else if (rpmatch(answer) == 0) {
|
||||||
|
+ continue;
|
||||||
|
+ } else if (rpmatch(answer) == 1) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
printf(_("Please answer one of y,n,q\n"));
|
|
@ -0,0 +1,47 @@
|
||||||
|
From 9b5dc4cb8d5d82c31c0cda898832998c21afc303 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Mon, 9 Sep 2013 12:24:01 +0200
|
||||||
|
Subject: [PATCH] su: fix lastlog and btmp logging
|
||||||
|
|
||||||
|
The su(1) logging code mix ups "old" and "new" passwd structs. The
|
||||||
|
result is things like
|
||||||
|
|
||||||
|
Sep 9 11:50:45 x2 su: (to kzak) kzak on none
|
||||||
|
|
||||||
|
in /var/log/messages. The right log entry is
|
||||||
|
|
||||||
|
Sep 9 11:50:45 x2 su: (to root) kzak on pts/3
|
||||||
|
|
||||||
|
The bug has been introduced by commit c74a7af17c7a176c358dfaa8e1814786c89ebc14.
|
||||||
|
|
||||||
|
References: https://bugzilla.redhat.com/show_bug.cgi?id=1005194
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 5 +----
|
||||||
|
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index ade5c92..858af01 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -161,7 +161,7 @@ log_syslog(struct passwd const *pw, bool successful)
|
||||||
|
old_user = pwd ? pwd->pw_name : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (get_terminal_name(STDERR_FILENO, NULL, &tty, NULL) == 0 && tty)
|
||||||
|
+ if (get_terminal_name(STDERR_FILENO, NULL, &tty, NULL) != 0 || !tty)
|
||||||
|
tty = "none";
|
||||||
|
|
||||||
|
openlog (program_invocation_short_name, 0 , LOG_AUTH);
|
||||||
|
@@ -483,9 +483,6 @@ authenticate (const struct passwd *pw)
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
|
- if (lpw && lpw->pw_name)
|
||||||
|
- pw = lpw;
|
||||||
|
-
|
||||||
|
log_syslog(pw, !is_pam_failure(retval));
|
||||||
|
|
||||||
|
if (is_pam_failure(retval))
|
||||||
|
--
|
||||||
|
1.8.1.4
|
|
@ -0,0 +1,48 @@
|
||||||
|
diff -up util-linux-2.23.2/login-utils/su-common.c.kzak util-linux-2.23.2/login-utils/su-common.c
|
||||||
|
--- util-linux-2.23.2/login-utils/su-common.c.kzak 2013-07-30 10:39:26.223738407 +0200
|
||||||
|
+++ util-linux-2.23.2/login-utils/su-common.c 2013-09-09 09:32:05.497238691 +0200
|
||||||
|
@@ -111,6 +111,9 @@ static int same_session = 0;
|
||||||
|
/* SU_MODE_{RUNUSER,SU} */
|
||||||
|
static int su_mode;
|
||||||
|
|
||||||
|
+/* Don't print PAM info messages (Last login, etc.). */
|
||||||
|
+static int suppress_pam_info;
|
||||||
|
+
|
||||||
|
static bool _pam_session_opened;
|
||||||
|
static bool _pam_cred_established;
|
||||||
|
static sig_atomic_t volatile caught_signal = false;
|
||||||
|
@@ -208,10 +211,23 @@ static void log_btmp(struct passwd const
|
||||||
|
updwtmp(_PATH_BTMP, &ut);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+static int su_pam_conv(int num_msg, const struct pam_message **msg,
|
||||||
|
+ struct pam_response **resp, void *appdata_ptr)
|
||||||
|
+{
|
||||||
|
+ if (suppress_pam_info
|
||||||
|
+ && num_msg == 1
|
||||||
|
+ && msg
|
||||||
|
+ && msg[0]->msg_style == PAM_TEXT_INFO)
|
||||||
|
+ return PAM_SUCCESS;
|
||||||
|
+
|
||||||
|
+ return misc_conv(num_msg, msg, resp, appdata_ptr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct pam_conv conv =
|
||||||
|
{
|
||||||
|
- misc_conv,
|
||||||
|
- NULL
|
||||||
|
+ su_pam_conv,
|
||||||
|
+ NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -902,6 +918,9 @@ su_main (int argc, char **argv, int mode
|
||||||
|
|
||||||
|
init_groups (pw, groups, num_supp_groups);
|
||||||
|
|
||||||
|
+ if (!simulate_login || command)
|
||||||
|
+ suppress_pam_info = 1; /* don't print PAM info messages */
|
||||||
|
+
|
||||||
|
create_watching_parent ();
|
||||||
|
/* Now we're in the child. */
|
|
@ -0,0 +1,37 @@
|
||||||
|
diff -up util-linux-2.23.2/tests/functions.sh.kzak util-linux-2.23.2/tests/functions.sh
|
||||||
|
--- util-linux-2.23.2/tests/functions.sh.kzak 2013-06-13 09:46:10.554651768 +0200
|
||||||
|
+++ util-linux-2.23.2/tests/functions.sh 2013-09-09 10:01:23.355469268 +0200
|
||||||
|
@@ -483,7 +483,7 @@ function ts_scsi_debug_init {
|
||||||
|
modprobe scsi_debug $*
|
||||||
|
[ "$?" == 0 ] || ts_die "Cannot init device"
|
||||||
|
|
||||||
|
- DEVNAME=$(grep scsi_debug /sys/block/*/device/model | awk -F '/' '{print $4}')
|
||||||
|
+ DEVNAME=$(grep --with-filename scsi_debug /sys/block/*/device/model | awk -F '/' '{print $4}')
|
||||||
|
[ "x${DEVNAME}" == "x" ] && ts_die "Cannot find device"
|
||||||
|
|
||||||
|
DEVICE="/dev/${DEVNAME}"
|
||||||
|
diff -up util-linux-2.23.2/tests/ts/cramfs/mkfs.kzak util-linux-2.23.2/tests/ts/cramfs/mkfs
|
||||||
|
--- util-linux-2.23.2/tests/ts/cramfs/mkfs.kzak 2013-06-13 09:46:10.557651793 +0200
|
||||||
|
+++ util-linux-2.23.2/tests/ts/cramfs/mkfs 2013-09-09 10:01:23.355469268 +0200
|
||||||
|
@@ -80,7 +80,7 @@ cd $TS_MOUNTPOINT
|
||||||
|
|
||||||
|
ts_log "list the image"
|
||||||
|
export TZ='GMT-1'
|
||||||
|
-ls -laR --time-style=long-iso . >> $TS_OUTPUT
|
||||||
|
+ls -laR --time-style=long-iso . | sed 's:\. : :g' >> $TS_OUTPUT
|
||||||
|
echo >> $TS_OUTPUT
|
||||||
|
|
||||||
|
ts_log "list checksums from new data"
|
||||||
|
diff -up util-linux-2.23.2/tests/ts/libmount/context-utab.kzak util-linux-2.23.2/tests/ts/libmount/context-utab
|
||||||
|
--- util-linux-2.23.2/tests/ts/libmount/context-utab.kzak 2013-06-13 09:46:10.561651827 +0200
|
||||||
|
+++ util-linux-2.23.2/tests/ts/libmount/context-utab 2013-09-09 10:01:23.355469268 +0200
|
||||||
|
@@ -85,7 +85,9 @@ grep -q $DEVICE $LIBMOUNT_UTAB && \
|
||||||
|
echo "umount (mountpoint) failed: found $DEVICE in $LIBMOUNT_UTAB" >> $TS_OUTPUT 2>&1
|
||||||
|
ts_finalize_subtest
|
||||||
|
|
||||||
|
+
|
||||||
|
if [ -x "/sbin/mkfs.btrfs" ]; then
|
||||||
|
+ $TS_CMD_WIPEFS -a $DEVICE &> /dev/null
|
||||||
|
ts_log "Create filesystem [btrfs]"
|
||||||
|
/sbin/mkfs.btrfs -L "$LABEL" $DEVICE &> /dev/null
|
||||||
|
udevadm settle
|
|
@ -0,0 +1,248 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/Makemodule.am.kzak util-linux-2.23.2/sys-utils/Makemodule.am
|
||||||
|
--- util-linux-2.23.2/sys-utils/Makemodule.am.kzak 2014-09-25 14:16:33.526384729 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/Makemodule.am 2014-09-25 14:15:34.861825005 +0200
|
||||||
|
@@ -290,6 +290,7 @@ usrbin_exec_PROGRAMS += unshare
|
||||||
|
dist_man_MANS += sys-utils/unshare.1
|
||||||
|
unshare_SOURCES = sys-utils/unshare.c
|
||||||
|
unshare_LDADD = $(LDADD) libcommon.la
|
||||||
|
+unshare_CFLAGS = $(AM_CFLAGS) -I$(ul_libmount_incdir)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if BUILD_NSENTER
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.1.kzak util-linux-2.23.2/sys-utils/unshare.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.1.kzak 2014-09-25 14:14:30.194208005 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.1 2014-09-25 14:15:17.617660476 +0200
|
||||||
|
@@ -1,63 +1,82 @@
|
||||||
|
.\" Process this file with
|
||||||
|
.\" groff -man -Tascii lscpu.1
|
||||||
|
.\"
|
||||||
|
-.TH UNSHARE 1 "January 2013" "util-linux" "User Commands"
|
||||||
|
+.TH UNSHARE 1 "July 2013" "util-linux" "User Commands"
|
||||||
|
.SH NAME
|
||||||
|
unshare \- run program with some namespaces unshared from parent
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B unshare
|
||||||
|
.RI [ options ]
|
||||||
|
-program
|
||||||
|
+.I program
|
||||||
|
.RI [ arguments ]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
-Unshares specified namespaces from parent process and then executes specified
|
||||||
|
-program. Unshareable namespaces are:
|
||||||
|
+Unshares the indicated namespaces from the parent process and then executes
|
||||||
|
+the specified program. The namespaces to be unshared are indicated via
|
||||||
|
+options. Unshareable namespaces are:
|
||||||
|
.TP
|
||||||
|
.BR "mount namespace"
|
||||||
|
-mounting and unmounting filesystems will not affect rest of the system
|
||||||
|
+Mounting and unmounting filesystems will not affect the rest of the system
|
||||||
|
(\fBCLONE_NEWNS\fP flag), except for filesystems which are explicitly marked as
|
||||||
|
-shared (by mount --make-shared). See /proc/self/mountinfo for the shared flags.
|
||||||
|
+shared (with \fBmount --make-shared\fP; see \fI/proc/self/mountinfo\fP for the
|
||||||
|
+\fBshared\fP flags).
|
||||||
|
+
|
||||||
|
+It's recommended to use \fBmount --make-rprivate\fP or \fBmount --make-rslave\fP
|
||||||
|
+after \fBunshare --mount\fP to make sure that mountpoints in the new namespace
|
||||||
|
+are really unshared from parental namespace.
|
||||||
|
.TP
|
||||||
|
.BR "UTS namespace"
|
||||||
|
-setting hostname, domainname will not affect rest of the system
|
||||||
|
-(\fBCLONE_NEWUTS\fP flag).
|
||||||
|
+Setting hostname or domainname will not affect the rest of the system.
|
||||||
|
+(\fBCLONE_NEWUTS\fP flag)
|
||||||
|
.TP
|
||||||
|
.BR "IPC namespace"
|
||||||
|
-process will have independent namespace for System V message queues, semaphore
|
||||||
|
-sets and shared memory segments (\fBCLONE_NEWIPC\fP flag).
|
||||||
|
+The process will have an independent namespace for System V message queues,
|
||||||
|
+semaphore sets and shared memory segments. (\fBCLONE_NEWIPC\fP flag)
|
||||||
|
.TP
|
||||||
|
.BR "network namespace"
|
||||||
|
-process will have independent IPv4 and IPv6 stacks, IP routing tables, firewall
|
||||||
|
-rules, the \fI/proc/net\fP and \fI/sys/class/net\fP directory trees, sockets
|
||||||
|
-etc. (\fBCLONE_NEWNET\fP flag).
|
||||||
|
+The process will have independent IPv4 and IPv6 stacks, IP routing tables,
|
||||||
|
+firewall rules, the \fI/proc/net\fP and \fI/sys/class/net\fP directory trees,
|
||||||
|
+sockets, etc. (\fBCLONE_NEWNET\fP flag)
|
||||||
|
.TP
|
||||||
|
.BR "pid namespace"
|
||||||
|
-children will have a distinct set of pid to process mappings than their parent.
|
||||||
|
-(\fBCLONE_NEWPID\fP flag).
|
||||||
|
+Children will have a distinct set of PID to process mappings from their parent.
|
||||||
|
+(\fBCLONE_NEWPID\fP flag)
|
||||||
|
.PP
|
||||||
|
-See the \fBclone\fR(2) for exact semantics of the flags.
|
||||||
|
+See \fBclone\fR(2) for the exact semantics of the flags.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-h , " \-\-help"
|
||||||
|
-Print a help message,
|
||||||
|
-.TP
|
||||||
|
-.BR \-m , " \-\-mount"
|
||||||
|
-Unshare the mount namespace,
|
||||||
|
-.TP
|
||||||
|
-.BR \-u , " \-\-uts"
|
||||||
|
-Unshare the UTS namespace,
|
||||||
|
+Display help text and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-i , " \-\-ipc"
|
||||||
|
-Unshare the IPC namespace,
|
||||||
|
+Unshare the IPC namespace.
|
||||||
|
+.TP
|
||||||
|
+.BR \-m , " \-\-mount"
|
||||||
|
+Unshare the mount namespace.
|
||||||
|
.TP
|
||||||
|
.BR \-n , " \-\-net"
|
||||||
|
Unshare the network namespace.
|
||||||
|
.TP
|
||||||
|
.BR \-p , " \-\-pid"
|
||||||
|
Unshare the pid namespace.
|
||||||
|
+See also the \fB--fork\fP and \fB--mount-proc\fP options.
|
||||||
|
+.TP
|
||||||
|
+.BR \-u , " \-\-uts"
|
||||||
|
+Unshare the UTS namespace.
|
||||||
|
+.TP
|
||||||
|
+.BR \-f , " \-\-fork"
|
||||||
|
+Fork the specified \fIprogram\fR as a child process of \fBunshare\fR rather than
|
||||||
|
+running it directly. This is useful when creating a new pid namespace.
|
||||||
|
+.TP
|
||||||
|
+.BR \-\-mount-proc "[=\fImountpoint\fP]"
|
||||||
|
+Just before running the program, mount the proc filesystem at the \fImountpoint\fP
|
||||||
|
+(default is /proc). This is useful when creating a new pid namespace. It also
|
||||||
|
+implies creating a new mount namespace since the /proc mount would otherwise
|
||||||
|
+mess up existing programs on the system. The new proc filesystem is explicitly
|
||||||
|
+mounted as private (by MS_PRIVATE|MS_REC).
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR unshare (2),
|
||||||
|
-.BR clone (2)
|
||||||
|
+.BR clone (2),
|
||||||
|
+.BR mount (8)
|
||||||
|
.SH BUGS
|
||||||
|
None known so far.
|
||||||
|
.SH AUTHOR
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.c.kzak util-linux-2.23.2/sys-utils/unshare.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.c.kzak 2014-09-25 14:14:30.194208005 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.c 2014-09-25 14:15:34.861825005 +0200
|
||||||
|
@@ -24,12 +24,19 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
+#include <sys/wait.h>
|
||||||
|
+#include <sys/mount.h>
|
||||||
|
+
|
||||||
|
+/* we only need some defines missing in sys/mount.h, no libmount linkage */
|
||||||
|
+#include <libmount.h>
|
||||||
|
|
||||||
|
#include "nls.h"
|
||||||
|
#include "c.h"
|
||||||
|
-#include "closestream.h"
|
||||||
|
#include "namespace.h"
|
||||||
|
#include "exec_shell.h"
|
||||||
|
+#include "xalloc.h"
|
||||||
|
+#include "pathnames.h"
|
||||||
|
+
|
||||||
|
|
||||||
|
static void usage(int status)
|
||||||
|
{
|
||||||
|
@@ -40,11 +47,13 @@ static void usage(int status)
|
||||||
|
_(" %s [options] <program> [args...]\n"), program_invocation_short_name);
|
||||||
|
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
- fputs(_(" -m, --mount unshare mounts namespace\n"), out);
|
||||||
|
- fputs(_(" -u, --uts unshare UTS namespace (hostname etc)\n"), out);
|
||||||
|
- fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
|
||||||
|
- fputs(_(" -n, --net unshare network namespace\n"), out);
|
||||||
|
- fputs(_(" -p, --pid unshare pid namespace\n"), out);
|
||||||
|
+ fputs(_(" -m, --mount unshare mounts namespace\n"), out);
|
||||||
|
+ fputs(_(" -u, --uts unshare UTS namespace (hostname etc)\n"), out);
|
||||||
|
+ fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
|
||||||
|
+ fputs(_(" -n, --net unshare network namespace\n"), out);
|
||||||
|
+ fputs(_(" -p, --pid unshare pid namespace\n"), out);
|
||||||
|
+ fputs(_(" -f, --fork fork before launching <program>\n"), out);
|
||||||
|
+ fputs(_(" --mount-proc[=<dir>] mount proc filesystem first (implies --mount)\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
@@ -56,6 +65,9 @@ static void usage(int status)
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
+ enum {
|
||||||
|
+ OPT_MOUNTPROC = CHAR_MAX + 1
|
||||||
|
+ };
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
{ "version", no_argument, 0, 'V'},
|
||||||
|
@@ -64,20 +76,24 @@ int main(int argc, char *argv[])
|
||||||
|
{ "ipc", no_argument, 0, 'i' },
|
||||||
|
{ "net", no_argument, 0, 'n' },
|
||||||
|
{ "pid", no_argument, 0, 'p' },
|
||||||
|
+ { "fork", no_argument, 0, 'f' },
|
||||||
|
+ { "mount-proc", optional_argument, 0, OPT_MOUNTPROC },
|
||||||
|
{ NULL, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
int unshare_flags = 0;
|
||||||
|
+ int c, forkit = 0;
|
||||||
|
+ const char *procmnt = NULL;
|
||||||
|
|
||||||
|
- int c;
|
||||||
|
-
|
||||||
|
- setlocale(LC_MESSAGES, "");
|
||||||
|
+ setlocale(LC_ALL, "");
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
- atexit(close_stdout);
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "hVmuinp", longopts, NULL)) != -1) {
|
||||||
|
+ while ((c = getopt_long(argc, argv, "+fhVmuinp", longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
+ case 'f':
|
||||||
|
+ forkit = 1;
|
||||||
|
+ break;
|
||||||
|
case 'h':
|
||||||
|
usage(EXIT_SUCCESS);
|
||||||
|
case 'V':
|
||||||
|
@@ -98,6 +114,10 @@ int main(int argc, char *argv[])
|
||||||
|
case 'p':
|
||||||
|
unshare_flags |= CLONE_NEWPID;
|
||||||
|
break;
|
||||||
|
+ case OPT_MOUNTPROC:
|
||||||
|
+ unshare_flags |= CLONE_NEWNS;
|
||||||
|
+ procmnt = optarg ? optarg : "/proc";
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
@@ -106,6 +126,31 @@ int main(int argc, char *argv[])
|
||||||
|
if (-1 == unshare(unshare_flags))
|
||||||
|
err(EXIT_FAILURE, _("unshare failed"));
|
||||||
|
|
||||||
|
+ if (forkit) {
|
||||||
|
+ int status;
|
||||||
|
+ pid_t pid = fork();
|
||||||
|
+
|
||||||
|
+ switch(pid) {
|
||||||
|
+ case -1:
|
||||||
|
+ err(EXIT_FAILURE, _("fork failed"));
|
||||||
|
+ case 0: /* child */
|
||||||
|
+ break;
|
||||||
|
+ default: /* parent */
|
||||||
|
+ if (waitpid(pid, &status, 0) == -1)
|
||||||
|
+ err(EXIT_FAILURE, _("waitpid failed"));
|
||||||
|
+ if (WIFEXITED(status))
|
||||||
|
+ return WEXITSTATUS(status);
|
||||||
|
+ else if (WIFSIGNALED(status))
|
||||||
|
+ kill(getpid(), WTERMSIG(status));
|
||||||
|
+ err(EXIT_FAILURE, _("child exit failed"));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (procmnt &&
|
||||||
|
+ (mount("none", procmnt, NULL, MS_PRIVATE|MS_REC, NULL) != 0 ||
|
||||||
|
+ mount("proc", procmnt, "proc", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) != 0))
|
||||||
|
+ err(EXIT_FAILURE, _("mount %s failed"), procmnt);
|
||||||
|
+
|
||||||
|
if (optind < argc) {
|
||||||
|
execvp(argv[optind], argv + optind);
|
||||||
|
err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
|
|
@ -0,0 +1,56 @@
|
||||||
|
diff -up util-linux-2.23.2/login-utils/utmpdump.c.kzak util-linux-2.23.2/login-utils/utmpdump.c
|
||||||
|
--- util-linux-2.23.2/login-utils/utmpdump.c.kzak 2013-10-07 11:56:02.030191040 +0200
|
||||||
|
+++ util-linux-2.23.2/login-utils/utmpdump.c 2013-10-07 12:05:08.671171091 +0200
|
||||||
|
@@ -85,11 +85,14 @@ static void xcleanse(char *s, int len)
|
||||||
|
|
||||||
|
static void print_utline(struct utmp ut)
|
||||||
|
{
|
||||||
|
- char *addr_string, *time_string;
|
||||||
|
- struct in_addr in;
|
||||||
|
+ const char *addr_string, *time_string;
|
||||||
|
+ char buffer[INET6_ADDRSTRLEN];
|
||||||
|
+
|
||||||
|
+ if (ut.ut_addr_v6[1] || ut.ut_addr_v6[2] || ut.ut_addr_v6[3])
|
||||||
|
+ addr_string = inet_ntop(AF_INET6, &(ut.ut_addr_v6), buffer, sizeof(buffer));
|
||||||
|
+ else
|
||||||
|
+ addr_string = inet_ntop(AF_INET, &(ut.ut_addr_v6), buffer, sizeof(buffer));
|
||||||
|
|
||||||
|
- in.s_addr = ut.ut_addr;
|
||||||
|
- addr_string = inet_ntoa(in);
|
||||||
|
time_string = timetostr(ut.ut_time);
|
||||||
|
cleanse(ut.ut_id);
|
||||||
|
cleanse(ut.ut_user);
|
||||||
|
@@ -97,7 +100,7 @@ static void print_utline(struct utmp ut)
|
||||||
|
cleanse(ut.ut_host);
|
||||||
|
|
||||||
|
/* pid id user line host addr time */
|
||||||
|
- printf("[%d] [%05d] [%-4.4s] [%-*.*s] [%-*.*s] [%-*.*s] [%-15.15s] [%-28.28s]\n",
|
||||||
|
+ printf("[%d] [%05d] [%-4.4s] [%-*.*s] [%-*.*s] [%-*.*s] [%-15s] [%-28.28s]\n",
|
||||||
|
ut.ut_type, ut.ut_pid, ut.ut_id, 8, UT_NAMESIZE, ut.ut_user,
|
||||||
|
12, UT_LINESIZE, ut.ut_line, 20, UT_HOSTSIZE, ut.ut_host,
|
||||||
|
addr_string, time_string);
|
||||||
|
@@ -248,11 +251,10 @@ static int gettok(char *line, char *dest
|
||||||
|
static void undump(FILE *fp)
|
||||||
|
{
|
||||||
|
struct utmp ut;
|
||||||
|
- char s_addr[16], s_time[29], *linestart, *line;
|
||||||
|
+ char s_addr[INET6_ADDRSTRLEN + 1], s_time[29], *linestart, *line;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
line = linestart = xmalloc(1024 * sizeof(*linestart));
|
||||||
|
- s_addr[15] = 0;
|
||||||
|
s_time[28] = 0;
|
||||||
|
|
||||||
|
while (fgets(linestart, 1023, fp)) {
|
||||||
|
@@ -267,7 +269,10 @@ static void undump(FILE *fp)
|
||||||
|
line += gettok(line, s_addr, sizeof(s_addr) - 1, 1);
|
||||||
|
line += gettok(line, s_time, sizeof(s_time) - 1, 0);
|
||||||
|
|
||||||
|
- ut.ut_addr = inet_addr(s_addr);
|
||||||
|
+ if (strchr(s_addr, '.'))
|
||||||
|
+ inet_pton(AF_INET, s_addr, &(ut.ut_addr_v6));
|
||||||
|
+ else
|
||||||
|
+ inet_pton(AF_INET6, s_addr, &(ut.ut_addr_v6));
|
||||||
|
ut.ut_time = strtotime(s_time);
|
||||||
|
|
||||||
|
ignore_result( fwrite(&ut, sizeof(ut), 1, stdout) );
|
|
@ -0,0 +1,95 @@
|
||||||
|
diff -up util-linux-2.23.2/disk-utils/blockdev.c.kzak util-linux-2.23.2/disk-utils/blockdev.c
|
||||||
|
--- util-linux-2.23.2/disk-utils/blockdev.c.kzak 2015-06-23 11:29:27.818001654 +0200
|
||||||
|
+++ util-linux-2.23.2/disk-utils/blockdev.c 2015-06-23 11:29:43.752884860 +0200
|
||||||
|
@@ -16,6 +16,7 @@
|
||||||
|
#include "blkdev.h"
|
||||||
|
#include "pathnames.h"
|
||||||
|
#include "closestream.h"
|
||||||
|
+#include "sysfs.h"
|
||||||
|
|
||||||
|
struct bdc {
|
||||||
|
long ioc; /* ioctl code */
|
||||||
|
@@ -364,7 +365,7 @@ static void do_commands(int fd, char **a
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res == -1) {
|
||||||
|
- perror(bdcms[j].iocname);
|
||||||
|
+ warn(_("ioctl error on %s"), bdcms[j].iocname);
|
||||||
|
if (verbose)
|
||||||
|
printf(_("%s failed.\n"), _(bdcms[j].help));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
@@ -436,7 +437,8 @@ static void report_device(char *device,
|
||||||
|
int ro, ssz, bsz;
|
||||||
|
long ra;
|
||||||
|
unsigned long long bytes;
|
||||||
|
- struct hd_geometry g;
|
||||||
|
+ uint64_t start = 0;
|
||||||
|
+ struct stat st;
|
||||||
|
|
||||||
|
fd = open(device, O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fd < 0) {
|
||||||
|
@@ -446,15 +448,27 @@ static void report_device(char *device,
|
||||||
|
}
|
||||||
|
|
||||||
|
ro = ssz = bsz = 0;
|
||||||
|
- g.start = ra = 0;
|
||||||
|
+ ra = 0;
|
||||||
|
+ if (fstat(fd, &st) == 0 && !sysfs_devno_is_wholedisk(st.st_rdev)) {
|
||||||
|
+ struct sysfs_cxt cxt;
|
||||||
|
+
|
||||||
|
+ if (sysfs_init(&cxt, st.st_rdev, NULL))
|
||||||
|
+ err(EXIT_FAILURE,
|
||||||
|
+ _("%s: failed to initialize sysfs handler"),
|
||||||
|
+ device);
|
||||||
|
+ if (sysfs_read_u64(&cxt, "start", &start))
|
||||||
|
+ err(EXIT_FAILURE,
|
||||||
|
+ _("%s: failed to read partition start from sysfs"),
|
||||||
|
+ device);
|
||||||
|
+ sysfs_deinit(&cxt);
|
||||||
|
+ }
|
||||||
|
if (ioctl(fd, BLKROGET, &ro) == 0 &&
|
||||||
|
ioctl(fd, BLKRAGET, &ra) == 0 &&
|
||||||
|
ioctl(fd, BLKSSZGET, &ssz) == 0 &&
|
||||||
|
ioctl(fd, BLKBSZGET, &bsz) == 0 &&
|
||||||
|
- ioctl(fd, HDIO_GETGEO, &g) == 0 &&
|
||||||
|
blkdev_get_size(fd, &bytes) == 0) {
|
||||||
|
- printf("%s %5ld %5d %5d %10ld %15lld %s\n",
|
||||||
|
- ro ? "ro" : "rw", ra, ssz, bsz, g.start, bytes, device);
|
||||||
|
+ printf("%s %5ld %5d %5d %10ju %15lld %s\n",
|
||||||
|
+ ro ? "ro" : "rw", ra, ssz, bsz, start, bytes, device);
|
||||||
|
} else {
|
||||||
|
if (!quiet)
|
||||||
|
warnx(_("ioctl error on %s"), device);
|
||||||
|
diff -up util-linux-2.23.2/include/sysfs.h.kzak util-linux-2.23.2/include/sysfs.h
|
||||||
|
--- util-linux-2.23.2/include/sysfs.h.kzak 2015-06-23 11:32:12.709793086 +0200
|
||||||
|
+++ util-linux-2.23.2/include/sysfs.h 2015-06-23 11:32:31.909652361 +0200
|
||||||
|
@@ -72,6 +72,7 @@ extern int sysfs_is_partition_dirent(DIR
|
||||||
|
|
||||||
|
extern int sysfs_devno_to_wholedisk(dev_t dev, char *diskname,
|
||||||
|
size_t len, dev_t *diskdevno);
|
||||||
|
+extern int sysfs_devno_is_wholedisk(dev_t devno);
|
||||||
|
|
||||||
|
extern int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h,
|
||||||
|
int *c, int *t, int *l);
|
||||||
|
diff -up util-linux-2.23.2/lib/sysfs.c.kzak util-linux-2.23.2/lib/sysfs.c
|
||||||
|
--- util-linux-2.23.2/lib/sysfs.c.kzak 2015-06-23 11:31:32.166090250 +0200
|
||||||
|
+++ util-linux-2.23.2/lib/sysfs.c 2015-06-23 11:31:59.684888551 +0200
|
||||||
|
@@ -638,6 +638,18 @@ err:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Return 0 or 1, or < 0 in case of error
|
||||||
|
+ */
|
||||||
|
+int sysfs_devno_is_wholedisk(dev_t devno)
|
||||||
|
+{
|
||||||
|
+ dev_t disk;
|
||||||
|
+
|
||||||
|
+ if (sysfs_devno_to_wholedisk(devno, NULL, 0, &disk) != 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ return devno == disk;
|
||||||
|
+}
|
||||||
|
|
||||||
|
int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h, int *c, int *t, int *l)
|
||||||
|
{
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/dmesg.c.kzak util-linux-2.23.2/sys-utils/dmesg.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/dmesg.c.kzak 2013-07-30 11:22:47.213494455 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/dmesg.c 2014-09-24 10:24:49.179371108 +0200
|
||||||
|
@@ -991,6 +991,8 @@ static int init_kmsg(struct dmesg_contro
|
||||||
|
|
||||||
|
if (!ctl->follow)
|
||||||
|
mode |= O_NONBLOCK;
|
||||||
|
+ else
|
||||||
|
+ setlinebuf(stdout);
|
||||||
|
|
||||||
|
ctl->kmsg = open("/dev/kmsg", mode);
|
||||||
|
if (ctl->kmsg < 0)
|
|
@ -0,0 +1,11 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/flock.c.kzak util-linux-2.23.2/sys-utils/flock.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/flock.c.kzak 2014-03-25 12:00:53.735361387 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/flock.c 2014-03-25 12:01:44.534886083 +0100
|
||||||
|
@@ -250,6 +250,7 @@ int main(int argc, char *argv[])
|
||||||
|
/* otherwise try again */
|
||||||
|
continue;
|
||||||
|
case EIO:
|
||||||
|
+ case EBADF: /* since Linux 3.4 (commit 55725513) */
|
||||||
|
/* Probably NFSv4 where flock() is emulated by fcntl().
|
||||||
|
* Let's try to reopen in read-write mode.
|
||||||
|
*/
|
|
@ -0,0 +1,173 @@
|
||||||
|
diff -up util-linux-2.23.2/disk-utils/fsck.c.kzak util-linux-2.23.2/disk-utils/fsck.c
|
||||||
|
--- util-linux-2.23.2/disk-utils/fsck.c.kzak 2014-03-25 12:52:33.429389852 +0100
|
||||||
|
+++ util-linux-2.23.2/disk-utils/fsck.c 2014-03-25 12:56:27.126804792 +0100
|
||||||
|
@@ -79,9 +79,7 @@ static const char *really_wanted[] = {
|
||||||
|
"ext4dev",
|
||||||
|
"jfs",
|
||||||
|
"reiserfs",
|
||||||
|
- "xiafs",
|
||||||
|
- "xfs",
|
||||||
|
- NULL
|
||||||
|
+ "xiafs"
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -167,6 +165,19 @@ static int string_to_int(const char *s)
|
||||||
|
return (int) l;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Do we really really want to check this fs? */
|
||||||
|
+static int fs_check_required(const char *type)
|
||||||
|
+{
|
||||||
|
+ size_t i;
|
||||||
|
+
|
||||||
|
+ for(i = 0; i < ARRAY_SIZE(really_wanted); i++) {
|
||||||
|
+ if (strcmp(type, really_wanted[i]) == 0)
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int is_mounted(struct libmnt_fs *fs)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
@@ -546,17 +557,17 @@ static void print_stats(struct fsck_inst
|
||||||
|
* Execute a particular fsck program, and link it into the list of
|
||||||
|
* child processes we are waiting for.
|
||||||
|
*/
|
||||||
|
-static int execute(const char *type, struct libmnt_fs *fs, int interactive)
|
||||||
|
+static int execute(const char *progname, const char *progpath,
|
||||||
|
+ const char *type, struct libmnt_fs *fs, int interactive)
|
||||||
|
{
|
||||||
|
- char *s, *argv[80], prog[80];
|
||||||
|
+ char *argv[80];
|
||||||
|
int argc, i;
|
||||||
|
struct fsck_instance *inst, *p;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
inst = xcalloc(1, sizeof(*inst));
|
||||||
|
|
||||||
|
- sprintf(prog, "fsck.%s", type);
|
||||||
|
- argv[0] = xstrdup(prog);
|
||||||
|
+ argv[0] = xstrdup(progname);
|
||||||
|
argc = 1;
|
||||||
|
|
||||||
|
for (i=0; i <num_args; i++)
|
||||||
|
@@ -583,19 +594,12 @@ static int execute(const char *type, str
|
||||||
|
argv[argc++] = xstrdup(fs_get_device(fs));
|
||||||
|
argv[argc] = 0;
|
||||||
|
|
||||||
|
- s = find_fsck(prog);
|
||||||
|
- if (s == NULL) {
|
||||||
|
- warnx(_("%s: not found"), prog);
|
||||||
|
- free(inst);
|
||||||
|
- return ENOENT;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (verbose || noexecute) {
|
||||||
|
const char *tgt = mnt_fs_get_target(fs);
|
||||||
|
|
||||||
|
if (!tgt)
|
||||||
|
tgt = fs_get_device(fs);
|
||||||
|
- printf("[%s (%d) -- %s] ", s, num_running, tgt);
|
||||||
|
+ printf("[%s (%d) -- %s] ", progpath, num_running, tgt);
|
||||||
|
for (i=0; i < argc; i++)
|
||||||
|
printf("%s ", argv[i]);
|
||||||
|
printf("\n");
|
||||||
|
@@ -617,15 +621,15 @@ static int execute(const char *type, str
|
||||||
|
} else if (pid == 0) {
|
||||||
|
if (!interactive)
|
||||||
|
close(0);
|
||||||
|
- execv(s, argv);
|
||||||
|
- err(FSCK_EX_ERROR, _("%s: execute failed"), s);
|
||||||
|
+ execv(progpath, argv);
|
||||||
|
+ err(FSCK_EX_ERROR, _("%s: execute failed"), progpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i < argc; i++)
|
||||||
|
free(argv[i]);
|
||||||
|
|
||||||
|
inst->pid = pid;
|
||||||
|
- inst->prog = xstrdup(prog);
|
||||||
|
+ inst->prog = xstrdup(progname);
|
||||||
|
inst->type = xstrdup(type);
|
||||||
|
gettimeofday(&inst->start_time, NULL);
|
||||||
|
inst->next = NULL;
|
||||||
|
@@ -822,6 +826,7 @@ static int wait_many(int flags)
|
||||||
|
*/
|
||||||
|
static int fsck_device(struct libmnt_fs *fs, int interactive)
|
||||||
|
{
|
||||||
|
+ char progname[80], *progpath;
|
||||||
|
const char *type;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
@@ -838,15 +843,27 @@ static int fsck_device(struct libmnt_fs
|
||||||
|
else
|
||||||
|
type = DEFAULT_FSTYPE;
|
||||||
|
|
||||||
|
+ sprintf(progname, "fsck.%s", type);
|
||||||
|
+ progpath = find_fsck(progname);
|
||||||
|
+ if (progpath == NULL) {
|
||||||
|
+ if (fs_check_required(type)) {
|
||||||
|
+ retval = ENOENT;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
num_running++;
|
||||||
|
- retval = execute(type, fs, interactive);
|
||||||
|
+ retval = execute(progname, progpath, type, fs, interactive);
|
||||||
|
if (retval) {
|
||||||
|
- warnx(_("error %d while executing fsck.%s for %s"),
|
||||||
|
- retval, type, fs_get_device(fs));
|
||||||
|
num_running--;
|
||||||
|
- return FSCK_EX_ERROR;
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
+err:
|
||||||
|
+ warnx(_("error %d (%m) while executing fsck.%s for %s"),
|
||||||
|
+ retval, type, fs_get_device(fs));
|
||||||
|
+ return FSCK_EX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1014,8 +1031,7 @@ static int fs_ignored_type(struct libmnt
|
||||||
|
/* Check if we should ignore this filesystem. */
|
||||||
|
static int ignore(struct libmnt_fs *fs)
|
||||||
|
{
|
||||||
|
- const char **ip, *type;
|
||||||
|
- int wanted = 0;
|
||||||
|
+ const char *type;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the pass number is 0, ignore it.
|
||||||
|
@@ -1070,16 +1086,11 @@ static int ignore(struct libmnt_fs *fs)
|
||||||
|
if (fs_ignored_type(fs))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- /* Do we really really want to check this fs? */
|
||||||
|
- for(ip = really_wanted; *ip; ip++)
|
||||||
|
- if (strcmp(type, *ip) == 0) {
|
||||||
|
- wanted = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
|
||||||
|
/* See if the <fsck.fs> program is available. */
|
||||||
|
if (find_fsck(type) == NULL) {
|
||||||
|
- if (wanted)
|
||||||
|
+ if (fs_check_required(type))
|
||||||
|
warnx(_("cannot check %s: fsck.%s not found"),
|
||||||
|
fs_get_device(fs), type);
|
||||||
|
return 1;
|
||||||
|
@@ -1557,7 +1568,6 @@ int main(int argc, char *argv[])
|
||||||
|
fs = add_dummy_fs(devices[i]);
|
||||||
|
else if (fs_ignored_type(fs))
|
||||||
|
continue;
|
||||||
|
-
|
||||||
|
if (ignore_mounted && is_mounted(fs))
|
||||||
|
continue;
|
||||||
|
status |= fsck_device(fs, interactive);
|
|
@ -0,0 +1,496 @@
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/libmount.h.in.kzak util-linux-2.23.2/libmount/src/libmount.h.in
|
||||||
|
--- util-linux-2.23.2/libmount/src/libmount.h.in.kzak 2015-06-23 11:54:00.510210784 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/libmount.h.in 2015-06-23 11:54:58.592785482 +0200
|
||||||
|
@@ -420,6 +420,15 @@ extern int mnt_table_get_root_fs(struct
|
||||||
|
extern int mnt_table_set_iter(struct libmnt_table *tb, struct libmnt_iter *itr,
|
||||||
|
struct libmnt_fs *fs);
|
||||||
|
|
||||||
|
+enum {
|
||||||
|
+ MNT_UNIQ_FORWARD = (1 << 1), /* default is backward */
|
||||||
|
+ MNT_UNIQ_KEEPTREE = (1 << 2)
|
||||||
|
+};
|
||||||
|
+extern int mnt_table_uniq_fs(struct libmnt_table *tb, int flags,
|
||||||
|
+ int (*cmp)(struct libmnt_table *,
|
||||||
|
+ struct libmnt_fs *,
|
||||||
|
+ struct libmnt_fs *));
|
||||||
|
+
|
||||||
|
extern struct libmnt_fs *mnt_table_find_mountpoint(struct libmnt_table *tb,
|
||||||
|
const char *path, int direction);
|
||||||
|
extern struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb,
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/libmount.sym.kzak util-linux-2.23.2/libmount/src/libmount.sym
|
||||||
|
--- util-linux-2.23.2/libmount/src/libmount.sym.kzak 2015-06-23 11:56:47.259989779 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/libmount.sym 2015-06-23 11:56:17.681206366 +0200
|
||||||
|
@@ -256,3 +256,9 @@ global:
|
||||||
|
mnt_context_find_umount_fs;
|
||||||
|
mnt_table_find_mountpoint;
|
||||||
|
} MOUNT_2.22;
|
||||||
|
+
|
||||||
|
+/* backport from v2.25 to RHEL7 */
|
||||||
|
+MOUNT_2.25 {
|
||||||
|
+ mnt_table_uniq_fs;
|
||||||
|
+} MOUNT_2.23;
|
||||||
|
+
|
||||||
|
diff -up util-linux-2.23.2/libmount/src/tab.c.kzak util-linux-2.23.2/libmount/src/tab.c
|
||||||
|
--- util-linux-2.23.2/libmount/src/tab.c.kzak 2015-06-23 11:52:04.750058424 +0200
|
||||||
|
+++ util-linux-2.23.2/libmount/src/tab.c 2015-06-23 11:53:26.109462680 +0200
|
||||||
|
@@ -398,6 +398,93 @@ int mnt_table_find_next_fs(struct libmnt
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int mnt_table_move_parent(struct libmnt_table *tb, int oldid, int newid)
|
||||||
|
+{
|
||||||
|
+ struct libmnt_iter itr;
|
||||||
|
+ struct libmnt_fs *fs;
|
||||||
|
+
|
||||||
|
+ if (!tb)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ if (list_empty(&tb->ents))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ mnt_reset_iter(&itr, MNT_ITER_FORWARD);
|
||||||
|
+
|
||||||
|
+ while (mnt_table_next_fs(tb, &itr, &fs) == 0) {
|
||||||
|
+ if (fs->parent == oldid)
|
||||||
|
+ fs->parent = newid;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * mnt_table_uniq_fs:
|
||||||
|
+ * @tb: table
|
||||||
|
+ * @flags: MNT_UNIQ_*
|
||||||
|
+ * @cmp: function to compare filesystems
|
||||||
|
+ *
|
||||||
|
+ * This function de-duplicate the @tb, but does not change order of the
|
||||||
|
+ * filesystems. The @cmp function has to return 0 if the filesystems are
|
||||||
|
+ * equal, otherwise non-zero.
|
||||||
|
+ *
|
||||||
|
+ * The default is to keep in the table later mounted filesystems (function uses
|
||||||
|
+ * backward mode iterator).
|
||||||
|
+ *
|
||||||
|
+ * @MNT_UNIQ_FORWARD: remove later mounted filesystems
|
||||||
|
+ * @MNT_UNIQ_KEEPTREE: keep parent->id relation ship stil valid
|
||||||
|
+ *
|
||||||
|
+ * Returns: negative number in case of error, or 0 o success.
|
||||||
|
+ */
|
||||||
|
+int mnt_table_uniq_fs(struct libmnt_table *tb, int flags,
|
||||||
|
+ int (*cmp)(struct libmnt_table *,
|
||||||
|
+ struct libmnt_fs *,
|
||||||
|
+ struct libmnt_fs *))
|
||||||
|
+{
|
||||||
|
+ struct libmnt_iter itr;
|
||||||
|
+ struct libmnt_fs *fs;
|
||||||
|
+ int direction = MNT_ITER_BACKWARD;
|
||||||
|
+
|
||||||
|
+ if (!tb || !cmp)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ if (list_empty(&tb->ents))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (flags & MNT_UNIQ_FORWARD)
|
||||||
|
+ direction = MNT_ITER_FORWARD;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ mnt_reset_iter(&itr, direction);
|
||||||
|
+
|
||||||
|
+ if ((flags & MNT_UNIQ_KEEPTREE) && !is_mountinfo(tb))
|
||||||
|
+ flags &= ~MNT_UNIQ_KEEPTREE;
|
||||||
|
+
|
||||||
|
+ while (mnt_table_next_fs(tb, &itr, &fs) == 0) {
|
||||||
|
+ int want = 1;
|
||||||
|
+ struct libmnt_iter xtr;
|
||||||
|
+ struct libmnt_fs *x;
|
||||||
|
+
|
||||||
|
+ mnt_reset_iter(&xtr, direction);
|
||||||
|
+ while (want && mnt_table_next_fs(tb, &xtr, &x) == 0) {
|
||||||
|
+ if (fs == x)
|
||||||
|
+ break;
|
||||||
|
+ want = cmp(tb, x, fs) != 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!want) {
|
||||||
|
+ if (flags & MNT_UNIQ_KEEPTREE)
|
||||||
|
+ mnt_table_move_parent(tb, mnt_fs_get_id(fs),
|
||||||
|
+ mnt_fs_get_parent_id(fs));
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ mnt_table_remove_fs(tb, fs);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* mnt_table_set_iter:
|
||||||
|
* @tb: tab pointer
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/fstrim.c.kzak util-linux-2.23.2/sys-utils/fstrim.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/fstrim.c.kzak 2013-06-13 09:46:10.535651605 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/fstrim.c 2015-06-23 11:57:59.435461283 +0200
|
||||||
|
@@ -41,6 +41,11 @@
|
||||||
|
#include "strutils.h"
|
||||||
|
#include "c.h"
|
||||||
|
#include "closestream.h"
|
||||||
|
+#include "pathnames.h"
|
||||||
|
+#include "sysfs.h"
|
||||||
|
+#include "exitcodes.h"
|
||||||
|
+
|
||||||
|
+#include <libmount.h>
|
||||||
|
|
||||||
|
#ifndef FITRIM
|
||||||
|
struct fstrim_range {
|
||||||
|
@@ -51,16 +56,216 @@ struct fstrim_range {
|
||||||
|
#define FITRIM _IOWR('X', 121, struct fstrim_range)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* returns: 0 = success, 1 = unsupported, < 0 = error */
|
||||||
|
+static int fstrim_filesystem(const char *path, struct fstrim_range *rangetpl,
|
||||||
|
+ int verbose)
|
||||||
|
+{
|
||||||
|
+ int fd;
|
||||||
|
+ struct stat sb;
|
||||||
|
+ struct fstrim_range range;
|
||||||
|
+
|
||||||
|
+ /* kernel modifies the range */
|
||||||
|
+ memcpy(&range, rangetpl, sizeof(range));
|
||||||
|
+
|
||||||
|
+ fd = open(path, O_RDONLY);
|
||||||
|
+ if (fd < 0) {
|
||||||
|
+ warn(_("cannot open %s"), path);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ if (fstat(fd, &sb) == -1) {
|
||||||
|
+ warn(_("stat of %s failed"), path);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ if (!S_ISDIR(sb.st_mode)) {
|
||||||
|
+ warnx(_("%s: not a directory"), path);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ errno = 0;
|
||||||
|
+ if (ioctl(fd, FITRIM, &range)) {
|
||||||
|
+ int rc = errno == EOPNOTSUPP || errno == ENOTTY ? 1 : -1;
|
||||||
|
+
|
||||||
|
+ if (rc != 1)
|
||||||
|
+ warn(_("%s: FITRIM ioctl failed"), path);
|
||||||
|
+ close(fd);
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (verbose) {
|
||||||
|
+ char *str = size_to_human_string(
|
||||||
|
+ SIZE_SUFFIX_3LETTER | SIZE_SUFFIX_SPACE,
|
||||||
|
+ (uint64_t) range.len);
|
||||||
|
+ /* TRANSLATORS: The standard value here is a very large number. */
|
||||||
|
+ printf(_("%s: %s (%" PRIu64 " bytes) trimmed\n"),
|
||||||
|
+ path, str, (uint64_t) range.len);
|
||||||
|
+ free(str);
|
||||||
|
+ }
|
||||||
|
+ close(fd);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int has_discard(const char *devname, struct sysfs_cxt *wholedisk)
|
||||||
|
+{
|
||||||
|
+ struct sysfs_cxt cxt, *parent = NULL;
|
||||||
|
+ uint64_t dg = 0;
|
||||||
|
+ dev_t disk = 0, dev;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ dev = sysfs_devname_to_devno(devname, NULL);
|
||||||
|
+ if (!dev)
|
||||||
|
+ return 1;
|
||||||
|
+ /*
|
||||||
|
+ * This is tricky to read the info from sys/, because the queue
|
||||||
|
+ * atrributes are provided for whole devices (disk) only. We're trying
|
||||||
|
+ * to reuse the whole-disk sysfs context to optimize this stuff (as
|
||||||
|
+ * system usually have just one disk only).
|
||||||
|
+ */
|
||||||
|
+ if (sysfs_devno_to_wholedisk(dev, NULL, 0, &disk) || !disk)
|
||||||
|
+ return 1;
|
||||||
|
+ if (dev != disk) {
|
||||||
|
+ if (wholedisk->devno != disk) {
|
||||||
|
+ sysfs_deinit(wholedisk);
|
||||||
|
+ if (sysfs_init(wholedisk, disk, NULL))
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ parent = wholedisk;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rc = sysfs_init(&cxt, dev, parent);
|
||||||
|
+ if (!rc)
|
||||||
|
+ rc = sysfs_read_u64(&cxt, "queue/discard_granularity", &dg);
|
||||||
|
+
|
||||||
|
+ sysfs_deinit(&cxt);
|
||||||
|
+ return rc == 0 && dg > 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+static int uniq_fs_target_cmp(
|
||||||
|
+ struct libmnt_table *tb __attribute__((__unused__)),
|
||||||
|
+ struct libmnt_fs *a,
|
||||||
|
+ struct libmnt_fs *b)
|
||||||
|
+{
|
||||||
|
+ return !mnt_fs_streq_target(a, mnt_fs_get_target(b));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int uniq_fs_source_cmp(
|
||||||
|
+ struct libmnt_table *tb __attribute__((__unused__)),
|
||||||
|
+ struct libmnt_fs *a,
|
||||||
|
+ struct libmnt_fs *b)
|
||||||
|
+{
|
||||||
|
+ int eq;
|
||||||
|
+
|
||||||
|
+ if (mnt_fs_is_pseudofs(a) || mnt_fs_is_netfs(a) ||
|
||||||
|
+ mnt_fs_is_pseudofs(b) || mnt_fs_is_netfs(b))
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ eq = mnt_fs_streq_srcpath(a, mnt_fs_get_srcpath(b));
|
||||||
|
+ if (eq) {
|
||||||
|
+ const char *aroot = mnt_fs_get_root(a),
|
||||||
|
+ *broot = mnt_fs_get_root(b);
|
||||||
|
+ if (!aroot || !broot)
|
||||||
|
+ eq = 0;
|
||||||
|
+ else if (strcmp(aroot, broot) != 0)
|
||||||
|
+ eq = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return !eq;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * fstrim --all follows "mount -a" return codes:
|
||||||
|
+ *
|
||||||
|
+ * 0 = all success
|
||||||
|
+ * 32 = all failed
|
||||||
|
+ * 64 = some failed, some success
|
||||||
|
+ */
|
||||||
|
+static int fstrim_all(struct fstrim_range *rangetpl, int verbose)
|
||||||
|
+{
|
||||||
|
+ struct libmnt_fs *fs;
|
||||||
|
+ struct libmnt_iter *itr;
|
||||||
|
+ struct libmnt_table *tab;
|
||||||
|
+ struct sysfs_cxt wholedisk = UL_SYSFSCXT_EMPTY;
|
||||||
|
+ int cnt = 0, cnt_err = 0;
|
||||||
|
+
|
||||||
|
+ mnt_init_debug(0);
|
||||||
|
+
|
||||||
|
+ itr = mnt_new_iter(MNT_ITER_BACKWARD);
|
||||||
|
+ if (!itr)
|
||||||
|
+ err(MOUNT_EX_FAIL, _("failed to initialize libmount iterator"));
|
||||||
|
+
|
||||||
|
+ tab = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
|
||||||
|
+ if (!tab)
|
||||||
|
+ err(MOUNT_EX_FAIL, _("failed to parse %s"), _PATH_PROC_MOUNTINFO);
|
||||||
|
+
|
||||||
|
+ /* de-duplicate by mountpoints */
|
||||||
|
+ mnt_table_uniq_fs(tab, 0, uniq_fs_target_cmp);
|
||||||
|
+
|
||||||
|
+ /* de-duplicate by source and root */
|
||||||
|
+ mnt_table_uniq_fs(tab, 0, uniq_fs_source_cmp);
|
||||||
|
+
|
||||||
|
+ while (mnt_table_next_fs(tab, itr, &fs) == 0) {
|
||||||
|
+ const char *src = mnt_fs_get_srcpath(fs),
|
||||||
|
+ *tgt = mnt_fs_get_target(fs);
|
||||||
|
+ char *path;
|
||||||
|
+ int rc = 1;
|
||||||
|
+
|
||||||
|
+ if (!src || !tgt || *src != '/' ||
|
||||||
|
+ mnt_fs_is_pseudofs(fs) ||
|
||||||
|
+ mnt_fs_is_netfs(fs))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ /* Is it really accessible mountpoint? Not all mountpoints are
|
||||||
|
+ * accessible (maybe over mounted by another fylesystem) */
|
||||||
|
+ path = mnt_get_mountpoint(tgt);
|
||||||
|
+ if (path && strcmp(path, tgt) == 0)
|
||||||
|
+ rc = 0;
|
||||||
|
+ free(path);
|
||||||
|
+ if (rc)
|
||||||
|
+ continue; /* overlaying mount */
|
||||||
|
+
|
||||||
|
+ if (!has_discard(src, &wholedisk))
|
||||||
|
+ continue;
|
||||||
|
+ cnt++;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We're able to detect that the device supports discard, but
|
||||||
|
+ * things also depend on filesystem or device mapping, for
|
||||||
|
+ * example vfat or LUKS (by default) does not support FSTRIM.
|
||||||
|
+ *
|
||||||
|
+ * This is reason why we ignore EOPNOTSUPP and ENOTTY errors
|
||||||
|
+ * from discard ioctl.
|
||||||
|
+ */
|
||||||
|
+ if (fstrim_filesystem(tgt, rangetpl, verbose) < 0)
|
||||||
|
+ cnt_err++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sysfs_deinit(&wholedisk);
|
||||||
|
+ mnt_free_table(tab);
|
||||||
|
+ mnt_free_iter(itr);
|
||||||
|
+
|
||||||
|
+ if (cnt && cnt == cnt_err)
|
||||||
|
+ return MOUNT_EX_FAIL; /* all failed */
|
||||||
|
+ if (cnt && cnt_err)
|
||||||
|
+ return MOUNT_EX_SOMEOK; /* some ok */
|
||||||
|
+
|
||||||
|
+ return EXIT_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void __attribute__((__noreturn__)) usage(FILE *out)
|
||||||
|
{
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
fprintf(out,
|
||||||
|
_(" %s [options] <mount point>\n"), program_invocation_short_name);
|
||||||
|
+
|
||||||
|
+ fputs(USAGE_SEPARATOR, out);
|
||||||
|
+ fputs(_("Discard unused blocks on a mounted filesystem.\n"), out);
|
||||||
|
+
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
- fputs(_(" -o, --offset <num> offset in bytes to discard from\n"
|
||||||
|
- " -l, --length <num> length of bytes to discard from the offset\n"
|
||||||
|
- " -m, --minimum <num> minimum extent length to discard\n"
|
||||||
|
- " -v, --verbose print number of discarded bytes\n"), out);
|
||||||
|
+ fputs(_(" -a, --all trim all mounted filesystems that are supported\n"), out);
|
||||||
|
+ fputs(_(" -o, --offset <num> the offset in bytes to start discarding from\n"), out);
|
||||||
|
+ fputs(_(" -l, --length <num> the number of bytes to discard\n"), out);
|
||||||
|
+ fputs(_(" -m, --minimum <num> the minimum extent length to discard\n"), out);
|
||||||
|
+ fputs(_(" -v, --verbose print number of discarded bytes\n"), out);
|
||||||
|
+
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
fputs(USAGE_VERSION, out);
|
||||||
|
@@ -70,12 +275,12 @@ static void __attribute__((__noreturn__)
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
- char *path;
|
||||||
|
- int c, fd, verbose = 0;
|
||||||
|
+ char *path = NULL;
|
||||||
|
+ int c, rc, verbose = 0, all = 0;
|
||||||
|
struct fstrim_range range;
|
||||||
|
- struct stat sb;
|
||||||
|
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
+ { "all", 0, 0, 'a' },
|
||||||
|
{ "help", 0, 0, 'h' },
|
||||||
|
{ "version", 0, 0, 'V' },
|
||||||
|
{ "offset", 1, 0, 'o' },
|
||||||
|
@@ -93,8 +298,11 @@ int main(int argc, char **argv)
|
||||||
|
memset(&range, 0, sizeof(range));
|
||||||
|
range.len = ULLONG_MAX;
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "hVo:l:m:v", longopts, NULL)) != -1) {
|
||||||
|
+ while ((c = getopt_long(argc, argv, "ahVo:l:m:v", longopts, NULL)) != -1) {
|
||||||
|
switch(c) {
|
||||||
|
+ case 'a':
|
||||||
|
+ all = 1;
|
||||||
|
+ break;
|
||||||
|
case 'h':
|
||||||
|
usage(stdout);
|
||||||
|
break;
|
||||||
|
@@ -122,38 +330,26 @@ int main(int argc, char **argv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (optind == argc)
|
||||||
|
- errx(EXIT_FAILURE, _("no mountpoint specified"));
|
||||||
|
-
|
||||||
|
- path = argv[optind++];
|
||||||
|
+ if (!all) {
|
||||||
|
+ if (optind == argc)
|
||||||
|
+ errx(EXIT_FAILURE, _("no mountpoint specified"));
|
||||||
|
+ path = argv[optind++];
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (optind != argc) {
|
||||||
|
warnx(_("unexpected number of arguments"));
|
||||||
|
usage(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (stat(path, &sb) == -1)
|
||||||
|
- err(EXIT_FAILURE, _("stat failed %s"), path);
|
||||||
|
- if (!S_ISDIR(sb.st_mode))
|
||||||
|
- errx(EXIT_FAILURE, _("%s: not a directory"), path);
|
||||||
|
-
|
||||||
|
- fd = open(path, O_RDONLY);
|
||||||
|
- if (fd < 0)
|
||||||
|
- err(EXIT_FAILURE, _("cannot open %s"), path);
|
||||||
|
-
|
||||||
|
- if (ioctl(fd, FITRIM, &range))
|
||||||
|
- err(EXIT_FAILURE, _("%s: FITRIM ioctl failed"), path);
|
||||||
|
-
|
||||||
|
- if (verbose) {
|
||||||
|
- char *str = size_to_human_string(SIZE_SUFFIX_3LETTER |
|
||||||
|
- SIZE_SUFFIX_SPACE,
|
||||||
|
- (uint64_t) range.len);
|
||||||
|
- /* TRANSLATORS: The standard value here is a very large number. */
|
||||||
|
- printf(_("%s: %s (%" PRIu64 " bytes) trimmed\n"),
|
||||||
|
- path, str,
|
||||||
|
- (uint64_t) range.len);
|
||||||
|
- free(str);
|
||||||
|
+ if (all)
|
||||||
|
+ rc = fstrim_all(&range, verbose);
|
||||||
|
+ else {
|
||||||
|
+ rc = fstrim_filesystem(path, &range, verbose);
|
||||||
|
+ if (rc == 1) {
|
||||||
|
+ warnx(_("%s: the discard operation is not supported"), path);
|
||||||
|
+ rc = EXIT_FAILURE;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- close(fd);
|
||||||
|
- return EXIT_SUCCESS;
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/fstrim.service.in.kzak util-linux-2.23.2/sys-utils/fstrim.service
|
||||||
|
--- util-linux-2.23.2/sys-utils/fstrim.service.in.kzak 2015-06-23 12:02:18.505564273 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/fstrim.service.in 2015-06-23 12:02:05.049662802 +0200
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+[Unit]
|
||||||
|
+Description=Discard unused blocks
|
||||||
|
+
|
||||||
|
+[Service]
|
||||||
|
+Type=oneshot
|
||||||
|
+ExecStart=@sbindir@/fstrim -a
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/fstrim.timer.kzak util-linux-2.23.2/sys-utils/fstrim.timer
|
||||||
|
--- util-linux-2.23.2/sys-utils/fstrim.timer.kzak 2015-06-23 12:02:18.505564273 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/fstrim.timer 2015-06-23 12:02:05.049662802 +0200
|
||||||
|
@@ -0,0 +1,11 @@
|
||||||
|
+[Unit]
|
||||||
|
+Description=Discard unused blocks once a week
|
||||||
|
+Documentation=man:fstrim
|
||||||
|
+
|
||||||
|
+[Timer]
|
||||||
|
+OnCalendar=weekly
|
||||||
|
+AccuracySec=1h
|
||||||
|
+Persistent=true
|
||||||
|
+
|
||||||
|
+[Install]
|
||||||
|
+WantedBy=multi-user.target
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/Makemodule.am.kzak util-linux-2.23.2/sys-utils/Makemodule.am
|
||||||
|
--- util-linux-2.23.2/sys-utils/Makemodule.am.kzak 2015-06-23 11:59:05.803975307 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/Makemodule.am 2015-06-23 12:01:18.682002323 +0200
|
||||||
|
@@ -68,7 +68,18 @@ fsfreeze_SOURCES = sys-utils/fsfreeze.c
|
||||||
|
sbin_PROGRAMS += fstrim
|
||||||
|
dist_man_MANS += sys-utils/fstrim.8
|
||||||
|
fstrim_SOURCES = sys-utils/fstrim.c
|
||||||
|
-fstrim_LDADD = $(LDADD) libcommon.la
|
||||||
|
+fstrim_LDADD = $(LDADD) libcommon.la libmount.la
|
||||||
|
+fstrim_CFLAGS = $(AM_CFLAGS) -I$(ul_libmount_incdir)
|
||||||
|
+
|
||||||
|
+if HAVE_SYSTEMD
|
||||||
|
+systemdsystemunit_DATA += \
|
||||||
|
+ sys-utils/fstrim.service \
|
||||||
|
+ sys-utils/fstrim.timer
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+PATHFILES += sys-utils/fstrim.service
|
||||||
|
+EXTRA_DIST += sys-utils/fstrim.timer
|
||||||
|
+
|
||||||
|
|
||||||
|
sbin_PROGRAMS += blkdiscard
|
||||||
|
dist_man_MANS += sys-utils/blkdiscard.8
|
|
@ -0,0 +1,254 @@
|
||||||
|
From 4a44a54b3caf77923f0e3f1d5bdf5eda6ef07f62 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris MacGregor <chrismacgregor@google.com>
|
||||||
|
Date: Thu, 27 Feb 2014 10:40:59 -0800
|
||||||
|
Subject: [PATCH] hwclock: fix possible hang and other
|
||||||
|
set_hardware_clock_exact() issues
|
||||||
|
|
||||||
|
In sys-utils/hwclock.c, set_hardware_clock_exact() has some problems when the
|
||||||
|
process gets pre-empted (for more than 100ms) before reaching the time for
|
||||||
|
which it waits:
|
||||||
|
|
||||||
|
1. The "continue" statement causes execution to skip the final tdiff
|
||||||
|
assignment at the end of the do...while loop, leading to the while condition
|
||||||
|
using the wrong value of tdiff, and thus always exiting the loop once
|
||||||
|
newhwtime != sethwtime (e.g., after 1 second). This masks bug # 2, below.
|
||||||
|
|
||||||
|
2. The previously-existing bug is that because it starts over waiting for the
|
||||||
|
desired time whenever two successive calls to gettimeofday() return values >
|
||||||
|
100ms apart, the loop will never terminate unless the process holds the CPU
|
||||||
|
(without losing it for more than 100ms) for at least 500ms. This can happen
|
||||||
|
on a heavily loaded machine or on a virtual machine (or on a heavily loaded
|
||||||
|
virtual machine). This has been observed to occur, preventing a machine from
|
||||||
|
completing the shutdown or reboot process due to a "hwclock --systohc" call in
|
||||||
|
a shutdown script.
|
||||||
|
|
||||||
|
The new implementation presented in this patch takes a somewhat different
|
||||||
|
approach, intended to accomplish the same goals:
|
||||||
|
|
||||||
|
It computes the desired target system time (at which the requested hardware
|
||||||
|
clock time will be applied to the hardware clock), and waits for that time to
|
||||||
|
arrive. If it misses the time (such as due to being pre-empted for too long),
|
||||||
|
it recalculates the target time, and increases the tolerance (how late it can
|
||||||
|
be relative to the target time, and still be "close enough". Thus, if all is
|
||||||
|
well, the time will be set *very* precisely. On a machine where the hwclock
|
||||||
|
process is repeatedly pre-empted, it will set the time as precisely as is
|
||||||
|
possible under the conditions present on that particular machine. In any
|
||||||
|
case, it will always terminate eventually (and pretty quickly); it will never
|
||||||
|
hang forever.
|
||||||
|
|
||||||
|
[kzak@redhat.com: - tiny coding style changes]
|
||||||
|
|
||||||
|
Signed-off-by: Chris MacGregor <chrismacgregor@google.com>
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
sys-utils/hwclock.c | 170 ++++++++++++++++++++++++++++++++++++++++------------
|
||||||
|
1 file changed, 131 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sys-utils/hwclock.c b/sys-utils/hwclock.c
|
||||||
|
index 30660d4..395b5c3 100644
|
||||||
|
--- a/sys-utils/hwclock.c
|
||||||
|
+++ b/sys-utils/hwclock.c
|
||||||
|
@@ -125,7 +125,7 @@ struct adjtime {
|
||||||
|
* We are running in debug mode, wherein we put a lot of information about
|
||||||
|
* what we're doing to standard output.
|
||||||
|
*/
|
||||||
|
-bool debug;
|
||||||
|
+int debug;
|
||||||
|
|
||||||
|
/* Workaround for Award 4.50g BIOS bug: keep the year in a file. */
|
||||||
|
bool badyear;
|
||||||
|
@@ -526,43 +526,141 @@ set_hardware_clock_exact(const time_t sethwtime,
|
||||||
|
const struct timeval refsystime,
|
||||||
|
const bool universal, const bool testing)
|
||||||
|
{
|
||||||
|
- time_t newhwtime = sethwtime;
|
||||||
|
- struct timeval beginsystime, nowsystime;
|
||||||
|
- double tdiff;
|
||||||
|
- int time_resync = 1;
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
- * Now delay some more until Hardware Clock time newhwtime arrives.
|
||||||
|
- * The 0.5 s is because the Hardware Clock always sets to your set
|
||||||
|
- * time plus 500 ms (because it is designed to update to the next
|
||||||
|
- * second precisely 500 ms after you finish the setting).
|
||||||
|
+ * The Hardware Clock can only be set to any integer time plus one
|
||||||
|
+ * half second. The integer time is required because there is no
|
||||||
|
+ * interface to set or get a fractional second. The additional half
|
||||||
|
+ * second is because the Hardware Clock updates to the following
|
||||||
|
+ * second precisely 500 ms (not 1 second!) after you release the
|
||||||
|
+ * divider reset (after setting the new time) - see description of
|
||||||
|
+ * DV2, DV1, DV0 in Register A in the MC146818A data sheet (and note
|
||||||
|
+ * that although that document doesn't say so, real-world code seems
|
||||||
|
+ * to expect that the SET bit in Register B functions the same way).
|
||||||
|
+ * That means that, e.g., when you set the clock to 1:02:03, it
|
||||||
|
+ * effectively really sets it to 1:02:03.5, because it will update to
|
||||||
|
+ * 1:02:04 only half a second later. Our caller passes the desired
|
||||||
|
+ * integer Hardware Clock time in sethwtime, and the corresponding
|
||||||
|
+ * system time (which may have a fractional part, and which may or may
|
||||||
|
+ * not be the same!) in refsystime. In an ideal situation, we would
|
||||||
|
+ * then apply sethwtime to the Hardware Clock at refsystime+500ms, so
|
||||||
|
+ * that when the Hardware Clock ticks forward to sethwtime+1s half a
|
||||||
|
+ * second later at refsystime+1000ms, everything is in sync. So we
|
||||||
|
+ * spin, waiting for gettimeofday() to return a time at or after that
|
||||||
|
+ * time (refsystime+500ms) up to a tolerance value, initially 1ms. If
|
||||||
|
+ * we miss that time due to being preempted for some other process,
|
||||||
|
+ * then we increase the margin a little bit (initially 1ms, doubling
|
||||||
|
+ * each time), add 1 second (or more, if needed to get a time that is
|
||||||
|
+ * in the future) to both the time for which we are waiting and the
|
||||||
|
+ * time that we will apply to the Hardware Clock, and start waiting
|
||||||
|
+ * again.
|
||||||
|
+ *
|
||||||
|
+ * For example, the caller requests that we set the Hardware Clock to
|
||||||
|
+ * 1:02:03, with reference time (current system time) = 6:07:08.250.
|
||||||
|
+ * We want the Hardware Clock to update to 1:02:04 at 6:07:09.250 on
|
||||||
|
+ * the system clock, and the first such update will occur 0.500
|
||||||
|
+ * seconds after we write to the Hardware Clock, so we spin until the
|
||||||
|
+ * system clock reads 6:07:08.750. If we get there, great, but let's
|
||||||
|
+ * imagine the system is so heavily loaded that our process is
|
||||||
|
+ * preempted and by the time we get to run again, the system clock
|
||||||
|
+ * reads 6:07:11.990. We now want to wait until the next xx:xx:xx.750
|
||||||
|
+ * time, which is 6:07:12.750 (4.5 seconds after the reference time),
|
||||||
|
+ * at which point we will set the Hardware Clock to 1:02:07 (4 seconds
|
||||||
|
+ * after the originally requested time). If we do that successfully,
|
||||||
|
+ * then at 6:07:13.250 (5 seconds after the reference time), the
|
||||||
|
+ * Hardware Clock will update to 1:02:08 (5 seconds after the
|
||||||
|
+ * originally requested time), and all is well thereafter.
|
||||||
|
*/
|
||||||
|
- do {
|
||||||
|
- if (time_resync) {
|
||||||
|
- gettimeofday(&beginsystime, NULL);
|
||||||
|
- tdiff = time_diff(beginsystime, refsystime);
|
||||||
|
- newhwtime = sethwtime + (int)(tdiff + 0.5);
|
||||||
|
- if (debug)
|
||||||
|
- printf(_
|
||||||
|
- ("Time elapsed since reference time has been %.6f seconds.\n"
|
||||||
|
- "Delaying further to reach the new time.\n"),
|
||||||
|
- tdiff);
|
||||||
|
- time_resync = 0;
|
||||||
|
+
|
||||||
|
+ time_t newhwtime = sethwtime;
|
||||||
|
+ double target_time_tolerance_secs = 0.001; /* initial value */
|
||||||
|
+ double tolerance_incr_secs = 0.001; /* initial value */
|
||||||
|
+ const double RTC_SET_DELAY_SECS = 0.5; /* 500 ms */
|
||||||
|
+ const struct timeval RTC_SET_DELAY_TV = { 0, RTC_SET_DELAY_SECS * 1E6 };
|
||||||
|
+
|
||||||
|
+ struct timeval targetsystime;
|
||||||
|
+ struct timeval nowsystime;
|
||||||
|
+ struct timeval prevsystime = refsystime;
|
||||||
|
+ double deltavstarget;
|
||||||
|
+
|
||||||
|
+ timeradd(&refsystime, &RTC_SET_DELAY_TV, &targetsystime);
|
||||||
|
+
|
||||||
|
+ while (1) {
|
||||||
|
+ double ticksize;
|
||||||
|
+
|
||||||
|
+ /* FOR TESTING ONLY: inject random delays of up to 1000ms */
|
||||||
|
+ if (debug >= 10) {
|
||||||
|
+ int usec = random() % 1000000;
|
||||||
|
+ printf(_("sleeping ~%d usec\n"), usec);
|
||||||
|
+ usleep(usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
gettimeofday(&nowsystime, NULL);
|
||||||
|
- tdiff = time_diff(nowsystime, beginsystime);
|
||||||
|
- if (tdiff < 0) {
|
||||||
|
- time_resync = 1; /* probably backward time reset */
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- if (tdiff > 0.1) {
|
||||||
|
- time_resync = 1; /* probably forward time reset */
|
||||||
|
- continue;
|
||||||
|
+ deltavstarget = time_diff(nowsystime, targetsystime);
|
||||||
|
+ ticksize = time_diff(nowsystime, prevsystime);
|
||||||
|
+ prevsystime = nowsystime;
|
||||||
|
+
|
||||||
|
+ if (ticksize < 0) {
|
||||||
|
+ if (debug)
|
||||||
|
+ printf(_("time jumped backward %.6f seconds "
|
||||||
|
+ "to %ld.%06d - retargeting\n"),
|
||||||
|
+ ticksize, (long)nowsystime.tv_sec,
|
||||||
|
+ (int)nowsystime.tv_usec);
|
||||||
|
+ /* The retarget is handled at the end of the loop. */
|
||||||
|
+ } else if (deltavstarget < 0) {
|
||||||
|
+ /* deltavstarget < 0 if current time < target time */
|
||||||
|
+ if (debug >= 2)
|
||||||
|
+ printf(_("%ld.%06d < %ld.%06d (%.6f)\n"),
|
||||||
|
+ (long)nowsystime.tv_sec,
|
||||||
|
+ (int)nowsystime.tv_usec,
|
||||||
|
+ (long)targetsystime.tv_sec,
|
||||||
|
+ (int)targetsystime.tv_usec,
|
||||||
|
+ deltavstarget);
|
||||||
|
+ continue; /* not there yet - keep spinning */
|
||||||
|
+ } else if (deltavstarget <= target_time_tolerance_secs) {
|
||||||
|
+ /* Close enough to the target time; done waiting. */
|
||||||
|
+ break;
|
||||||
|
+ } else /* (deltavstarget > target_time_tolerance_secs) */ {
|
||||||
|
+ /*
|
||||||
|
+ * We missed our window. Increase the tolerance and
|
||||||
|
+ * aim for the next opportunity.
|
||||||
|
+ */
|
||||||
|
+ if (debug)
|
||||||
|
+ printf(_("missed it - %ld.%06d is too far "
|
||||||
|
+ "past %ld.%06d (%.6f > %.6f)\n"),
|
||||||
|
+ (long)nowsystime.tv_sec,
|
||||||
|
+ (int)nowsystime.tv_usec,
|
||||||
|
+ (long)targetsystime.tv_sec,
|
||||||
|
+ (int)targetsystime.tv_usec,
|
||||||
|
+ deltavstarget,
|
||||||
|
+ target_time_tolerance_secs);
|
||||||
|
+ target_time_tolerance_secs += tolerance_incr_secs;
|
||||||
|
+ tolerance_incr_secs *= 2;
|
||||||
|
}
|
||||||
|
- beginsystime = nowsystime;
|
||||||
|
- tdiff = time_diff(nowsystime, refsystime);
|
||||||
|
- } while (newhwtime == sethwtime + (int)(tdiff + 0.5));
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Aim for the same offset (tv_usec) within the second in
|
||||||
|
+ * either the current second (if that offset hasn't arrived
|
||||||
|
+ * yet), or the next second.
|
||||||
|
+ */
|
||||||
|
+ if (nowsystime.tv_usec < targetsystime.tv_usec)
|
||||||
|
+ targetsystime.tv_sec = nowsystime.tv_sec;
|
||||||
|
+ else
|
||||||
|
+ targetsystime.tv_sec = nowsystime.tv_sec + 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ newhwtime = sethwtime
|
||||||
|
+ + (int)(time_diff(nowsystime, refsystime)
|
||||||
|
+ - RTC_SET_DELAY_SECS /* don't count this */
|
||||||
|
+ + 0.5 /* for rounding */);
|
||||||
|
+ if (debug)
|
||||||
|
+ printf(_("%ld.%06d is close enough to %ld.%06d (%.6f < %.6f)\n"
|
||||||
|
+ "Set RTC to %ld (%ld + %d; refsystime = %ld.%06d)\n"),
|
||||||
|
+ (long)nowsystime.tv_sec, (int)nowsystime.tv_usec,
|
||||||
|
+ (long)targetsystime.tv_sec, (int)targetsystime.tv_usec,
|
||||||
|
+ deltavstarget, target_time_tolerance_secs,
|
||||||
|
+ (long)newhwtime, (long)sethwtime,
|
||||||
|
+ (int)(newhwtime - sethwtime),
|
||||||
|
+ (long)refsystime.tv_sec, (int)refsystime.tv_usec);
|
||||||
|
|
||||||
|
set_hardware_clock(newhwtime, universal, testing);
|
||||||
|
}
|
||||||
|
@@ -1636,7 +1734,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'D':
|
||||||
|
- debug = TRUE;
|
||||||
|
+ ++debug;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
adjust = TRUE;
|
||||||
|
@@ -1953,10 +2051,4 @@ void __attribute__((__noreturn__)) hwaudit_exit(int status)
|
||||||
|
*
|
||||||
|
* hwclock uses this method, and considers the Hardware Clock to have
|
||||||
|
* infinite precision.
|
||||||
|
- *
|
||||||
|
- * TODO: Enhancements needed:
|
||||||
|
- *
|
||||||
|
- * - When waiting for whole second boundary in set_hardware_clock_exact,
|
||||||
|
- * fail if we miss the goal by more than .1 second, as could happen if we
|
||||||
|
- * get pre-empted (by the kernel dispatcher).
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
1.9.3
|
|
@ -0,0 +1,50 @@
|
||||||
|
From dd3bc51a539ffdd5c6c6b7d0b20acd1f61bdd337 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Mon, 6 Jan 2014 16:48:13 +0100
|
||||||
|
Subject: [PATCH] lib/path: add path_strdup()
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
include/path.h | 2 ++
|
||||||
|
lib/path.c | 13 +++++++++++++
|
||||||
|
2 files changed, 15 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/include/path.h b/include/path.h
|
||||||
|
index 615d284..45da692 100644
|
||||||
|
--- a/include/path.h
|
||||||
|
+++ b/include/path.h
|
||||||
|
@@ -4,6 +4,8 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
+extern char *path_strdup(const char *path, ...)
|
||||||
|
+ __attribute__ ((__format__ (__printf__, 1, 2)));
|
||||||
|
extern FILE *path_fopen(const char *mode, int exit_on_err, const char *path, ...)
|
||||||
|
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||||
|
extern void path_read_str(char *result, size_t len, const char *path, ...)
|
||||||
|
diff --git a/lib/path.c b/lib/path.c
|
||||||
|
index 1f7e258..42d321c 100644
|
||||||
|
--- a/lib/path.c
|
||||||
|
+++ b/lib/path.c
|
||||||
|
@@ -49,6 +49,19 @@ path_vcreate(const char *path, va_list ap)
|
||||||
|
return pathbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
+char *
|
||||||
|
+path_strdup(const char *path, ...)
|
||||||
|
+{
|
||||||
|
+ const char *p;
|
||||||
|
+ va_list ap;
|
||||||
|
+
|
||||||
|
+ va_start(ap, path);
|
||||||
|
+ p = path_vcreate(path, ap);
|
||||||
|
+ va_end(ap);
|
||||||
|
+
|
||||||
|
+ return p ? strdup(p) : NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static FILE *
|
||||||
|
path_vfopen(const char *mode, int exit_on_error, const char *path, va_list ap)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
1.8.4.2
|
|
@ -0,0 +1,240 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/ext.c.kzak util-linux-2.23.2/libblkid/src/superblocks/ext.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/ext.c.kzak 2013-06-13 09:46:10.422650639 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/ext.c 2014-01-23 10:28:51.175358545 +0100
|
||||||
|
@@ -18,7 +18,6 @@
|
||||||
|
#endif
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
-#include "linux_version.h"
|
||||||
|
#include "superblocks.h"
|
||||||
|
|
||||||
|
struct ext2_super_block {
|
||||||
|
@@ -132,140 +131,11 @@ struct ext2_super_block {
|
||||||
|
#define EXT3_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT3_FEATURE_RO_COMPAT_SUPP
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Check to see if a filesystem is in /proc/filesystems.
|
||||||
|
- * Returns 1 if found, 0 if not
|
||||||
|
- */
|
||||||
|
-static int fs_proc_check(const char *fs_name)
|
||||||
|
-{
|
||||||
|
- FILE *f;
|
||||||
|
- char buf[80], *cp, *t;
|
||||||
|
-
|
||||||
|
- f = fopen("/proc/filesystems", "r" UL_CLOEXECSTR);
|
||||||
|
- if (!f)
|
||||||
|
- return 0;
|
||||||
|
- while (!feof(f)) {
|
||||||
|
- if (!fgets(buf, sizeof(buf), f))
|
||||||
|
- break;
|
||||||
|
- cp = buf;
|
||||||
|
- if (!isspace(*cp)) {
|
||||||
|
- while (*cp && !isspace(*cp))
|
||||||
|
- cp++;
|
||||||
|
- }
|
||||||
|
- while (*cp && isspace(*cp))
|
||||||
|
- cp++;
|
||||||
|
- if ((t = strchr(cp, '\n')) != NULL)
|
||||||
|
- *t = 0;
|
||||||
|
- if ((t = strchr(cp, '\t')) != NULL)
|
||||||
|
- *t = 0;
|
||||||
|
- if ((t = strchr(cp, ' ')) != NULL)
|
||||||
|
- *t = 0;
|
||||||
|
- if (!strcmp(fs_name, cp)) {
|
||||||
|
- fclose(f);
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- fclose(f);
|
||||||
|
- return (0);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/*
|
||||||
|
- * Check to see if a filesystem is available as a module
|
||||||
|
- * Returns 1 if found, 0 if not
|
||||||
|
- */
|
||||||
|
-static int check_for_modules(const char *fs_name)
|
||||||
|
-{
|
||||||
|
-#ifdef __linux__
|
||||||
|
- struct utsname uts;
|
||||||
|
- FILE *f;
|
||||||
|
- char buf[1024], *cp;
|
||||||
|
- int namesz;
|
||||||
|
-
|
||||||
|
- if (uname(&uts))
|
||||||
|
- return 0;
|
||||||
|
- snprintf(buf, sizeof(buf), "/lib/modules/%s/modules.dep", uts.release);
|
||||||
|
-
|
||||||
|
- f = fopen(buf, "r" UL_CLOEXECSTR);
|
||||||
|
- if (!f)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- namesz = strlen(fs_name);
|
||||||
|
-
|
||||||
|
- while (!feof(f)) {
|
||||||
|
- if (!fgets(buf, sizeof(buf), f))
|
||||||
|
- break;
|
||||||
|
- if ((cp = strchr(buf, ':')) != NULL)
|
||||||
|
- *cp = 0;
|
||||||
|
- else
|
||||||
|
- continue;
|
||||||
|
- if ((cp = strrchr(buf, '/')) == NULL)
|
||||||
|
- continue;
|
||||||
|
- cp++;
|
||||||
|
-
|
||||||
|
- if (!strncmp(cp, fs_name, namesz) &&
|
||||||
|
- (!strcmp(cp + namesz, ".ko") ||
|
||||||
|
- !strcmp(cp + namesz, ".ko.gz"))) {
|
||||||
|
- fclose(f);
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- fclose(f);
|
||||||
|
-#endif /* __linux__ */
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/*
|
||||||
|
* Starting in 2.6.29, ext4 can be used to support filesystems
|
||||||
|
* without a journal.
|
||||||
|
*/
|
||||||
|
#define EXT4_SUPPORTS_EXT2 KERNEL_VERSION(2, 6, 29)
|
||||||
|
|
||||||
|
-static int system_supports_ext2(void)
|
||||||
|
-{
|
||||||
|
- static time_t last_check = 0;
|
||||||
|
- static int ret = -1;
|
||||||
|
- time_t now = time(0);
|
||||||
|
-
|
||||||
|
- if (ret != -1 || (now - last_check) < 5)
|
||||||
|
- return ret;
|
||||||
|
- last_check = now;
|
||||||
|
- ret = (fs_proc_check("ext2") || check_for_modules("ext2"));
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int system_supports_ext4(void)
|
||||||
|
-{
|
||||||
|
- static time_t last_check = 0;
|
||||||
|
- static int ret = -1;
|
||||||
|
- time_t now = time(0);
|
||||||
|
-
|
||||||
|
- if (ret != -1 || (now - last_check) < 5)
|
||||||
|
- return ret;
|
||||||
|
- last_check = now;
|
||||||
|
- ret = (fs_proc_check("ext4") || check_for_modules("ext4"));
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int system_supports_ext4dev(void)
|
||||||
|
-{
|
||||||
|
- static time_t last_check = 0;
|
||||||
|
- static int ret = -1;
|
||||||
|
- time_t now = time(0);
|
||||||
|
-
|
||||||
|
- if (ret != -1 || (now - last_check) < 5)
|
||||||
|
- return ret;
|
||||||
|
- last_check = now;
|
||||||
|
- ret = (fs_proc_check("ext4dev") || check_for_modules("ext4dev"));
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int system_supports_ext4_ext2(void)
|
||||||
|
-{
|
||||||
|
-#ifdef __linux__
|
||||||
|
- return get_linux_version() >= EXT4_SUPPORTS_EXT2;
|
||||||
|
-#else
|
||||||
|
- return 0;
|
||||||
|
-#endif
|
||||||
|
-}
|
||||||
|
/*
|
||||||
|
* reads superblock and returns:
|
||||||
|
* fc = feature_compat
|
||||||
|
@@ -355,15 +225,6 @@ static int probe_ext2(blkid_probe pr,
|
||||||
|
(fi & EXT2_FEATURE_INCOMPAT_UNSUPPORTED))
|
||||||
|
return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * If ext2 is not present, but ext4 or ext4dev are, then
|
||||||
|
- * disclaim we are ext2
|
||||||
|
- */
|
||||||
|
- if (!system_supports_ext2() &&
|
||||||
|
- (system_supports_ext4() || system_supports_ext4dev()) &&
|
||||||
|
- system_supports_ext4_ext2())
|
||||||
|
- return -BLKID_ERR_PARAM;
|
||||||
|
-
|
||||||
|
ext_get_info(pr, 2, es);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -406,34 +267,9 @@ static int probe_ext4dev(blkid_probe pr,
|
||||||
|
if (fi & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
|
||||||
|
return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * If the filesystem does not have a journal and ext2 and ext4
|
||||||
|
- * is not present, then force this to be detected as an
|
||||||
|
- * ext4dev filesystem.
|
||||||
|
- */
|
||||||
|
- if (!(fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL) &&
|
||||||
|
- !system_supports_ext2() && !system_supports_ext4() &&
|
||||||
|
- system_supports_ext4dev() &&
|
||||||
|
- system_supports_ext4_ext2())
|
||||||
|
- goto force_ext4dev;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * If the filesystem is marked as OK for use by in-development
|
||||||
|
- * filesystem code, but ext4dev is not supported, and ext4 is,
|
||||||
|
- * then don't call ourselves ext4dev, since we should be
|
||||||
|
- * detected as ext4 in that case.
|
||||||
|
- *
|
||||||
|
- * If the filesystem is marked as in use by production
|
||||||
|
- * filesystem, then it can only be used by ext4 and NOT by
|
||||||
|
- * ext4dev, so always disclaim we are ext4dev in that case.
|
||||||
|
- */
|
||||||
|
- if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS) {
|
||||||
|
- if (!system_supports_ext4dev() && system_supports_ext4())
|
||||||
|
- return -BLKID_ERR_PARAM;
|
||||||
|
- } else
|
||||||
|
+ if (!(le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS))
|
||||||
|
return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
-force_ext4dev:
|
||||||
|
ext_get_info(pr, 4, es);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -452,22 +288,11 @@ static int probe_ext4(blkid_probe pr,
|
||||||
|
if (fi & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
|
||||||
|
return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * If the filesystem does not have a journal and ext2 is not
|
||||||
|
- * present, then force this to be detected as an ext2
|
||||||
|
- * filesystem.
|
||||||
|
- */
|
||||||
|
- if (!(fc & EXT3_FEATURE_COMPAT_HAS_JOURNAL) &&
|
||||||
|
- !system_supports_ext2() && system_supports_ext4() &&
|
||||||
|
- system_supports_ext4_ext2())
|
||||||
|
- goto force_ext4;
|
||||||
|
-
|
||||||
|
/* Ext4 has at least one feature which ext3 doesn't understand */
|
||||||
|
if (!(frc & EXT3_FEATURE_RO_COMPAT_UNSUPPORTED) &&
|
||||||
|
!(fi & EXT3_FEATURE_INCOMPAT_UNSUPPORTED))
|
||||||
|
return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
-force_ext4:
|
||||||
|
/*
|
||||||
|
* If the filesystem is a OK for use by in-development
|
||||||
|
* filesystem code, and ext4dev is supported or ext4 is not
|
||||||
|
@@ -478,10 +303,8 @@ force_ext4:
|
||||||
|
* filesystem, then it can only be used by ext4 and NOT by
|
||||||
|
* ext4dev.
|
||||||
|
*/
|
||||||
|
- if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS) {
|
||||||
|
- if (system_supports_ext4dev() || !system_supports_ext4())
|
||||||
|
- return -BLKID_ERR_PARAM;
|
||||||
|
- }
|
||||||
|
+ if (le32_to_cpu(es->s_flags) & EXT2_FLAGS_TEST_FILESYS)
|
||||||
|
+ return -BLKID_ERR_PARAM;
|
||||||
|
|
||||||
|
ext_get_info(pr, 4, es);
|
||||||
|
return 0;
|
|
@ -0,0 +1,100 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak util-linux-2.23.2/libblkid/src/partitions/gpt.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak 2013-07-30 10:39:26.206738239 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/gpt.c 2014-01-23 11:06:17.364011293 +0100
|
||||||
|
@@ -156,13 +156,15 @@ static int last_lba(blkid_probe pr, uint
|
||||||
|
* Note that the PMBR detection is optional (enabled by default) and could be
|
||||||
|
* disabled by BLKID_PARTS_FOPCE_GPT flag (see also blkid_paertitions_set_flags()).
|
||||||
|
*/
|
||||||
|
-static int is_pmbr_valid(blkid_probe pr)
|
||||||
|
+static int is_pmbr_valid(blkid_probe pr, int *has)
|
||||||
|
{
|
||||||
|
int flags = blkid_partitions_get_flags(pr);
|
||||||
|
unsigned char *data;
|
||||||
|
struct dos_partition *p;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
+ if (has)
|
||||||
|
+ *has = 0;
|
||||||
|
if (flags & BLKID_PARTS_FORCE_GPT)
|
||||||
|
goto ok; /* skip PMBR check */
|
||||||
|
|
||||||
|
@@ -182,6 +184,8 @@ static int is_pmbr_valid(blkid_probe pr)
|
||||||
|
failed:
|
||||||
|
return 0;
|
||||||
|
ok:
|
||||||
|
+ if (has)
|
||||||
|
+ *has = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -305,7 +309,7 @@ static int probe_gpt_pt(blkid_probe pr,
|
||||||
|
if (last_lba(pr, &lastlba))
|
||||||
|
goto nothing;
|
||||||
|
|
||||||
|
- if (!is_pmbr_valid(pr))
|
||||||
|
+ if (!is_pmbr_valid(pr, NULL))
|
||||||
|
goto nothing;
|
||||||
|
|
||||||
|
h = get_gpt_header(pr, &hdr, &e, (lba = GPT_PRIMARY_LBA), lastlba);
|
||||||
|
@@ -410,3 +414,39 @@ const struct blkid_idinfo gpt_pt_idinfo
|
||||||
|
.magics = BLKID_NONE_MAGIC
|
||||||
|
};
|
||||||
|
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* probe for *alone* protective MBR */
|
||||||
|
+static int probe_pmbr_pt(blkid_probe pr,
|
||||||
|
+ const struct blkid_idmag *mag __attribute__((__unused__)))
|
||||||
|
+{
|
||||||
|
+ int has = 0;
|
||||||
|
+ struct gpt_entry *e;
|
||||||
|
+ uint64_t lastlba = 0;
|
||||||
|
+ struct gpt_header hdr;
|
||||||
|
+
|
||||||
|
+ if (last_lba(pr, &lastlba))
|
||||||
|
+ goto nothing;
|
||||||
|
+
|
||||||
|
+ is_pmbr_valid(pr, &has);
|
||||||
|
+ if (!has)
|
||||||
|
+ goto nothing;
|
||||||
|
+
|
||||||
|
+ if (!get_gpt_header(pr, &hdr, &e, GPT_PRIMARY_LBA, lastlba) &&
|
||||||
|
+ !get_gpt_header(pr, &hdr, &e, lastlba, lastlba))
|
||||||
|
+ return 0;
|
||||||
|
+nothing:
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+const struct blkid_idinfo pmbr_pt_idinfo =
|
||||||
|
+{
|
||||||
|
+ .name = "PMBR",
|
||||||
|
+ .probefunc = probe_pmbr_pt,
|
||||||
|
+ .magics =
|
||||||
|
+ {
|
||||||
|
+ { .magic = "\x55\xAA", .len = 2, .sboff = 510 },
|
||||||
|
+ { NULL }
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak 2013-07-30 10:39:26.207738249 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.c 2014-01-23 11:06:17.364011293 +0100
|
||||||
|
@@ -125,6 +125,7 @@ static const struct blkid_idinfo *idinfo
|
||||||
|
&sun_pt_idinfo,
|
||||||
|
&dos_pt_idinfo,
|
||||||
|
&gpt_pt_idinfo,
|
||||||
|
+ &pmbr_pt_idinfo, /* always after GPT */
|
||||||
|
&mac_pt_idinfo,
|
||||||
|
&ultrix_pt_idinfo,
|
||||||
|
&bsd_pt_idinfo,
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.h.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.h
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/partitions.h.kzak 2013-07-30 10:39:26.208738259 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.h 2014-01-23 11:06:17.364011293 +0100
|
||||||
|
@@ -59,6 +59,7 @@ extern const struct blkid_idinfo mac_pt_
|
||||||
|
extern const struct blkid_idinfo dos_pt_idinfo;
|
||||||
|
extern const struct blkid_idinfo minix_pt_idinfo;
|
||||||
|
extern const struct blkid_idinfo gpt_pt_idinfo;
|
||||||
|
+extern const struct blkid_idinfo pmbr_pt_idinfo;
|
||||||
|
extern const struct blkid_idinfo ultrix_pt_idinfo;
|
||||||
|
|
||||||
|
#endif /* BLKID_PARTITIONS_H */
|
|
@ -0,0 +1,21 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak util-linux-2.23.2/libblkid/src/partitions/gpt.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/gpt.c.kzak 2014-09-25 10:36:26.761377688 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/gpt.c 2014-09-25 10:36:56.912665364 +0200
|
||||||
|
@@ -332,7 +332,7 @@ static int probe_gpt_pt(blkid_probe pr,
|
||||||
|
|
||||||
|
blkid_probe_use_wiper(pr, lba * blkid_probe_get_size(pr), 8);
|
||||||
|
|
||||||
|
- if (blkid_probe_set_magic(pr, lba << 9,
|
||||||
|
+ if (blkid_probe_set_magic(pr, blkid_probe_get_sectorsize(pr) * lba,
|
||||||
|
sizeof(GPT_HEADER_SIGNATURE_STR) - 1,
|
||||||
|
(unsigned char *) GPT_HEADER_SIGNATURE_STR))
|
||||||
|
goto err;
|
||||||
|
@@ -345,7 +345,8 @@ static int probe_gpt_pt(blkid_probe pr,
|
||||||
|
if (!ls)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
- tab = blkid_partlist_new_parttable(ls, "gpt", lba << 9);
|
||||||
|
+ tab = blkid_partlist_new_parttable(ls, "gpt",
|
||||||
|
+ blkid_probe_get_sectorsize(pr) * lba);
|
||||||
|
if (!tab)
|
||||||
|
goto err;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,68 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/blkidP.h.kzak util-linux-2.23.2/libblkid/src/blkidP.h
|
||||||
|
--- util-linux-2.23.2/libblkid/src/blkidP.h.kzak 2013-07-30 10:39:26.205738229 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/blkidP.h 2014-01-23 10:51:10.109593273 +0100
|
||||||
|
@@ -224,9 +224,6 @@ struct blkid_struct_probe
|
||||||
|
|
||||||
|
/* private per-probing flags */
|
||||||
|
#define BLKID_PROBE_FL_IGNORE_PT (1 << 1) /* ignore partition table */
|
||||||
|
-#define BLKID_PROBE_FL_IGNORE_BACKUP (1 << 2) /* ignore backup superblocks or PT */
|
||||||
|
-
|
||||||
|
-extern int blkid_probe_ignore_backup(blkid_probe pr);
|
||||||
|
|
||||||
|
extern blkid_probe blkid_clone_probe(blkid_probe parent);
|
||||||
|
extern blkid_probe blkid_probe_get_wholedisk_probe(blkid_probe pr);
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/probe.c.kzak util-linux-2.23.2/libblkid/src/probe.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/probe.c.kzak 2013-07-30 10:39:26.208738259 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/probe.c 2014-01-23 10:51:10.109593273 +0100
|
||||||
|
@@ -924,7 +924,8 @@ int blkid_do_probe(blkid_probe pr)
|
||||||
|
*
|
||||||
|
* This function erases the current signature detected by @pr. The @pr has to
|
||||||
|
* be open in O_RDWR mode, BLKID_SUBLKS_MAGIC or/and BLKID_PARTS_MAGIC flags
|
||||||
|
- * has to be enabled.
|
||||||
|
+ * has to be enabled (if you want to errase also superblock with broken check
|
||||||
|
+ * sums then use BLKID_SUBLKS_BADCSUM too).
|
||||||
|
*
|
||||||
|
* After successful signature removing the @pr prober will be moved one step
|
||||||
|
* back and the next blkid_do_probe() call will again call previously called
|
||||||
|
@@ -1125,8 +1126,6 @@ int blkid_do_safeprobe(blkid_probe pr)
|
||||||
|
|
||||||
|
blkid_probe_start(pr);
|
||||||
|
|
||||||
|
- pr->prob_flags |= BLKID_PROBE_FL_IGNORE_BACKUP;
|
||||||
|
-
|
||||||
|
for (i = 0; i < BLKID_NCHAINS; i++) {
|
||||||
|
struct blkid_chain *chn;
|
||||||
|
|
||||||
|
@@ -1764,8 +1763,3 @@ void blkid_probe_use_wiper(blkid_probe p
|
||||||
|
blkid_probe_chain_reset_vals(pr, chn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-int blkid_probe_ignore_backup(blkid_probe pr)
|
||||||
|
-{
|
||||||
|
- return pr && (pr->prob_flags & BLKID_PROBE_FL_IGNORE_BACKUP);
|
||||||
|
-}
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/btrfs.c.kzak util-linux-2.23.2/libblkid/src/superblocks/btrfs.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/btrfs.c.kzak 2013-06-13 09:46:10.421650630 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/btrfs.c 2014-01-23 10:51:10.109593273 +0100
|
||||||
|
@@ -63,11 +63,6 @@ static int probe_btrfs(blkid_probe pr, c
|
||||||
|
{
|
||||||
|
struct btrfs_super_block *bfs;
|
||||||
|
|
||||||
|
- if (mag->kboff > 64 && blkid_probe_ignore_backup(pr)) {
|
||||||
|
- DBG(LOWPROBE, blkid_debug("btrfs: found backup superblock, ignore"));
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
bfs = blkid_probe_get_sb(pr, mag, struct btrfs_super_block);
|
||||||
|
if (!bfs)
|
||||||
|
return -1;
|
||||||
|
@@ -92,8 +87,6 @@ const struct blkid_idinfo btrfs_idinfo =
|
||||||
|
.magics =
|
||||||
|
{
|
||||||
|
{ .magic = "_BHRfS_M", .len = 8, .sboff = 0x40, .kboff = 64 },
|
||||||
|
- { .magic = "_BHRfS_M", .len = 8, .sboff = 0x40, .kboff = 64 * 1024 },
|
||||||
|
- { .magic = "_BHRfS_M", .len = 8, .sboff = 0x40, .kboff = 256 * 1024 * 1024 },
|
||||||
|
{ NULL }
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,204 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak 2015-08-11 14:00:27.930573965 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.c 2015-08-11 14:13:11.213087814 +0200
|
||||||
|
@@ -533,7 +533,7 @@ static int idinfo_probe(blkid_probe pr,
|
||||||
|
{
|
||||||
|
const struct blkid_idmag *mag = NULL;
|
||||||
|
blkid_loff_t off;
|
||||||
|
- int rc = BLKID_PROBE_NONE; /* = nothing detected */
|
||||||
|
+ int rc = BLKID_PROBE_NONE; /* default is nothing */
|
||||||
|
|
||||||
|
if (pr->size <= 0 || (id->minsz && id->minsz > pr->size))
|
||||||
|
goto nothing; /* the device is too small */
|
||||||
|
@@ -564,8 +564,10 @@ static int idinfo_probe(blkid_probe pr,
|
||||||
|
DBG(LOWPROBE, blkid_debug("%s: <--- (rc = %d)", id->name, rc));
|
||||||
|
}
|
||||||
|
|
||||||
|
-nothing:
|
||||||
|
return rc;
|
||||||
|
+
|
||||||
|
+nothing:
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -620,7 +622,7 @@ static int partitions_probe(blkid_probe
|
||||||
|
strlen(name) + 1);
|
||||||
|
DBG(LOWPROBE, blkid_debug("<-- leaving probing loop (type=%s) [PARTS idx=%d]",
|
||||||
|
name, chn->idx));
|
||||||
|
- rc = 0;
|
||||||
|
+ rc = BLKID_PROBE_OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -637,10 +639,16 @@ details_only:
|
||||||
|
(blkid_partitions_get_flags(pr) & BLKID_PARTS_ENTRY_DETAILS)) {
|
||||||
|
|
||||||
|
int xrc = blkid_partitions_probe_partition(pr);
|
||||||
|
+
|
||||||
|
+ /* partition entry probing is optional, and "not-found" from
|
||||||
|
+ * this sub-probing must not to overwrite previous success. */
|
||||||
|
if (xrc < 0)
|
||||||
|
- rc = xrc; /* optional, care about errors only */
|
||||||
|
+ rc = xrc; /* always propagate errors */
|
||||||
|
+ else if (rc == BLKID_PROBE_NONE)
|
||||||
|
+ rc = xrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("partitions probe done [rc=%d]", rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -709,7 +717,6 @@ int blkid_partitions_do_subprobe(blkid_p
|
||||||
|
|
||||||
|
static int blkid_partitions_probe_partition(blkid_probe pr)
|
||||||
|
{
|
||||||
|
- int rc = BLKID_PROBE_NONE;
|
||||||
|
blkid_probe disk_pr = NULL;
|
||||||
|
blkid_partlist ls;
|
||||||
|
blkid_partition par;
|
||||||
|
@@ -732,7 +739,9 @@ static int blkid_partitions_probe_partit
|
||||||
|
goto nothing;
|
||||||
|
|
||||||
|
par = blkid_partlist_devno_to_partition(ls, devno);
|
||||||
|
- if (par) {
|
||||||
|
+ if (!par)
|
||||||
|
+ goto nothing;
|
||||||
|
+ else {
|
||||||
|
const char *v;
|
||||||
|
blkid_parttable tab = blkid_partition_get_table(par);
|
||||||
|
dev_t disk = blkid_probe_get_devno(disk_pr);
|
||||||
|
@@ -778,9 +787,13 @@ static int blkid_partitions_probe_partit
|
||||||
|
blkid_probe_sprintf_value(pr, "PART_ENTRY_DISK", "%u:%u",
|
||||||
|
major(disk), minor(disk));
|
||||||
|
}
|
||||||
|
- rc = BLKID_PROBE_OK;
|
||||||
|
+
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("parts: end probing for partition entry [success]"));
|
||||||
|
+ return BLKID_PROBE_OK;
|
||||||
|
+
|
||||||
|
nothing:
|
||||||
|
- return rc;
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("parts: end probing for partition entry [nothing]"));
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak util-linux-2.23.2/libblkid/src/superblocks/superblocks.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak 2015-07-03 10:35:05.456153560 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/superblocks.c 2015-08-11 14:08:42.572674469 +0200
|
||||||
|
@@ -335,19 +335,24 @@ static int superblocks_probe(blkid_probe
|
||||||
|
|
||||||
|
if (!pr || chn->idx < -1)
|
||||||
|
return -EINVAL;
|
||||||
|
- if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
- goto nothing;
|
||||||
|
|
||||||
|
blkid_probe_chain_reset_vals(pr, chn);
|
||||||
|
|
||||||
|
DBG(LOWPROBE, blkid_debug("--> starting probing loop [SUBLKS idx=%d]",
|
||||||
|
chn->idx));
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
+
|
||||||
|
if (pr->size <= 0 || (pr->size <= 1024 && !S_ISCHR(pr->mode)))
|
||||||
|
/* Ignore very very small block devices or regular files (e.g.
|
||||||
|
* extended partitions). Note that size of the UBI char devices
|
||||||
|
* is 1 byte */
|
||||||
|
- goto nothing;
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("--> starting probing loop [SUBLKS idx=%d]",
|
||||||
|
+ chn->idx));
|
||||||
|
|
||||||
|
i = chn->idx < 0 ? 0 : chn->idx + 1U;
|
||||||
|
|
||||||
|
@@ -417,7 +422,7 @@ static int superblocks_probe(blkid_probe
|
||||||
|
(unsigned char *) mag->magic);
|
||||||
|
if (rc) {
|
||||||
|
blkid_probe_chain_reset_vals(pr, chn);
|
||||||
|
- DBG(LOWPROBE, blkid_debug("failed to set result -- ingnore"));
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("failed to set result -- ignore"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -426,7 +431,6 @@ static int superblocks_probe(blkid_probe
|
||||||
|
return BLKID_PROBE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
-nothing:
|
||||||
|
DBG(LOWPROBE, blkid_debug("<-- leaving probing loop (failed=%d) [SUBLKS idx=%d]",
|
||||||
|
rc, chn->idx));
|
||||||
|
return rc;
|
||||||
|
@@ -454,13 +458,12 @@ static int superblocks_safeprobe(blkid_p
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
- return 1; /* nothing */
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
|
||||||
|
while ((rc = superblocks_probe(pr, chn)) == 0) {
|
||||||
|
|
||||||
|
if (blkid_probe_is_tiny(pr) && !count)
|
||||||
|
- /* floppy or so -- returns the first result. */
|
||||||
|
- return 0;
|
||||||
|
+ return BLKID_PROBE_OK; /* floppy or so -- returns the first result. */
|
||||||
|
|
||||||
|
count++;
|
||||||
|
|
||||||
|
@@ -489,7 +492,7 @@ static int superblocks_safeprobe(blkid_p
|
||||||
|
return -2; /* error, ambivalent result (more FS) */
|
||||||
|
}
|
||||||
|
if (!count)
|
||||||
|
- return 1; /* nothing detected */
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
|
||||||
|
if (idx != -1) {
|
||||||
|
/* restore the first result */
|
||||||
|
@@ -506,7 +509,7 @@ static int superblocks_safeprobe(blkid_p
|
||||||
|
if (chn->idx >= 0 && idinfos[chn->idx]->usage & BLKID_USAGE_RAID)
|
||||||
|
pr->prob_flags |= BLKID_PROBE_FL_IGNORE_PT;
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ return BLKID_PROBE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blkid_probe_set_version(blkid_probe pr, const char *version)
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/topology/topology.c.kzak util-linux-2.23.2/libblkid/src/topology/topology.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/topology/topology.c.kzak 2013-06-13 09:46:10.429650699 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/topology/topology.c 2015-08-11 14:09:35.623361499 +0200
|
||||||
|
@@ -150,7 +150,7 @@ static int topology_probe(blkid_probe pr
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!S_ISBLK(pr->mode))
|
||||||
|
- return -1; /* nothing, works with block devices only */
|
||||||
|
+ return -EINVAL; /* nothing, works with block devices only */
|
||||||
|
|
||||||
|
if (chn->binary) {
|
||||||
|
DBG(LOWPROBE, blkid_debug("initialize topology binary data"));
|
||||||
|
@@ -163,7 +163,7 @@ static int topology_probe(blkid_probe pr
|
||||||
|
chn->data = calloc(1,
|
||||||
|
sizeof(struct blkid_struct_topology));
|
||||||
|
if (!chn->data)
|
||||||
|
- return -1;
|
||||||
|
+ return -ENOMEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -193,12 +193,12 @@ static int topology_probe(blkid_probe pr
|
||||||
|
|
||||||
|
DBG(LOWPROBE, blkid_debug("<-- leaving probing loop (type=%s) [TOPOLOGY idx=%d]",
|
||||||
|
id->name, chn->idx));
|
||||||
|
- return 0;
|
||||||
|
+ return BLKID_PROBE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG(LOWPROBE, blkid_debug("<-- leaving probing loop (failed) [TOPOLOGY idx=%d]",
|
||||||
|
chn->idx));
|
||||||
|
- return 1;
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void topology_free(blkid_probe pr __attribute__((__unused__)),
|
|
@ -0,0 +1,237 @@
|
||||||
|
diff -up util-linux-2.23.2/fdisks/fdisk.c.kzak util-linux-2.23.2/fdisks/fdisk.c
|
||||||
|
--- util-linux-2.23.2/fdisks/fdisk.c.kzak 2015-07-02 12:37:24.465906322 +0200
|
||||||
|
+++ util-linux-2.23.2/fdisks/fdisk.c 2015-07-02 12:37:57.870673753 +0200
|
||||||
|
@@ -34,6 +34,7 @@
|
||||||
|
#include "canonicalize.h"
|
||||||
|
#include "strutils.h"
|
||||||
|
#include "closestream.h"
|
||||||
|
+#include "sysfs.h"
|
||||||
|
|
||||||
|
#include "fdisksunlabel.h"
|
||||||
|
#include "fdisksgilabel.h"
|
||||||
|
diff -up util-linux-2.23.2/include/sysfs.h.kzak util-linux-2.23.2/include/sysfs.h
|
||||||
|
--- util-linux-2.23.2/include/sysfs.h.kzak 2015-07-02 12:12:50.408196320 +0200
|
||||||
|
+++ util-linux-2.23.2/include/sysfs.h 2015-07-02 12:13:09.708061372 +0200
|
||||||
|
@@ -74,6 +74,8 @@ extern int sysfs_devno_to_wholedisk(dev_
|
||||||
|
size_t len, dev_t *diskdevno);
|
||||||
|
extern int sysfs_devno_is_wholedisk(dev_t devno);
|
||||||
|
|
||||||
|
+extern int sysfs_devno_is_lvm_private(dev_t devno);
|
||||||
|
+
|
||||||
|
extern int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h,
|
||||||
|
int *c, int *t, int *l);
|
||||||
|
extern char *sysfs_scsi_host_strdup_attribute(struct sysfs_cxt *cxt,
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/blkidP.h.kzak util-linux-2.23.2/libblkid/src/blkidP.h
|
||||||
|
--- util-linux-2.23.2/libblkid/src/blkidP.h.kzak 2015-07-02 12:18:27.349840375 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/blkidP.h 2015-07-02 12:19:07.797557558 +0200
|
||||||
|
@@ -221,6 +221,7 @@ struct blkid_struct_probe
|
||||||
|
#define BLKID_FL_PRIVATE_FD (1 << 1) /* see blkid_new_probe_from_filename() */
|
||||||
|
#define BLKID_FL_TINY_DEV (1 << 2) /* <= 1.47MiB (floppy or so) */
|
||||||
|
#define BLKID_FL_CDROM_DEV (1 << 3) /* is a CD/DVD drive */
|
||||||
|
+#define BLKID_FL_NOSCAN_DEV (1 << 4) /* do not scan this device */
|
||||||
|
|
||||||
|
/* private per-probing flags */
|
||||||
|
#define BLKID_PROBE_FL_IGNORE_PT (1 << 1) /* ignore partition table */
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak util-linux-2.23.2/libblkid/src/partitions/partitions.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/partitions.c.kzak 2015-07-02 12:19:11.669530485 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/partitions.c 2015-07-02 12:28:24.166667964 +0200
|
||||||
|
@@ -537,6 +537,8 @@ static int idinfo_probe(blkid_probe pr,
|
||||||
|
|
||||||
|
if (pr->size <= 0 || (id->minsz && id->minsz > pr->size))
|
||||||
|
goto nothing; /* the device is too small */
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ goto nothing;
|
||||||
|
|
||||||
|
rc = blkid_probe_get_idmag(pr, id, &off, &mag);
|
||||||
|
if (rc != BLKID_PROBE_OK)
|
||||||
|
@@ -576,8 +578,12 @@ static int partitions_probe(blkid_probe
|
||||||
|
|
||||||
|
if (!pr || chn->idx < -1)
|
||||||
|
return -EINVAL;
|
||||||
|
+
|
||||||
|
blkid_probe_chain_reset_vals(pr, chn);
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
+
|
||||||
|
if (chn->binary)
|
||||||
|
partitions_init_data(chn);
|
||||||
|
|
||||||
|
@@ -653,6 +659,8 @@ int blkid_partitions_do_subprobe(blkid_p
|
||||||
|
|
||||||
|
if (!pr || !parent || !parent->size)
|
||||||
|
return -EINVAL;
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return BLKID_PROBE_NONE;
|
||||||
|
|
||||||
|
/* range defined by parent */
|
||||||
|
sz = ((blkid_loff_t) parent->size) << 9;
|
||||||
|
@@ -707,6 +715,9 @@ static int blkid_partitions_probe_partit
|
||||||
|
blkid_partition par;
|
||||||
|
dev_t devno;
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ goto nothing;
|
||||||
|
+
|
||||||
|
devno = blkid_probe_get_devno(pr);
|
||||||
|
if (!devno)
|
||||||
|
goto nothing;
|
||||||
|
@@ -779,7 +790,7 @@ nothing:
|
||||||
|
int blkid_probe_is_covered_by_pt(blkid_probe pr,
|
||||||
|
blkid_loff_t offset, blkid_loff_t size)
|
||||||
|
{
|
||||||
|
- blkid_probe prc;
|
||||||
|
+ blkid_probe prc = NULL;
|
||||||
|
blkid_partlist ls = NULL;
|
||||||
|
blkid_loff_t start, end;
|
||||||
|
int nparts, i, rc = 0;
|
||||||
|
@@ -788,6 +799,9 @@ int blkid_probe_is_covered_by_pt(blkid_p
|
||||||
|
"=> checking if off=%jd size=%jd covered by PT",
|
||||||
|
offset, size));
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ goto done;
|
||||||
|
+
|
||||||
|
prc = blkid_clone_probe(pr);
|
||||||
|
if (!prc)
|
||||||
|
goto done;
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/probe.c.kzak util-linux-2.23.2/libblkid/src/probe.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/probe.c.kzak 2015-07-02 12:13:48.823787869 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/probe.c 2015-07-02 12:38:20.110518915 +0200
|
||||||
|
@@ -110,6 +110,7 @@
|
||||||
|
|
||||||
|
#include "blkidP.h"
|
||||||
|
#include "all-io.h"
|
||||||
|
+#include "sysfs.h"
|
||||||
|
|
||||||
|
/* chains */
|
||||||
|
extern const struct blkid_chaindrv superblocks_drv;
|
||||||
|
@@ -714,8 +715,13 @@ int blkid_probe_set_device(blkid_probe p
|
||||||
|
if (pr->size <= 1440 * 1024 && !S_ISCHR(sb.st_mode))
|
||||||
|
pr->flags |= BLKID_FL_TINY_DEV;
|
||||||
|
|
||||||
|
+ if (S_ISBLK(sb.st_mode) && sysfs_devno_is_lvm_private(sb.st_rdev)) {
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("ignore private LVM device"));
|
||||||
|
+ pr->flags |= BLKID_FL_NOSCAN_DEV;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
#ifdef CDROM_GET_CAPABILITY
|
||||||
|
- if (S_ISBLK(sb.st_mode) &&
|
||||||
|
+ else if (S_ISBLK(sb.st_mode) &&
|
||||||
|
!blkid_probe_is_tiny(pr) &&
|
||||||
|
blkid_probe_is_wholedisk(pr) &&
|
||||||
|
ioctl(fd, CDROM_GET_CAPABILITY, NULL) >= 0)
|
||||||
|
@@ -892,6 +898,9 @@ int blkid_do_probe(blkid_probe pr)
|
||||||
|
if (!pr)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
do {
|
||||||
|
struct blkid_chain *chn = pr->cur_chain;
|
||||||
|
|
||||||
|
@@ -1143,6 +1152,8 @@ int blkid_do_safeprobe(blkid_probe pr)
|
||||||
|
|
||||||
|
if (!pr)
|
||||||
|
return -1;
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
blkid_probe_start(pr);
|
||||||
|
|
||||||
|
@@ -1197,6 +1208,8 @@ int blkid_do_fullprobe(blkid_probe pr)
|
||||||
|
|
||||||
|
if (!pr)
|
||||||
|
return -1;
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
blkid_probe_start(pr);
|
||||||
|
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak util-linux-2.23.2/libblkid/src/superblocks/superblocks.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak 2015-07-02 12:29:32.370193121 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/superblocks.c 2015-07-02 12:31:06.897535008 +0200
|
||||||
|
@@ -338,6 +338,9 @@ static int superblocks_probe(blkid_probe
|
||||||
|
|
||||||
|
if (!pr || chn->idx < -1)
|
||||||
|
return -EINVAL;
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ goto nothing;
|
||||||
|
+
|
||||||
|
blkid_probe_chain_reset_vals(pr, chn);
|
||||||
|
|
||||||
|
DBG(LOWPROBE, blkid_debug("--> starting probing loop [SUBLKS idx=%d]",
|
||||||
|
@@ -453,6 +456,9 @@ static int superblocks_safeprobe(blkid_p
|
||||||
|
int intol = 0;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
+ if (pr->flags & BLKID_FL_NOSCAN_DEV)
|
||||||
|
+ return 1; /* nothing */
|
||||||
|
+
|
||||||
|
while ((rc = superblocks_probe(pr, chn)) == 0) {
|
||||||
|
|
||||||
|
if (blkid_probe_is_tiny(pr) && !count)
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/verify.c.kzak util-linux-2.23.2/libblkid/src/verify.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/verify.c.kzak 2015-07-02 12:15:51.782928121 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/verify.c 2015-07-02 12:16:45.078555470 +0200
|
||||||
|
@@ -112,6 +112,10 @@ blkid_dev blkid_verify(blkid_cache cache
|
||||||
|
(unsigned long)diff));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ if (sysfs_devno_is_lvm_private(st.st_rdev)) {
|
||||||
|
+ blkid_free_dev(dev);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
if (!cache->probe) {
|
||||||
|
cache->probe = blkid_new_probe();
|
||||||
|
if (!cache->probe) {
|
||||||
|
diff -up util-linux-2.23.2/lib/sysfs.c.kzak util-linux-2.23.2/lib/sysfs.c
|
||||||
|
--- util-linux-2.23.2/lib/sysfs.c.kzak 2015-07-02 12:12:29.193344657 +0200
|
||||||
|
+++ util-linux-2.23.2/lib/sysfs.c 2015-07-02 12:12:13.565453930 +0200
|
||||||
|
@@ -639,6 +639,35 @@ err:
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * Returns 1 if the device is private LVM device.
|
||||||
|
+ */
|
||||||
|
+int sysfs_devno_is_lvm_private(dev_t devno)
|
||||||
|
+{
|
||||||
|
+ struct sysfs_cxt cxt = UL_SYSFSCXT_EMPTY;
|
||||||
|
+ char *uuid = NULL;
|
||||||
|
+ int rc = 0;
|
||||||
|
+
|
||||||
|
+ if (sysfs_init(&cxt, devno, NULL) != 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ uuid = sysfs_strdup(&cxt, "dm/uuid");
|
||||||
|
+
|
||||||
|
+ /* Private LVM devices use "LVM-<uuid>-<name>" uuid format (important
|
||||||
|
+ * is the "LVM" prefix and "-<name>" postfix).
|
||||||
|
+ */
|
||||||
|
+ if (uuid && strncmp(uuid, "LVM-", 4) == 0) {
|
||||||
|
+ char *p = strrchr(uuid + 4, '-');
|
||||||
|
+
|
||||||
|
+ if (p && *(p + 1))
|
||||||
|
+ rc = 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sysfs_deinit(&cxt);
|
||||||
|
+ free(uuid);
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* Return 0 or 1, or < 0 in case of error
|
||||||
|
*/
|
||||||
|
int sysfs_devno_is_wholedisk(dev_t devno)
|
||||||
|
@@ -651,6 +680,9 @@ int sysfs_devno_is_wholedisk(dev_t devno
|
||||||
|
return devno == disk;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
int sysfs_scsi_get_hctl(struct sysfs_cxt *cxt, int *h, int *c, int *t, int *l)
|
||||||
|
{
|
||||||
|
char buf[PATH_MAX], *hctl;
|
|
@ -0,0 +1,133 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak util-linux-2.23.2/libblkid/src/superblocks/superblocks.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/superblocks.c.kzak 2015-06-24 12:58:20.790115492 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/superblocks.c 2015-06-24 12:57:57.961286166 +0200
|
||||||
|
@@ -49,6 +49,8 @@
|
||||||
|
*
|
||||||
|
* @UUID_SUB: subvolume uuid (e.g. btrfs)
|
||||||
|
*
|
||||||
|
+ * @LOGUUID: external log UUID (e.g. xfs)
|
||||||
|
+ *
|
||||||
|
* @UUID_RAW: raw UUID from FS superblock
|
||||||
|
*
|
||||||
|
* @EXT_JOURNAL: external journal UUID
|
||||||
|
@@ -113,6 +115,7 @@ static const struct blkid_idinfo *idinfo
|
||||||
|
&swsuspend_idinfo,
|
||||||
|
&swap_idinfo,
|
||||||
|
&xfs_idinfo,
|
||||||
|
+ &xfs_log_idinfo,
|
||||||
|
&ext4dev_idinfo,
|
||||||
|
&ext4_idinfo,
|
||||||
|
&ext3_idinfo,
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/superblocks.h.kzak util-linux-2.23.2/libblkid/src/superblocks/superblocks.h
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/superblocks.h.kzak 2015-06-24 12:58:48.533908071 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/superblocks.h 2015-06-24 12:59:00.098821476 +0200
|
||||||
|
@@ -29,6 +29,7 @@ extern const struct blkid_idinfo ext2_id
|
||||||
|
extern const struct blkid_idinfo jbd_idinfo;
|
||||||
|
extern const struct blkid_idinfo jfs_idinfo;
|
||||||
|
extern const struct blkid_idinfo xfs_idinfo;
|
||||||
|
+extern const struct blkid_idinfo xfs_log_idinfo;
|
||||||
|
extern const struct blkid_idinfo gfs_idinfo;
|
||||||
|
extern const struct blkid_idinfo gfs2_idinfo;
|
||||||
|
extern const struct blkid_idinfo romfs_idinfo;
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/xfs.c.kzak util-linux-2.23.2/libblkid/src/superblocks/xfs.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/xfs.c.kzak 2015-06-24 12:39:34.300507071 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/xfs.c 2015-06-24 12:39:45.389427015 +0200
|
||||||
|
@@ -4,6 +4,7 @@
|
||||||
|
* Copyright (C) 2001 by Andreas Dilger
|
||||||
|
* Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
|
||||||
|
* Copyright (C) 2008 Karel Zak <kzak@redhat.com>
|
||||||
|
+ * Copyright (C) 2013 Eric Sandeen <sandeen@redhat.com>
|
||||||
|
*
|
||||||
|
* This file may be redistributed under the terms of the
|
||||||
|
* GNU Lesser General Public License.
|
||||||
|
@@ -187,3 +188,90 @@ const struct blkid_idinfo xfs_idinfo =
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct xlog_rec_header {
|
||||||
|
+ uint32_t h_magicno;
|
||||||
|
+ uint32_t h_dummy1[1];
|
||||||
|
+ uint32_t h_version;
|
||||||
|
+ uint32_t h_len;
|
||||||
|
+ uint32_t h_dummy2[71];
|
||||||
|
+ uint32_t h_fmt;
|
||||||
|
+ unsigned char h_uuid[16];
|
||||||
|
+} __attribute__((packed));
|
||||||
|
+
|
||||||
|
+#define XLOG_HEADER_MAGIC_NUM 0xFEEDbabe
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * For very small filesystems, the minimum log size
|
||||||
|
+ * can be smaller, but that seems vanishingly unlikely
|
||||||
|
+ * when used with an external log (which is used for
|
||||||
|
+ * performance reasons; tiny conflicts with that goal).
|
||||||
|
+ */
|
||||||
|
+#define XFS_MIN_LOG_BYTES (10 * 1024 * 1024)
|
||||||
|
+
|
||||||
|
+#define XLOG_FMT_LINUX_LE 1
|
||||||
|
+#define XLOG_FMT_LINUX_BE 2
|
||||||
|
+#define XLOG_FMT_IRIX_BE 3
|
||||||
|
+
|
||||||
|
+#define XLOG_VERSION_1 1
|
||||||
|
+#define XLOG_VERSION_2 2 /* Large IClogs, Log sunit */
|
||||||
|
+#define XLOG_VERSION_OKBITS (XLOG_VERSION_1 | XLOG_VERSION_2)
|
||||||
|
+
|
||||||
|
+static int xlog_valid_rec_header(struct xlog_rec_header *rhead)
|
||||||
|
+{
|
||||||
|
+ uint32_t hlen;
|
||||||
|
+
|
||||||
|
+ if (rhead->h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (!rhead->h_version ||
|
||||||
|
+ (be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS)))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* LR body must have data or it wouldn't have been written */
|
||||||
|
+ hlen = be32_to_cpu(rhead->h_len);
|
||||||
|
+ if (hlen <= 0 || hlen > INT_MAX)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rhead->h_fmt != cpu_to_be32(XLOG_FMT_LINUX_LE) &&
|
||||||
|
+ rhead->h_fmt != cpu_to_be32(XLOG_FMT_LINUX_BE) &&
|
||||||
|
+ rhead->h_fmt != cpu_to_be32(XLOG_FMT_IRIX_BE))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* xlog record header will be in some sector in the first 256k */
|
||||||
|
+static int probe_xfs_log(blkid_probe pr, const struct blkid_idmag *mag)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ struct xlog_rec_header *rhead;
|
||||||
|
+ unsigned char *buf;
|
||||||
|
+
|
||||||
|
+ buf = blkid_probe_get_buffer(pr, 0, 256*1024);
|
||||||
|
+ if (!buf)
|
||||||
|
+ return errno ? -errno : 1;
|
||||||
|
+
|
||||||
|
+ if (memcmp(buf, "XFSB", 4) == 0)
|
||||||
|
+ return 1; /* this is regular XFS, ignore */
|
||||||
|
+
|
||||||
|
+ /* check the first 512 512-byte sectors */
|
||||||
|
+ for (i = 0; i < 512; i++) {
|
||||||
|
+ rhead = (struct xlog_rec_header *)&buf[i*512];
|
||||||
|
+
|
||||||
|
+ if (xlog_valid_rec_header(rhead)) {
|
||||||
|
+ blkid_probe_set_uuid_as(pr, rhead->h_uuid, "LOGUUID");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+const struct blkid_idinfo xfs_log_idinfo =
|
||||||
|
+{
|
||||||
|
+ .name = "xfs_external_log",
|
||||||
|
+ .usage = BLKID_USAGE_OTHER,
|
||||||
|
+ .probefunc = probe_xfs_log,
|
||||||
|
+ .magics = BLKID_NONE_MAGIC,
|
||||||
|
+ .minsz = XFS_MIN_LOG_BYTES,
|
||||||
|
+};
|
|
@ -0,0 +1,176 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/xfs.c.kzak util-linux-2.23.2/libblkid/src/superblocks/xfs.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/xfs.c.kzak 2014-09-24 10:59:39.548315524 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/xfs.c 2014-09-24 11:02:55.595186026 +0200
|
||||||
|
@@ -20,20 +20,143 @@
|
||||||
|
#include "superblocks.h"
|
||||||
|
|
||||||
|
struct xfs_super_block {
|
||||||
|
- unsigned char xs_magic[4];
|
||||||
|
- uint32_t xs_blocksize;
|
||||||
|
- uint64_t xs_dblocks;
|
||||||
|
- uint64_t xs_rblocks;
|
||||||
|
- uint32_t xs_dummy1[2];
|
||||||
|
- unsigned char xs_uuid[16];
|
||||||
|
- uint32_t xs_dummy2[15];
|
||||||
|
- char xs_fname[12];
|
||||||
|
- uint32_t xs_dummy3[2];
|
||||||
|
- uint64_t xs_icount;
|
||||||
|
- uint64_t xs_ifree;
|
||||||
|
- uint64_t xs_fdblocks;
|
||||||
|
+ uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
||||||
|
+ uint32_t sb_blocksize; /* logical block size, bytes */
|
||||||
|
+ uint64_t sb_dblocks; /* number of data blocks */
|
||||||
|
+ uint64_t sb_rblocks; /* number of realtime blocks */
|
||||||
|
+ uint64_t sb_rextents; /* number of realtime extents */
|
||||||
|
+ unsigned char sb_uuid[16]; /* file system unique id */
|
||||||
|
+ uint64_t sb_logstart; /* starting block of log if internal */
|
||||||
|
+ uint64_t sb_rootino; /* root inode number */
|
||||||
|
+ uint64_t sb_rbmino; /* bitmap inode for realtime extents */
|
||||||
|
+ uint64_t sb_rsumino; /* summary inode for rt bitmap */
|
||||||
|
+ uint32_t sb_rextsize; /* realtime extent size, blocks */
|
||||||
|
+ uint32_t sb_agblocks; /* size of an allocation group */
|
||||||
|
+ uint32_t sb_agcount; /* number of allocation groups */
|
||||||
|
+ uint32_t sb_rbmblocks; /* number of rt bitmap blocks */
|
||||||
|
+ uint32_t sb_logblocks; /* number of log blocks */
|
||||||
|
+
|
||||||
|
+ uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */
|
||||||
|
+ uint16_t sb_sectsize; /* volume sector size, bytes */
|
||||||
|
+ uint16_t sb_inodesize; /* inode size, bytes */
|
||||||
|
+ uint16_t sb_inopblock; /* inodes per block */
|
||||||
|
+ char sb_fname[12]; /* file system name */
|
||||||
|
+ uint8_t sb_blocklog; /* log2 of sb_blocksize */
|
||||||
|
+ uint8_t sb_sectlog; /* log2 of sb_sectsize */
|
||||||
|
+ uint8_t sb_inodelog; /* log2 of sb_inodesize */
|
||||||
|
+ uint8_t sb_inopblog; /* log2 of sb_inopblock */
|
||||||
|
+ uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */
|
||||||
|
+ uint8_t sb_rextslog; /* log2 of sb_rextents */
|
||||||
|
+ uint8_t sb_inprogress; /* mkfs is in progress, don't mount */
|
||||||
|
+ uint8_t sb_imax_pct; /* max % of fs for inode space */
|
||||||
|
+ /* statistics */
|
||||||
|
+ uint64_t sb_icount; /* allocated inodes */
|
||||||
|
+ uint64_t sb_ifree; /* free inodes */
|
||||||
|
+ uint64_t sb_fdblocks; /* free data blocks */
|
||||||
|
+ uint64_t sb_frextents; /* free realtime extents */
|
||||||
|
+
|
||||||
|
+ /* this is not all... but enough for libblkid */
|
||||||
|
+
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
+#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */
|
||||||
|
+#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */
|
||||||
|
+#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG)
|
||||||
|
+#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG)
|
||||||
|
+#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */
|
||||||
|
+#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */
|
||||||
|
+#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG)
|
||||||
|
+#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG)
|
||||||
|
+
|
||||||
|
+#define XFS_DINODE_MIN_LOG 8
|
||||||
|
+#define XFS_DINODE_MAX_LOG 11
|
||||||
|
+#define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG)
|
||||||
|
+#define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG)
|
||||||
|
+
|
||||||
|
+#define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */
|
||||||
|
+#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */
|
||||||
|
+#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */
|
||||||
|
+
|
||||||
|
+#define XFS_MIN_AG_BLOCKS 64
|
||||||
|
+#define XFS_MAX_DBLOCKS(s) ((uint64_t)(s)->sb_agcount * (s)->sb_agblocks)
|
||||||
|
+#define XFS_MIN_DBLOCKS(s) ((uint64_t)((s)->sb_agcount - 1) * \
|
||||||
|
+ (s)->sb_agblocks + XFS_MIN_AG_BLOCKS)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+static void sb_from_disk(struct xfs_super_block *from,
|
||||||
|
+ struct xfs_super_block *to)
|
||||||
|
+{
|
||||||
|
+
|
||||||
|
+ to->sb_magicnum = be32_to_cpu(from->sb_magicnum);
|
||||||
|
+ to->sb_blocksize = be32_to_cpu(from->sb_blocksize);
|
||||||
|
+ to->sb_dblocks = be64_to_cpu(from->sb_dblocks);
|
||||||
|
+ to->sb_rblocks = be64_to_cpu(from->sb_rblocks);
|
||||||
|
+ to->sb_rextents = be64_to_cpu(from->sb_rextents);
|
||||||
|
+ to->sb_logstart = be64_to_cpu(from->sb_logstart);
|
||||||
|
+ to->sb_rootino = be64_to_cpu(from->sb_rootino);
|
||||||
|
+ to->sb_rbmino = be64_to_cpu(from->sb_rbmino);
|
||||||
|
+ to->sb_rsumino = be64_to_cpu(from->sb_rsumino);
|
||||||
|
+ to->sb_rextsize = be32_to_cpu(from->sb_rextsize);
|
||||||
|
+ to->sb_agblocks = be32_to_cpu(from->sb_agblocks);
|
||||||
|
+ to->sb_agcount = be32_to_cpu(from->sb_agcount);
|
||||||
|
+ to->sb_rbmblocks = be32_to_cpu(from->sb_rbmblocks);
|
||||||
|
+ to->sb_logblocks = be32_to_cpu(from->sb_logblocks);
|
||||||
|
+ to->sb_versionnum = be16_to_cpu(from->sb_versionnum);
|
||||||
|
+ to->sb_sectsize = be16_to_cpu(from->sb_sectsize);
|
||||||
|
+ to->sb_inodesize = be16_to_cpu(from->sb_inodesize);
|
||||||
|
+ to->sb_inopblock = be16_to_cpu(from->sb_inopblock);
|
||||||
|
+ to->sb_blocklog = from->sb_blocklog;
|
||||||
|
+ to->sb_sectlog = from->sb_sectlog;
|
||||||
|
+ to->sb_inodelog = from->sb_inodelog;
|
||||||
|
+ to->sb_inopblog = from->sb_inopblog;
|
||||||
|
+ to->sb_agblklog = from->sb_agblklog;
|
||||||
|
+ to->sb_rextslog = from->sb_rextslog;
|
||||||
|
+ to->sb_inprogress = from->sb_inprogress;
|
||||||
|
+ to->sb_imax_pct = from->sb_imax_pct;
|
||||||
|
+ to->sb_icount = be64_to_cpu(from->sb_icount);
|
||||||
|
+ to->sb_ifree = be64_to_cpu(from->sb_ifree);
|
||||||
|
+ to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks);
|
||||||
|
+ to->sb_frextents = be64_to_cpu(from->sb_frextents);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int xfs_verify_sb(struct xfs_super_block *ondisk)
|
||||||
|
+{
|
||||||
|
+ struct xfs_super_block sb, *sbp = &sb;
|
||||||
|
+
|
||||||
|
+ /* beXX_to_cpu(), but don't convert UUID and fsname! */
|
||||||
|
+ sb_from_disk(ondisk, sbp);
|
||||||
|
+
|
||||||
|
+ /* sanity checks, we don't want to rely on magic string only */
|
||||||
|
+ if (sbp->sb_agcount <= 0 ||
|
||||||
|
+ sbp->sb_sectsize < XFS_MIN_SECTORSIZE ||
|
||||||
|
+ sbp->sb_sectsize > XFS_MAX_SECTORSIZE ||
|
||||||
|
+ sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG ||
|
||||||
|
+ sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG ||
|
||||||
|
+ sbp->sb_sectsize != (1 << sbp->sb_sectlog) ||
|
||||||
|
+ sbp->sb_blocksize < XFS_MIN_BLOCKSIZE ||
|
||||||
|
+ sbp->sb_blocksize > XFS_MAX_BLOCKSIZE ||
|
||||||
|
+ sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG ||
|
||||||
|
+ sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG ||
|
||||||
|
+ sbp->sb_blocksize != (1 << sbp->sb_blocklog) ||
|
||||||
|
+ sbp->sb_inodesize < XFS_DINODE_MIN_SIZE ||
|
||||||
|
+ sbp->sb_inodesize > XFS_DINODE_MAX_SIZE ||
|
||||||
|
+ sbp->sb_inodelog < XFS_DINODE_MIN_LOG ||
|
||||||
|
+ sbp->sb_inodelog > XFS_DINODE_MAX_LOG ||
|
||||||
|
+ sbp->sb_inodesize != (1 << sbp->sb_inodelog) ||
|
||||||
|
+ (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) ||
|
||||||
|
+ (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) ||
|
||||||
|
+ (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||
|
||||||
|
+ (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) ||
|
||||||
|
+ sbp->sb_dblocks == 0 ||
|
||||||
|
+ sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) ||
|
||||||
|
+ sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* TODO: version 5 has also checksum CRC32, maybe we can check it too */
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int probe_xfs(blkid_probe pr, const struct blkid_idmag *mag)
|
||||||
|
{
|
||||||
|
struct xfs_super_block *xs;
|
||||||
|
@@ -42,10 +165,13 @@ static int probe_xfs(blkid_probe pr, con
|
||||||
|
if (!xs)
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
|
||||||
|
- if (strlen(xs->xs_fname))
|
||||||
|
- blkid_probe_set_label(pr, (unsigned char *) xs->xs_fname,
|
||||||
|
- sizeof(xs->xs_fname));
|
||||||
|
- blkid_probe_set_uuid(pr, xs->xs_uuid);
|
||||||
|
+ if (!xfs_verify_sb(xs))
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ if (strlen(xs->sb_fname))
|
||||||
|
+ blkid_probe_set_label(pr, (unsigned char *) xs->sb_fname,
|
||||||
|
+ sizeof(xs->sb_fname));
|
||||||
|
+ blkid_probe_set_uuid(pr, xs->sb_uuid);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/lscpu.c.kzak util-linux-2.23.2/sys-utils/lscpu.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/lscpu.c.kzak 2014-09-24 10:27:29.410899893 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/lscpu.c 2014-09-24 10:33:20.960254060 +0200
|
||||||
|
@@ -809,7 +809,7 @@ static inline int is_node_dirent(struct
|
||||||
|
return
|
||||||
|
d &&
|
||||||
|
#ifdef _DIRENT_HAVE_D_TYPE
|
||||||
|
- d->d_type == DT_DIR &&
|
||||||
|
+ (d->d_type == DT_DIR || d->d_type == DT_UNKNOWN) &&
|
||||||
|
#endif
|
||||||
|
strncmp(d->d_name, "node", 4) == 0 &&
|
||||||
|
isdigit_string(d->d_name + 4);
|
|
@ -0,0 +1,102 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/lscpu.c.kzak util-linux-2.23.2/sys-utils/lscpu.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/lscpu.c.kzak 2013-07-30 10:39:26.342739583 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/lscpu.c 2014-01-14 11:21:51.837599200 +0100
|
||||||
|
@@ -49,6 +49,7 @@
|
||||||
|
/* /sys paths */
|
||||||
|
#define _PATH_SYS_SYSTEM "/sys/devices/system"
|
||||||
|
#define _PATH_SYS_CPU _PATH_SYS_SYSTEM "/cpu"
|
||||||
|
+#define _PATH_SYS_NODE _PATH_SYS_SYSTEM "/node"
|
||||||
|
#define _PATH_PROC_XEN "/proc/xen"
|
||||||
|
#define _PATH_PROC_XENCAP _PATH_PROC_XEN "/capabilities"
|
||||||
|
#define _PATH_PROC_CPUINFO "/proc/cpuinfo"
|
||||||
|
@@ -157,6 +158,7 @@ struct lscpu_desc {
|
||||||
|
cpu_set_t *online; /* mask with online CPUs */
|
||||||
|
|
||||||
|
int nnodes; /* number of NUMA modes */
|
||||||
|
+ int *idx2nodenum; /* Support for discontinuous nodes */
|
||||||
|
cpu_set_t **nodemaps; /* array with NUMA nodes */
|
||||||
|
|
||||||
|
/* books -- based on book_siblings (internal kernel map of cpuX's
|
||||||
|
@@ -802,25 +804,59 @@ read_cache(struct lscpu_desc *desc, int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline int is_node_dirent(struct dirent *d)
|
||||||
|
+{
|
||||||
|
+ return
|
||||||
|
+ d &&
|
||||||
|
+#ifdef _DIRENT_HAVE_D_TYPE
|
||||||
|
+ d->d_type == DT_DIR &&
|
||||||
|
+#endif
|
||||||
|
+ strncmp(d->d_name, "node", 4) == 0 &&
|
||||||
|
+ isdigit_string(d->d_name + 4);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
read_nodes(struct lscpu_desc *desc)
|
||||||
|
{
|
||||||
|
- int i;
|
||||||
|
+ int i = 0;
|
||||||
|
+ DIR *dir;
|
||||||
|
+ struct dirent *d;
|
||||||
|
+ char *path;
|
||||||
|
|
||||||
|
/* number of NUMA node */
|
||||||
|
- while (path_exist(_PATH_SYS_SYSTEM "/node/node%d", desc->nnodes))
|
||||||
|
- desc->nnodes++;
|
||||||
|
+ path = path_strdup(_PATH_SYS_NODE);
|
||||||
|
+ dir = opendir(path);
|
||||||
|
+ free(path);
|
||||||
|
+
|
||||||
|
+ while (dir && (d = readdir(dir))) {
|
||||||
|
+ if (is_node_dirent(d))
|
||||||
|
+ desc->nnodes++;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (!desc->nnodes)
|
||||||
|
+ if (!desc->nnodes) {
|
||||||
|
+ if (dir)
|
||||||
|
+ closedir(dir);
|
||||||
|
return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
desc->nodemaps = xcalloc(desc->nnodes, sizeof(cpu_set_t *));
|
||||||
|
+ desc->idx2nodenum = xmalloc(desc->nnodes * sizeof(int));
|
||||||
|
+
|
||||||
|
+ if (dir) {
|
||||||
|
+ rewinddir(dir);
|
||||||
|
+ while ((d = readdir(dir)) && i < desc->nnodes) {
|
||||||
|
+ if (is_node_dirent(d))
|
||||||
|
+ desc->idx2nodenum[i++] = strtol_or_err(((d->d_name) + 4),
|
||||||
|
+ _("Failed to extract the node number"));
|
||||||
|
+ }
|
||||||
|
+ closedir(dir);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* information about how nodes share different CPUs */
|
||||||
|
for (i = 0; i < desc->nnodes; i++)
|
||||||
|
desc->nodemaps[i] = path_read_cpuset(maxcpus,
|
||||||
|
_PATH_SYS_SYSTEM "/node/node%d/cpumap",
|
||||||
|
- i);
|
||||||
|
+ desc->idx2nodenum[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
@@ -850,7 +886,7 @@ get_cell_data(struct lscpu_desc *desc, i
|
||||||
|
case COL_NODE:
|
||||||
|
if (cpuset_ary_isset(cpu, desc->nodemaps,
|
||||||
|
desc->nnodes, setsize, &idx) == 0)
|
||||||
|
- snprintf(buf, bufsz, "%zd", idx);
|
||||||
|
+ snprintf(buf, bufsz, "%d", desc->idx2nodenum[idx]);
|
||||||
|
break;
|
||||||
|
case COL_BOOK:
|
||||||
|
if (cpuset_ary_isset(cpu, desc->bookmaps,
|
||||||
|
@@ -1250,7 +1286,7 @@ print_summary(struct lscpu_desc *desc, s
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < desc->nnodes; i++) {
|
||||||
|
- snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), i);
|
||||||
|
+ snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), desc->idx2nodenum[i]);
|
||||||
|
print_cpuset(buf, desc->nodemaps[i], mod->hex);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,144 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/lscpu.c.kzak util-linux-2.23.2/sys-utils/lscpu.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/lscpu.c.kzak 2014-01-14 14:02:52.228996385 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/lscpu.c 2014-01-14 14:04:08.109795733 +0100
|
||||||
|
@@ -815,6 +815,13 @@ static inline int is_node_dirent(struct
|
||||||
|
isdigit_string(d->d_name + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+nodecmp(const void *ap, const void *bp)
|
||||||
|
+{
|
||||||
|
+ int *a = (int *) ap, *b = (int *) bp;
|
||||||
|
+ return *a - *b;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
read_nodes(struct lscpu_desc *desc)
|
||||||
|
{
|
||||||
|
@@ -850,6 +857,7 @@ read_nodes(struct lscpu_desc *desc)
|
||||||
|
_("Failed to extract the node number"));
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
+ qsort(desc->idx2nodenum, desc->nnodes, sizeof(int), nodecmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* information about how nodes share different CPUs */
|
||||||
|
diff -up util-linux-2.23.2/tests/expected/lscpu/lscpu-x86_64-64cpu.kzak util-linux-2.23.2/tests/expected/lscpu/lscpu-x86_64-64cpu
|
||||||
|
--- util-linux-2.23.2/tests/expected/lscpu/lscpu-x86_64-64cpu.kzak 2013-06-13 09:46:10.551651742 +0200
|
||||||
|
+++ util-linux-2.23.2/tests/expected/lscpu/lscpu-x86_64-64cpu 2014-01-14 14:04:29.662022613 +0100
|
||||||
|
@@ -4,7 +4,7 @@ On-line CPU(s) list: 0-63
|
||||||
|
Thread(s) per core: 2
|
||||||
|
Core(s) per socket: 8
|
||||||
|
Socket(s): 4
|
||||||
|
-NUMA node(s): 1
|
||||||
|
+NUMA node(s): 3
|
||||||
|
Vendor ID: GenuineIntel
|
||||||
|
CPU family: 6
|
||||||
|
Model: 46
|
||||||
|
@@ -18,72 +18,74 @@ L1i cache: 32K
|
||||||
|
L2 cache: 256K
|
||||||
|
L3 cache: 18432K
|
||||||
|
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62
|
||||||
|
+NUMA node2 CPU(s): 1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
|
||||||
|
+NUMA node3 CPU(s): 3,7,11,15,19,23,27,31,35,39,43,47,51,55,59,63
|
||||||
|
|
||||||
|
# The following is the parsable format, which can be fed to other
|
||||||
|
# programs. Each different item in every column has an unique ID
|
||||||
|
# starting from zero.
|
||||||
|
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
|
||||||
|
0,0,0,0,,0,0,0,0
|
||||||
|
-1,1,1,,,1,1,1,1
|
||||||
|
+1,1,1,2,,1,1,1,1
|
||||||
|
2,2,2,0,,2,2,2,2
|
||||||
|
-3,3,3,,,3,3,3,3
|
||||||
|
+3,3,3,3,,3,3,3,3
|
||||||
|
4,4,0,0,,4,4,4,0
|
||||||
|
-5,5,1,,,5,5,5,1
|
||||||
|
+5,5,1,2,,5,5,5,1
|
||||||
|
6,6,2,0,,6,6,6,2
|
||||||
|
-7,7,3,,,7,7,7,3
|
||||||
|
+7,7,3,3,,7,7,7,3
|
||||||
|
8,8,0,0,,8,8,8,0
|
||||||
|
-9,9,1,,,9,9,9,1
|
||||||
|
+9,9,1,2,,9,9,9,1
|
||||||
|
10,10,2,0,,10,10,10,2
|
||||||
|
-11,11,3,,,11,11,11,3
|
||||||
|
+11,11,3,3,,11,11,11,3
|
||||||
|
12,12,0,0,,12,12,12,0
|
||||||
|
-13,13,1,,,13,13,13,1
|
||||||
|
+13,13,1,2,,13,13,13,1
|
||||||
|
14,14,2,0,,14,14,14,2
|
||||||
|
-15,15,3,,,15,15,15,3
|
||||||
|
+15,15,3,3,,15,15,15,3
|
||||||
|
16,16,0,0,,16,16,16,0
|
||||||
|
-17,17,1,,,17,17,17,1
|
||||||
|
+17,17,1,2,,17,17,17,1
|
||||||
|
18,18,2,0,,18,18,18,2
|
||||||
|
-19,19,3,,,19,19,19,3
|
||||||
|
+19,19,3,3,,19,19,19,3
|
||||||
|
20,20,0,0,,20,20,20,0
|
||||||
|
-21,21,1,,,21,21,21,1
|
||||||
|
+21,21,1,2,,21,21,21,1
|
||||||
|
22,22,2,0,,22,22,22,2
|
||||||
|
-23,23,3,,,23,23,23,3
|
||||||
|
+23,23,3,3,,23,23,23,3
|
||||||
|
24,24,0,0,,24,24,24,0
|
||||||
|
-25,25,1,,,25,25,25,1
|
||||||
|
+25,25,1,2,,25,25,25,1
|
||||||
|
26,26,2,0,,26,26,26,2
|
||||||
|
-27,27,3,,,27,27,27,3
|
||||||
|
+27,27,3,3,,27,27,27,3
|
||||||
|
28,28,0,0,,28,28,28,0
|
||||||
|
-29,29,1,,,29,29,29,1
|
||||||
|
+29,29,1,2,,29,29,29,1
|
||||||
|
30,30,2,0,,30,30,30,2
|
||||||
|
-31,31,3,,,31,31,31,3
|
||||||
|
+31,31,3,3,,31,31,31,3
|
||||||
|
32,0,0,0,,0,0,0,0
|
||||||
|
-33,1,1,,,1,1,1,1
|
||||||
|
+33,1,1,2,,1,1,1,1
|
||||||
|
34,2,2,0,,2,2,2,2
|
||||||
|
-35,3,3,,,3,3,3,3
|
||||||
|
+35,3,3,3,,3,3,3,3
|
||||||
|
36,4,0,0,,4,4,4,0
|
||||||
|
-37,5,1,,,5,5,5,1
|
||||||
|
+37,5,1,2,,5,5,5,1
|
||||||
|
38,6,2,0,,6,6,6,2
|
||||||
|
-39,7,3,,,7,7,7,3
|
||||||
|
+39,7,3,3,,7,7,7,3
|
||||||
|
40,8,0,0,,8,8,8,0
|
||||||
|
-41,9,1,,,9,9,9,1
|
||||||
|
+41,9,1,2,,9,9,9,1
|
||||||
|
42,10,2,0,,10,10,10,2
|
||||||
|
-43,11,3,,,11,11,11,3
|
||||||
|
+43,11,3,3,,11,11,11,3
|
||||||
|
44,12,0,0,,12,12,12,0
|
||||||
|
-45,13,1,,,13,13,13,1
|
||||||
|
+45,13,1,2,,13,13,13,1
|
||||||
|
46,14,2,0,,14,14,14,2
|
||||||
|
-47,15,3,,,15,15,15,3
|
||||||
|
+47,15,3,3,,15,15,15,3
|
||||||
|
48,16,0,0,,16,16,16,0
|
||||||
|
-49,17,1,,,17,17,17,1
|
||||||
|
+49,17,1,2,,17,17,17,1
|
||||||
|
50,18,2,0,,18,18,18,2
|
||||||
|
-51,19,3,,,19,19,19,3
|
||||||
|
+51,19,3,3,,19,19,19,3
|
||||||
|
52,20,0,0,,20,20,20,0
|
||||||
|
-53,21,1,,,21,21,21,1
|
||||||
|
+53,21,1,2,,21,21,21,1
|
||||||
|
54,22,2,0,,22,22,22,2
|
||||||
|
-55,23,3,,,23,23,23,3
|
||||||
|
+55,23,3,3,,23,23,23,3
|
||||||
|
56,24,0,0,,24,24,24,0
|
||||||
|
-57,25,1,,,25,25,25,1
|
||||||
|
+57,25,1,2,,25,25,25,1
|
||||||
|
58,26,2,0,,26,26,26,2
|
||||||
|
-59,27,3,,,27,27,27,3
|
||||||
|
+59,27,3,3,,27,27,27,3
|
||||||
|
60,28,0,0,,28,28,28,0
|
||||||
|
-61,29,1,,,29,29,29,1
|
||||||
|
+61,29,1,2,,29,29,29,1
|
||||||
|
62,30,2,0,,30,30,30,2
|
||||||
|
-63,31,3,,,31,31,31,3
|
||||||
|
+63,31,3,3,,31,31,31,3
|
|
@ -0,0 +1,27 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/mount.8.kzak util-linux-2.23.2/sys-utils/mount.8
|
||||||
|
--- util-linux-2.23.2/sys-utils/mount.8.kzak 2015-06-24 10:44:54.888929869 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/mount.8 2015-06-24 10:48:10.022436703 +0200
|
||||||
|
@@ -865,9 +865,10 @@ Some of these options are only useful wh
|
||||||
|
.I /etc/fstab
|
||||||
|
file.
|
||||||
|
|
||||||
|
-Some of these options could be enabled or disabled by default
|
||||||
|
-in the system kernel. To check the current setting see the options
|
||||||
|
-in /proc/mounts.
|
||||||
|
+Some of these options could be enabled or disabled by default in the system
|
||||||
|
+kernel. To check the current setting see the options in /proc/mounts. Note
|
||||||
|
+that filesystems also have per-filesystem specific default mount options (see
|
||||||
|
+for example tune2fs -l output for extN filesystems).
|
||||||
|
|
||||||
|
The following options apply to any filesystem that is being
|
||||||
|
mounted (but not every filesystem actually honors them - e.g., the
|
||||||
|
@@ -973,6 +974,9 @@ For more details, see
|
||||||
|
.B defaults
|
||||||
|
Use default options:
|
||||||
|
.BR rw ", " suid ", " dev ", " exec ", " auto ", " nouser ", and " async.
|
||||||
|
+
|
||||||
|
+Note that the real set of the all default mount options depends on kernel
|
||||||
|
+and filesystem type. See the begin of this section for more details.
|
||||||
|
.TP
|
||||||
|
.B dev
|
||||||
|
Interpret character or block special devices on the filesystem.
|
|
@ -0,0 +1,16 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/mount.8.kzak util-linux-2.23.2/sys-utils/mount.8
|
||||||
|
--- util-linux-2.23.2/sys-utils/mount.8.kzak 2014-03-12 12:35:46.532369960 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/mount.8 2014-03-12 12:35:23.041126143 +0100
|
||||||
|
@@ -2598,9 +2598,9 @@ None.
|
||||||
|
.TP
|
||||||
|
.BR allocsize=size
|
||||||
|
Sets the buffered I/O end-of-file preallocation size when
|
||||||
|
-doing delayed allocation writeout (default size is 64KiB).
|
||||||
|
-Valid values for this option are page size (typically 4KiB)
|
||||||
|
-through to 1GiB, inclusive, in power-of-2 increments.
|
||||||
|
+doing delayed allocation writeout. Valid values for this
|
||||||
|
+option are page size (typically 4KiB) through to 1GiB,
|
||||||
|
+inclusive, in power-of-2 increments.
|
||||||
|
.sp
|
||||||
|
The default behaviour is for dynamic end-of-file
|
||||||
|
preallocation size, which uses a set of heuristics to
|
|
@ -0,0 +1,200 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/swapon.8.kzak util-linux-2.23.2/sys-utils/swapon.8
|
||||||
|
--- util-linux-2.23.2/sys-utils/swapon.8.kzak 2013-06-13 09:46:10.544651682 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/swapon.8 2014-09-24 10:57:45.855230767 +0200
|
||||||
|
@@ -112,15 +112,25 @@ All devices marked as ``swap'' in
|
||||||
|
are made available, except for those with the ``noauto'' option.
|
||||||
|
Devices that are already being used as swap are silently skipped.
|
||||||
|
.TP
|
||||||
|
-.B "\-d, \-\-discard"
|
||||||
|
-Discard freed swap pages before they are reused, if the swap
|
||||||
|
-device supports the discard or trim operation. This may improve
|
||||||
|
-performance on some Solid State Devices, but often it does not.
|
||||||
|
+.B "\-d, \-\-discard\fR [=\fIpolicy\fR]"
|
||||||
|
+Enable swap discards, if the swap backing device supports the discard or
|
||||||
|
+trim operation. This may improve performance on some Solid State Devices,
|
||||||
|
+but often it does not. The option allows one to select between two
|
||||||
|
+available swap discard policies:
|
||||||
|
+.BI \-\-discard=once
|
||||||
|
+to perform a single-time discard operation for the whole swap area at swapon;
|
||||||
|
+or
|
||||||
|
+.BI \-\-discard=pages
|
||||||
|
+to discard freed swap pages before they are reused, while swapping.
|
||||||
|
+If no policy is selected, the default behavior is to enable both discard types.
|
||||||
|
The
|
||||||
|
.I /etc/fstab
|
||||||
|
-mount option
|
||||||
|
-.BI discard
|
||||||
|
-may be also used to enable discard flag.
|
||||||
|
+mount options
|
||||||
|
+.BI discard,
|
||||||
|
+.BI discard=once,
|
||||||
|
+or
|
||||||
|
+.BI discard=pages
|
||||||
|
+may be also used to enable discard flags.
|
||||||
|
.TP
|
||||||
|
.B "\-e, \-\-ifexists"
|
||||||
|
Silently skip devices that do not exist.
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/swapon.c.kzak util-linux-2.23.2/sys-utils/swapon.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/swapon.c.kzak 2013-07-30 10:39:26.348739643 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/swapon.c 2014-09-24 10:57:45.855230767 +0200
|
||||||
|
@@ -34,9 +34,20 @@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SWAP_FLAG_DISCARD
|
||||||
|
-# define SWAP_FLAG_DISCARD 0x10000 /* discard swap cluster after use */
|
||||||
|
+# define SWAP_FLAG_DISCARD 0x10000 /* enable discard for swap */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifndef SWAP_FLAG_DISCARD_ONCE
|
||||||
|
+# define SWAP_FLAG_DISCARD_ONCE 0x20000 /* discard swap area at swapon-time */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifndef SWAP_FLAG_DISCARD_PAGES
|
||||||
|
+# define SWAP_FLAG_DISCARD_PAGES 0x40000 /* discard page-clusters after use */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#define SWAP_FLAGS_DISCARD_VALID (SWAP_FLAG_DISCARD | SWAP_FLAG_DISCARD_ONCE | \
|
||||||
|
+ SWAP_FLAG_DISCARD_PAGES)
|
||||||
|
+
|
||||||
|
#ifndef SWAP_FLAG_PREFER
|
||||||
|
# define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */
|
||||||
|
#endif
|
||||||
|
@@ -70,7 +81,7 @@ enum {
|
||||||
|
|
||||||
|
static int all;
|
||||||
|
static int priority = -1; /* non-prioritized swap by default */
|
||||||
|
-static int discard;
|
||||||
|
+static int discard; /* don't send swap discards by default */
|
||||||
|
|
||||||
|
/* If true, don't complain if the device/file doesn't exist */
|
||||||
|
static int ifexists;
|
||||||
|
@@ -567,8 +578,22 @@ static int do_swapon(const char *orig_sp
|
||||||
|
<< SWAP_FLAG_PRIO_SHIFT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
- if (fl_discard)
|
||||||
|
- flags |= SWAP_FLAG_DISCARD;
|
||||||
|
+ /*
|
||||||
|
+ * Validate the discard flags passed and set them
|
||||||
|
+ * accordingly before calling sys_swapon.
|
||||||
|
+ */
|
||||||
|
+ if (fl_discard && !(fl_discard & ~SWAP_FLAGS_DISCARD_VALID)) {
|
||||||
|
+ /*
|
||||||
|
+ * If we get here with both discard policy flags set,
|
||||||
|
+ * we just need to tell the kernel to enable discards
|
||||||
|
+ * and it will do correctly, just as we expect.
|
||||||
|
+ */
|
||||||
|
+ if ((fl_discard & SWAP_FLAG_DISCARD_ONCE) &&
|
||||||
|
+ (fl_discard & SWAP_FLAG_DISCARD_PAGES))
|
||||||
|
+ flags |= SWAP_FLAG_DISCARD;
|
||||||
|
+ else
|
||||||
|
+ flags |= fl_discard;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
status = swapon(special, flags);
|
||||||
|
if (status < 0)
|
||||||
|
@@ -608,12 +633,22 @@ static int swapon_all(void)
|
||||||
|
while (mnt_table_find_next_fs(tb, itr, match_swap, NULL, &fs) == 0) {
|
||||||
|
/* defaults */
|
||||||
|
int pri = priority, dsc = discard, nofail = ifexists;
|
||||||
|
- char *p, *src;
|
||||||
|
+ char *p, *src, *dscarg;
|
||||||
|
|
||||||
|
if (mnt_fs_get_option(fs, "noauto", NULL, NULL) == 0)
|
||||||
|
continue;
|
||||||
|
- if (mnt_fs_get_option(fs, "discard", NULL, NULL) == 0)
|
||||||
|
- dsc = 1;
|
||||||
|
+ if (mnt_fs_get_option(fs, "discard", &dscarg, NULL) == 0) {
|
||||||
|
+ dsc |= SWAP_FLAG_DISCARD;
|
||||||
|
+ if (dscarg) {
|
||||||
|
+ /* only single-time discards are wanted */
|
||||||
|
+ if (strcmp(dscarg, "once") == 0)
|
||||||
|
+ dsc |= SWAP_FLAG_DISCARD_ONCE;
|
||||||
|
+
|
||||||
|
+ /* do discard for every released swap page */
|
||||||
|
+ if (strcmp(dscarg, "pages") == 0)
|
||||||
|
+ dsc |= SWAP_FLAG_DISCARD_PAGES;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
if (mnt_fs_get_option(fs, "nofail", NULL, NULL) == 0)
|
||||||
|
nofail = 1;
|
||||||
|
if (mnt_fs_get_option(fs, "pri", &p, NULL) == 0 && p)
|
||||||
|
@@ -643,17 +678,17 @@ static void __attribute__ ((__noreturn__
|
||||||
|
fprintf(out, _(" %s [options] [<spec>]\n"), program_invocation_short_name);
|
||||||
|
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
- fputs(_(" -a, --all enable all swaps from /etc/fstab\n"
|
||||||
|
- " -d, --discard discard freed pages before they are reused\n"
|
||||||
|
- " -e, --ifexists silently skip devices that do not exist\n"
|
||||||
|
- " -f, --fixpgsz reinitialize the swap space if necessary\n"
|
||||||
|
- " -p, --priority <prio> specify the priority of the swap device\n"
|
||||||
|
- " -s, --summary display summary about used swap devices\n"
|
||||||
|
- " --show[=<columns>] display summary in definable table\n"
|
||||||
|
- " --noheadings don't print headings, use with --show\n"
|
||||||
|
- " --raw use the raw output format, use with --show\n"
|
||||||
|
- " --bytes display swap size in bytes in --show output\n"
|
||||||
|
- " -v, --verbose verbose mode\n"), out);
|
||||||
|
+ fputs(_(" -a, --all enable all swaps from /etc/fstab\n"
|
||||||
|
+ " -d, --discard[=<policy>] enable swap discards, if supported by device\n"
|
||||||
|
+ " -e, --ifexists silently skip devices that do not exist\n"
|
||||||
|
+ " -f, --fixpgsz reinitialize the swap space if necessary\n"
|
||||||
|
+ " -p, --priority <prio> specify the priority of the swap device\n"
|
||||||
|
+ " -s, --summary display summary about used swap devices\n"
|
||||||
|
+ " --show[=<columns>] display summary in definable table\n"
|
||||||
|
+ " --noheadings don't print headings, use with --show\n"
|
||||||
|
+ " --raw use the raw output format, use with --show\n"
|
||||||
|
+ " --bytes display swap size in bytes in --show output\n"
|
||||||
|
+ " -v, --verbose verbose mode\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
@@ -669,6 +704,11 @@ static void __attribute__ ((__noreturn__
|
||||||
|
" <device> name of device to be used\n"
|
||||||
|
" <file> name of file to be used\n"), out);
|
||||||
|
|
||||||
|
+ fputs(_("\nAvailable discard policy types (for --discard):\n"
|
||||||
|
+ " once : only single-time area discards are issued. (swapon)\n"
|
||||||
|
+ " pages : discard freed pages before they are reused.\n"
|
||||||
|
+ " * if no policy is selected both discard types are enabled. (default)\n"), out);
|
||||||
|
+
|
||||||
|
fputs(_("\nAvailable columns (for --show):\n"), out);
|
||||||
|
for (i = 0; i < NCOLS; i++)
|
||||||
|
fprintf(out, " %4s %s\n", infos[i].name, _(infos[i].help));
|
||||||
|
@@ -693,7 +733,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
static const struct option long_opts[] = {
|
||||||
|
{ "priority", 1, 0, 'p' },
|
||||||
|
- { "discard", 0, 0, 'd' },
|
||||||
|
+ { "discard", 2, 0, 'd' },
|
||||||
|
{ "ifexists", 0, 0, 'e' },
|
||||||
|
{ "summary", 0, 0, 's' },
|
||||||
|
{ "fixpgsz", 0, 0, 'f' },
|
||||||
|
@@ -716,7 +756,7 @@ int main(int argc, char *argv[])
|
||||||
|
mnt_init_debug(0);
|
||||||
|
mntcache = mnt_new_cache();
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "ahdefp:svVL:U:",
|
||||||
|
+ while ((c = getopt_long(argc, argv, "ahd::efp:svVL:U:",
|
||||||
|
long_opts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'a': /* all */
|
||||||
|
@@ -736,7 +776,18 @@ int main(int argc, char *argv[])
|
||||||
|
add_uuid(optarg);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
- discard = 1;
|
||||||
|
+ discard |= SWAP_FLAG_DISCARD;
|
||||||
|
+ if (optarg) {
|
||||||
|
+ if (*optarg == '=')
|
||||||
|
+ optarg++;
|
||||||
|
+
|
||||||
|
+ if (strcmp(optarg, "once") == 0)
|
||||||
|
+ discard |= SWAP_FLAG_DISCARD_ONCE;
|
||||||
|
+ else if (strcmp(optarg, "pages") == 0)
|
||||||
|
+ discard |= SWAP_FLAG_DISCARD_PAGES;
|
||||||
|
+ else
|
||||||
|
+ errx(EXIT_FAILURE, _("unsupported discard policy: %s"), optarg);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
case 'e': /* ifexists */
|
||||||
|
ifexists = 1;
|
|
@ -0,0 +1,35 @@
|
||||||
|
From ab0e0fa7a45bccf8304edcb2a904f30a4f3a48b1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rik van Riel <riel@redhat.com>
|
||||||
|
Date: Fri, 6 Dec 2013 16:07:54 -0500
|
||||||
|
Subject: [PATCH] taskset: fix PERMISSIONS section of taskset man page
|
||||||
|
|
||||||
|
A user is always allowed to change the CPU affinity of his or her
|
||||||
|
own processes. CAP_SYS_NICE is only required to change the affinity
|
||||||
|
of another user's process.
|
||||||
|
|
||||||
|
Signed-off-by: Rik van Riel <riel@redhat.com>
|
||||||
|
Reported-by: Joe Mario <jmario@redhat.com>
|
||||||
|
---
|
||||||
|
schedutils/taskset.1 | 5 +++--
|
||||||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/schedutils/taskset.1 b/schedutils/taskset.1
|
||||||
|
index ade202b..fb5738c 100644
|
||||||
|
--- a/schedutils/taskset.1
|
||||||
|
+++ b/schedutils/taskset.1
|
||||||
|
@@ -102,10 +102,11 @@ Or set it:
|
||||||
|
.B taskset \-p
|
||||||
|
.I mask pid
|
||||||
|
.SH PERMISSIONS
|
||||||
|
+A user can change the CPU affinity of a process belonging to the same user.
|
||||||
|
A user must possess
|
||||||
|
.B CAP_SYS_NICE
|
||||||
|
-to change the CPU affinity of a process. Any user can retrieve the affinity
|
||||||
|
-mask.
|
||||||
|
+to change the CPU affinity of a process belonging to another user.
|
||||||
|
+A user can retrieve the affinity mask of any process.
|
||||||
|
.SH AUTHOR
|
||||||
|
Written by Robert M. Love.
|
||||||
|
.SH COPYRIGHT
|
||||||
|
--
|
||||||
|
1.8.4.2
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/uuidd.service.in.kzak util-linux-2.23.2/misc-utils/uuidd.service.in
|
||||||
|
--- util-linux-2.23.2/misc-utils/uuidd.service.in.kzak 2013-02-27 17:46:29.903020913 +0100
|
||||||
|
+++ util-linux-2.23.2/misc-utils/uuidd.service.in 2015-04-20 11:31:44.614013049 +0200
|
||||||
|
@@ -3,7 +3,7 @@ Description=Daemon for generating UUIDs
|
||||||
|
Requires=uuidd.socket
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
-ExecStart=@usrsbin_execdir@/uuidd --socket-activation --timeout 60
|
||||||
|
+ExecStart=@usrsbin_execdir@/uuidd --socket-activation
|
||||||
|
Restart=no
|
||||||
|
User=uuidd
|
||||||
|
Group=uuidd
|
|
@ -0,0 +1,140 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/wipefs.8.kzak util-linux-2.23.2/misc-utils/wipefs.8
|
||||||
|
--- util-linux-2.23.2/misc-utils/wipefs.8.kzak 2013-07-30 10:39:26.232738496 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/wipefs.8 2014-01-23 11:07:54.390022299 +0100
|
||||||
|
@@ -23,6 +23,9 @@ does not erase the filesystem itself nor
|
||||||
|
When used without options \fB-a\fR or \fB-o\fR, it lists all visible filesystems
|
||||||
|
and the offsets of their basic signatures.
|
||||||
|
|
||||||
|
+.B wipefs
|
||||||
|
+calls BLKRRPART ioctl when erase partition table to inform kernel about the change.
|
||||||
|
+
|
||||||
|
Note that some filesystems or some partition tables store more magic strings on
|
||||||
|
the devices. The
|
||||||
|
.B wipefs
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/wipefs.c.kzak util-linux-2.23.2/misc-utils/wipefs.c
|
||||||
|
--- util-linux-2.23.2/misc-utils/wipefs.c.kzak 2013-07-30 10:39:26.232738496 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/wipefs.c 2014-01-23 11:12:26.786860550 +0100
|
||||||
|
@@ -40,21 +40,24 @@
|
||||||
|
#include "c.h"
|
||||||
|
#include "closestream.h"
|
||||||
|
#include "optutils.h"
|
||||||
|
+#include "blkdev.h"
|
||||||
|
|
||||||
|
struct wipe_desc {
|
||||||
|
loff_t offset; /* magic string offset */
|
||||||
|
size_t len; /* length of magic string */
|
||||||
|
unsigned char *magic; /* magic string */
|
||||||
|
|
||||||
|
- int zap; /* zap this offset? */
|
||||||
|
char *usage; /* raid, filesystem, ... */
|
||||||
|
char *type; /* FS type */
|
||||||
|
char *label; /* FS label */
|
||||||
|
char *uuid; /* FS uuid */
|
||||||
|
|
||||||
|
- int on_disk;
|
||||||
|
-
|
||||||
|
struct wipe_desc *next;
|
||||||
|
+
|
||||||
|
+ unsigned int zap : 1,
|
||||||
|
+ on_disk : 1,
|
||||||
|
+ is_parttable : 1;
|
||||||
|
+
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
@@ -72,7 +75,7 @@ print_pretty(struct wipe_desc *wp, int l
|
||||||
|
printf("----------------------------------------------------------------\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
- printf("0x%-17jx %s [%s]", wp->offset, wp->type, wp->usage);
|
||||||
|
+ printf("0x%-17jx %s [%s]", wp->offset, wp->type, _(wp->usage));
|
||||||
|
|
||||||
|
if (wp->label && *wp->label)
|
||||||
|
printf("\n%27s %s", "LABEL:", wp->label);
|
||||||
|
@@ -141,7 +144,7 @@ add_offset(struct wipe_desc *wp0, loff_t
|
||||||
|
wp = xcalloc(1, sizeof(struct wipe_desc));
|
||||||
|
wp->offset = offset;
|
||||||
|
wp->next = wp0;
|
||||||
|
- wp->zap = zap;
|
||||||
|
+ wp->zap = zap ? 1 : 0;
|
||||||
|
return wp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -164,7 +167,7 @@ get_desc_for_probe(struct wipe_desc *wp,
|
||||||
|
const char *off, *type, *mag, *p, *usage = NULL;
|
||||||
|
size_t len;
|
||||||
|
loff_t offset;
|
||||||
|
- int rc;
|
||||||
|
+ int rc, ispt = 0;
|
||||||
|
|
||||||
|
/* superblocks */
|
||||||
|
if (blkid_probe_lookup_value(pr, "TYPE", &type, NULL) == 0) {
|
||||||
|
@@ -181,7 +184,8 @@ get_desc_for_probe(struct wipe_desc *wp,
|
||||||
|
rc = blkid_probe_lookup_value(pr, "PTMAGIC", &mag, &len);
|
||||||
|
if (rc)
|
||||||
|
return wp;
|
||||||
|
- usage = "partition table";
|
||||||
|
+ usage = N_("partition table");
|
||||||
|
+ ispt = 1;
|
||||||
|
} else
|
||||||
|
return wp;
|
||||||
|
|
||||||
|
@@ -199,6 +203,7 @@ get_desc_for_probe(struct wipe_desc *wp,
|
||||||
|
|
||||||
|
wp->type = xstrdup(type);
|
||||||
|
wp->on_disk = 1;
|
||||||
|
+ wp->is_parttable = ispt ? 1 : 0;
|
||||||
|
|
||||||
|
wp->magic = xmalloc(len);
|
||||||
|
memcpy(wp->magic, mag, len);
|
||||||
|
@@ -309,10 +314,25 @@ static void do_wipe_real(blkid_probe pr,
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+static void rereadpt(int fd, const char *devname)
|
||||||
|
+{
|
||||||
|
+#ifdef BLKRRPART
|
||||||
|
+ struct stat st;
|
||||||
|
+
|
||||||
|
+ if (fstat(fd, &st) || !S_ISBLK(st.st_mode))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ errno = 0;
|
||||||
|
+ ioctl(fd, BLKRRPART);
|
||||||
|
+ printf(_("%s: calling ioclt to re-read partition table: %m\n"), devname);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct wipe_desc *
|
||||||
|
do_wipe(struct wipe_desc *wp, const char *devname, int noact, int all, int quiet, int force)
|
||||||
|
{
|
||||||
|
- int flags;
|
||||||
|
+ int flags, reread = 0;
|
||||||
|
blkid_probe pr;
|
||||||
|
struct wipe_desc *w, *wp0;
|
||||||
|
int zap = all ? 1 : wp->zap;
|
||||||
|
@@ -345,8 +365,11 @@ do_wipe(struct wipe_desc *wp, const char
|
||||||
|
if (!wp->on_disk)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (zap)
|
||||||
|
+ if (zap) {
|
||||||
|
do_wipe_real(pr, devname, wp, noact, quiet);
|
||||||
|
+ if (wp->is_parttable)
|
||||||
|
+ reread = 1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (w = wp0; w != NULL; w = w->next) {
|
||||||
|
@@ -355,6 +378,10 @@ do_wipe(struct wipe_desc *wp, const char
|
||||||
|
}
|
||||||
|
|
||||||
|
fsync(blkid_probe_get_fd(pr));
|
||||||
|
+
|
||||||
|
+ if (reread)
|
||||||
|
+ rereadpt(blkid_probe_get_fd(pr), devname);
|
||||||
|
+
|
||||||
|
close(blkid_probe_get_fd(pr));
|
||||||
|
blkid_free_probe(pr);
|
||||||
|
free_wipe(wp0);
|
|
@ -0,0 +1,53 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/wipefs.8.kzak util-linux-2.23.2/misc-utils/wipefs.8
|
||||||
|
--- util-linux-2.23.2/misc-utils/wipefs.8.kzak 2014-09-24 10:41:31.061930168 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/wipefs.8 2014-09-24 10:46:30.142783728 +0200
|
||||||
|
@@ -37,6 +37,11 @@ table will still be visible by another m
|
||||||
|
When used with option \fB-a\fR, all magic strings that are visible for libblkid are
|
||||||
|
erased.
|
||||||
|
|
||||||
|
+Note that by default
|
||||||
|
+.B wipefs
|
||||||
|
+does not erase nested partition tables on non-whole disk devices. The option
|
||||||
|
+\-\-force is required.
|
||||||
|
+
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-a , " \-\-all"
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/wipefs.c.kzak util-linux-2.23.2/misc-utils/wipefs.c
|
||||||
|
--- util-linux-2.23.2/misc-utils/wipefs.c.kzak 2014-09-24 10:41:31.061930168 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/wipefs.c 2014-09-24 10:50:07.728859738 +0200
|
||||||
|
@@ -332,7 +332,7 @@ static void rereadpt(int fd, const char
|
||||||
|
static struct wipe_desc *
|
||||||
|
do_wipe(struct wipe_desc *wp, const char *devname, int noact, int all, int quiet, int force)
|
||||||
|
{
|
||||||
|
- int flags, reread = 0;
|
||||||
|
+ int flags, reread = 0, need_force = 0;
|
||||||
|
blkid_probe pr;
|
||||||
|
struct wipe_desc *w, *wp0;
|
||||||
|
int zap = all ? 1 : wp->zap;
|
||||||
|
@@ -365,6 +365,15 @@ do_wipe(struct wipe_desc *wp, const char
|
||||||
|
if (!wp->on_disk)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
+ if (!force
|
||||||
|
+ && wp->is_parttable
|
||||||
|
+ && !blkid_probe_is_wholedisk(pr)) {
|
||||||
|
+ warnx(_("%s: ignore nested \"%s\" partition "
|
||||||
|
+ "table on non-whole disk device."), devname, wp->type);
|
||||||
|
+ need_force = 1;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (zap) {
|
||||||
|
do_wipe_real(pr, devname, wp, noact, quiet);
|
||||||
|
if (wp->is_parttable)
|
||||||
|
@@ -377,6 +386,9 @@ do_wipe(struct wipe_desc *wp, const char
|
||||||
|
warnx(_("%s: offset 0x%jx not found"), devname, w->offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (need_force)
|
||||||
|
+ warnx(_("Use the --force option to force erase."));
|
||||||
|
+
|
||||||
|
fsync(blkid_probe_get_fd(pr));
|
||||||
|
|
||||||
|
if (reread)
|
|
@ -0,0 +1,259 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/blkdiscard.8.kzak util-linux-2.23.2/sys-utils/blkdiscard.8
|
||||||
|
--- util-linux-2.23.2/sys-utils/blkdiscard.8.kzak 2013-06-13 09:46:10.532651579 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/blkdiscard.8 2014-10-27 10:03:13.650011708 +0100
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
.\" -*- nroff -*-
|
||||||
|
-.TH BLKDISCARD 8 "October 2012" "util-linux" "System Administration"
|
||||||
|
+.TH BLKDISCARD 8 "July 2014" "util-linux" "System Administration"
|
||||||
|
.SH NAME
|
||||||
|
blkdiscard \- discard sectors on a device
|
||||||
|
.SH SYNOPSIS
|
||||||
|
@@ -15,7 +15,7 @@ blkdiscard \- discard sectors on a devic
|
||||||
|
.B blkdiscard
|
||||||
|
is used to discard device sectors. This is useful for solid-state
|
||||||
|
drivers (SSDs) and thinly-provisioned storage. Unlike
|
||||||
|
-.BR fstrim (8)
|
||||||
|
+.BR fstrim (8) ,
|
||||||
|
this command is used directly on the block device.
|
||||||
|
.PP
|
||||||
|
By default,
|
||||||
|
@@ -33,32 +33,44 @@ The
|
||||||
|
.I offset
|
||||||
|
and
|
||||||
|
.I length
|
||||||
|
-arguments may be followed by the multiplicative suffixes KiB=1024,
|
||||||
|
-MiB=1024*1024, and so on for GiB, TiB, PiB, EiB, ZiB and YiB (the "iB" is
|
||||||
|
+arguments may be followed by the multiplicative suffixes KiB (=1024),
|
||||||
|
+MiB (=1024*1024), and so on for GiB, TiB, PiB, EiB, ZiB and YiB (the "iB" is
|
||||||
|
optional, e.g., "K" has the same meaning as "KiB") or the suffixes
|
||||||
|
-KB=1000, MB=1000*1000, and so on for GB, TB, PB, EB, ZB and YB.
|
||||||
|
-.IP "\fB\-h, \-\-help\fP"
|
||||||
|
-Print help and exit.
|
||||||
|
-.IP "\fB\-o, \-\-offset\fP \fIoffset\fP"
|
||||||
|
-Byte offset in the device from which to discard. Provided value will be
|
||||||
|
-aligned to the device sector size. Default value is zero.
|
||||||
|
-.IP "\fB\-l, \-\-length\fP \fIlength\fP"
|
||||||
|
-Number of bytes after starting point to discard. Provided value will be
|
||||||
|
-aligned to the device sector size. If the specified value extends past
|
||||||
|
+KB (=1000), MB (=1000*1000), and so on for GB, TB, PB, EB, ZB and YB.
|
||||||
|
+.TP
|
||||||
|
+.BR \-o , " \-\-offset \fIoffset"
|
||||||
|
+Byte offset into the device from which to start discarding. The provided value
|
||||||
|
+will be aligned to the device sector size. The default value is zero.
|
||||||
|
+.TP
|
||||||
|
+.BR \-l , " \-\-length \fIlength"
|
||||||
|
+The number of bytes to discard (counting from the starting point). The provided value
|
||||||
|
+will be aligned to the device sector size. If the specified value extends past
|
||||||
|
the end of the device,
|
||||||
|
.B blkdiscard
|
||||||
|
-will stop at the device size boundary. Default value extends to the end
|
||||||
|
+will stop at the device size boundary. The default value extends to the end
|
||||||
|
of the device.
|
||||||
|
-.IP "\fB\-s, \-\-secure\fP"
|
||||||
|
-Perform secure discard. Secure discard is the same as regular discard
|
||||||
|
-except all copies of the discarded blocks possibly created by garbage
|
||||||
|
-collection must also be erased. It has to be supported by the device.
|
||||||
|
-.IP "\fB\-v, \-\-verbose\fP"
|
||||||
|
-Print aligned
|
||||||
|
+.TP
|
||||||
|
+.BR \-p , " \-\-step \fIlength"
|
||||||
|
+The number of bytes to discard within one iteration. The default is to discard
|
||||||
|
+all by one ioctl call.
|
||||||
|
+.TP
|
||||||
|
+.BR \-s , " \-\-secure"
|
||||||
|
+Perform a secure discard. A secure discard is the same as a regular discard
|
||||||
|
+except that all copies of the discarded blocks that were possibly created by
|
||||||
|
+garbage collection must also be erased. This requires support from the device.
|
||||||
|
+.TP
|
||||||
|
+.BR \-v , " \-\-verbose"
|
||||||
|
+Display the aligned values of
|
||||||
|
.I offset
|
||||||
|
and
|
||||||
|
-.I length
|
||||||
|
-arguments.
|
||||||
|
+.IR length .
|
||||||
|
+If the option \fB\-\-step\fR specified than it prints discard progress every second.
|
||||||
|
+.TP
|
||||||
|
+.BR \-V , " \-\-version"
|
||||||
|
+Display version information and exit.
|
||||||
|
+.TP
|
||||||
|
+.BR \-h , " \-\-help"
|
||||||
|
+Display help text and exit.
|
||||||
|
.SH AUTHOR
|
||||||
|
.MT lczerner@redhat.com
|
||||||
|
Lukas Czerner
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/blkdiscard.c.kzak util-linux-2.23.2/sys-utils/blkdiscard.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/blkdiscard.c.kzak 2013-07-30 10:39:26.337739534 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/blkdiscard.c 2014-10-27 10:03:20.981088614 +0100
|
||||||
|
@@ -31,9 +31,11 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
+#include <time.h>
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
+#include <sys/time.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
#include "nls.h"
|
||||||
|
@@ -49,6 +51,10 @@
|
||||||
|
#define BLKSECDISCARD _IO(0x12,125)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#define print_stats(path, stats) \
|
||||||
|
+ printf(_("%s: Discarded %" PRIu64 " bytes from the " \
|
||||||
|
+ "offset %" PRIu64"\n"), path, stats[1], stats[0]);
|
||||||
|
+
|
||||||
|
static void __attribute__((__noreturn__)) usage(FILE *out)
|
||||||
|
{
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
@@ -57,6 +63,7 @@ static void __attribute__((__noreturn__)
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
fputs(_(" -o, --offset <num> offset in bytes to discard from\n"
|
||||||
|
" -l, --length <num> length of bytes to discard from the offset\n"
|
||||||
|
+ " -p, --step <num> size of the discard iterations within the offset\n"
|
||||||
|
" -s, --secure perform secure discard\n"
|
||||||
|
" -v, --verbose print aligned length and offset\n"),
|
||||||
|
out);
|
||||||
|
@@ -70,15 +77,17 @@ static void __attribute__((__noreturn__)
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char *path;
|
||||||
|
- int c, fd, verbose = 0, secure = 0;
|
||||||
|
- uint64_t end, blksize, secsize, range[2];
|
||||||
|
+ int c, fd, verbose = 0, secure = 0, secsize;
|
||||||
|
+ uint64_t end, blksize, step, range[2], stats[2];
|
||||||
|
struct stat sb;
|
||||||
|
+ struct timespec now, last;
|
||||||
|
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
{ "help", 0, 0, 'h' },
|
||||||
|
{ "version", 0, 0, 'V' },
|
||||||
|
{ "offset", 1, 0, 'o' },
|
||||||
|
{ "length", 1, 0, 'l' },
|
||||||
|
+ { "step", 1, 0, 'p' },
|
||||||
|
{ "secure", 0, 0, 's' },
|
||||||
|
{ "verbose", 0, 0, 'v' },
|
||||||
|
{ NULL, 0, 0, 0 }
|
||||||
|
@@ -91,8 +100,9 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
|
range[0] = 0;
|
||||||
|
range[1] = ULLONG_MAX;
|
||||||
|
+ step = 0;
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "hVsvo:l:", longopts, NULL)) != -1) {
|
||||||
|
+ while ((c = getopt_long(argc, argv, "hVsvo:l:p:", longopts, NULL)) != -1) {
|
||||||
|
switch(c) {
|
||||||
|
case 'h':
|
||||||
|
usage(stdout);
|
||||||
|
@@ -108,6 +118,10 @@ int main(int argc, char **argv)
|
||||||
|
range[0] = strtosize_or_err(optarg,
|
||||||
|
_("failed to parse offset"));
|
||||||
|
break;
|
||||||
|
+ case 'p':
|
||||||
|
+ step = strtosize_or_err(optarg,
|
||||||
|
+ _("failed to parse step"));
|
||||||
|
+ break;
|
||||||
|
case 's':
|
||||||
|
secure = 1;
|
||||||
|
break;
|
||||||
|
@@ -121,7 +135,7 @@ int main(int argc, char **argv)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind == argc)
|
||||||
|
- errx(EXIT_FAILURE, _("no device specified."));
|
||||||
|
+ errx(EXIT_FAILURE, _("no device specified"));
|
||||||
|
|
||||||
|
path = argv[optind++];
|
||||||
|
|
||||||
|
@@ -130,43 +144,69 @@ int main(int argc, char **argv)
|
||||||
|
usage(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (stat(path, &sb) == -1)
|
||||||
|
- err(EXIT_FAILURE, _("stat failed %s"), path);
|
||||||
|
- if (!S_ISBLK(sb.st_mode))
|
||||||
|
- errx(EXIT_FAILURE, _("%s: not a block device"), path);
|
||||||
|
-
|
||||||
|
fd = open(path, O_WRONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
err(EXIT_FAILURE, _("cannot open %s"), path);
|
||||||
|
|
||||||
|
+ if (fstat(fd, &sb) == -1)
|
||||||
|
+ err(EXIT_FAILURE, _("stat failed %s"), path);
|
||||||
|
+ if (!S_ISBLK(sb.st_mode))
|
||||||
|
+ errx(EXIT_FAILURE, _("%s: not a block device"), path);
|
||||||
|
+
|
||||||
|
if (ioctl(fd, BLKGETSIZE64, &blksize))
|
||||||
|
err(EXIT_FAILURE, _("%s: BLKGETSIZE64 ioctl failed"), path);
|
||||||
|
-
|
||||||
|
if (ioctl(fd, BLKSSZGET, &secsize))
|
||||||
|
err(EXIT_FAILURE, _("%s: BLKSSZGET ioctl failed"), path);
|
||||||
|
|
||||||
|
- /* align range to the sector size */
|
||||||
|
- range[0] = (range[0] + secsize - 1) & ~(secsize - 1);
|
||||||
|
- range[1] &= ~(secsize - 1);
|
||||||
|
+ /* check offset alignment to the sector size */
|
||||||
|
+ if (range[0] % secsize)
|
||||||
|
+ errx(EXIT_FAILURE, _("%s: offset %" PRIu64 " is not aligned "
|
||||||
|
+ "to sector size %i"), path, range[0], secsize);
|
||||||
|
|
||||||
|
/* is the range end behind the end of the device ?*/
|
||||||
|
+ if (range[0] > blksize)
|
||||||
|
+ errx(EXIT_FAILURE, _("%s: offset is greater than device size"), path);
|
||||||
|
end = range[0] + range[1];
|
||||||
|
if (end < range[0] || end > blksize)
|
||||||
|
- range[1] = blksize - range[0];
|
||||||
|
+ end = blksize;
|
||||||
|
+
|
||||||
|
+ range[1] = (step > 0) ? step : end - range[0];
|
||||||
|
+
|
||||||
|
+ /* check length alignment to the sector size */
|
||||||
|
+ if (range[1] % secsize)
|
||||||
|
+ errx(EXIT_FAILURE, _("%s: length %" PRIu64 " is not aligned "
|
||||||
|
+ "to sector size %i"), path, range[1], secsize);
|
||||||
|
+
|
||||||
|
+ stats[0] = range[0], stats[1] = 0;
|
||||||
|
+ clock_gettime(CLOCK_MONOTONIC, &last);
|
||||||
|
+
|
||||||
|
+ for (range[0] = range[0]; range[0] < end; range[0] += range[1]) {
|
||||||
|
+ if (range[0] + range[1] > end)
|
||||||
|
+ range[1] = end - range[0];
|
||||||
|
+
|
||||||
|
+ if (secure) {
|
||||||
|
+ if (ioctl(fd, BLKSECDISCARD, &range))
|
||||||
|
+ err(EXIT_FAILURE, _("%s: BLKSECDISCARD ioctl failed"), path);
|
||||||
|
+ } else {
|
||||||
|
+ if (ioctl(fd, BLKDISCARD, &range))
|
||||||
|
+ err(EXIT_FAILURE, _("%s: BLKDISCARD ioctl failed"), path);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* reporting progress */
|
||||||
|
+ if (verbose && step) {
|
||||||
|
+ clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
|
+ if (last.tv_sec < now.tv_sec) {
|
||||||
|
+ print_stats(path, stats);
|
||||||
|
+ stats[0] = range[0], stats[1] = 0;
|
||||||
|
+ last = now;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (secure) {
|
||||||
|
- if (ioctl(fd, BLKSECDISCARD, &range))
|
||||||
|
- err(EXIT_FAILURE, _("%s: BLKSECDISCARD ioctl failed"), path);
|
||||||
|
- } else {
|
||||||
|
- if (ioctl(fd, BLKDISCARD, &range))
|
||||||
|
- err(EXIT_FAILURE, _("%s: BLKDISCARD ioctl failed"), path);
|
||||||
|
+ stats[1] += range[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
- /* TRANSLATORS: The standard value here is a very large number. */
|
||||||
|
- printf(_("%s: Discarded %" PRIu64 " bytes from the "
|
||||||
|
- "offset %" PRIu64"\n"), path,
|
||||||
|
- (uint64_t) range[1], (uint64_t) range[0]);
|
||||||
|
+ print_stats(path, stats);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return EXIT_SUCCESS;
|
|
@ -0,0 +1,113 @@
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/dos.c.kzak util-linux-2.23.2/libblkid/src/partitions/dos.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/dos.c.kzak 2015-08-21 10:16:45.244332027 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/dos.c 2015-08-21 10:22:07.181340367 +0200
|
||||||
|
@@ -151,16 +151,6 @@ static int probe_dos_pt(blkid_probe pr,
|
||||||
|
if (memcmp(data, BLKID_AIX_MAGIC_STRING, BLKID_AIX_MAGIC_STRLEN) == 0)
|
||||||
|
goto nothing;
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Now that the 55aa signature is present, this is probably
|
||||||
|
- * either the boot sector of a FAT filesystem or a DOS-type
|
||||||
|
- * partition table.
|
||||||
|
- */
|
||||||
|
- if (blkid_probe_is_vfat(pr) == 1) {
|
||||||
|
- DBG(LOWPROBE, blkid_debug("probably FAT -- ignore"));
|
||||||
|
- goto nothing;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
p0 = (struct dos_partition *) (data + BLKID_MSDOS_PT_OFFSET);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -182,6 +172,16 @@ static int probe_dos_pt(blkid_probe pr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Now that the 55aa signature is present, this is probably
|
||||||
|
+ * either the boot sector of a FAT filesystem or a DOS-type
|
||||||
|
+ * partition table.
|
||||||
|
+ */
|
||||||
|
+ if (blkid_probe_is_vfat(pr) == 1) {
|
||||||
|
+ DBG(LOWPROBE, blkid_debug("probably FAT -- ignore"));
|
||||||
|
+ goto nothing;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
blkid_probe_use_wiper(pr, BLKID_MSDOS_PT_OFFSET,
|
||||||
|
512 - BLKID_MSDOS_PT_OFFSET);
|
||||||
|
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/partitions/dos.h.kzak util-linux-2.23.2/libblkid/src/partitions/dos.h
|
||||||
|
--- util-linux-2.23.2/libblkid/src/partitions/dos.h.kzak 2015-08-21 10:34:14.919380422 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/partitions/dos.h 2015-08-21 10:35:45.221807669 +0200
|
||||||
|
@@ -12,6 +12,12 @@ struct dos_partition {
|
||||||
|
|
||||||
|
#define BLKID_MSDOS_PT_OFFSET 0x1be
|
||||||
|
|
||||||
|
+static inline struct dos_partition *mbr_get_partition(unsigned char *mbr, int i)
|
||||||
|
+{
|
||||||
|
+ return (struct dos_partition *)
|
||||||
|
+ (mbr + BLKID_MSDOS_PT_OFFSET + (i * sizeof(struct dos_partition)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* assemble badly aligned little endian integer */
|
||||||
|
static inline unsigned int assemble4le(const unsigned char *p)
|
||||||
|
{
|
||||||
|
diff -up util-linux-2.23.2/libblkid/src/superblocks/vfat.c.kzak util-linux-2.23.2/libblkid/src/superblocks/vfat.c
|
||||||
|
--- util-linux-2.23.2/libblkid/src/superblocks/vfat.c.kzak 2015-08-21 10:10:12.111906711 +0200
|
||||||
|
+++ util-linux-2.23.2/libblkid/src/superblocks/vfat.c 2015-08-21 10:35:07.733045452 +0200
|
||||||
|
@@ -16,6 +16,7 @@
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
+#include "partitions/dos.h"
|
||||||
|
#include "superblocks.h"
|
||||||
|
|
||||||
|
/* Yucky misaligned values */
|
||||||
|
@@ -169,7 +170,8 @@ static unsigned char *search_fat_label(b
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int fat_valid_superblock(const struct blkid_idmag *mag,
|
||||||
|
+static int fat_valid_superblock(blkid_probe pr,
|
||||||
|
+ const struct blkid_idmag *mag,
|
||||||
|
struct msdos_super_block *ms,
|
||||||
|
struct vfat_super_block *vs,
|
||||||
|
uint32_t *cluster_count, uint32_t *fat_size)
|
||||||
|
@@ -243,6 +245,20 @@ static int fat_valid_superblock(const st
|
||||||
|
if (cluster_count)
|
||||||
|
*cluster_count = __cluster_count;
|
||||||
|
|
||||||
|
+ if (blkid_probe_is_wholedisk(pr)) {
|
||||||
|
+ /* OK, seems like FAT, but it's possible that we found boot
|
||||||
|
+ * sector with crazy FAT-like stuff (magic strings, media,
|
||||||
|
+ * etc..) before MBR. Let's make sure that there is no MBR with
|
||||||
|
+ * usable partition. */
|
||||||
|
+ unsigned char *buf = (unsigned char *) ms;
|
||||||
|
+ if (is_valid_mbr_signature(buf)) {
|
||||||
|
+ struct dos_partition *p0 = mbr_get_partition(buf, 0);
|
||||||
|
+ if (dos_partition_size(p0) != 0 &&
|
||||||
|
+ (p0->boot_ind == 0 || p0->boot_ind == 0x80))
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return 1; /* valid */
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -270,7 +286,7 @@ int blkid_probe_is_vfat(blkid_probe pr)
|
||||||
|
if (!vs)
|
||||||
|
return errno ? -errno : 0;
|
||||||
|
|
||||||
|
- return fat_valid_superblock(mag, ms, vs, NULL, NULL);
|
||||||
|
+ return fat_valid_superblock(pr, mag, ms, vs, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FAT label extraction from the root directory taken from Kay
|
||||||
|
@@ -293,7 +309,7 @@ static int probe_vfat(blkid_probe pr, co
|
||||||
|
if (!vs)
|
||||||
|
return errno ? -errno : 1;
|
||||||
|
|
||||||
|
- if (!fat_valid_superblock(mag, ms, vs, &cluster_count, &fat_size))
|
||||||
|
+ if (!fat_valid_superblock(pr, mag, ms, vs, &cluster_count, &fat_size))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sector_size = unaligned_le16(&ms->ms_sector_size);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,72 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/logger.1.kzak util-linux-2.23.2/misc-utils/logger.1
|
||||||
|
--- util-linux-2.23.2/misc-utils/logger.1.kzak 2015-06-24 12:18:23.938735038 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/logger.1 2015-06-24 12:18:33.154667053 +0200
|
||||||
|
@@ -125,28 +125,49 @@ flag is not provided, standard input is
|
||||||
|
The
|
||||||
|
.B logger
|
||||||
|
utility exits 0 on success, and >0 if an error occurs.
|
||||||
|
-.PP
|
||||||
|
+.SH FACILITIES AND LEVELS
|
||||||
|
Valid facility names are:
|
||||||
|
-.IR auth , \ authpriv
|
||||||
|
-(for security information of a sensitive nature),
|
||||||
|
-.IR cron , \ daemon , \ ftp , \ kern
|
||||||
|
-(can't be generated from user process),
|
||||||
|
-.IR lpr , \ mail , \ news , \ security
|
||||||
|
-(deprecated synonym for
|
||||||
|
-.IR auth ), \ syslog , \ user , \ uucp ,
|
||||||
|
-and
|
||||||
|
-.IR local0 \ to \ local7 ,
|
||||||
|
-inclusive.
|
||||||
|
+.IP
|
||||||
|
+.TS
|
||||||
|
+tab(:);
|
||||||
|
+left l l.
|
||||||
|
+\fBauth
|
||||||
|
+\fBauthpriv\fR:for security information of a sensitive nature
|
||||||
|
+\fBcron
|
||||||
|
+\fBdaemon
|
||||||
|
+\fBftp
|
||||||
|
+\fBkern\fR:cannot be generated from userspace process, automatically converted to \fBuser
|
||||||
|
+\fBlpr
|
||||||
|
+\fBmail
|
||||||
|
+\fBnews
|
||||||
|
+\fBsyslog
|
||||||
|
+\fBuser
|
||||||
|
+\fBuucp
|
||||||
|
+\fBlocal0
|
||||||
|
+ to:
|
||||||
|
+\fBlocal7
|
||||||
|
+\fBsecurity\fR:deprecated synonym for \fBauth
|
||||||
|
+.TE
|
||||||
|
.PP
|
||||||
|
Valid level names are:
|
||||||
|
-.IR alert , \ crit , \ debug , \ emerg , \ err , \ error
|
||||||
|
-(deprecated synonym for
|
||||||
|
-.IR err ), \ info , \ notice , \ panic
|
||||||
|
-(deprecated synonym for
|
||||||
|
-.IR emerg ), \ warning , \ warn
|
||||||
|
-(deprecated synonym for
|
||||||
|
-.IR warning ).
|
||||||
|
-For the priority order and intended purposes of these levels, see
|
||||||
|
+.IP
|
||||||
|
+.TS
|
||||||
|
+tab(:);
|
||||||
|
+left l l.
|
||||||
|
+\fBemerg
|
||||||
|
+\fBalert
|
||||||
|
+\fBcrit
|
||||||
|
+\fBerr
|
||||||
|
+\fBwarning
|
||||||
|
+\fBnotice
|
||||||
|
+\fBinfo
|
||||||
|
+\fBdebug
|
||||||
|
+\fBpanic\fR:deprecated synonym for \fBemerg
|
||||||
|
+\fBerror\fR:deprecated synonym for \fBerr
|
||||||
|
+\fBwarn\fR:deprecated synonym for \fBwarning
|
||||||
|
+.TE
|
||||||
|
+.PP
|
||||||
|
+For the priority order and intended purposes of these facilities and levels, see
|
||||||
|
.BR syslog (3).
|
||||||
|
.SH EXAMPLES
|
||||||
|
logger System rebooted
|
|
@ -0,0 +1,39 @@
|
||||||
|
diff -up util-linux-2.23.2/login-utils/login.c.kzak util-linux-2.23.2/login-utils/login.c
|
||||||
|
--- util-linux-2.23.2/login-utils/login.c.kzak 2015-06-24 11:03:45.123285155 +0200
|
||||||
|
+++ util-linux-2.23.2/login-utils/login.c 2015-06-24 11:46:19.168114438 +0200
|
||||||
|
@@ -495,6 +495,7 @@ static void log_audit(struct login_conte
|
||||||
|
|
||||||
|
static void log_lastlog(struct login_context *cxt)
|
||||||
|
{
|
||||||
|
+ struct sigaction sa, oldsa_xfsz;
|
||||||
|
struct lastlog ll;
|
||||||
|
time_t t;
|
||||||
|
int fd;
|
||||||
|
@@ -502,9 +503,14 @@ static void log_lastlog(struct login_con
|
||||||
|
if (!cxt->pwd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ /* lastlog is huge on systems with large UIDs, ignore SIGXFSZ */
|
||||||
|
+ memset(&sa, 0, sizeof(sa));
|
||||||
|
+ sa.sa_handler = SIG_IGN;
|
||||||
|
+ sigaction(SIGXFSZ, &sa, &oldsa_xfsz);
|
||||||
|
+
|
||||||
|
fd = open(_PATH_LASTLOG, O_RDWR | O_CREAT, 0);
|
||||||
|
if (fd < 0)
|
||||||
|
- return;
|
||||||
|
+ goto done;
|
||||||
|
|
||||||
|
if (lseek(fd, (off_t) cxt->pwd->pw_uid * sizeof(ll), SEEK_SET) == -1)
|
||||||
|
goto done;
|
||||||
|
@@ -542,7 +548,10 @@ static void log_lastlog(struct login_con
|
||||||
|
if (write_all(fd, (char *)&ll, sizeof(ll)))
|
||||||
|
warn(_("write lastlog failed"));
|
||||||
|
done:
|
||||||
|
- close(fd);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ close(fd);
|
||||||
|
+
|
||||||
|
+ sigaction(SIGXFSZ, &oldsa_xfsz, NULL); /* restore original setting */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
|
@ -0,0 +1,63 @@
|
||||||
|
diff -up util-linux-2.23.2/misc-utils/lsblk.c.kzak util-linux-2.23.2/misc-utils/lsblk.c
|
||||||
|
--- util-linux-2.23.2/misc-utils/lsblk.c.kzak 2015-06-25 11:01:10.543344225 +0200
|
||||||
|
+++ util-linux-2.23.2/misc-utils/lsblk.c 2015-06-25 11:14:17.085404974 +0200
|
||||||
|
@@ -953,11 +953,13 @@ static void set_tt_data(struct blkdev_cx
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void print_device(struct blkdev_cxt *cxt, struct tt_line *tt_parent)
|
||||||
|
+static void fill_table_line(struct blkdev_cxt *cxt, struct tt_line *tt_parent)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
cxt->tt_line = tt_add_line(lsblk->tt, tt_parent);
|
||||||
|
+ if (!cxt->tt_line)
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
for (i = 0; i < ncolumns; i++)
|
||||||
|
set_tt_data(cxt, i, get_column_id(i), cxt->tt_line);
|
||||||
|
@@ -1084,7 +1086,7 @@ static int list_partitions(struct blkdev
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
wholedisk_cxt->parent = &part_cxt;
|
||||||
|
- print_device(&part_cxt, parent_cxt ? parent_cxt->tt_line : NULL);
|
||||||
|
+ fill_table_line(&part_cxt, parent_cxt ? parent_cxt->tt_line : NULL);
|
||||||
|
if (!lsblk->nodeps)
|
||||||
|
process_blkdev(wholedisk_cxt, &part_cxt, 0, NULL);
|
||||||
|
} else {
|
||||||
|
@@ -1098,7 +1100,7 @@ static int list_partitions(struct blkdev
|
||||||
|
|
||||||
|
/* Print whole disk only once */
|
||||||
|
if (r)
|
||||||
|
- print_device(wholedisk_cxt, parent_cxt ? parent_cxt->tt_line : NULL);
|
||||||
|
+ fill_table_line(wholedisk_cxt, parent_cxt ? parent_cxt->tt_line : NULL);
|
||||||
|
if (ps == 0 && !lsblk->nodeps)
|
||||||
|
process_blkdev(&part_cxt, wholedisk_cxt, 0, NULL);
|
||||||
|
}
|
||||||
|
@@ -1171,9 +1173,11 @@ static int list_deps(struct blkdev_cxt *
|
||||||
|
process_blkdev(&dep, cxt, 1, d->d_name);
|
||||||
|
}
|
||||||
|
/* The dependency is a whole device. */
|
||||||
|
- else if (!set_cxt(&dep, cxt, NULL, d->d_name))
|
||||||
|
- process_blkdev(&dep, cxt, 1, NULL);
|
||||||
|
-
|
||||||
|
+ else if (!set_cxt(&dep, cxt, NULL, d->d_name)) {
|
||||||
|
+ /* For inverse tree we don't want to show partitions
|
||||||
|
+ * if the dependence is pn whle-disk */
|
||||||
|
+ process_blkdev(&dep, cxt, lsblk->inverse ? 0 : 1, NULL);
|
||||||
|
+ }
|
||||||
|
reset_blkdev_cxt(&dep);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
@@ -1185,9 +1189,10 @@ static int process_blkdev(struct blkdev_
|
||||||
|
int do_partitions, const char *part_name)
|
||||||
|
{
|
||||||
|
if (do_partitions && cxt->npartitions)
|
||||||
|
- return list_partitions(cxt, parent, part_name);
|
||||||
|
+ list_partitions(cxt, parent, part_name); /* partitoins + whole-disk */
|
||||||
|
+ else
|
||||||
|
+ fill_table_line(cxt, parent ? parent->tt_line : NULL); /* whole-disk only */
|
||||||
|
|
||||||
|
- print_device(cxt, parent ? parent->tt_line : NULL);
|
||||||
|
return list_deps(cxt);
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,11 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/mount.8.kzak util-linux-2.23.2/sys-utils/mount.8
|
||||||
|
--- util-linux-2.23.2/sys-utils/mount.8.kzak 2014-09-25 11:03:25.492822164 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/mount.8 2014-09-25 11:04:00.102152375 +0200
|
||||||
|
@@ -451,7 +451,7 @@ has to be a mountpoint.
|
||||||
|
|
||||||
|
Note that moving a mount residing under a shared mount is invalid and
|
||||||
|
unsupported. Use
|
||||||
|
-.B findmnt -o TARGET,PROPAGATION /dir
|
||||||
|
+.B findmnt -o TARGET,PROPAGATION
|
||||||
|
to see the current propagation flags.
|
||||||
|
.RE
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -up util-linux-2.23.2/disk-utils/raw.c.kzak util-linux-2.23.2/disk-utils/raw.c
|
||||||
|
--- util-linux-2.23.2/disk-utils/raw.c.kzak 2013-06-13 09:46:10.382650297 +0200
|
||||||
|
+++ util-linux-2.23.2/disk-utils/raw.c 2015-01-13 14:51:24.877755962 +0100
|
||||||
|
@@ -220,7 +220,7 @@ static int query(int minor_raw, const ch
|
||||||
|
if (raw_name) {
|
||||||
|
struct stat statbuf;
|
||||||
|
|
||||||
|
- if (!stat(raw_name, &statbuf))
|
||||||
|
+ if (stat(raw_name, &statbuf) != 0)
|
||||||
|
err(EXIT_RAW_ACCESS,
|
||||||
|
_("Cannot locate raw device '%s'"), raw_name);
|
||||||
|
if (!S_ISCHR(statbuf.st_mode))
|
|
@ -0,0 +1,17 @@
|
||||||
|
diff -up util-linux-2.23.2/login-utils/su-common.c.kzak util-linux-2.23.2/login-utils/su-common.c
|
||||||
|
--- util-linux-2.23.2/login-utils/su-common.c.kzak 2015-06-24 11:14:25.102395082 +0200
|
||||||
|
+++ util-linux-2.23.2/login-utils/su-common.c 2015-06-24 11:22:20.472859684 +0200
|
||||||
|
@@ -359,10 +359,9 @@ create_watching_parent (void)
|
||||||
|
if (pid != (pid_t)-1)
|
||||||
|
if (WIFSIGNALED (status))
|
||||||
|
{
|
||||||
|
- status = WTERMSIG (status) + 128;
|
||||||
|
- if (WCOREDUMP (status))
|
||||||
|
- fprintf (stderr, _("%s (core dumped)\n"),
|
||||||
|
- strsignal (WTERMSIG (status)));
|
||||||
|
+ fprintf (stderr, "%s%s\n", strsignal (WTERMSIG (status)),
|
||||||
|
+ WCOREDUMP (status) ? _(" (core dumped)") : "");
|
||||||
|
+ status = WTERMSIG (status) + 128;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
status = WEXITSTATUS (status);
|
|
@ -0,0 +1,757 @@
|
||||||
|
diff -up util-linux-2.23.2/include/pathnames.h.kzak util-linux-2.23.2/include/pathnames.h
|
||||||
|
--- util-linux-2.23.2/include/pathnames.h.kzak 2015-06-26 10:00:19.111877564 +0200
|
||||||
|
+++ util-linux-2.23.2/include/pathnames.h 2015-06-26 10:00:51.623630869 +0200
|
||||||
|
@@ -85,6 +85,10 @@
|
||||||
|
#define _PATH_PROC_LOCKS "/proc/locks"
|
||||||
|
#define _PATH_PROC_CDROMINFO "/proc/sys/dev/cdrom/info"
|
||||||
|
|
||||||
|
+#define _PATH_PROC_UIDMAP "/proc/self/uid_map"
|
||||||
|
+#define _PATH_PROC_GIDMAP "/proc/self/gid_map"
|
||||||
|
+#define _PATH_PROC_SETGROUPS "/proc/self/setgroups"
|
||||||
|
+
|
||||||
|
#define _PATH_PROC_ATTR_CURRENT "/proc/self/attr/current"
|
||||||
|
#define _PATH_PROC_ATTR_EXEC "/proc/self/attr/exec"
|
||||||
|
#define _PATH_PROC_CAPLASTCAP "/proc/sys/kernel/cap_last_cap"
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/Makemodule.am.kzak util-linux-2.23.2/sys-utils/Makemodule.am
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.1.kzak util-linux-2.23.2/sys-utils/nsenter.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.1.kzak 2015-06-26 09:58:39.468633643 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.1 2015-06-26 09:58:51.672541041 +0200
|
||||||
|
@@ -1,44 +1,45 @@
|
||||||
|
-.TH NSENTER 1 "January 2013" "util-linux" "User Commands"
|
||||||
|
+.TH NSENTER 1 "June 2013" "util-linux" "User Commands"
|
||||||
|
.SH NAME
|
||||||
|
nsenter \- run program with namespaces of other processes
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B nsenter
|
||||||
|
-.RI [ options ]
|
||||||
|
-.RI [ program ]
|
||||||
|
-.RI [ arguments ]
|
||||||
|
+[options]
|
||||||
|
+.RI [ program
|
||||||
|
+.RI [ arguments ]]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
Enters the namespaces of one or more other processes and then executes the specified
|
||||||
|
program. Enterable namespaces are:
|
||||||
|
.TP
|
||||||
|
.B mount namespace
|
||||||
|
-mounting and unmounting filesystems will not affect rest of the system
|
||||||
|
+Mounting and unmounting filesystems will not affect the rest of the system
|
||||||
|
.RB ( CLONE_\:NEWNS
|
||||||
|
-flag), except for filesystems which are explicitly marked as shared (by mount
|
||||||
|
---make-\:shared). See /proc\:/self\:/mountinfo for the shared flag.
|
||||||
|
+flag), except for filesystems which are explicitly marked as shared (with
|
||||||
|
+\fBmount --make-\:shared\fP; see \fI/proc\:/self\:/mountinfo\fP for the
|
||||||
|
+\fBshared\fP flag).
|
||||||
|
.TP
|
||||||
|
.B UTS namespace
|
||||||
|
-setting hostname, domainname will not affect rest of the system
|
||||||
|
+Setting hostname or domainname will not affect the rest of the system.
|
||||||
|
.RB ( CLONE_\:NEWUTS
|
||||||
|
-flag).
|
||||||
|
+flag)
|
||||||
|
.TP
|
||||||
|
.B IPC namespace
|
||||||
|
-process will have independent namespace for System V message queues, semaphore
|
||||||
|
-sets and shared memory segments
|
||||||
|
+The process will have an independent namespace for System V message queues,
|
||||||
|
+semaphore sets and shared memory segments.
|
||||||
|
.RB ( CLONE_\:NEWIPC
|
||||||
|
-flag).
|
||||||
|
+flag)
|
||||||
|
.TP
|
||||||
|
.B network namespace
|
||||||
|
-process will have independent IPv4 and IPv6 stacks, IP routing tables, firewall
|
||||||
|
-rules, the
|
||||||
|
+The process will have independent IPv4 and IPv6 stacks, IP routing tables,
|
||||||
|
+firewall rules, the
|
||||||
|
.I /proc\:/net
|
||||||
|
and
|
||||||
|
.I /sys\:/class\:/net
|
||||||
|
-directory trees, sockets etc.
|
||||||
|
+directory trees, sockets, etc.
|
||||||
|
.RB ( CLONE_\:NEWNET
|
||||||
|
-flag).
|
||||||
|
+flag)
|
||||||
|
.TP
|
||||||
|
.B PID namespace
|
||||||
|
-children will have a set of PID to process mappings separate from the
|
||||||
|
+Children will have a set of PID to process mappings separate from the
|
||||||
|
.B nsenter
|
||||||
|
process
|
||||||
|
.RB ( CLONE_\:NEWPID
|
||||||
|
@@ -46,18 +47,18 @@ flag).
|
||||||
|
.B nsenter
|
||||||
|
will fork by default if changing the PID namespace, so that the new program
|
||||||
|
and its children share the same PID namespace and are visible to each other.
|
||||||
|
-If \-\-no\-fork is used, the new program will be exec'ed without forking.
|
||||||
|
-.PP
|
||||||
|
-See the
|
||||||
|
-.BR clone (2)
|
||||||
|
-for exact semantics of the flags.
|
||||||
|
+If \fB\-\-no\-fork\fP is used, the new program will be exec'ed without forking.
|
||||||
|
.TP
|
||||||
|
-If program is not given, run ``${SHELL}'' (default: /bin\:/sh).
|
||||||
|
+.B user namespace
|
||||||
|
+The process will have a distinct set of UIDs, GIDs and capabilities.
|
||||||
|
+.RB ( CLONE_\:NEWUSER
|
||||||
|
+flag)
|
||||||
|
+.TP
|
||||||
|
+See \fBclone\fP(2) for the exact semantics of the flags.
|
||||||
|
+.TP
|
||||||
|
+If \fIprogram\fP is not given, then ``${SHELL}'' is run (default: /bin\:/sh).
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
-Argument with square brakets, such as [\fIfile\fR], means optional argument.
|
||||||
|
-Command line syntax to specify optional argument \-\-mount=/path\:/to\:/file.
|
||||||
|
-Please notice the equals sign.
|
||||||
|
.TP
|
||||||
|
\fB\-t\fR, \fB\-\-target\fR \fIpid\fP
|
||||||
|
Specify a target process to get contexts from. The paths to the contexts
|
||||||
|
@@ -83,6 +84,9 @@ the network namespace
|
||||||
|
/proc/\fIpid\fR/ns/pid
|
||||||
|
the PID namespace
|
||||||
|
.TP
|
||||||
|
+/proc/\fIpid\fR/ns/user
|
||||||
|
+the user namespace
|
||||||
|
+.TP
|
||||||
|
/proc/\fIpid\fR/root
|
||||||
|
the root directory
|
||||||
|
.TP
|
||||||
|
@@ -91,51 +95,71 @@ the working directory respectively
|
||||||
|
.PD
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
-\fB\-m\fR, \fB\-\-mount\fR [\fIfile\fR]
|
||||||
|
-Enter the mount namespace. If no file is specified enter the mount namespace
|
||||||
|
-of the target process. If file is specified enter the mount namespace
|
||||||
|
+\fB\-m\fR, \fB\-\-mount\fR[=\fIfile\fR]
|
||||||
|
+Enter the mount namespace. If no file is specified, enter the mount namespace
|
||||||
|
+of the target process. If file is specified, enter the mount namespace
|
||||||
|
specified by file.
|
||||||
|
.TP
|
||||||
|
-\fB\-u\fR, \fB\-\-uts\fR [\fIfile\fR]
|
||||||
|
-Enter the UTS namespace. If no file is specified enter the UTS namespace of
|
||||||
|
-the target process. If file is specified enter the UTS namespace specified by
|
||||||
|
+\fB\-u\fR, \fB\-\-uts\fR[=\fIfile\fR]
|
||||||
|
+Enter the UTS namespace. If no file is specified, enter the UTS namespace of
|
||||||
|
+the target process. If file is specified, enter the UTS namespace specified by
|
||||||
|
file.
|
||||||
|
.TP
|
||||||
|
-\fB\-i\fR, \fB\-\-ipc\fR [\fIfile\fR]
|
||||||
|
-Enter the IPC namespace. If no file is specified enter the IPC namespace of
|
||||||
|
-the target process. If file is specified enter the IPC namespace specified by
|
||||||
|
+\fB\-i\fR, \fB\-\-ipc\fR[=\fIfile\fR]
|
||||||
|
+Enter the IPC namespace. If no file is specified, enter the IPC namespace of
|
||||||
|
+the target process. If file is specified, enter the IPC namespace specified by
|
||||||
|
file.
|
||||||
|
.TP
|
||||||
|
-\fB\-n\fR, \fB\-\-net\fR [\fIfile\fR]
|
||||||
|
-Enter the network namespace. If no file is specified enter the network
|
||||||
|
-namespace of the target process. If file is specified enter the network
|
||||||
|
+\fB\-n\fR, \fB\-\-net\fR[=\fIfile\fR]
|
||||||
|
+Enter the network namespace. If no file is specified, enter the network
|
||||||
|
+namespace of the target process. If file is specified, enter the network
|
||||||
|
namespace specified by file.
|
||||||
|
.TP
|
||||||
|
-\fB\-p\fR, \fB\-\-pid\fR [\fIfile\fR]
|
||||||
|
-Enter the PID namespace. If no file is specified enter the PID namespace of
|
||||||
|
-the target process. If file is specified enter the PID namespace specified by
|
||||||
|
+\fB\-p\fR, \fB\-\-pid\fR[=\fIfile\fR]
|
||||||
|
+Enter the PID namespace. If no file is specified, enter the PID namespace of
|
||||||
|
+the target process. If file is specified, enter the PID namespace specified by
|
||||||
|
file.
|
||||||
|
.TP
|
||||||
|
-\fB\-r\fR, \fB\-\-root\fR [\fIdirectory\fR]
|
||||||
|
-Set the root directory. If no directory is specified set the root directory to
|
||||||
|
-the root directory of the target process. If directory is specified set the
|
||||||
|
+\fB\-U\fR, \fB\-\-user\fR[=\fIfile\fR]
|
||||||
|
+Enter the user namespace. If no file is specified, enter the user namespace of
|
||||||
|
+the target process. If file is specified, enter the user namespace specified by
|
||||||
|
+file. See also the \fB\-\-setuid\fR and \fB\-\-setgid\fR options.
|
||||||
|
+.TP
|
||||||
|
+\fB\-G\fR, \fB\-\-setgid\fR \fIgid\fR
|
||||||
|
+Set the group ID which will be used in the entered namespace and drop
|
||||||
|
+supplementary groups.
|
||||||
|
+.BR nsenter (1)
|
||||||
|
+always sets GID for user namespaces, the default is 0.
|
||||||
|
+.TP
|
||||||
|
+\fB\-S\fR, \fB\-\-setuid\fR \fIuid\fR
|
||||||
|
+Set the user ID which will be used in the entered namespace.
|
||||||
|
+.BR nsenter (1)
|
||||||
|
+always sets UID for user namespaces, the default is 0.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-preserve\-credentials\fR
|
||||||
|
+Don't modify UID and GID when enter user namespace. The default is to
|
||||||
|
+drops supplementary groups and sets GID and UID to 0.
|
||||||
|
+.TP
|
||||||
|
+\fB\-r\fR, \fB\-\-root\fR[=\fIdirectory\fR]
|
||||||
|
+Set the root directory. If no directory is specified, set the root directory to
|
||||||
|
+the root directory of the target process. If directory is specified, set the
|
||||||
|
root directory to the specified directory.
|
||||||
|
.TP
|
||||||
|
-\fB\-w\fR, \fB\-\-wd\fR [\fIdirectory\fR]
|
||||||
|
-Set the working directory. If no directory is specified set the working
|
||||||
|
+\fB\-w\fR, \fB\-\-wd\fR[=\fIdirectory\fR]
|
||||||
|
+Set the working directory. If no directory is specified, set the working
|
||||||
|
directory to the working directory of the target process. If directory is
|
||||||
|
-specified set the working directory to the specified directory.
|
||||||
|
+specified, set the working directory to the specified directory.
|
||||||
|
.TP
|
||||||
|
-\fB\-F\fR, \fB\-\-no-fork\fR
|
||||||
|
-Do not fork before exec'ing the specified program. By default when entering a
|
||||||
|
-pid namespace enter calls fork before calling exec so that the children will be
|
||||||
|
-in the newly entered pid namespace.
|
||||||
|
+\fB\-F\fR, \fB\-\-no\-fork\fR
|
||||||
|
+Do not fork before exec'ing the specified program. By default, when entering a
|
||||||
|
+PID namespace, \fBnsenter\fP calls \fBfork\fP before calling \fBexec\fP so that
|
||||||
|
+any children will also be in the newly entered PID namespace.
|
||||||
|
.TP
|
||||||
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
|
Display version information and exit.
|
||||||
|
.TP
|
||||||
|
\fB\-h\fR, \fB\-\-help\fR
|
||||||
|
-Print a help message.
|
||||||
|
+Display help text and exit.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR setns (2),
|
||||||
|
.BR clone (2)
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.c.kzak util-linux-2.23.2/sys-utils/nsenter.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.c.kzak 2015-06-26 09:58:39.468633643 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.c 2015-06-26 09:58:51.673541033 +0200
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
+#include <grp.h>
|
||||||
|
|
||||||
|
#include "strutils.h"
|
||||||
|
#include "nls.h"
|
||||||
|
@@ -42,7 +43,12 @@ static struct namespace_file {
|
||||||
|
int fd;
|
||||||
|
} namespace_files[] = {
|
||||||
|
/* Careful the order is significant in this array.
|
||||||
|
+ *
|
||||||
|
+ * The user namespace comes first, so that it is entered
|
||||||
|
+ * first. This gives an unprivileged user the potential to
|
||||||
|
+ * enter the other namespaces.
|
||||||
|
*/
|
||||||
|
+ { .nstype = CLONE_NEWUSER, .name = "ns/user", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWIPC, .name = "ns/ipc", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWUTS, .name = "ns/uts", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWNET, .name = "ns/net", .fd = -1 },
|
||||||
|
@@ -56,18 +62,25 @@ static void usage(int status)
|
||||||
|
FILE *out = status == EXIT_SUCCESS ? stdout : stderr;
|
||||||
|
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
- fprintf(out, _(" %s [options] <program> [args...]\n"),
|
||||||
|
+ fprintf(out, _(" %s [options] <program> [<argument>...]\n"),
|
||||||
|
program_invocation_short_name);
|
||||||
|
|
||||||
|
+ fputs(USAGE_SEPARATOR, out);
|
||||||
|
+ fputs(_("Run a program with namespaces of other processes.\n"), out);
|
||||||
|
+
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
fputs(_(" -t, --target <pid> target process to get namespaces from\n"), out);
|
||||||
|
- fputs(_(" -m, --mount [=<file>] enter mount namespace\n"), out);
|
||||||
|
- fputs(_(" -u, --uts [=<file>] enter UTS namespace (hostname etc)\n"), out);
|
||||||
|
- fputs(_(" -i, --ipc [=<file>] enter System V IPC namespace\n"), out);
|
||||||
|
- fputs(_(" -n, --net [=<file>] enter network namespace\n"), out);
|
||||||
|
- fputs(_(" -p, --pid [=<file>] enter pid namespace\n"), out);
|
||||||
|
- fputs(_(" -r, --root [=<dir>] set the root directory\n"), out);
|
||||||
|
- fputs(_(" -w, --wd [=<dir>] set the working directory\n"), out);
|
||||||
|
+ fputs(_(" -m, --mount[=<file>] enter mount namespace\n"), out);
|
||||||
|
+ fputs(_(" -u, --uts[=<file>] enter UTS namespace (hostname etc)\n"), out);
|
||||||
|
+ fputs(_(" -i, --ipc[=<file>] enter System V IPC namespace\n"), out);
|
||||||
|
+ fputs(_(" -n, --net[=<file>] enter network namespace\n"), out);
|
||||||
|
+ fputs(_(" -p, --pid[=<file>] enter pid namespace\n"), out);
|
||||||
|
+ fputs(_(" -U, --user[=<file>] enter user namespace\n"), out);
|
||||||
|
+ fputs(_(" -S, --setuid <uid> set uid in entered namespace\n"), out);
|
||||||
|
+ fputs(_(" -G, --setgid <gid> set gid in entered namespace\n"), out);
|
||||||
|
+ fputs(_(" --preserve-credentials do not touch uids or gids\n"), out);
|
||||||
|
+ fputs(_(" -r, --root[=<dir>] set the root directory\n"), out);
|
||||||
|
+ fputs(_(" -w, --wd[=<dir>] set the working directory\n"), out);
|
||||||
|
fputs(_(" -F, --no-fork do not fork before exec'ing <program>\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
@@ -153,6 +166,9 @@ static void continue_as_child(void)
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
+ enum {
|
||||||
|
+ OPT_PRESERVE_CRED = CHAR_MAX + 1
|
||||||
|
+ };
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
{ "version", no_argument, NULL, 'V'},
|
||||||
|
@@ -162,24 +178,30 @@ int main(int argc, char *argv[])
|
||||||
|
{ "ipc", optional_argument, NULL, 'i' },
|
||||||
|
{ "net", optional_argument, NULL, 'n' },
|
||||||
|
{ "pid", optional_argument, NULL, 'p' },
|
||||||
|
+ { "user", optional_argument, NULL, 'U' },
|
||||||
|
+ { "setuid", required_argument, NULL, 'S' },
|
||||||
|
+ { "setgid", required_argument, NULL, 'G' },
|
||||||
|
{ "root", optional_argument, NULL, 'r' },
|
||||||
|
{ "wd", optional_argument, NULL, 'w' },
|
||||||
|
{ "no-fork", no_argument, NULL, 'F' },
|
||||||
|
+ { "preserve-credentials", no_argument, NULL, OPT_PRESERVE_CRED },
|
||||||
|
{ NULL, 0, NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct namespace_file *nsfile;
|
||||||
|
- int c, namespaces = 0;
|
||||||
|
- bool do_rd = false, do_wd = false;
|
||||||
|
+ int c, namespaces = 0, setgroups_nerrs = 0, preserve_cred = 0;
|
||||||
|
+ bool do_rd = false, do_wd = false, force_uid = false, force_gid = false;
|
||||||
|
int do_fork = -1; /* unknown yet */
|
||||||
|
+ uid_t uid = 0;
|
||||||
|
+ gid_t gid = 0;
|
||||||
|
|
||||||
|
- setlocale(LC_MESSAGES, "");
|
||||||
|
+ setlocale(LC_ALL, "");
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
atexit(close_stdout);
|
||||||
|
|
||||||
|
while ((c =
|
||||||
|
- getopt_long(argc, argv, "hVt:m::u::i::n::p::r::w::F",
|
||||||
|
+ getopt_long(argc, argv, "+hVt:m::u::i::n::p::U::S:G:r::w::F",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'h':
|
||||||
|
@@ -221,6 +243,20 @@ int main(int argc, char *argv[])
|
||||||
|
else
|
||||||
|
namespaces |= CLONE_NEWPID;
|
||||||
|
break;
|
||||||
|
+ case 'U':
|
||||||
|
+ if (optarg)
|
||||||
|
+ open_namespace_fd(CLONE_NEWUSER, optarg);
|
||||||
|
+ else
|
||||||
|
+ namespaces |= CLONE_NEWUSER;
|
||||||
|
+ break;
|
||||||
|
+ case 'S':
|
||||||
|
+ uid = strtoul_or_err(optarg, _("failed to parse uid"));
|
||||||
|
+ force_uid = true;
|
||||||
|
+ break;
|
||||||
|
+ case 'G':
|
||||||
|
+ gid = strtoul_or_err(optarg, _("failed to parse gid"));
|
||||||
|
+ force_gid = true;
|
||||||
|
+ break;
|
||||||
|
case 'F':
|
||||||
|
do_fork = 0;
|
||||||
|
break;
|
||||||
|
@@ -236,6 +272,9 @@ int main(int argc, char *argv[])
|
||||||
|
else
|
||||||
|
do_wd = true;
|
||||||
|
break;
|
||||||
|
+ case OPT_PRESERVE_CRED:
|
||||||
|
+ preserve_cred = 1;
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
@@ -253,6 +292,26 @@ int main(int argc, char *argv[])
|
||||||
|
open_target_fd(&wd_fd, "cwd", NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * Update namespaces variable to contain all requested namespaces
|
||||||
|
+ */
|
||||||
|
+ for (nsfile = namespace_files; nsfile->nstype; nsfile++) {
|
||||||
|
+ if (nsfile->fd < 0)
|
||||||
|
+ continue;
|
||||||
|
+ namespaces |= nsfile->nstype;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* for user namespaces we always set UID and GID (default is 0)
|
||||||
|
+ * and clear root's groups if --preserve-credentials is no specified */
|
||||||
|
+ if ((namespaces & CLONE_NEWUSER) && !preserve_cred) {
|
||||||
|
+ force_uid = true, force_gid = true;
|
||||||
|
+
|
||||||
|
+ /* We call setgroups() before and after we enter user namespace,
|
||||||
|
+ * let's complain only if both fail */
|
||||||
|
+ if (setgroups(0, NULL) != 0)
|
||||||
|
+ setgroups_nerrs++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
* Now that we know which namespaces we want to enter, enter them.
|
||||||
|
*/
|
||||||
|
for (nsfile = namespace_files; nsfile->nstype; nsfile++) {
|
||||||
|
@@ -302,6 +361,15 @@ int main(int argc, char *argv[])
|
||||||
|
if (do_fork == 1)
|
||||||
|
continue_as_child();
|
||||||
|
|
||||||
|
+ if (force_uid || force_gid) {
|
||||||
|
+ if (force_gid && setgroups(0, NULL) != 0 && setgroups_nerrs) /* drop supplementary groups */
|
||||||
|
+ err(EXIT_FAILURE, _("setgroups failed"));
|
||||||
|
+ if (force_gid && setgid(gid) < 0) /* change GID */
|
||||||
|
+ err(EXIT_FAILURE, _("setgid failed"));
|
||||||
|
+ if (force_uid && setuid(uid) < 0) /* change UID */
|
||||||
|
+ err(EXIT_FAILURE, _("setuid failed"));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (optind < argc) {
|
||||||
|
execvp(argv[optind], argv + optind);
|
||||||
|
err(EXIT_FAILURE, _("failed to execute %s"), argv[optind]);
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.1.kzak util-linux-2.23.2/sys-utils/unshare.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.1.kzak 2015-06-26 09:58:39.484633521 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.1 2015-06-26 09:58:51.673541033 +0200
|
||||||
|
@@ -1,28 +1,27 @@
|
||||||
|
-.\" Process this file with
|
||||||
|
-.\" groff -man -Tascii lscpu.1
|
||||||
|
-.\"
|
||||||
|
-.TH UNSHARE 1 "July 2013" "util-linux" "User Commands"
|
||||||
|
+.TH UNSHARE 1 "July 2014" "util-linux" "User Commands"
|
||||||
|
.SH NAME
|
||||||
|
unshare \- run program with some namespaces unshared from parent
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B unshare
|
||||||
|
-.RI [ options ]
|
||||||
|
+[options]
|
||||||
|
.I program
|
||||||
|
.RI [ arguments ]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
Unshares the indicated namespaces from the parent process and then executes
|
||||||
|
-the specified program. The namespaces to be unshared are indicated via
|
||||||
|
+the specified \fIprogram\fR. The namespaces to be unshared are indicated via
|
||||||
|
options. Unshareable namespaces are:
|
||||||
|
.TP
|
||||||
|
.BR "mount namespace"
|
||||||
|
Mounting and unmounting filesystems will not affect the rest of the system
|
||||||
|
(\fBCLONE_NEWNS\fP flag), except for filesystems which are explicitly marked as
|
||||||
|
-shared (with \fBmount --make-shared\fP; see \fI/proc/self/mountinfo\fP for the
|
||||||
|
-\fBshared\fP flags).
|
||||||
|
-
|
||||||
|
-It's recommended to use \fBmount --make-rprivate\fP or \fBmount --make-rslave\fP
|
||||||
|
-after \fBunshare --mount\fP to make sure that mountpoints in the new namespace
|
||||||
|
-are really unshared from parental namespace.
|
||||||
|
+shared (with \fBmount --make-shared\fP; see \fI/proc/self/mountinfo\fP or
|
||||||
|
+\fBfindmnt -o+PROPAGATION\fP for the \fBshared\fP flags).
|
||||||
|
+.sp
|
||||||
|
+.B unshare
|
||||||
|
+automatically sets propagation to \fBprivate\fP
|
||||||
|
+in the new mount namespace to make sure that the new namespace is really
|
||||||
|
+unshared. This feature is possible to disable by option \fB\-\-propagation unchanged\fP.
|
||||||
|
+Note that \fBprivate\fP is the kernel default.
|
||||||
|
.TP
|
||||||
|
.BR "UTS namespace"
|
||||||
|
Setting hostname or domainname will not affect the rest of the system.
|
||||||
|
@@ -40,13 +39,14 @@ sockets, etc. (\fBCLONE_NEWNET\fP flag)
|
||||||
|
.BR "pid namespace"
|
||||||
|
Children will have a distinct set of PID to process mappings from their parent.
|
||||||
|
(\fBCLONE_NEWPID\fP flag)
|
||||||
|
+.TP
|
||||||
|
+.BR "user namespace"
|
||||||
|
+The process will have a distinct set of UIDs, GIDs and capabilities.
|
||||||
|
+(\fBCLONE_NEWUSER\fP flag)
|
||||||
|
.PP
|
||||||
|
See \fBclone\fR(2) for the exact semantics of the flags.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
-.BR \-h , " \-\-help"
|
||||||
|
-Display help text and exit.
|
||||||
|
-.TP
|
||||||
|
.BR \-i , " \-\-ipc"
|
||||||
|
Unshare the IPC namespace.
|
||||||
|
.TP
|
||||||
|
@@ -63,16 +63,68 @@ See also the \fB--fork\fP and \fB--mount
|
||||||
|
.BR \-u , " \-\-uts"
|
||||||
|
Unshare the UTS namespace.
|
||||||
|
.TP
|
||||||
|
+.BR \-U , " \-\-user"
|
||||||
|
+Unshare the user namespace.
|
||||||
|
+.TP
|
||||||
|
.BR \-f , " \-\-fork"
|
||||||
|
Fork the specified \fIprogram\fR as a child process of \fBunshare\fR rather than
|
||||||
|
running it directly. This is useful when creating a new pid namespace.
|
||||||
|
.TP
|
||||||
|
-.BR \-\-mount-proc "[=\fImountpoint\fP]"
|
||||||
|
-Just before running the program, mount the proc filesystem at the \fImountpoint\fP
|
||||||
|
+.BR \-\-mount\-proc "[=\fImountpoint\fP]"
|
||||||
|
+Just before running the program, mount the proc filesystem at \fImountpoint\fP
|
||||||
|
(default is /proc). This is useful when creating a new pid namespace. It also
|
||||||
|
implies creating a new mount namespace since the /proc mount would otherwise
|
||||||
|
-mess up existing programs on the system. The new proc filesystem is explicitly
|
||||||
|
+mess up existing programs on the system. The new proc filesystem is explicitly
|
||||||
|
mounted as private (by MS_PRIVATE|MS_REC).
|
||||||
|
+.TP
|
||||||
|
+.BR \-r , " \-\-map\-root\-user"
|
||||||
|
+Run the program only after the current effective user and group IDs have been mapped to
|
||||||
|
+the superuser UID and GID in the newly created user namespace. This makes it possible to
|
||||||
|
+conveniently gain capabilities needed to manage various aspects of the newly created
|
||||||
|
+namespaces (such as configuring interfaces in the network namespace or mounting filesystems in
|
||||||
|
+the mount namespace) even when run unprivileged. As a mere convenience feature, it does not support
|
||||||
|
+more sophisticated use cases, such as mapping multiple ranges of UIDs and GIDs.
|
||||||
|
+This option implies --setgroups=deny.
|
||||||
|
+.TP
|
||||||
|
+.BR "\-\-propagation \fIprivate|shared|slave|unchanged\fP"
|
||||||
|
+Recursively sets mount propagation flag in the new mount namespace. The default
|
||||||
|
+is to set the propagation to \fIprivate\fP, this feature is possible to disable
|
||||||
|
+by \fIunchanged\fP argument. The options is silently ignored when mount namespace (\fB\-\-mount\fP)
|
||||||
|
+is not requested.
|
||||||
|
+.TP
|
||||||
|
+.BR "\-\-setgroups \fIallow|deny\fP"
|
||||||
|
+Allow or deny
|
||||||
|
+.BR setgroups (2)
|
||||||
|
+syscall in user namespaces.
|
||||||
|
+
|
||||||
|
+.BR setgroups(2)
|
||||||
|
+is only callable with CAP_SETGID and CAP_SETGID in a user
|
||||||
|
+namespace (since Linux 3.19) does not give you permission to call setgroups(2)
|
||||||
|
+until after GID map has been set. The GID map is writable by root when
|
||||||
|
+.BR setgroups(2)
|
||||||
|
+is enabled and GID map becomes writable by unprivileged processes when
|
||||||
|
+.BR setgroups(2)
|
||||||
|
+is permanently disabled.
|
||||||
|
+.TP
|
||||||
|
+.BR \-V , " \-\-version"
|
||||||
|
+Display version information and exit.
|
||||||
|
+.TP
|
||||||
|
+.BR \-h , " \-\-help"
|
||||||
|
+Display help text and exit.
|
||||||
|
+.SH EXAMPLES
|
||||||
|
+.TP
|
||||||
|
+.B # unshare --fork --pid --mount-proc readlink /proc/self
|
||||||
|
+.TQ
|
||||||
|
+1
|
||||||
|
+.br
|
||||||
|
+Establish a PID namespace, ensure we're PID 1 in it against newly mounted
|
||||||
|
+procfs instance.
|
||||||
|
+.TP
|
||||||
|
+.B $ unshare --map-root-user --user sh -c whoami
|
||||||
|
+.TQ
|
||||||
|
+root
|
||||||
|
+.br
|
||||||
|
+Establish a user namespace as an unprivileged user with a root user within it.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR unshare (2),
|
||||||
|
.BR clone (2),
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.c.kzak util-linux-2.23.2/sys-utils/unshare.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.c.kzak 2015-06-26 09:58:39.484633521 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.c 2015-06-26 09:58:51.673541033 +0200
|
||||||
|
@@ -32,19 +32,117 @@
|
||||||
|
|
||||||
|
#include "nls.h"
|
||||||
|
#include "c.h"
|
||||||
|
+#include "closestream.h"
|
||||||
|
#include "namespace.h"
|
||||||
|
#include "exec_shell.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
#include "pathnames.h"
|
||||||
|
+#include "all-io.h"
|
||||||
|
|
||||||
|
+/* 'private' is kernel default */
|
||||||
|
+#define UNSHARE_PROPAGATION_DEFAULT (MS_REC | MS_PRIVATE)
|
||||||
|
+
|
||||||
|
+enum {
|
||||||
|
+ SETGROUPS_NONE = -1,
|
||||||
|
+ SETGROUPS_DENY = 0,
|
||||||
|
+ SETGROUPS_ALLOW = 1,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const char *setgroups_strings[] =
|
||||||
|
+{
|
||||||
|
+ [SETGROUPS_DENY] = "deny",
|
||||||
|
+ [SETGROUPS_ALLOW] = "allow"
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int setgroups_str2id(const char *str)
|
||||||
|
+{
|
||||||
|
+ size_t i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(setgroups_strings); i++)
|
||||||
|
+ if (strcmp(str, setgroups_strings[i]) == 0)
|
||||||
|
+ return i;
|
||||||
|
+
|
||||||
|
+ errx(EXIT_FAILURE, _("unsupported --setgroups argument '%s'"), str);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void setgroups_control(int action)
|
||||||
|
+{
|
||||||
|
+ const char *file = _PATH_PROC_SETGROUPS;
|
||||||
|
+ const char *cmd;
|
||||||
|
+ int fd;
|
||||||
|
+
|
||||||
|
+ if (action < 0 || (size_t) action >= ARRAY_SIZE(setgroups_strings))
|
||||||
|
+ return;
|
||||||
|
+ cmd = setgroups_strings[action];
|
||||||
|
+
|
||||||
|
+ fd = open(file, O_WRONLY);
|
||||||
|
+ if (fd < 0) {
|
||||||
|
+ if (errno == ENOENT)
|
||||||
|
+ return;
|
||||||
|
+ err(EXIT_FAILURE, _("cannot open %s"), file);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (write_all(fd, cmd, strlen(cmd)))
|
||||||
|
+ err(EXIT_FAILURE, _("write failed %s"), file);
|
||||||
|
+ close(fd);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void map_id(const char *file, uint32_t from, uint32_t to)
|
||||||
|
+{
|
||||||
|
+ char *buf;
|
||||||
|
+ int fd;
|
||||||
|
+
|
||||||
|
+ fd = open(file, O_WRONLY);
|
||||||
|
+ if (fd < 0)
|
||||||
|
+ err(EXIT_FAILURE, _("cannot open %s"), file);
|
||||||
|
+
|
||||||
|
+ xasprintf(&buf, "%u %u 1", from, to);
|
||||||
|
+ if (write_all(fd, buf, strlen(buf)))
|
||||||
|
+ err(EXIT_FAILURE, _("write failed %s"), file);
|
||||||
|
+ free(buf);
|
||||||
|
+ close(fd);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static unsigned long parse_propagation(const char *str)
|
||||||
|
+{
|
||||||
|
+ size_t i;
|
||||||
|
+ static const struct prop_opts {
|
||||||
|
+ const char *name;
|
||||||
|
+ unsigned long flag;
|
||||||
|
+ } opts[] = {
|
||||||
|
+ { "slave", MS_REC | MS_SLAVE },
|
||||||
|
+ { "private", MS_REC | MS_PRIVATE },
|
||||||
|
+ { "shared", MS_REC | MS_SHARED },
|
||||||
|
+ { "unchanged", 0 }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(opts); i++) {
|
||||||
|
+ if (strcmp(opts[i].name, str) == 0)
|
||||||
|
+ return opts[i].flag;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ errx(EXIT_FAILURE, _("unsupported propagation mode: %s"), str);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void set_propagation(unsigned long flags)
|
||||||
|
+{
|
||||||
|
+ if (flags == 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (mount("none", "/", NULL, flags, NULL) != 0)
|
||||||
|
+ err(EXIT_FAILURE, _("cannot change root filesystem propagation"));
|
||||||
|
+}
|
||||||
|
|
||||||
|
static void usage(int status)
|
||||||
|
{
|
||||||
|
FILE *out = status == EXIT_SUCCESS ? stdout : stderr;
|
||||||
|
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
- fprintf(out,
|
||||||
|
- _(" %s [options] <program> [args...]\n"), program_invocation_short_name);
|
||||||
|
+ fprintf(out, _(" %s [options] <program> [<argument>...]\n"),
|
||||||
|
+ program_invocation_short_name);
|
||||||
|
+
|
||||||
|
+ fputs(USAGE_SEPARATOR, out);
|
||||||
|
+ fputs(_("Run a program with some namespaces unshared from the parent.\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
fputs(_(" -m, --mount unshare mounts namespace\n"), out);
|
||||||
|
@@ -52,8 +150,13 @@ static void usage(int status)
|
||||||
|
fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
|
||||||
|
fputs(_(" -n, --net unshare network namespace\n"), out);
|
||||||
|
fputs(_(" -p, --pid unshare pid namespace\n"), out);
|
||||||
|
+ fputs(_(" -U, --user unshare user namespace\n"), out);
|
||||||
|
fputs(_(" -f, --fork fork before launching <program>\n"), out);
|
||||||
|
fputs(_(" --mount-proc[=<dir>] mount proc filesystem first (implies --mount)\n"), out);
|
||||||
|
+ fputs(_(" -r, --map-root-user map current user to root (implies --user)\n"), out);
|
||||||
|
+ fputs(_(" --propagation <slave|shared|private|unchanged>\n"
|
||||||
|
+ " modify mount propagation in mount namespace\n"), out);
|
||||||
|
+ fputs(_(" -s, --setgroups allow|deny control the setgroups syscall in user namespaces\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
@@ -66,7 +169,9 @@ static void usage(int status)
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
enum {
|
||||||
|
- OPT_MOUNTPROC = CHAR_MAX + 1
|
||||||
|
+ OPT_MOUNTPROC = CHAR_MAX + 1,
|
||||||
|
+ OPT_PROPAGATION,
|
||||||
|
+ OPT_SETGROUPS
|
||||||
|
};
|
||||||
|
static const struct option longopts[] = {
|
||||||
|
{ "help", no_argument, 0, 'h' },
|
||||||
|
@@ -76,20 +181,29 @@ int main(int argc, char *argv[])
|
||||||
|
{ "ipc", no_argument, 0, 'i' },
|
||||||
|
{ "net", no_argument, 0, 'n' },
|
||||||
|
{ "pid", no_argument, 0, 'p' },
|
||||||
|
+ { "user", no_argument, 0, 'U' },
|
||||||
|
{ "fork", no_argument, 0, 'f' },
|
||||||
|
{ "mount-proc", optional_argument, 0, OPT_MOUNTPROC },
|
||||||
|
+ { "map-root-user", no_argument, 0, 'r' },
|
||||||
|
+ { "propagation", required_argument, 0, OPT_PROPAGATION },
|
||||||
|
+ { "setgroups", required_argument, 0, OPT_SETGROUPS },
|
||||||
|
{ NULL, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
+ int setgrpcmd = SETGROUPS_NONE;
|
||||||
|
int unshare_flags = 0;
|
||||||
|
- int c, forkit = 0;
|
||||||
|
+ int c, forkit = 0, maproot = 0;
|
||||||
|
const char *procmnt = NULL;
|
||||||
|
+ unsigned long propagation = UNSHARE_PROPAGATION_DEFAULT;
|
||||||
|
+ uid_t real_euid = geteuid();
|
||||||
|
+ gid_t real_egid = getegid();;
|
||||||
|
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
+ atexit(close_stdout);
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "+fhVmuinp", longopts, NULL)) != -1) {
|
||||||
|
+ while ((c = getopt_long(argc, argv, "+fhVmuinpUr", longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'f':
|
||||||
|
forkit = 1;
|
||||||
|
@@ -114,10 +228,23 @@ int main(int argc, char *argv[])
|
||||||
|
case 'p':
|
||||||
|
unshare_flags |= CLONE_NEWPID;
|
||||||
|
break;
|
||||||
|
+ case 'U':
|
||||||
|
+ unshare_flags |= CLONE_NEWUSER;
|
||||||
|
+ break;
|
||||||
|
case OPT_MOUNTPROC:
|
||||||
|
unshare_flags |= CLONE_NEWNS;
|
||||||
|
procmnt = optarg ? optarg : "/proc";
|
||||||
|
break;
|
||||||
|
+ case 'r':
|
||||||
|
+ unshare_flags |= CLONE_NEWUSER;
|
||||||
|
+ maproot = 1;
|
||||||
|
+ break;
|
||||||
|
+ case OPT_SETGROUPS:
|
||||||
|
+ setgrpcmd = setgroups_str2id(optarg);
|
||||||
|
+ break;
|
||||||
|
+ case OPT_PROPAGATION:
|
||||||
|
+ propagation = parse_propagation(optarg);
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
@@ -146,6 +273,25 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (maproot) {
|
||||||
|
+ if (setgrpcmd == SETGROUPS_ALLOW)
|
||||||
|
+ errx(EXIT_FAILURE, _("options --setgroups=allow and "
|
||||||
|
+ "--map-root-user are mutually exclusive"));
|
||||||
|
+
|
||||||
|
+ /* since Linux 3.19 unprivileged writing of /proc/self/gid_map
|
||||||
|
+ * has s been disabled unless /proc/self/setgroups is written
|
||||||
|
+ * first to permanently disable the ability to call setgroups
|
||||||
|
+ * in that user namespace. */
|
||||||
|
+ setgroups_control(SETGROUPS_DENY);
|
||||||
|
+ map_id(_PATH_PROC_UIDMAP, 0, real_euid);
|
||||||
|
+ map_id(_PATH_PROC_GIDMAP, 0, real_egid);
|
||||||
|
+
|
||||||
|
+ } else if (setgrpcmd != SETGROUPS_NONE)
|
||||||
|
+ setgroups_control(setgrpcmd);
|
||||||
|
+
|
||||||
|
+ if ((unshare_flags & CLONE_NEWNS) && propagation)
|
||||||
|
+ set_propagation(propagation);
|
||||||
|
+
|
||||||
|
if (procmnt &&
|
||||||
|
(mount("none", procmnt, NULL, MS_PRIVATE|MS_REC, NULL) != 0 ||
|
||||||
|
mount("proc", procmnt, "proc", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) != 0))
|
|
@ -0,0 +1,31 @@
|
||||||
|
From d5b7d2912afceac3774d1aaea9e8486b54d4e9e9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Tue, 13 Oct 2015 12:01:29 +0200
|
||||||
|
Subject: [PATCH] libblkid: make XFS Log visible for wipefs
|
||||||
|
|
||||||
|
Reported-by: Peter Rajnoha <prajnoha@redhat.com>
|
||||||
|
Signed-off-by: root <root@ws.net.home>
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
libblkid/src/superblocks/xfs.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/libblkid/src/superblocks/xfs.c b/libblkid/src/superblocks/xfs.c
|
||||||
|
index a6c04a2..d13c849 100644
|
||||||
|
--- a/libblkid/src/superblocks/xfs.c
|
||||||
|
+++ b/libblkid/src/superblocks/xfs.c
|
||||||
|
@@ -260,6 +260,12 @@ static int probe_xfs_log(blkid_probe pr, const struct blkid_idmag *mag)
|
||||||
|
|
||||||
|
if (xlog_valid_rec_header(rhead)) {
|
||||||
|
blkid_probe_set_uuid_as(pr, rhead->h_uuid, "LOGUUID");
|
||||||
|
+
|
||||||
|
+ if (blkid_probe_set_magic(pr, i * 512,
|
||||||
|
+ sizeof(rhead->h_magicno),
|
||||||
|
+ (unsigned char *) &rhead->h_magicno))
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.4.3
|
|
@ -0,0 +1,209 @@
|
||||||
|
diff -up util-linux-2.23.2/include/pathnames.h.kzak util-linux-2.23.2/include/pathnames.h
|
||||||
|
--- util-linux-2.23.2/include/pathnames.h.kzak 2016-03-16 17:17:02.980243390 +0100
|
||||||
|
+++ util-linux-2.23.2/include/pathnames.h 2016-03-16 17:17:37.129015363 +0100
|
||||||
|
@@ -36,6 +36,7 @@
|
||||||
|
#endif
|
||||||
|
#define _PATH_MOTDFILE "/etc/motd"
|
||||||
|
#define _PATH_NOLOGIN "/etc/nologin"
|
||||||
|
+#define _PATH_VAR_NOLOGIN "/var/run/nologin"
|
||||||
|
|
||||||
|
#define _PATH_LOGIN "/bin/login"
|
||||||
|
#define _PATH_INITTAB "/etc/inittab"
|
||||||
|
diff -up util-linux-2.23.2/login-utils/lslogins.1.kzak util-linux-2.23.2/login-utils/lslogins.1
|
||||||
|
--- util-linux-2.23.2/login-utils/lslogins.1.kzak 2016-03-16 17:17:02.970243457 +0100
|
||||||
|
+++ util-linux-2.23.2/login-utils/lslogins.1 2016-03-16 17:17:37.129015363 +0100
|
||||||
|
@@ -5,7 +5,10 @@
|
||||||
|
lslogins \- display information about known users in the system
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B lslogins
|
||||||
|
-[\fIoptions\fR] [\fB-s\fR|\fB-u\fR[=\fIUID\fR]] [\fB-g \fIgroups\fR] [\fB-l \fIlogins\fR]
|
||||||
|
+[options]
|
||||||
|
+.RB [ \-s | \-u [ =\fIUID ]]
|
||||||
|
+.RB [ \-g " \fIgroups\fR]"
|
||||||
|
+.RB [ \-l " \fIlogins\fR]"
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
Examine the wtmp and btmp logs, /etc/shadow (if necessary) and /etc/passwd
|
||||||
|
@@ -17,7 +20,7 @@ Mandatory arguments to long options are
|
||||||
|
.TP
|
||||||
|
\fB\-a\fR, \fB\-\-acc\-expiration\fR
|
||||||
|
Display data about the date of last password change and the account expiration
|
||||||
|
-date (see \fBshadow\fR(5) for more info). (Requires root priviliges.)
|
||||||
|
+date (see \fBshadow\fR(5) for more info). (Requires root privileges.)
|
||||||
|
.TP
|
||||||
|
\fB\-\-btmp\-file \fIpath\fP
|
||||||
|
Alternate path for btmp.
|
||||||
|
@@ -31,7 +34,7 @@ Output data in the format of NAME=VALUE.
|
||||||
|
\fB\-f\fR, \fB\-\-failed\fR
|
||||||
|
Display data about the users' last failed login attempts.
|
||||||
|
.TP
|
||||||
|
-\fB\-G\fR, \fB\-\-groups\-info\fR
|
||||||
|
+\fB\-G\fR, \fB\-\-supp\-groups\fR
|
||||||
|
Show information about groups.
|
||||||
|
.TP
|
||||||
|
\fB\-g\fR, \fB\-\-groups\fR=\fIgroups\fR
|
||||||
|
@@ -48,9 +51,6 @@ Display data containing information abou
|
||||||
|
Only show data of users with a login specified in \fIlogins\fR (user names or user
|
||||||
|
IDS). More than one login may be specified; the list has to be comma-separated.
|
||||||
|
.TP
|
||||||
|
-\fB\-m\fR, \fB\-\-supp\-groups\fR
|
||||||
|
-Show supplementary groups.
|
||||||
|
-.TP
|
||||||
|
\fB\-n\fR, \fB\-\-newline\fR
|
||||||
|
Display each piece of information on a separate line.
|
||||||
|
.TP
|
||||||
|
@@ -71,21 +71,21 @@ Display information related to login by
|
||||||
|
\fB\-r\fR, \fB\-\-raw\fR
|
||||||
|
Raw output (no columnation).
|
||||||
|
.TP
|
||||||
|
-\fB\-s\fR, \fB\-\-system\-accs\fR[=\fIthreshold\fR]
|
||||||
|
+\fB\-s\fR, \fB\-\-system\-accs\fR
|
||||||
|
Show system accounts. These are by default all accounts with a UID below 1000
|
||||||
|
-(non-inclusive), with the exception of either nobody or nfsnobody (UID 65534). The UID
|
||||||
|
-threshold can also be specified explicitly (necessary for some distributions that
|
||||||
|
-allocate UIDs starting from 100, 500 - or an entirely different value - rather than 1000).
|
||||||
|
+(non-inclusive), with the exception of either nobody or nfsnobody (UID 65534).
|
||||||
|
+This hardcoded default maybe overwritten by parameters SYS_UID_MIN and SYS_UID_MAX in
|
||||||
|
+the file /etc/login.defs.
|
||||||
|
.TP
|
||||||
|
-\fB\-\-time-format\fR \fItype\fP
|
||||||
|
+\fB\-\-time\-format\fR \fItype\fP
|
||||||
|
Display dates in short, full or iso format. The default is short, this time
|
||||||
|
format is designed to be space efficient and human readable.
|
||||||
|
.TP
|
||||||
|
-\fB\-u\fR, \fB\-\-user\-accs\fR[=\fIthreshold\fR]
|
||||||
|
+\fB\-u\fR, \fB\-\-user\-accs\fR
|
||||||
|
Show user accounts. These are by default all accounts with UID above 1000
|
||||||
|
-(inclusive), with the exception of either nobody or nfsnobody (UID 65534). The UID
|
||||||
|
-threshold can also be specified explicitly (necessary for some distributions that
|
||||||
|
-allocate UIDs starting from 100, 500 - or an entirely different value - rather than 1000).
|
||||||
|
+(inclusive), with the exception of either nobody or nfsnobody (UID 65534).
|
||||||
|
+This hardcoded default maybe overwritten by parameters UID_MIN and UID_MAX in
|
||||||
|
+the file /etc/login.defs.
|
||||||
|
.TP
|
||||||
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
|
Display version information and exit.
|
||||||
|
diff -up util-linux-2.23.2/login-utils/lslogins.c.kzak util-linux-2.23.2/login-utils/lslogins.c
|
||||||
|
--- util-linux-2.23.2/login-utils/lslogins.c.kzak 2016-03-16 17:17:02.970243457 +0100
|
||||||
|
+++ util-linux-2.23.2/login-utils/lslogins.c 2016-03-16 17:23:47.191484521 +0100
|
||||||
|
@@ -396,7 +396,7 @@ again:
|
||||||
|
x = snprintf(p, len, "%s,", grp->gr_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (x < 0 || (size_t) x + 1 > len) {
|
||||||
|
+ if (x < 0 || (size_t) x >= len) {
|
||||||
|
size_t cur = p - res;
|
||||||
|
|
||||||
|
maxlen *= 2;
|
||||||
|
@@ -496,21 +496,24 @@ static int parse_btmp(struct lslogins_co
|
||||||
|
static int get_sgroups(gid_t **list, size_t *len, struct passwd *pwd)
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
+ int ngroups = 0;
|
||||||
|
|
||||||
|
*len = 0;
|
||||||
|
*list = NULL;
|
||||||
|
|
||||||
|
/* first let's get a supp. group count */
|
||||||
|
- getgrouplist(pwd->pw_name, pwd->pw_gid, *list, (int *) len);
|
||||||
|
- if (!*len)
|
||||||
|
+ getgrouplist(pwd->pw_name, pwd->pw_gid, *list, &ngroups);
|
||||||
|
+ if (!ngroups)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- *list = xcalloc(1, *len * sizeof(gid_t));
|
||||||
|
+ *list = xcalloc(1, ngroups * sizeof(gid_t));
|
||||||
|
|
||||||
|
/* now for the actual list of GIDs */
|
||||||
|
- if (-1 == getgrouplist(pwd->pw_name, pwd->pw_gid, *list, (int *) len))
|
||||||
|
+ if (-1 == getgrouplist(pwd->pw_name, pwd->pw_gid, *list, &ngroups))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ *len = (size_t) ngroups;
|
||||||
|
+
|
||||||
|
/* getgroups also returns the user's primary GID - dispose of it */
|
||||||
|
while (n < *len) {
|
||||||
|
if ((*list)[n] == pwd->pw_gid)
|
||||||
|
@@ -852,7 +855,7 @@ static int get_user(struct lslogins_cont
|
||||||
|
const char *username)
|
||||||
|
{
|
||||||
|
*user = get_user_info(ctl, username);
|
||||||
|
- if (!*user && errno)
|
||||||
|
+ if (!*user)
|
||||||
|
if (IS_REAL_ERRNO(errno))
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
@@ -1193,16 +1196,18 @@ static void __attribute__((__noreturn__)
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
fprintf(out, _(" %s [options]\n"), program_invocation_short_name);
|
||||||
|
|
||||||
|
+ fputs(USAGE_SEPARATOR, out);
|
||||||
|
+ fputs(_("Display information about known users in the system.\n"), out);
|
||||||
|
+
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
fputs(_(" -a, --acc-expiration display info about passwords expiration\n"), out);
|
||||||
|
fputs(_(" -c, --colon-separate display data in a format similar to /etc/passwd\n"), out);
|
||||||
|
fputs(_(" -e, --export display in an export-able output format\n"), out);
|
||||||
|
fputs(_(" -f, --failed display data about the users' last failed logins\n"), out);
|
||||||
|
- fputs(_(" -G, --groups-info display information about groups\n"), out);
|
||||||
|
+ fputs(_(" -G, --supp-groups display information about groups\n"), out);
|
||||||
|
fputs(_(" -g, --groups=<groups> display users belonging to a group in <groups>\n"), out);
|
||||||
|
fputs(_(" -L, --last show info about the users' last login sessions\n"), out);
|
||||||
|
fputs(_(" -l, --logins=<logins> display only users from <logins>\n"), out);
|
||||||
|
- fputs(_(" -m, --supp-groups display supplementary groups as well\n"), out);
|
||||||
|
fputs(_(" -n, --newline display each piece of information on a new line\n"), out);
|
||||||
|
fputs(_(" --noheadings don't print headings\n"), out);
|
||||||
|
fputs(_(" --notruncate don't truncate output\n"), out);
|
||||||
|
@@ -1226,7 +1231,7 @@ static void __attribute__((__noreturn__)
|
||||||
|
fprintf(out, " %14s %s\n", coldescs[i].name,
|
||||||
|
_(coldescs[i].help));
|
||||||
|
|
||||||
|
- fprintf(out, _("\nFor more details see lslogins(1).\n"));
|
||||||
|
+ fprintf(out, USAGE_MAN_TAIL("lslogins(1)"));
|
||||||
|
|
||||||
|
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
@@ -1241,8 +1246,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
/* long only options. */
|
||||||
|
enum {
|
||||||
|
- OPT_VER = CHAR_MAX + 1,
|
||||||
|
- OPT_WTMP,
|
||||||
|
+ OPT_WTMP = CHAR_MAX + 1,
|
||||||
|
OPT_BTMP,
|
||||||
|
OPT_NOTRUNC,
|
||||||
|
OPT_NOHEAD,
|
||||||
|
@@ -1300,7 +1304,7 @@ int main(int argc, char *argv[])
|
||||||
|
add_column(columns, ncolumns++, COL_UID);
|
||||||
|
add_column(columns, ncolumns++, COL_USER);
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "acfGg:hLl:no:prsuVxzZ",
|
||||||
|
+ while ((c = getopt_long(argc, argv, "acefGg:hLl:no:prsuVzZ",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
|
||||||
|
err_exclusive_options(c, longopts, excl, excl_st);
|
||||||
|
@@ -1397,6 +1401,7 @@ int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
+ ctl->time_mode = TIME_INVALID;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(timefmts); i++) {
|
||||||
|
if (strcmp(timefmts[i].name, optarg) == 0) {
|
||||||
|
ctl->time_mode = timefmts[i].val;
|
||||||
|
@@ -1404,7 +1409,7 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ctl->time_mode == TIME_INVALID)
|
||||||
|
- usage(stderr);
|
||||||
|
+ errx(EXIT_FAILURE, _("unknown time format: %s"), optarg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
@@ -1433,7 +1438,7 @@ int main(int argc, char *argv[])
|
||||||
|
logins = argv[optind];
|
||||||
|
outmode = OUT_PRETTY;
|
||||||
|
} else if (argc != optind)
|
||||||
|
- usage(stderr);
|
||||||
|
+ errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));
|
||||||
|
|
||||||
|
scols_init_debug(0);
|
|
@ -0,0 +1,459 @@
|
||||||
|
diff -up util-linux-2.23.2/include/pathnames.h.kzak util-linux-2.23.2/include/pathnames.h
|
||||||
|
--- util-linux-2.23.2/include/pathnames.h.kzak 2016-03-16 15:17:42.648298525 +0100
|
||||||
|
+++ util-linux-2.23.2/include/pathnames.h 2016-03-16 15:18:13.769055345 +0100
|
||||||
|
@@ -36,6 +36,7 @@
|
||||||
|
#endif
|
||||||
|
#define _PATH_MOTDFILE "/etc/motd"
|
||||||
|
#define _PATH_NOLOGIN "/etc/nologin"
|
||||||
|
+#define _PATH_VAR_NOLOGIN "/var/run/nologin"
|
||||||
|
|
||||||
|
#define _PATH_LOGIN "/bin/login"
|
||||||
|
#define _PATH_INITTAB "/etc/inittab"
|
||||||
|
diff -up util-linux-2.23.2/login-utils/lslogins.1.kzak util-linux-2.23.2/login-utils/lslogins.1
|
||||||
|
--- util-linux-2.23.2/login-utils/lslogins.1.kzak 2016-03-16 15:17:42.639298595 +0100
|
||||||
|
+++ util-linux-2.23.2/login-utils/lslogins.1 2016-03-16 15:18:13.769055345 +0100
|
||||||
|
@@ -5,7 +5,10 @@
|
||||||
|
lslogins \- display information about known users in the system
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B lslogins
|
||||||
|
-[\fIoptions\fR] [\fB-s\fR|\fB-u\fR[=\fIUID\fR]] [\fB-g \fIgroups\fR] [\fB-l \fIlogins\fR]
|
||||||
|
+[options]
|
||||||
|
+.RB [ \-s | \-u [ =\fIUID ]]
|
||||||
|
+.RB [ \-g " \fIgroups\fR]"
|
||||||
|
+.RB [ \-l " \fIlogins\fR]"
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
Examine the wtmp and btmp logs, /etc/shadow (if necessary) and /etc/passwd
|
||||||
|
@@ -17,7 +20,7 @@ Mandatory arguments to long options are
|
||||||
|
.TP
|
||||||
|
\fB\-a\fR, \fB\-\-acc\-expiration\fR
|
||||||
|
Display data about the date of last password change and the account expiration
|
||||||
|
-date (see \fBshadow\fR(5) for more info). (Requires root priviliges.)
|
||||||
|
+date (see \fBshadow\fR(5) for more info). (Requires root privileges.)
|
||||||
|
.TP
|
||||||
|
\fB\-\-btmp\-file \fIpath\fP
|
||||||
|
Alternate path for btmp.
|
||||||
|
@@ -31,7 +34,7 @@ Output data in the format of NAME=VALUE.
|
||||||
|
\fB\-f\fR, \fB\-\-failed\fR
|
||||||
|
Display data about the users' last failed login attempts.
|
||||||
|
.TP
|
||||||
|
-\fB\-G\fR, \fB\-\-groups\-info\fR
|
||||||
|
+\fB\-G\fR, \fB\-\-supp\-groups\fR
|
||||||
|
Show information about groups.
|
||||||
|
.TP
|
||||||
|
\fB\-g\fR, \fB\-\-groups\fR=\fIgroups\fR
|
||||||
|
@@ -48,9 +51,6 @@ Display data containing information abou
|
||||||
|
Only show data of users with a login specified in \fIlogins\fR (user names or user
|
||||||
|
IDS). More than one login may be specified; the list has to be comma-separated.
|
||||||
|
.TP
|
||||||
|
-\fB\-m\fR, \fB\-\-supp\-groups\fR
|
||||||
|
-Show supplementary groups.
|
||||||
|
-.TP
|
||||||
|
\fB\-n\fR, \fB\-\-newline\fR
|
||||||
|
Display each piece of information on a separate line.
|
||||||
|
.TP
|
||||||
|
@@ -71,21 +71,21 @@ Display information related to login by
|
||||||
|
\fB\-r\fR, \fB\-\-raw\fR
|
||||||
|
Raw output (no columnation).
|
||||||
|
.TP
|
||||||
|
-\fB\-s\fR, \fB\-\-system\-accs\fR[=\fIthreshold\fR]
|
||||||
|
+\fB\-s\fR, \fB\-\-system\-accs\fR
|
||||||
|
Show system accounts. These are by default all accounts with a UID below 1000
|
||||||
|
-(non-inclusive), with the exception of either nobody or nfsnobody (UID 65534). The UID
|
||||||
|
-threshold can also be specified explicitly (necessary for some distributions that
|
||||||
|
-allocate UIDs starting from 100, 500 - or an entirely different value - rather than 1000).
|
||||||
|
+(non-inclusive), with the exception of either nobody or nfsnobody (UID 65534).
|
||||||
|
+This hardcoded default maybe overwritten by parameters SYS_UID_MIN and SYS_UID_MAX in
|
||||||
|
+the file /etc/login.defs.
|
||||||
|
.TP
|
||||||
|
-\fB\-\-time-format\fR \fItype\fP
|
||||||
|
+\fB\-\-time\-format\fR \fItype\fP
|
||||||
|
Display dates in short, full or iso format. The default is short, this time
|
||||||
|
format is designed to be space efficient and human readable.
|
||||||
|
.TP
|
||||||
|
-\fB\-u\fR, \fB\-\-user\-accs\fR[=\fIthreshold\fR]
|
||||||
|
+\fB\-u\fR, \fB\-\-user\-accs\fR
|
||||||
|
Show user accounts. These are by default all accounts with UID above 1000
|
||||||
|
-(inclusive), with the exception of either nobody or nfsnobody (UID 65534). The UID
|
||||||
|
-threshold can also be specified explicitly (necessary for some distributions that
|
||||||
|
-allocate UIDs starting from 100, 500 - or an entirely different value - rather than 1000).
|
||||||
|
+(inclusive), with the exception of either nobody or nfsnobody (UID 65534).
|
||||||
|
+This hardcoded default maybe overwritten by parameters UID_MIN and UID_MAX in
|
||||||
|
+the file /etc/login.defs.
|
||||||
|
.TP
|
||||||
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
|
Display version information and exit.
|
||||||
|
diff -up util-linux-2.23.2/login-utils/lslogins.c.kzak util-linux-2.23.2/login-utils/lslogins.c
|
||||||
|
--- util-linux-2.23.2/login-utils/lslogins.c.kzak 2016-03-16 15:17:42.639298595 +0100
|
||||||
|
+++ util-linux-2.23.2/login-utils/lslogins.c 2016-03-16 15:22:49.845899268 +0100
|
||||||
|
@@ -144,6 +144,7 @@ enum {
|
||||||
|
TIME_SHORT,
|
||||||
|
TIME_FULL,
|
||||||
|
TIME_ISO,
|
||||||
|
+ TIME_ISO_SHORT,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -350,6 +351,9 @@ static char *make_time(int mode, time_t
|
||||||
|
case TIME_ISO:
|
||||||
|
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%z", &tm);
|
||||||
|
break;
|
||||||
|
+ case TIME_ISO_SHORT:
|
||||||
|
+ strftime(buf, sizeof(buf), "%Y-%m-%d", &tm);
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
errx(EXIT_FAILURE, _("unsupported time type"));
|
||||||
|
}
|
||||||
|
@@ -396,7 +400,7 @@ again:
|
||||||
|
x = snprintf(p, len, "%s,", grp->gr_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (x < 0 || (size_t) x + 1 > len) {
|
||||||
|
+ if (x < 0 || (size_t) x >= len) {
|
||||||
|
size_t cur = p - res;
|
||||||
|
|
||||||
|
maxlen *= 2;
|
||||||
|
@@ -496,21 +500,24 @@ static int parse_btmp(struct lslogins_co
|
||||||
|
static int get_sgroups(gid_t **list, size_t *len, struct passwd *pwd)
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
+ int ngroups = 0;
|
||||||
|
|
||||||
|
*len = 0;
|
||||||
|
*list = NULL;
|
||||||
|
|
||||||
|
/* first let's get a supp. group count */
|
||||||
|
- getgrouplist(pwd->pw_name, pwd->pw_gid, *list, (int *) len);
|
||||||
|
- if (!*len)
|
||||||
|
+ getgrouplist(pwd->pw_name, pwd->pw_gid, *list, &ngroups);
|
||||||
|
+ if (!ngroups)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
- *list = xcalloc(1, *len * sizeof(gid_t));
|
||||||
|
+ *list = xcalloc(1, ngroups * sizeof(gid_t));
|
||||||
|
|
||||||
|
/* now for the actual list of GIDs */
|
||||||
|
- if (-1 == getgrouplist(pwd->pw_name, pwd->pw_gid, *list, (int *) len))
|
||||||
|
+ if (-1 == getgrouplist(pwd->pw_name, pwd->pw_gid, *list, &ngroups))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
+ *len = (size_t) ngroups;
|
||||||
|
+
|
||||||
|
/* getgroups also returns the user's primary GID - dispose of it */
|
||||||
|
while (n < *len) {
|
||||||
|
if ((*list)[n] == pwd->pw_gid)
|
||||||
|
@@ -520,6 +527,7 @@ static int get_sgroups(gid_t **list, siz
|
||||||
|
|
||||||
|
if (*len)
|
||||||
|
(*list)[n] = (*list)[--(*len)];
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -685,8 +693,8 @@ static struct lslogins_user *get_user_in
|
||||||
|
if (strstr(pwd->pw_shell, "nologin"))
|
||||||
|
user->nologin = 1;
|
||||||
|
else if (pwd->pw_uid)
|
||||||
|
- user->nologin = access("/etc/nologin", F_OK) == 0 ||
|
||||||
|
- access("/var/run/nologin", F_OK) == 0;
|
||||||
|
+ user->nologin = access(_PATH_NOLOGIN, F_OK) == 0 ||
|
||||||
|
+ access(_PATH_VAR_NOLOGIN, F_OK) == 0;
|
||||||
|
break;
|
||||||
|
case COL_PWD_WARN:
|
||||||
|
if (shadow && shadow->sp_warn >= 0)
|
||||||
|
@@ -694,7 +702,8 @@ static struct lslogins_user *get_user_in
|
||||||
|
break;
|
||||||
|
case COL_PWD_EXPIR:
|
||||||
|
if (shadow && shadow->sp_expire >= 0)
|
||||||
|
- user->pwd_expire = make_time(TIME_SHORT,
|
||||||
|
+ user->pwd_expire = make_time(ctl->time_mode == TIME_ISO ?
|
||||||
|
+ TIME_ISO_SHORT : ctl->time_mode,
|
||||||
|
shadow->sp_expire * 86400);
|
||||||
|
break;
|
||||||
|
case COL_PWD_CTIME:
|
||||||
|
@@ -702,7 +711,8 @@ static struct lslogins_user *get_user_in
|
||||||
|
* (especially in non-GMT timezones) would only serve
|
||||||
|
* to confuse */
|
||||||
|
if (shadow)
|
||||||
|
- user->pwd_ctime = make_time(TIME_SHORT,
|
||||||
|
+ user->pwd_ctime = make_time(ctl->time_mode == TIME_ISO ?
|
||||||
|
+ TIME_ISO_SHORT : ctl->time_mode,
|
||||||
|
shadow->sp_lstchg * 86400);
|
||||||
|
break;
|
||||||
|
case COL_PWD_CTIME_MIN:
|
||||||
|
@@ -852,7 +862,7 @@ static int get_user(struct lslogins_cont
|
||||||
|
const char *username)
|
||||||
|
{
|
||||||
|
*user = get_user_info(ctl, username);
|
||||||
|
- if (!*user && errno)
|
||||||
|
+ if (!*user)
|
||||||
|
if (IS_REAL_ERRNO(errno))
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
@@ -887,33 +897,33 @@ static int create_usertree(struct lslogi
|
||||||
|
|
||||||
|
static struct libscols_table *setup_table(struct lslogins_control *ctl)
|
||||||
|
{
|
||||||
|
- struct libscols_table *tb = scols_new_table();
|
||||||
|
+ struct libscols_table *table = scols_new_table();
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
- if (!tb)
|
||||||
|
+ if (!table)
|
||||||
|
errx(EXIT_FAILURE, _("failed to initialize output table"));
|
||||||
|
if (ctl->noheadings)
|
||||||
|
- scols_table_enable_noheadings(tb, 1);
|
||||||
|
+ scols_table_enable_noheadings(table, 1);
|
||||||
|
|
||||||
|
switch(outmode) {
|
||||||
|
case OUT_COLON:
|
||||||
|
- scols_table_enable_raw(tb, 1);
|
||||||
|
- scols_table_set_column_separator(tb, ":");
|
||||||
|
+ scols_table_enable_raw(table, 1);
|
||||||
|
+ scols_table_set_column_separator(table, ":");
|
||||||
|
break;
|
||||||
|
case OUT_NEWLINE:
|
||||||
|
- scols_table_set_column_separator(tb, "\n");
|
||||||
|
+ scols_table_set_column_separator(table, "\n");
|
||||||
|
/* fallthrough */
|
||||||
|
case OUT_EXPORT:
|
||||||
|
- scols_table_enable_export(tb, 1);
|
||||||
|
+ scols_table_enable_export(table, 1);
|
||||||
|
break;
|
||||||
|
case OUT_NUL:
|
||||||
|
- scols_table_set_line_separator(tb, "\0");
|
||||||
|
+ scols_table_set_line_separator(table, "\0");
|
||||||
|
/* fallthrough */
|
||||||
|
case OUT_RAW:
|
||||||
|
- scols_table_enable_raw(tb, 1);
|
||||||
|
+ scols_table_enable_raw(table, 1);
|
||||||
|
break;
|
||||||
|
case OUT_PRETTY:
|
||||||
|
- scols_table_enable_noheadings(tb, 1);
|
||||||
|
+ scols_table_enable_noheadings(table, 1);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -924,7 +934,7 @@ static struct libscols_table *setup_tabl
|
||||||
|
if (ctl->notrunc)
|
||||||
|
flags &= ~SCOLS_FL_TRUNC;
|
||||||
|
|
||||||
|
- if (!scols_table_new_column(tb,
|
||||||
|
+ if (!scols_table_new_column(table,
|
||||||
|
coldescs[columns[n]].name,
|
||||||
|
coldescs[columns[n]].whint,
|
||||||
|
flags))
|
||||||
|
@@ -932,9 +942,9 @@ static struct libscols_table *setup_tabl
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return tb;
|
||||||
|
+ return table;
|
||||||
|
fail:
|
||||||
|
- scols_unref_table(tb);
|
||||||
|
+ scols_unref_table(table);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1050,10 +1060,10 @@ static void fill_table(const void *u, co
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#ifdef HAVE_LIBSYSTEMD
|
||||||
|
-static void print_journal_tail(const char *journal_path, uid_t uid, size_t len)
|
||||||
|
+static void print_journal_tail(const char *journal_path, uid_t uid, size_t len, int time_mode)
|
||||||
|
{
|
||||||
|
sd_journal *j;
|
||||||
|
- char *match, *buf;
|
||||||
|
+ char *match, *timestamp;
|
||||||
|
uint64_t x;
|
||||||
|
time_t t;
|
||||||
|
const char *identifier, *pid, *message;
|
||||||
|
@@ -1064,7 +1074,6 @@ static void print_journal_tail(const cha
|
||||||
|
else
|
||||||
|
sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
|
||||||
|
|
||||||
|
- buf = xmalloc(sizeof(char) * 16);
|
||||||
|
xasprintf(&match, "_UID=%d", uid);
|
||||||
|
|
||||||
|
sd_journal_add_match(j, match, 0);
|
||||||
|
@@ -1074,37 +1083,35 @@ static void print_journal_tail(const cha
|
||||||
|
do {
|
||||||
|
if (0 > sd_journal_get_data(j, "SYSLOG_IDENTIFIER",
|
||||||
|
(const void **) &identifier, &identifier_len))
|
||||||
|
- return;
|
||||||
|
+ goto done;
|
||||||
|
if (0 > sd_journal_get_data(j, "_PID",
|
||||||
|
(const void **) &pid, &pid_len))
|
||||||
|
- return;
|
||||||
|
+ goto done;
|
||||||
|
if (0 > sd_journal_get_data(j, "MESSAGE",
|
||||||
|
(const void **) &message, &message_len))
|
||||||
|
- return;
|
||||||
|
+ goto done;
|
||||||
|
|
||||||
|
sd_journal_get_realtime_usec(j, &x);
|
||||||
|
t = x / 1000000;
|
||||||
|
- strftime(buf, 16, "%b %d %H:%M:%S", localtime(&t));
|
||||||
|
-
|
||||||
|
- fprintf(stdout, "%s", buf);
|
||||||
|
-
|
||||||
|
+ timestamp = make_time(time_mode, t);
|
||||||
|
+ /* Get rid of journal entry field identifiers */
|
||||||
|
identifier = strchr(identifier, '=') + 1;
|
||||||
|
- pid = strchr(pid, '=') + 1 ;
|
||||||
|
+ pid = strchr(pid, '=') + 1;
|
||||||
|
message = strchr(message, '=') + 1;
|
||||||
|
|
||||||
|
- fprintf(stdout, " %s", identifier);
|
||||||
|
- fprintf(stdout, "[%s]:", pid);
|
||||||
|
- fprintf(stdout, "%s\n", message);
|
||||||
|
+ fprintf(stdout, "%s %s[%s]: %s\n", timestamp, identifier, pid,
|
||||||
|
+ message);
|
||||||
|
+ free(timestamp);
|
||||||
|
} while (sd_journal_next(j));
|
||||||
|
|
||||||
|
- free(buf);
|
||||||
|
+done:
|
||||||
|
free(match);
|
||||||
|
sd_journal_flush_matches(j);
|
||||||
|
sd_journal_close(j);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-static int print_pretty(struct libscols_table *tb)
|
||||||
|
+static int print_pretty(struct libscols_table *table)
|
||||||
|
{
|
||||||
|
struct libscols_iter *itr = scols_new_iter(SCOLS_ITER_FORWARD);
|
||||||
|
struct libscols_column *col;
|
||||||
|
@@ -1113,8 +1120,8 @@ static int print_pretty(struct libscols_
|
||||||
|
const char *hstr, *dstr;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
- ln = scols_table_get_line(tb, 0);
|
||||||
|
- while (!scols_table_next_column(tb, itr, &col)) {
|
||||||
|
+ ln = scols_table_get_line(table, 0);
|
||||||
|
+ while (!scols_table_next_column(table, itr, &col)) {
|
||||||
|
|
||||||
|
data = scols_line_get_cell(ln, n);
|
||||||
|
|
||||||
|
@@ -1142,7 +1149,7 @@ static int print_user_table(struct lslog
|
||||||
|
print_pretty(tb);
|
||||||
|
#ifdef HAVE_LIBSYSTEMD
|
||||||
|
fprintf(stdout, _("\nLast logs:\n"));
|
||||||
|
- print_journal_tail(ctl->journal_path, ctl->uid, 3);
|
||||||
|
+ print_journal_tail(ctl->journal_path, ctl->uid, 3, ctl->time_mode);
|
||||||
|
fputc('\n', stdout);
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
@@ -1175,16 +1182,25 @@ static void free_user(void *f)
|
||||||
|
free(u);
|
||||||
|
}
|
||||||
|
|
||||||
|
-struct lslogins_timefmt {
|
||||||
|
- const char *name;
|
||||||
|
- int val;
|
||||||
|
-};
|
||||||
|
+static int parse_time_mode(const char *optarg)
|
||||||
|
+{
|
||||||
|
+ struct lslogins_timefmt {
|
||||||
|
+ const char *name;
|
||||||
|
+ const int val;
|
||||||
|
+ };
|
||||||
|
+ static const struct lslogins_timefmt timefmts[] = {
|
||||||
|
+ {"iso", TIME_ISO},
|
||||||
|
+ {"full", TIME_FULL},
|
||||||
|
+ {"short", TIME_SHORT},
|
||||||
|
+ };
|
||||||
|
+ size_t i;
|
||||||
|
|
||||||
|
-static struct lslogins_timefmt timefmts[] = {
|
||||||
|
- { "short", TIME_SHORT },
|
||||||
|
- { "full", TIME_FULL },
|
||||||
|
- { "iso", TIME_ISO },
|
||||||
|
-};
|
||||||
|
+ for (i = 0; i < ARRAY_SIZE(timefmts); i++) {
|
||||||
|
+ if (strcmp(timefmts[i].name, optarg) == 0)
|
||||||
|
+ return timefmts[i].val;
|
||||||
|
+ }
|
||||||
|
+ errx(EXIT_FAILURE, _("unknown time format: %s"), optarg);
|
||||||
|
+}
|
||||||
|
|
||||||
|
static void __attribute__((__noreturn__)) usage(FILE *out)
|
||||||
|
{
|
||||||
|
@@ -1193,16 +1209,18 @@ static void __attribute__((__noreturn__)
|
||||||
|
fputs(USAGE_HEADER, out);
|
||||||
|
fprintf(out, _(" %s [options]\n"), program_invocation_short_name);
|
||||||
|
|
||||||
|
+ fputs(USAGE_SEPARATOR, out);
|
||||||
|
+ fputs(_("Display information about known users in the system.\n"), out);
|
||||||
|
+
|
||||||
|
fputs(USAGE_OPTIONS, out);
|
||||||
|
fputs(_(" -a, --acc-expiration display info about passwords expiration\n"), out);
|
||||||
|
fputs(_(" -c, --colon-separate display data in a format similar to /etc/passwd\n"), out);
|
||||||
|
fputs(_(" -e, --export display in an export-able output format\n"), out);
|
||||||
|
fputs(_(" -f, --failed display data about the users' last failed logins\n"), out);
|
||||||
|
- fputs(_(" -G, --groups-info display information about groups\n"), out);
|
||||||
|
+ fputs(_(" -G, --supp-groups display information about groups\n"), out);
|
||||||
|
fputs(_(" -g, --groups=<groups> display users belonging to a group in <groups>\n"), out);
|
||||||
|
fputs(_(" -L, --last show info about the users' last login sessions\n"), out);
|
||||||
|
fputs(_(" -l, --logins=<logins> display only users from <logins>\n"), out);
|
||||||
|
- fputs(_(" -m, --supp-groups display supplementary groups as well\n"), out);
|
||||||
|
fputs(_(" -n, --newline display each piece of information on a new line\n"), out);
|
||||||
|
fputs(_(" --noheadings don't print headings\n"), out);
|
||||||
|
fputs(_(" --notruncate don't truncate output\n"), out);
|
||||||
|
@@ -1226,7 +1244,7 @@ static void __attribute__((__noreturn__)
|
||||||
|
fprintf(out, " %14s %s\n", coldescs[i].name,
|
||||||
|
_(coldescs[i].help));
|
||||||
|
|
||||||
|
- fprintf(out, _("\nFor more details see lslogins(1).\n"));
|
||||||
|
+ fprintf(out, USAGE_MAN_TAIL("lslogins(1)"));
|
||||||
|
|
||||||
|
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
@@ -1241,8 +1259,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
/* long only options. */
|
||||||
|
enum {
|
||||||
|
- OPT_VER = CHAR_MAX + 1,
|
||||||
|
- OPT_WTMP,
|
||||||
|
+ OPT_WTMP = CHAR_MAX + 1,
|
||||||
|
OPT_BTMP,
|
||||||
|
OPT_NOTRUNC,
|
||||||
|
OPT_NOHEAD,
|
||||||
|
@@ -1300,7 +1317,7 @@ int main(int argc, char *argv[])
|
||||||
|
add_column(columns, ncolumns++, COL_UID);
|
||||||
|
add_column(columns, ncolumns++, COL_USER);
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "acfGg:hLl:no:prsuVxzZ",
|
||||||
|
+ while ((c = getopt_long(argc, argv, "acefGg:hLl:no:prsuVzZ",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
|
||||||
|
err_exclusive_options(c, longopts, excl, excl_st);
|
||||||
|
@@ -1394,18 +1411,7 @@ int main(int argc, char *argv[])
|
||||||
|
ctl->noheadings = 1;
|
||||||
|
break;
|
||||||
|
case OPT_TIME_FMT:
|
||||||
|
- {
|
||||||
|
- size_t i;
|
||||||
|
-
|
||||||
|
- for (i = 0; i < ARRAY_SIZE(timefmts); i++) {
|
||||||
|
- if (strcmp(timefmts[i].name, optarg) == 0) {
|
||||||
|
- ctl->time_mode = timefmts[i].val;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- if (ctl->time_mode == TIME_INVALID)
|
||||||
|
- usage(stderr);
|
||||||
|
- }
|
||||||
|
+ ctl->time_mode = parse_time_mode(optarg);
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
printf(UTIL_LINUX_VERSION);
|
||||||
|
@@ -1433,7 +1439,7 @@ int main(int argc, char *argv[])
|
||||||
|
logins = argv[optind];
|
||||||
|
outmode = OUT_PRETTY;
|
||||||
|
} else if (argc != optind)
|
||||||
|
- usage(stderr);
|
||||||
|
+ errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));
|
||||||
|
|
||||||
|
scols_init_debug(0);
|
|
@ -0,0 +1,63 @@
|
||||||
|
.\" $OpenBSD: nologin.8,v 1.8 1999/06/04 02:45:19 aaron Exp $
|
||||||
|
.\" $NetBSD: nologin.8,v 1.3 1995/03/18 14:59:09 cgd Exp $
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1993
|
||||||
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. All advertising materials mentioning features or use of this software
|
||||||
|
.\" must display the following acknowledgement:
|
||||||
|
.\" This product includes software developed by the University of
|
||||||
|
.\" California, Berkeley and its contributors.
|
||||||
|
.\" 4. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" @(#)nologin.8 8.1 (Berkeley) 6/19/93
|
||||||
|
.\"
|
||||||
|
.Dd February 15, 1997
|
||||||
|
.Dt NOLOGIN 8
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm nologin
|
||||||
|
.Nd politely refuse a login
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm nologin
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Nm
|
||||||
|
displays a message that an account is not available and
|
||||||
|
exits non-zero.
|
||||||
|
It is intended as a replacement shell field for accounts that
|
||||||
|
have been disabled.
|
||||||
|
.Pp
|
||||||
|
If the file
|
||||||
|
.Pa /etc/nologin.txt
|
||||||
|
exists,
|
||||||
|
.Nm
|
||||||
|
displays its contents to the user instead of the default message.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr login 1
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
command appeared in
|
||||||
|
.Bx 4.4 .
|
|
@ -0,0 +1,58 @@
|
||||||
|
/* $OpenBSD: nologin.c,v 1.2 1997/04/04 16:51:37 millert Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1997, Jason Downs. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS
|
||||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Distinctly different from _PATH_NOLOGIN. */
|
||||||
|
#define _PATH_NOLOGIN_TXT "/etc/nologin.txt"
|
||||||
|
|
||||||
|
#define DEFAULT_MESG "This account is currently not available.\n"
|
||||||
|
|
||||||
|
/*ARGSUSED*/
|
||||||
|
int main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
int nfd, nrd;
|
||||||
|
char nbuf[128];
|
||||||
|
|
||||||
|
nfd = open(_PATH_NOLOGIN_TXT, O_RDONLY);
|
||||||
|
if (nfd < 0) {
|
||||||
|
write(STDOUT_FILENO, DEFAULT_MESG, strlen(DEFAULT_MESG));
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((nrd = read(nfd, nbuf, sizeof(nbuf))) > 0)
|
||||||
|
write(STDOUT_FILENO, nbuf, nrd);
|
||||||
|
close (nfd);
|
||||||
|
|
||||||
|
exit (1);
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.1.kzak util-linux-2.23.2/sys-utils/nsenter.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.1.kzak 2014-03-12 12:39:19.283577293 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.1 2014-03-12 12:42:08.930336415 +0100
|
||||||
|
@@ -47,12 +47,7 @@ flag).
|
||||||
|
will fork by default if changing the PID namespace, so that the new program
|
||||||
|
and its children share the same PID namespace and are visible to each other.
|
||||||
|
If \-\-no\-fork is used, the new program will be exec'ed without forking.
|
||||||
|
-.TP
|
||||||
|
-.B user namespace
|
||||||
|
-process will have distinct set of UIDs, GIDs and capabilities
|
||||||
|
-.RB ( CLONE_\:NEWUSER
|
||||||
|
-flag).
|
||||||
|
-.TP
|
||||||
|
+.PP
|
||||||
|
See the
|
||||||
|
.BR clone (2)
|
||||||
|
for exact semantics of the flags.
|
||||||
|
@@ -88,9 +83,6 @@ the network namespace
|
||||||
|
/proc/\fIpid\fR/ns/pid
|
||||||
|
the PID namespace
|
||||||
|
.TP
|
||||||
|
-/proc/\fIpid\fR/ns/user
|
||||||
|
-the user namespace
|
||||||
|
-.TP
|
||||||
|
/proc/\fIpid\fR/root
|
||||||
|
the root directory
|
||||||
|
.TP
|
||||||
|
@@ -124,11 +116,6 @@ Enter the PID namespace. If no file is
|
||||||
|
the target process. If file is specified enter the PID namespace specified by
|
||||||
|
file.
|
||||||
|
.TP
|
||||||
|
-\fB\-U\fR, \fB\-\-user\fR [\fIfile\fR]
|
||||||
|
-Enter the user namespace. If no file is specified enter the user namespace of
|
||||||
|
-the target process. If file is specified enter the user namespace specified by
|
||||||
|
-file.
|
||||||
|
-.TP
|
||||||
|
\fB\-r\fR, \fB\-\-root\fR [\fIdirectory\fR]
|
||||||
|
Set the root directory. If no directory is specified set the root directory to
|
||||||
|
the root directory of the target process. If directory is specified set the
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.c.kzak util-linux-2.23.2/sys-utils/nsenter.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.c.kzak 2014-03-12 12:39:10.402485179 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.c 2014-03-12 12:44:07.986570461 +0100
|
||||||
|
@@ -42,12 +42,7 @@ static struct namespace_file {
|
||||||
|
int fd;
|
||||||
|
} namespace_files[] = {
|
||||||
|
/* Careful the order is significant in this array.
|
||||||
|
- *
|
||||||
|
- * The user namespace comes first, so that it is entered
|
||||||
|
- * first. This gives an unprivileged user the potential to
|
||||||
|
- * enter the other namespaces.
|
||||||
|
*/
|
||||||
|
- { .nstype = CLONE_NEWUSER, .name = "ns/user", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWIPC, .name = "ns/ipc", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWUTS, .name = "ns/uts", .fd = -1 },
|
||||||
|
{ .nstype = CLONE_NEWNET, .name = "ns/net", .fd = -1 },
|
||||||
|
@@ -71,7 +66,6 @@ static void usage(int status)
|
||||||
|
fputs(_(" -i, --ipc [=<file>] enter System V IPC namespace\n"), out);
|
||||||
|
fputs(_(" -n, --net [=<file>] enter network namespace\n"), out);
|
||||||
|
fputs(_(" -p, --pid [=<file>] enter pid namespace\n"), out);
|
||||||
|
- fputs(_(" -U, --user [=<file>] enter user namespace\n"), out);
|
||||||
|
fputs(_(" -r, --root [=<dir>] set the root directory\n"), out);
|
||||||
|
fputs(_(" -w, --wd [=<dir>] set the working directory\n"), out);
|
||||||
|
fputs(_(" -F, --no-fork do not fork before exec'ing <program>\n"), out);
|
||||||
|
@@ -168,7 +162,6 @@ int main(int argc, char *argv[])
|
||||||
|
{ "ipc", optional_argument, NULL, 'i' },
|
||||||
|
{ "net", optional_argument, NULL, 'n' },
|
||||||
|
{ "pid", optional_argument, NULL, 'p' },
|
||||||
|
- { "user", optional_argument, NULL, 'U' },
|
||||||
|
{ "root", optional_argument, NULL, 'r' },
|
||||||
|
{ "wd", optional_argument, NULL, 'w' },
|
||||||
|
{ "no-fork", no_argument, NULL, 'F' },
|
||||||
|
@@ -186,7 +179,7 @@ int main(int argc, char *argv[])
|
||||||
|
atexit(close_stdout);
|
||||||
|
|
||||||
|
while ((c =
|
||||||
|
- getopt_long(argc, argv, "hVt:m::u::i::n::p::U::r::w::F",
|
||||||
|
+ getopt_long(argc, argv, "hVt:m::u::i::n::p::r::w::F",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'h':
|
||||||
|
@@ -228,12 +221,6 @@ int main(int argc, char *argv[])
|
||||||
|
else
|
||||||
|
namespaces |= CLONE_NEWPID;
|
||||||
|
break;
|
||||||
|
- case 'U':
|
||||||
|
- if (optarg)
|
||||||
|
- open_namespace_fd(CLONE_NEWUSER, optarg);
|
||||||
|
- else
|
||||||
|
- namespaces |= CLONE_NEWUSER;
|
||||||
|
- break;
|
||||||
|
case 'F':
|
||||||
|
do_fork = 0;
|
||||||
|
break;
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.1.kzak util-linux-2.23.2/sys-utils/unshare.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.1.kzak 2014-03-12 12:39:41.367806340 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.1 2014-03-12 12:40:25.186260760 +0100
|
||||||
|
@@ -34,9 +34,6 @@ etc. (\fBCLONE_NEWNET\fP flag).
|
||||||
|
.BR "pid namespace"
|
||||||
|
children will have a distinct set of pid to process mappings than their parent.
|
||||||
|
(\fBCLONE_NEWPID\fP flag).
|
||||||
|
-.TP
|
||||||
|
-.BR "user namespace"
|
||||||
|
-process will have distinct set of uids, gids and capabilities. (\fBCLONE_NEWUSER\fP flag).
|
||||||
|
.PP
|
||||||
|
See the \fBclone\fR(2) for exact semantics of the flags.
|
||||||
|
.SH OPTIONS
|
||||||
|
@@ -58,9 +55,6 @@ Unshare the network namespace.
|
||||||
|
.TP
|
||||||
|
.BR \-p , " \-\-pid"
|
||||||
|
Unshare the pid namespace.
|
||||||
|
-.TP
|
||||||
|
-.BR \-U , " \-\-user"
|
||||||
|
-Unshare the user namespace.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR unshare (2),
|
||||||
|
.BR clone (2)
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/unshare.c.kzak util-linux-2.23.2/sys-utils/unshare.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/unshare.c.kzak 2014-03-12 12:39:46.385858383 +0100
|
||||||
|
+++ util-linux-2.23.2/sys-utils/unshare.c 2014-03-12 12:44:49.955005384 +0100
|
||||||
|
@@ -45,7 +45,6 @@ static void usage(int status)
|
||||||
|
fputs(_(" -i, --ipc unshare System V IPC namespace\n"), out);
|
||||||
|
fputs(_(" -n, --net unshare network namespace\n"), out);
|
||||||
|
fputs(_(" -p, --pid unshare pid namespace\n"), out);
|
||||||
|
- fputs(_(" -U, --user unshare user namespace\n"), out);
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
@@ -65,7 +64,6 @@ int main(int argc, char *argv[])
|
||||||
|
{ "ipc", no_argument, 0, 'i' },
|
||||||
|
{ "net", no_argument, 0, 'n' },
|
||||||
|
{ "pid", no_argument, 0, 'p' },
|
||||||
|
- { "user", no_argument, 0, 'U' },
|
||||||
|
{ NULL, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -78,7 +76,7 @@ int main(int argc, char *argv[])
|
||||||
|
textdomain(PACKAGE);
|
||||||
|
atexit(close_stdout);
|
||||||
|
|
||||||
|
- while ((c = getopt_long(argc, argv, "hVmuinpU", longopts, NULL)) != -1) {
|
||||||
|
+ while ((c = getopt_long(argc, argv, "hVmuinp", longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'h':
|
||||||
|
usage(EXIT_SUCCESS);
|
||||||
|
@@ -100,9 +98,6 @@ int main(int argc, char *argv[])
|
||||||
|
case 'p':
|
||||||
|
unshare_flags |= CLONE_NEWPID;
|
||||||
|
break;
|
||||||
|
- case 'U':
|
||||||
|
- unshare_flags |= CLONE_NEWUSER;
|
||||||
|
- break;
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
|
@ -0,0 +1,129 @@
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/Makemodule.am.kzak util-linux-2.23.2/sys-utils/Makemodule.am
|
||||||
|
--- util-linux-2.23.2/sys-utils/Makemodule.am.kzak 2015-06-26 10:21:34.337221288 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/Makemodule.am 2015-06-26 10:22:18.719885983 +0200
|
||||||
|
@@ -308,7 +308,7 @@ if BUILD_NSENTER
|
||||||
|
usrbin_exec_PROGRAMS += nsenter
|
||||||
|
dist_man_MANS += sys-utils/nsenter.1
|
||||||
|
nsenter_SOURCES = sys-utils/nsenter.c
|
||||||
|
-nsenter_LDADD = $(LDADD) libcommon.la
|
||||||
|
+nsenter_LDADD = $(LDADD) libcommon.la $(SELINUX_LIBS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if BUILD_HWCLOCK
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.1.kzak util-linux-2.23.2/sys-utils/nsenter.1
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.1.kzak 2015-06-26 10:14:00.947646586 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.1 2015-06-26 10:21:34.337221288 +0200
|
||||||
|
@@ -155,6 +155,11 @@ Do not fork before exec'ing the specifie
|
||||||
|
PID namespace, \fBnsenter\fP calls \fBfork\fP before calling \fBexec\fP so that
|
||||||
|
any children will also be in the newly entered PID namespace.
|
||||||
|
.TP
|
||||||
|
+\fB\-Z\fR, \fB\-\-follow\-context\fR
|
||||||
|
+Set the SELinux security context used for executing a new process according to
|
||||||
|
+already running process specified by \fB\-\-target\fR PID. (The util-linux has
|
||||||
|
+to be compiled with SELinux support otherwise the option is unavailable.)
|
||||||
|
+.TP
|
||||||
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
|
Display version information and exit.
|
||||||
|
.TP
|
||||||
|
@@ -163,10 +168,14 @@ Display help text and exit.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR setns (2),
|
||||||
|
.BR clone (2)
|
||||||
|
-.SH AUTHOR
|
||||||
|
-.MT ebiederm@xmission.com
|
||||||
|
+.SH AUTHORS
|
||||||
|
+.UR biederm@xmission.com
|
||||||
|
Eric Biederman
|
||||||
|
-.ME
|
||||||
|
+.UE
|
||||||
|
+.br
|
||||||
|
+.UR kzak@redhat.com
|
||||||
|
+Karel Zak
|
||||||
|
+.UE
|
||||||
|
.SH AVAILABILITY
|
||||||
|
The nsenter command is part of the util-linux package and is available from
|
||||||
|
.UR ftp://\:ftp.kernel.org\:/pub\:/linux\:/utils\:/util-linux/
|
||||||
|
diff -up util-linux-2.23.2/sys-utils/nsenter.c.kzak util-linux-2.23.2/sys-utils/nsenter.c
|
||||||
|
--- util-linux-2.23.2/sys-utils/nsenter.c.kzak 2015-06-26 10:14:00.947646586 +0200
|
||||||
|
+++ util-linux-2.23.2/sys-utils/nsenter.c 2015-06-26 10:21:34.337221288 +0200
|
||||||
|
@@ -30,6 +30,10 @@
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+# include <selinux/selinux.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#include "strutils.h"
|
||||||
|
#include "nls.h"
|
||||||
|
#include "c.h"
|
||||||
|
@@ -82,6 +86,9 @@ static void usage(int status)
|
||||||
|
fputs(_(" -r, --root[=<dir>] set the root directory\n"), out);
|
||||||
|
fputs(_(" -w, --wd[=<dir>] set the working directory\n"), out);
|
||||||
|
fputs(_(" -F, --no-fork do not fork before exec'ing <program>\n"), out);
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+ fputs(_(" -Z, --follow-context set SELinux context according to --target PID\n"), out);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
fputs(USAGE_SEPARATOR, out);
|
||||||
|
fputs(USAGE_HELP, out);
|
||||||
|
@@ -185,6 +192,9 @@ int main(int argc, char *argv[])
|
||||||
|
{ "wd", optional_argument, NULL, 'w' },
|
||||||
|
{ "no-fork", no_argument, NULL, 'F' },
|
||||||
|
{ "preserve-credentials", no_argument, NULL, OPT_PRESERVE_CRED },
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+ { "follow-context", no_argument, NULL, 'Z' },
|
||||||
|
+#endif
|
||||||
|
{ NULL, 0, NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -194,6 +204,9 @@ int main(int argc, char *argv[])
|
||||||
|
int do_fork = -1; /* unknown yet */
|
||||||
|
uid_t uid = 0;
|
||||||
|
gid_t gid = 0;
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+ bool selinux = 0;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
|
@@ -201,7 +214,7 @@ int main(int argc, char *argv[])
|
||||||
|
atexit(close_stdout);
|
||||||
|
|
||||||
|
while ((c =
|
||||||
|
- getopt_long(argc, argv, "+hVt:m::u::i::n::p::U::S:G:r::w::F",
|
||||||
|
+ getopt_long(argc, argv, "+hVt:m::u::i::n::p::U::S:G:r::w::FZ",
|
||||||
|
longopts, NULL)) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'h':
|
||||||
|
@@ -275,11 +288,30 @@ int main(int argc, char *argv[])
|
||||||
|
case OPT_PRESERVE_CRED:
|
||||||
|
preserve_cred = 1;
|
||||||
|
break;
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+ case 'Z':
|
||||||
|
+ selinux = 1;
|
||||||
|
+ break;
|
||||||
|
+#endif
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef HAVE_LIBSELINUX
|
||||||
|
+ if (selinux && is_selinux_enabled() > 0) {
|
||||||
|
+ char *scon = NULL;
|
||||||
|
+
|
||||||
|
+ if (!namespace_target_pid)
|
||||||
|
+ errx(EXIT_FAILURE, _("no target PID specified for --follow-context"));
|
||||||
|
+ if (getpidcon(namespace_target_pid, &scon) < 0)
|
||||||
|
+ errx(EXIT_FAILURE, _("failed to get %d SELinux context"),
|
||||||
|
+ (int) namespace_target_pid);
|
||||||
|
+ if (setexeccon(scon) < 0)
|
||||||
|
+ errx(EXIT_FAILURE, _("failed to set exec context to '%s'"), scon);
|
||||||
|
+ freecon(scon);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
/*
|
||||||
|
* Open remaining namespace and directory descriptors.
|
||||||
|
*/
|
|
@ -2,7 +2,7 @@
|
||||||
Summary: A collection of basic system utilities
|
Summary: A collection of basic system utilities
|
||||||
Name: util-linux
|
Name: util-linux
|
||||||
Version: 2.23.2
|
Version: 2.23.2
|
||||||
Release: 26%{?dist}.2
|
Release: 52%{?dist}
|
||||||
License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
|
License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
URL: http://en.wikipedia.org/wiki/Util-linux
|
URL: http://en.wikipedia.org/wiki/Util-linux
|
||||||
|
@ -57,6 +57,9 @@ Conflicts: e2fsprogs < 1.41.8-5
|
||||||
Obsoletes: util-linux-ng < 2.19
|
Obsoletes: util-linux-ng < 2.19
|
||||||
Provides: util-linux-ng = %{version}-%{release}
|
Provides: util-linux-ng = %{version}-%{release}
|
||||||
Conflicts: filesystem < 3
|
Conflicts: filesystem < 3
|
||||||
|
# lsmem and chmem from s390utils
|
||||||
|
Conflicts: s390utils-base < 2:1.23.0-33
|
||||||
|
|
||||||
Provides: /bin/dmesg
|
Provides: /bin/dmesg
|
||||||
Provides: /bin/kill
|
Provides: /bin/kill
|
||||||
Provides: /bin/more
|
Provides: /bin/more
|
||||||
|
@ -199,12 +202,189 @@ Patch56: 2.25-libblkid-return-codes.patch
|
||||||
Patch57: 2.26-libblkid-fat.patch
|
Patch57: 2.26-libblkid-fat.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
# RHEL 7.2.Z
|
# RHEL7.3
|
||||||
#
|
#
|
||||||
# 1302332 - [libblkid] Failed to get offset of the xfs_external_log signature
|
# 1301091 - [libblkid] Failed to get offset of the xfs_external_log signature
|
||||||
Patch58: 2.27-libblkid-xfs-log.patch
|
Patch58: 2.27-libblkid-xfs-log.patch
|
||||||
# 1317953 - lslogins crash when executed with buggy username
|
# 1291554 - lslogins crash when executed with buggy username
|
||||||
Patch59: 2.28-lslogins-1317953.patch
|
Patch59: 2.28-lslogins-rebase.patch
|
||||||
|
# 1092520 - util-linux - PIE and RELRO check
|
||||||
|
Patch60: 0060-build-sys-add-CFLAGS-and-LDFLAGS-for-daemons-and-sha.patch
|
||||||
|
# 1248003 - mount only parses <param>=<value> lines from fstab fs_spec field available from blkid block device
|
||||||
|
Patch61: 0061-libmount-be-more-restrictive-about-valid-tag-names.patch
|
||||||
|
# 1271850 - mount -a doesn't catch a typo in /etc/fstab and a typo in /etc/fstab can make a system not reboot properly
|
||||||
|
Patch62: 0062-mount-umount-swapon-fsck-lsblk-findmnt-ignore-malfor.patch
|
||||||
|
# 1290689 - util-linux: /bin/login does not retry getpwnam_r with larger buffers, leading to login failure
|
||||||
|
Patch63: 0063-login-mount-fix-__SC_GETPW_R_SIZE_MAX-usage.patch
|
||||||
|
# 1296366 - Bash completion for more(1) handles file names with spaces incorrectly
|
||||||
|
Patch64: 0064-bash-completion-use-n-as-IFS-when-ask-for-filenames.patch
|
||||||
|
# 1296521 - RHEL7: update audit event in hwclock
|
||||||
|
Patch65: 0065-hwclock-change-audit-message.patch
|
||||||
|
# 1304426 - [rfe] /bin/su should be improved to reduce stack use
|
||||||
|
Patch66: 0066-su-clean-up-groups-initialization.patch
|
||||||
|
# 1326615 - util-linux/lscpu: Fix model and model name on Power Systems
|
||||||
|
Patch67: 0067-lscpu-Fix-model-and-model-name-on-Power-Systems.patch
|
||||||
|
# 1326615 - util-linux/lscpu: Fix model and model name on Power Systems
|
||||||
|
Patch68: 0068-lscpu-use-cpu-and-revision-tag-if-available.patch
|
||||||
|
# 1335671 - extra quotes around UUID confuses findfs in RHEL (but not in Fedora)
|
||||||
|
Patch69: 0069-findfs-add-ability-to-work-with-PART-UUID-LABEL-too.patch
|
||||||
|
# 1335671 - extra quotes around UUID confuses findfs in RHEL (but not in Fedora)
|
||||||
|
Patch70: 0070-libblkid-fix-memory-leak-in-blkid_parse_tag_string.patch
|
||||||
|
# 587393 - [RFE] Make sure util-linux is ready for writable overlays
|
||||||
|
Patch71: 0071-findmnt-don-t-rely-on-st_dev-for-target.patch
|
||||||
|
# 587393 - [RFE] Make sure util-linux is ready for writable overlays
|
||||||
|
Patch72: 0072-libmount-cleanup-fs-root-detection-code.patch
|
||||||
|
# 587393 - [RFE] Make sure util-linux is ready for writable overlays
|
||||||
|
Patch73: 0073-libmount-mark-overlay-as-pseudo-FS.patch
|
||||||
|
# 1344222 - logger port option in help is misleading
|
||||||
|
Patch74: 0074-logger-be-more-precise-about-port-description.patch
|
||||||
|
# 1344482 - util-linux fails valid_pmbr() size checks if device is > 2.14TB, Device label type: dos instead of gpt
|
||||||
|
Patch75: 0075-libfdisk-gpt-be-more-careful-with-64bit-constants.patch
|
||||||
|
# 1332084 - [RFE] Inclusion of lsns command in util-linux Package
|
||||||
|
Patch76: 0076-lsns-backport-new-command.patch
|
||||||
|
# 1153770 - backport lsipc
|
||||||
|
Patch77: 0077-lib-strutils-make-strmode-more-generic.patch
|
||||||
|
# 1153770 - backport lsipc
|
||||||
|
Patch78: 0078-lsipc-backport-new-command.patch
|
||||||
|
# 1327886 - Backport blkdiscard's "-z" flag to RHEL
|
||||||
|
Patch79: 0079-blkdiscard-backport-zeroout-support.patch
|
||||||
|
# 1029385 - lack of non-ascii support
|
||||||
|
Patch80: 0080-sulogin-and-agetty-virtual-consoles-support-xvc-and-.patch
|
||||||
|
# 1298384 - RFE: add SCHED_DEADLINE support to chrt
|
||||||
|
Patch81: 0081-chrt-backport-DEADLINE-scheduler-support.patch
|
||||||
|
# 1304246 - fdisk 'f' subcommand updates partition ranges wrongly
|
||||||
|
Patch82: 0082-fdisk-backport-DOS-logical-partitions-chain-reorder.patch
|
||||||
|
# 1153770 - backport lsipc
|
||||||
|
Patch83: 0083-tests-cleanup-tests.patch
|
||||||
|
# 1281839 - [RFE]Bind mounts should be handled gracefully by the operating system
|
||||||
|
Patch84: 0084-libmount-add-support-for-bind-ro.patch
|
||||||
|
# 1007734 - blkid shows devices as /dev/block/$MAJOR:$MINOR
|
||||||
|
Patch85: 0085-libblkid-store-only-canonical-devnames-to-the-cache.patch
|
||||||
|
# 1349536 - Extended partition loop in MBR partition table leads to DOS
|
||||||
|
Patch86: 0086-libblkid-avoid-recursion-in-EBR.patch
|
||||||
|
|
||||||
|
#
|
||||||
|
# RHEL7.4
|
||||||
|
#
|
||||||
|
# 1405238 - findmnt --target behaviour changed in 7.3, shows all mount-points in chroot
|
||||||
|
Patch87: 0087-findmnt-fix-target-behaviour.patch
|
||||||
|
# 1419474
|
||||||
|
Patch88: 0088-su-properly-clear-child-PID.patch
|
||||||
|
# 1344102 - fdisk does not handle 4kN devices correctly in 'Blocks' calculation
|
||||||
|
Patch89: 0089-fdisk-fix-Blocks-column-calculation.patch
|
||||||
|
# 1344720 - when fdisk detects gpt table, expected menu items seem to be missing in the 'm' output
|
||||||
|
Patch90: 0090-fdisk-fix-menu-for-GPT.patch
|
||||||
|
# 1323916 - logger unnecessarily splits messages sent via stdin into 1024 byte chunks
|
||||||
|
Patch91: 0091-logger-backport-size.patch
|
||||||
|
# 1344726 - [RFE] fdisk: output UID from gpt in fdisk when detecting that a gpt partition table is present
|
||||||
|
Patch92: 0092-fdisk-print-header-UUID-for-GPT.patch
|
||||||
|
# 1362662 - fdisk -l fails/stops on first passive/not ready device, works on RHEL6
|
||||||
|
Patch93: 0093-fdisk-improve-l-error-handling.patch
|
||||||
|
# 1369436 - losetup man page incorrect syntax for Setup loop device
|
||||||
|
Patch94: 0094-losetup-improve-man-page-SYNOPSIS.patch
|
||||||
|
# 1392656 - [LLNL 7.4 Bug] fix buffer overflows in util-linux with upstream patch
|
||||||
|
Patch95: 0095-libblkid-fix-potential-bufer-overflows.patch
|
||||||
|
# 1370959 - [FJ7.3 Bug]: man 8 umount is wrong.
|
||||||
|
Patch96: 0096-umount-fix-obsolete-info-about-loop-in-umount.8.patch
|
||||||
|
# 1357746 - mount -av" report NFS "successfully mounted" but it is not.
|
||||||
|
Patch97: 0097-mount-fix-all-and-nofail-return-code.patch
|
||||||
|
# 1417722 - umount -a results in selinux being reported as Disabled
|
||||||
|
Patch98: 0098-umount-exclude-selinuxfs-from-all.patch
|
||||||
|
# 1402825 - RHEL7: "sfdisk -s" can't list the disk size
|
||||||
|
Patch99: 0099-sfdisk-remove-useless-CDROM-detection-for-s.patch
|
||||||
|
# 1403973 - /usr/bin/more crash on repeat search on failed regex match
|
||||||
|
Patch100: 0100-more-fix-repeat-search-crash.patch
|
||||||
|
# 1403971 - /usr/bin/more crash in end_it due to double free
|
||||||
|
Patch101: 0101-more-avoid-double-free-on-exit.patch
|
||||||
|
# 1358095 - ipcs shows wrong gid information
|
||||||
|
Patch102: 0102-ipcs-show-gid-instead-of-uid.patch
|
||||||
|
# 1358097 - ipcs shows strange status message in ja locale
|
||||||
|
Patch103: 0103-ipcs-fix-JP-status-message.patch
|
||||||
|
# 1378100 - fix swapon discard option parsing
|
||||||
|
Patch104: 0104-swapon-fix-discard-option-parsing.patch
|
||||||
|
# 1416467 - [RFE] Add support for posix_fallocate(3) call in fallocate(1) utility
|
||||||
|
Patch105: 0105-fallocate-Added-posix_fallocate-support.patch
|
||||||
|
# 1358755 - Backport request for zramctl on util-linux v2.23.2
|
||||||
|
Patch106: 0106-zramctl-backport-from-v2.29.patch
|
||||||
|
# 1392661 - [LLNL 7.4 Bug] add zfs patches to util-linux
|
||||||
|
Patch107: 0107-libblkid-zfs-let-s-keep-compiler-happy.patch
|
||||||
|
Patch108: 0108-blkid-make-zfs-detection-more-robust.patch
|
||||||
|
Patch109: 0109-zfs-make-less-syscalls.patch
|
||||||
|
Patch110: 0110-libblkid-zfs-keep-bufferes-read-only.patch
|
||||||
|
Patch111: 0111-libblkid-don-t-mark-zfs-as-RAID.patch
|
||||||
|
Patch112: 0112-tests-update-ZFS-test.patch
|
||||||
|
Patch113: 0113-libblkid-zfs-add-cast-to-fix-UB-cppcheck.patch
|
||||||
|
Patch114: 0114-libblkid-Avoid-OOB-access-on-illegal-ZFS-superblocks.patch
|
||||||
|
# 1360764 - SMT: "Threads Per Core" will automatically change when odd or even number of vcpu are enabled online.
|
||||||
|
# 1397709 - [7.4 FEAT] Refresh code for lscpu to support s390x cpu topology
|
||||||
|
Patch115: 0115-lscpu-backport-from-v2.29.patch
|
||||||
|
# 1402183 - [HPE 7.3 Bug] fdisk -l does not list non-BTT NVDIMM devices
|
||||||
|
Patch116: 0116-fdisk-use-sysfs_devno_is_wholedisk.patch
|
||||||
|
# 1358755 - Backport request for zramctl on util-linux v2.23.2
|
||||||
|
Patch117: 0117-zramctl-add-bash-completion.patch
|
||||||
|
Patch118: 0118-zramctl-make-mm_stat-parser-more-robust.patch
|
||||||
|
# 1344720 - when fdisk detects gpt table, expected menu items seem to be missing in the 'm' output
|
||||||
|
Patch119: 0119-fdisk-improve-menu-and-u-for-GPT.patch
|
||||||
|
# 1360764 1397709 - lscpu rebase
|
||||||
|
Patch120: 0120-tests-update-for-RHEL7.4-changes.patch
|
||||||
|
# 1358755 - Backport request for zramctl on util-linux v2.23.2
|
||||||
|
Patch121: 0121-zramctl-be-more-specific-about-default-output.patch
|
||||||
|
# 1344726 - [RFE] fdisk: output UID from gpt in fdisk when detecting that a gpt partition table is present
|
||||||
|
Patch122: 0122-libfdisk-gpt-fix-UUID-printing.patch
|
||||||
|
# 1451704 - [Intel 7.4 BUG] IMSM RAID on 4k disks not assembled on boot
|
||||||
|
Patch123: 0123-libblkid-Add-metadata-signature-check-for-IMSM-on-4K.patch
|
||||||
|
# 1455664 - lscpu causes kernel panic on HPE Comanche / Cavium ThunderX2 (cn99xx)
|
||||||
|
Patch124: 0124-lscpu-use-sysfs-for-table-access-if-available.patch
|
||||||
|
# 1457744 - lscpu -e get crashed after offline one host cpu on amd machine
|
||||||
|
Patch125: 0125-lscpu-improve-for-offline-CPUs-on-AMD.patch
|
||||||
|
|
||||||
|
#
|
||||||
|
# RHEL7.5
|
||||||
|
#
|
||||||
|
# 1499760 - gvfs-udisks2-volume-monitor generates huge amount of audit log with access denied messages
|
||||||
|
Patch126: 0126-libmount-use-eacess-rather-than-open-to-check-mtab-u.patch
|
||||||
|
# 1498462 - agetty not parsing /etc/os-release correctly when processing /etc/issue
|
||||||
|
Patch127: 0127-agetty-fix-etc-os-release-parsing.patch
|
||||||
|
# 1490984 - Please update fdisk's manual page
|
||||||
|
Patch128: 0128-fdisk-remove-obsolete-info-about-GPT-from-man-page.patch
|
||||||
|
# 1487031 - [GSS][RFE]The Ceph disk type is unknown then we run the command "fdisk -l"
|
||||||
|
Patch129: 0129-libfdisk-gpt-sync-type-UUIDs-with-upstream.patch
|
||||||
|
# 1468646 - lscpu output missing Hypervisor
|
||||||
|
Patch130: 0130-lscpu-cleanup-DMI-detection-return-codes.patch
|
||||||
|
# 1455398 - flock --timeout=0 doesn't work on RHEL7
|
||||||
|
Patch131: 0131-flock-zero-timeout-is-valid.patch
|
||||||
|
# 1336432 - journald: SYSLOG_IDENTIFIER is invalid when running logger
|
||||||
|
Patch132: 0132-logger-add-man-page-note-about-the-default-tag.patch
|
||||||
|
# 1427500 - util-linux: script does not retry on EINTR when logging command output
|
||||||
|
Patch133: 0133-script-use-all-io-to-write.patch
|
||||||
|
# 1336432 - journald: SYSLOG_IDENTIFIER is invalid when running logger
|
||||||
|
Patch134: 0134-logger-do-not-rely-only-getlogin-3-telling-who-ran-t.patch
|
||||||
|
# 1296233 - login(1) writes 0.0.0.0 IP address to wtmp when executed with "-h <ipv4-mapping-to-ipv6>" hostname
|
||||||
|
Patch135: 0135-login-use-IPv4-on-IPv4-mapping-to-IPv6.patch
|
||||||
|
# 1501953 - blkid shows wrong return code on failure with ambivalent results
|
||||||
|
Patch136: 0136-blkid-update-man-page-about-lsblk-and-ambivalent-pro.patch
|
||||||
|
# 1486777 - wipefs printing duplicate gpt clear messages
|
||||||
|
Patch137: 0137-wipefs-fix-t-filter.patch
|
||||||
|
# 1454652 - fix test suite
|
||||||
|
Patch138: 0138-tests-backport-new-ts_scsi_debug_init.patch
|
||||||
|
Patch139: 0139-tests-ts_scsi_debug_init-must-not-run-in-a-subshell.patch
|
||||||
|
Patch140: 0140-tests-cleanup-fdisk-outputs.patch
|
||||||
|
Patch141: 0141-tests-check-for-mdadm.patch
|
||||||
|
# 1496421 - [Pegas1.1 FEAT] z Systems: Move lsmem and chmem to util-linux (through rebase >= 2.30)
|
||||||
|
Patch142: 0142-lsmem-chmem-backport-new-commands.patch
|
||||||
|
Patch143: 0143-lsmem-make-split-optional-follow-output-by-default.patch
|
||||||
|
# 1499760 - gvfs-udisks2-volume-monitor generates huge amount of audit log with access denied messages
|
||||||
|
Patch144: 0144-libmount-fix-access-utab-write-test.patch
|
||||||
|
# 1520906 - make hostname in login(1) prompt optional [rhel-7.5]
|
||||||
|
Patch145: 0145-login-add-LOGIN_PLAIN_PROMPT-to-login.defs.patch
|
||||||
|
# 1521163 - [RFE] blkid can identify magic number and UUID of VDO volume
|
||||||
|
Patch146: 0146-libblkid-Add-VDO-superblock-information-into-blkid.patch
|
||||||
|
# 1534893 - RHEL7: util-linux: mount/unmount ASLR bypass via environment variable in libmount
|
||||||
|
Patch147: 0147-include-debug-don-t-print-pointer-address-for-SUID-p.patch
|
||||||
|
# 1538545 - SELinux error creating swap file
|
||||||
|
Patch148: 0148-mkswap-tolerate-ENOTSUP-when-failing-to-relabel.patch
|
||||||
|
# 1534893 - RHEL7: util-linux: mount/unmount ASLR bypass via environment variable in libmount
|
||||||
|
Patch149: 0149-libmount-fix-debug-message.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
The util-linux package contains a large variety of low-level system
|
The util-linux package contains a large variety of low-level system
|
||||||
|
@ -326,9 +506,14 @@ unset LINGUAS || :
|
||||||
# unfortunately, we did changes to build-system
|
# unfortunately, we did changes to build-system
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
|
|
||||||
|
# we modify .po files by RHEL patches
|
||||||
|
rm -f po/stamp*
|
||||||
|
|
||||||
export CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $RPM_OPT_FLAGS"
|
export CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $RPM_OPT_FLAGS"
|
||||||
export SUID_CFLAGS="-fpie"
|
export SUID_CFLAGS="-fpie"
|
||||||
export SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now"
|
export SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now"
|
||||||
|
export DAEMON_CFLAGS="$SUID_CFLAGS"
|
||||||
|
export DAEMON_LDFLAGS="$SUID_LDFLAGS"
|
||||||
%configure \
|
%configure \
|
||||||
--with-systemdsystemunitdir=%{_unitdir} \
|
--with-systemdsystemunitdir=%{_unitdir} \
|
||||||
--disable-silent-rules \
|
--disable-silent-rules \
|
||||||
|
@ -456,8 +641,7 @@ chmod 644 misc-utils/getopt-*.{bash,tcsh}
|
||||||
rm -f ${RPM_BUILD_ROOT}%{_datadir}/getopt/*
|
rm -f ${RPM_BUILD_ROOT}%{_datadir}/getopt/*
|
||||||
rmdir ${RPM_BUILD_ROOT}%{_datadir}/getopt
|
rmdir ${RPM_BUILD_ROOT}%{_datadir}/getopt
|
||||||
|
|
||||||
ln -sf /proc/mounts %{buildroot}/etc/mtab
|
ln -sf ../proc/self/mounts %{buildroot}/etc/mtab
|
||||||
|
|
||||||
|
|
||||||
# remove static libs
|
# remove static libs
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/lib{uuid,blkid,mount}.a
|
rm -f $RPM_BUILD_ROOT%{_libdir}/lib{uuid,blkid,mount}.a
|
||||||
|
@ -495,7 +679,7 @@ if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [ ! -L /etc/mtab ]; then
|
if [ ! -L /etc/mtab ]; then
|
||||||
ln -fs /proc/mounts /etc/mtab
|
ln -sf ../proc/self/mounts /etc/mtab || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
%post -n libblkid
|
%post -n libblkid
|
||||||
|
@ -580,6 +764,7 @@ fi
|
||||||
%{_bindir}/colcrt
|
%{_bindir}/colcrt
|
||||||
%{_bindir}/colrm
|
%{_bindir}/colrm
|
||||||
%{_bindir}/column
|
%{_bindir}/column
|
||||||
|
%{_bindir}/chmem
|
||||||
%{_bindir}/dmesg
|
%{_bindir}/dmesg
|
||||||
%{_bindir}/eject
|
%{_bindir}/eject
|
||||||
%{_bindir}/fallocate
|
%{_bindir}/fallocate
|
||||||
|
@ -593,6 +778,9 @@ fi
|
||||||
%{_bindir}/ipcs
|
%{_bindir}/ipcs
|
||||||
%{_bindir}/isosize
|
%{_bindir}/isosize
|
||||||
%{_bindir}/kill
|
%{_bindir}/kill
|
||||||
|
%{_bindir}/lsipc
|
||||||
|
%{_bindir}/lsns
|
||||||
|
%{_bindir}/lsmem
|
||||||
%{_bindir}/logger
|
%{_bindir}/logger
|
||||||
%{_bindir}/look
|
%{_bindir}/look
|
||||||
%{_bindir}/lsblk
|
%{_bindir}/lsblk
|
||||||
|
@ -647,6 +835,8 @@ fi
|
||||||
%{_mandir}/man1/look.1*
|
%{_mandir}/man1/look.1*
|
||||||
%{_mandir}/man1/lscpu.1*
|
%{_mandir}/man1/lscpu.1*
|
||||||
%{_mandir}/man1/lslogins.1*
|
%{_mandir}/man1/lslogins.1*
|
||||||
|
%{_mandir}/man1/lsmem.1*
|
||||||
|
%{_mandir}/man1/lsipc.1*
|
||||||
%{_mandir}/man1/mcookie.1*
|
%{_mandir}/man1/mcookie.1*
|
||||||
%{_mandir}/man1/more.1*
|
%{_mandir}/man1/more.1*
|
||||||
%{_mandir}/man1/mountpoint.1*
|
%{_mandir}/man1/mountpoint.1*
|
||||||
|
@ -678,6 +868,7 @@ fi
|
||||||
%{_mandir}/man8/blkid.8*
|
%{_mandir}/man8/blkid.8*
|
||||||
%{_mandir}/man8/blockdev.8*
|
%{_mandir}/man8/blockdev.8*
|
||||||
%{_mandir}/man8/chcpu.8*
|
%{_mandir}/man8/chcpu.8*
|
||||||
|
%{_mandir}/man8/chmem.8*
|
||||||
%{_mandir}/man8/ctrlaltdel.8*
|
%{_mandir}/man8/ctrlaltdel.8*
|
||||||
%{_mandir}/man8/delpart.8*
|
%{_mandir}/man8/delpart.8*
|
||||||
%{_mandir}/man8/fdisk.8*
|
%{_mandir}/man8/fdisk.8*
|
||||||
|
@ -692,7 +883,8 @@ fi
|
||||||
%{_mandir}/man8/ldattach.8*
|
%{_mandir}/man8/ldattach.8*
|
||||||
%{_mandir}/man8/losetup.8*
|
%{_mandir}/man8/losetup.8*
|
||||||
%{_mandir}/man8/lsblk.8*
|
%{_mandir}/man8/lsblk.8*
|
||||||
%{_mandir}/man8/lslocks.8.gz
|
%{_mandir}/man8/lslocks.8*
|
||||||
|
%{_mandir}/man8/lsns.8*
|
||||||
%{_mandir}/man8/mkfs.8*
|
%{_mandir}/man8/mkfs.8*
|
||||||
%{_mandir}/man8/mkfs.cramfs.8*
|
%{_mandir}/man8/mkfs.cramfs.8*
|
||||||
%{_mandir}/man8/mkfs.minix.8*
|
%{_mandir}/man8/mkfs.minix.8*
|
||||||
|
@ -707,14 +899,15 @@ fi
|
||||||
%{_mandir}/man8/resizepart.8*
|
%{_mandir}/man8/resizepart.8*
|
||||||
%{_mandir}/man8/rtcwake.8*
|
%{_mandir}/man8/rtcwake.8*
|
||||||
%{_mandir}/man8/setarch.8*
|
%{_mandir}/man8/setarch.8*
|
||||||
%{_mandir}/man8/sulogin.8.gz
|
%{_mandir}/man8/sulogin.8*
|
||||||
%{_mandir}/man8/swaplabel.8*
|
%{_mandir}/man8/swaplabel.8*
|
||||||
%{_mandir}/man8/swapoff.8*
|
%{_mandir}/man8/swapoff.8*
|
||||||
%{_mandir}/man8/swapon.8*
|
%{_mandir}/man8/swapon.8*
|
||||||
%{_mandir}/man8/switch_root.8*
|
%{_mandir}/man8/switch_root.8*
|
||||||
%{_mandir}/man8/umount.8*
|
%{_mandir}/man8/umount.8*
|
||||||
%{_mandir}/man8/wdctl.8.gz
|
%{_mandir}/man8/wdctl.8*
|
||||||
%{_mandir}/man8/wipefs.8*
|
%{_mandir}/man8/wipefs.8*
|
||||||
|
%{_mandir}/man8/zramctl.8*
|
||||||
%{_sbindir}/addpart
|
%{_sbindir}/addpart
|
||||||
%{_sbindir}/agetty
|
%{_sbindir}/agetty
|
||||||
%{_sbindir}/blkdiscard
|
%{_sbindir}/blkdiscard
|
||||||
|
@ -749,7 +942,7 @@ fi
|
||||||
%{_sbindir}/swapon
|
%{_sbindir}/swapon
|
||||||
%{_sbindir}/switch_root
|
%{_sbindir}/switch_root
|
||||||
%{_sbindir}/wipefs
|
%{_sbindir}/wipefs
|
||||||
|
%{_sbindir}/zramctl
|
||||||
%{compldir}/addpart
|
%{compldir}/addpart
|
||||||
%{compldir}/blkdiscard
|
%{compldir}/blkdiscard
|
||||||
%{compldir}/blkid
|
%{compldir}/blkid
|
||||||
|
@ -828,6 +1021,7 @@ fi
|
||||||
%{compldir}/whereis
|
%{compldir}/whereis
|
||||||
%{compldir}/wipefs
|
%{compldir}/wipefs
|
||||||
%{compldir}/write
|
%{compldir}/write
|
||||||
|
%{compldir}/zramctl
|
||||||
|
|
||||||
%ifnarch s390 s390x
|
%ifnarch s390 s390x
|
||||||
%{_sbindir}/clock
|
%{_sbindir}/clock
|
||||||
|
@ -924,11 +1118,140 @@ fi
|
||||||
%{_libdir}/pkgconfig/uuid.pc
|
%{_libdir}/pkgconfig/uuid.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Mar 16 2016 Karel Zak <kzak@redhat.com> 2.23.2-26.el7_2.2
|
* Fri Feb 02 2018 Karel Zak <kzak@redhat.com> 2.23.2-52
|
||||||
- fix #1317953 - lslogins crash when executed with buggy username
|
- fix #1534893 - RHEL7: util-linux: mount/unmount ASLR bypass via environment variable in libmount
|
||||||
|
|
||||||
* Thu Jan 28 2016 Karel Zak <kzak@redhat.com> 2.23.2-26.el7_2.1
|
* Wed Jan 31 2018 Karel Zak <kzak@redhat.com> 2.23.2-51
|
||||||
- fix #1302332 - [libblkid] Failed to get offset of the xfs_external_log signature
|
- fix #1538545 - SELinux error creating swap file
|
||||||
|
|
||||||
|
* Tue Jan 23 2018 Karel Zak <kzak@redhat.com> 2.23.2-50
|
||||||
|
- fix #1534893 - RHEL7: util-linux: mount/unmount ASLR bypass via environment variable in libmount
|
||||||
|
|
||||||
|
* Mon Dec 11 2017 Karel Zak <kzak@redhat.com> 2.23.2-49
|
||||||
|
- fix #1520906 - make hostname in login(1) prompt optional
|
||||||
|
- fix #1521163 - [RFE] blkid can identify magic number and UUID of VDO volume
|
||||||
|
|
||||||
|
* Thu Nov 09 2017 Karel Zak <kzak@redhat.com> 2.23.2-48
|
||||||
|
- improve libmount eaccess test (#1499760)
|
||||||
|
|
||||||
|
* Wed Nov 08 2017 Karel Zak <kzak@redhat.com> 2.23.2-47
|
||||||
|
- improve lsmem (#1496421)
|
||||||
|
|
||||||
|
* Mon Oct 23 2017 Karel Zak <kzak@redhat.com> 2.23.2-46
|
||||||
|
- fix #1496421 - Move lsmem and chmem to util-linux
|
||||||
|
|
||||||
|
* Tue Oct 17 2017 Karel Zak <kzak@redhat.com> 2.23.2-45
|
||||||
|
- fix #1501953 - blkid shows wrong return code on failure with ambivalent results
|
||||||
|
- fix #1486777 - wipefs printing duplicate gpt clear messages
|
||||||
|
- fix #1454652 - fix test suite
|
||||||
|
|
||||||
|
* Mon Oct 16 2017 Karel Zak <kzak@redhat.com> 2.23.2-44
|
||||||
|
- fix #1478002 - systemd read-only container produces errors
|
||||||
|
- fix #1499760 - gvfs-udisks2-volume-monitor generates huge amount of audit log with access denied messages
|
||||||
|
- fix #1498462 - agetty not parsing /etc/os-release correctly when processing /etc/issue
|
||||||
|
- fix #1490984 - Please update fdisk's manual page
|
||||||
|
- fix #1487031 - [GSS][RFE]The Ceph disk type is unknown then we run the command "fdisk -l"
|
||||||
|
- fix #1468646 - lscpu output missing Hypervisor
|
||||||
|
- fix #1455398 - flock --timeout=0 doesn't work on RHEL7
|
||||||
|
- fix #1336432 - journald: SYSLOG_IDENTIFIER is invalid when running logger
|
||||||
|
- fix #1427500 - util-linux: script does not retry on EINTR when logging command output
|
||||||
|
- fix #1336432 - journald: SYSLOG_IDENTIFIER is invalid when running logger
|
||||||
|
- fix #1296233 - login(1) writes 0.0.0.0 IP address to wtmp when executed with "-h <ipv4-mapping-to-ipv6>" hostname
|
||||||
|
|
||||||
|
* Thu Jun 01 2017 Karel Zak <kzak@redhat.com> 2.23.2-43
|
||||||
|
- fix #1457744 - lscpu -e get crashed after offline one host cpu on amd machine
|
||||||
|
|
||||||
|
* Wed May 31 2017 Karel Zak <kzak@redhat.com> 2.23.2-42
|
||||||
|
- fix #1455664 - lscpu causes kernel panic on HPE Comanche / Cavium ThunderX2 (cn99xx)
|
||||||
|
|
||||||
|
* Tue May 23 2017 Karel Zak <kzak@redhat.com> 2.23.2-41
|
||||||
|
- fix #1451704 - IMSM RAID on 4k disks not assembled on boot
|
||||||
|
- force gettext messages refresh (for #1358097 bugfix)
|
||||||
|
|
||||||
|
* Wed May 10 2017 Karel Zak <kzak@redhat.com> 2.23.2-40
|
||||||
|
- improve libfdisk GPT UUID printing (#1344726)
|
||||||
|
|
||||||
|
* Tue Apr 04 2017 Karel Zak <kzak@redhat.com> 2.23.2-39
|
||||||
|
- update package regression tests (due to #1360764 #1397709)
|
||||||
|
- improve zramctl man page (#1358755)
|
||||||
|
|
||||||
|
* Tue Apr 04 2017 Karel Zak <kzak@redhat.com> 2.23.2-38
|
||||||
|
- improve fdisk menu for GPT (#1344720)
|
||||||
|
|
||||||
|
* Thu Mar 30 2017 Karel Zak <kzak@redhat.com> 2.23.2-37
|
||||||
|
- improve zram mm_stat parser (#1358755)
|
||||||
|
|
||||||
|
* Wed Mar 22 2017 Karel Zak <kzak@redhat.com> 2.23.2-36
|
||||||
|
- fix #1344102 - fdisk does not handle 4kN devices correctly in 'Blocks' calculation
|
||||||
|
- fix #1344720 - when fdisk detects gpt table, expected menu items seem to be missing in the 'm' output
|
||||||
|
- fix #1323916 - logger unnecessarily splits messages sent via stdin into 1024 byte chunks
|
||||||
|
- fix #1344726 - [RFE] fdisk: output UID from gpt in fdisk when detecting that a gpt partition table is present
|
||||||
|
- fix #1362662 - fdisk -l fails/stops on first passive/not ready device, works on RHEL6
|
||||||
|
- fix #1369436 - losetup man page incorrect syntax for Setup loop device
|
||||||
|
- fix #1392656 - [LLNL 7.4 Bug] fix buffer overflows in util-linux with upstream patch
|
||||||
|
- fix #1370959 - [FJ7.3 Bug]: man 8 umount is wrong.
|
||||||
|
- fix #1357746 - mount -av" report NFS "successfully mounted" but it is not.
|
||||||
|
- fix #1417722 - umount -a results in selinux being reported as Disabled
|
||||||
|
- fix #1402825 - RHEL7: "sfdisk -s" can't list the disk size
|
||||||
|
- fix #1403973 - /usr/bin/more crash on repeat search on failed regex match
|
||||||
|
- fix #1403971 - /usr/bin/more crash in end_it due to double free
|
||||||
|
- fix #1358095 - ipcs shows wrong gid information
|
||||||
|
- fix #1358097 - ipcs shows strange status message in ja locale
|
||||||
|
- fix #1378100 - fix swapon discard option parsing
|
||||||
|
- fix #1416467 - [RFE] Add support for posix_fallocate(3) call in fallocate(1) utility
|
||||||
|
- fix #1358755 - Backport request for zramctl on util-linux v2.23.2
|
||||||
|
- fix #1392661 - [LLNL 7.4 Bug] add zfs patches to util-linux
|
||||||
|
- fix #1360764 - SMT: "Threads Per Core" will automatically change when odd or even number of vcpu are enabled online.
|
||||||
|
- fix #1397709 - [7.4 FEAT] Refresh code for lscpu to support s390x cpu topology
|
||||||
|
- fix #1402183 - [HPE 7.3 Bug] fdisk -l does not list non-BTT NVDIMM devices
|
||||||
|
|
||||||
|
* Wed Feb 8 2017 Karel Zak <kzak@redhat.com> 2.23.2-35
|
||||||
|
* fix #1419474 - su: properly clear child PID
|
||||||
|
|
||||||
|
* Mon Jan 23 2017 Karel Zak <kzak@redhat.com> 2.23.2-34
|
||||||
|
- fix #1405238 - findmnt --target behaviour changed in 7.3, shows all mount-points in chroot
|
||||||
|
|
||||||
|
* Tue Jul 12 2016 Karel Zak <kzak@redhat.com> 2.23.2-33
|
||||||
|
- improve patch for #1007734 (libblkid realpaths)
|
||||||
|
|
||||||
|
* Tue Jul 12 2016 Karel Zak <kzak@redhat.com> 2.23.2-32
|
||||||
|
- improve patch for chrt(1) deadline support #1298384
|
||||||
|
- fix #1007734 - blkid shows devices as /dev/block/$MAJOR:$MINOR
|
||||||
|
- fix #1349536 - Extended partition loop in MBR partition table leads to DOS
|
||||||
|
|
||||||
|
* Mon Jul 04 2016 Karel Zak <kzak@redhat.com> 2.23.2-31
|
||||||
|
- improve spec file for #1092520
|
||||||
|
|
||||||
|
* Fri Jul 01 2016 Karel Zak <kzak@redhat.com> 2.23.2-30
|
||||||
|
- improve patch for chrt(1) deadline support #1298384
|
||||||
|
- improve regression tests
|
||||||
|
|
||||||
|
* Thu Jun 30 2016 Karel Zak <kzak@redhat.com> 2.23.2-29
|
||||||
|
- fix #1029385 - lack of non-ascii support
|
||||||
|
- fix #1092520 - util-linux - PIE and RELRO check
|
||||||
|
- fix #1153770 - backport lsipc
|
||||||
|
- fix #1248003 - mount only parses <param>=<value> lines from fstab fs_spec field available from blkid block device
|
||||||
|
- fix #1271850 - mount -a doesn't catch a typo in /etc/fstab and a typo in /etc/fstab can make a system not reboot properly
|
||||||
|
- fix #1281839 - [RFE]Bind mounts should be handled gracefully by the operating system
|
||||||
|
- fix #1290689 - util-linux: /bin/login does not retry getpwnam_r with larger buffers, leading to login failure
|
||||||
|
- fix #1296366 - Bash completion for more(1) handles file names with spaces incorrectly
|
||||||
|
- fix #1296521 - RHEL7: update audit event in hwclock
|
||||||
|
- fix #1298384 - RFE: add SCHED_DEADLINE support to chrt
|
||||||
|
- fix #1304246 - fdisk 'f' subcommand updates partition ranges wrongly
|
||||||
|
- fix #1304426 - [rfe] /bin/su should be improved to reduce stack use
|
||||||
|
- fix #1326615 - util-linux/lscpu: Fix model and model name on Power Systems
|
||||||
|
- fix #1327886 - Backport blkdiscard's "-z" flag to RHEL
|
||||||
|
- fix #1332084 - [RFE] Inclusion of lsns command in util-linux Package
|
||||||
|
- fix #1335671 - extra quotes around UUID confuses findfs in RHEL (but not in Fedora)
|
||||||
|
- fix #1344222 - logger port option in help is misleading
|
||||||
|
- fix #1344482 - util-linux fails valid_pmbr() size checks if device is > 2.14TB, Device label type: dos instead of gpt
|
||||||
|
- fix #587393 - [RFE] Make sure util-linux is ready for writable overlays
|
||||||
|
|
||||||
|
* Wed Mar 16 2016 Karel Zak <kzak@redhat.com> 2.23.2-28
|
||||||
|
- fix #1291554 - lslogins crash when executed with buggy username
|
||||||
|
|
||||||
|
* Thu Jan 28 2016 Karel Zak <kzak@redhat.com> 2.23.2-27
|
||||||
|
- fix #1301091 - [libblkid] Failed to get offset of the xfs_external_log signature
|
||||||
|
|
||||||
* Fri Aug 21 2015 Karel Zak <kzak@redhat.com> 2.23.2-26
|
* Fri Aug 21 2015 Karel Zak <kzak@redhat.com> 2.23.2-26
|
||||||
- fix #1182831 - blkid incorrectly detects boot sec + MBR as FAT
|
- fix #1182831 - blkid incorrectly detects boot sec + MBR as FAT
|
||||||
|
|
Loading…
Reference in New Issue