[mdadm PATCH 1/2] Check hostname file empty or not when creating raid device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If /etc/hostname is empty and the hostname is decided by DHCP. There is a risk that the raid
device can't be active after boot. Maybe the network starts after storage. The system can
detect disk first and udev rules are triggered. It wants to assemble the raid device. But the
network hasn't started successfully. So the hostname is not specified. The raid will be treat
as a foreign raid.

So give a warning message if /etc/hostname is empty when creating a raid device.

Signed-off-by: Xiao Ni <xni@xxxxxxxxxx>
---
 mdadm.c |  3 +++
 mdadm.h |  1 +
 util.c  | 19 +++++++++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/mdadm.c b/mdadm.c
index 1b3467f..e551958 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -1408,6 +1408,9 @@ int main(int argc, char *argv[])
 	if (c.homehost == NULL && c.require_homehost)
 		c.homehost = conf_get_homehost(&c.require_homehost);
 	if (c.homehost == NULL || strcasecmp(c.homehost, "<system>") == 0) {
+		if (check_hostname())
+			pr_err("Note: The file /etc/hostname is empty. There is a risk the raid\n"
+				"      can't be active after boot\n");
 		if (gethostname(sys_hostname, sizeof(sys_hostname)) == 0) {
 			sys_hostname[sizeof(sys_hostname)-1] = 0;
 			c.homehost = sys_hostname;
diff --git a/mdadm.h b/mdadm.h
index 399478b..3ef1209 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1480,6 +1480,7 @@ extern int parse_cluster_confirm_arg(char *inp, char **devname, int *slot);
 extern int check_ext2(int fd, char *name);
 extern int check_reiser(int fd, char *name);
 extern int check_raid(int fd, char *name);
+extern int check_hostname(void);
 extern int check_partitions(int fd, char *dname,
 			    unsigned long long freesize,
 			    unsigned long long size);
diff --git a/util.c b/util.c
index 579dd42..de5bad0 100644
--- a/util.c
+++ b/util.c
@@ -694,6 +694,25 @@ int check_raid(int fd, char *name)
 	return 1;
 }
 
+/* It checks /etc/hostname has value or not */
+int check_hostname()
+{
+	int fd, ret = 0;
+	char buf[256];
+
+	fd = open("/etc/hostname", O_RDONLY);
+	if (fd < 0) {
+		ret = 1;
+		goto out;
+	}
+
+	if (read(fd, buf, sizeof(buf)) == 0)
+		ret = 1;
+out:
+	close(fd);
+	return ret;
+}
+
 int fstat_is_blkdev(int fd, char *devname, dev_t *rdev)
 {
 	struct stat stb;
-- 
2.7.5




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux