mdev: if device was moved at creation, at removal coreectly remove
 it from moved location and also remove symlinks to it

function                                             old     new   delta
build_alias                                            -      78     +78
mdev_main                                            505     503      -2
make_device                                         1300    1294      -6
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 78/-8)              Total: 70 bytes

diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index a4c0520..4ac5c43 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -35,6 +35,30 @@
 	return s;
 }
 
+/* Builds an alias path.
+ * This function potentionally reallocates the alias parameter.
+ */
+static char *build_alias(char *alias, const char *device_name)
+{
+	char *dest;
+
+	/* ">bar/": rename to bar/device_name */
+	/* ">bar[/]baz": rename to bar[/]baz */
+	dest = strrchr(alias, '/');
+	if (dest) { /* ">bar/[baz]" ? */
+		*dest = '\0'; /* mkdir bar */
+		bb_make_directory(alias, 0755, FILEUTILS_RECUR);
+		*dest = '/';
+		if (dest[1] == '\0') { /* ">bar/" => ">bar/device_name" */
+			dest = alias;
+			alias = concat_path_file(alias, device_name);
+			free(dest);
+		}
+	}
+
+	return alias;
+}
+
 /* mknod in /dev based on a path like "/sys/block/hda/hda1" */
 /* NB: "mdev -s" may call us many times, do not leak memory/fds! */
 static void make_device(char *path, int delete)
@@ -257,21 +281,7 @@
 			chown(device_name, uid, gid);
 
 			if (ENABLE_FEATURE_MDEV_RENAME && alias) {
-				char *dest;
-
-				/* ">bar/": rename to bar/device_name */
-				/* ">bar[/]baz": rename to bar[/]baz */
-				dest = strrchr(alias, '/');
-				if (dest) { /* ">bar/[baz]" ? */
-					*dest = '\0'; /* mkdir bar */
-					bb_make_directory(alias, 0755, FILEUTILS_RECUR);
-					*dest = '/';
-					if (dest[1] == '\0') { /* ">bar/" => ">bar/device_name" */
-						dest = alias;
-						alias = concat_path_file(alias, device_name);
-						free(dest);
-					}
-				}
+				alias = build_alias(alias, device_name);
 
 				/* move the device, and optionally
 				 * make a symlink to moved device node */
@@ -295,8 +305,16 @@
 		free(command);
 	}
 
-	if (delete)
+	if (delete) {
 		unlink(device_name);
+		/* At creation time, device might have been moved
+		 * and a symlink might have been created. Undo that. */
+		if (ENABLE_FEATURE_MDEV_RENAME && alias) {
+			alias = build_alias(alias, device_name);
+			unlink(alias);
+			free(alias);
+		}
+	}
 }
 
 /* File callback for /sys/ traversal */
@@ -309,7 +327,7 @@
 	char *scratch = userData;
 
 	/* len check is for paranoid reasons */
-	if (strcmp(fileName + len, "/dev") || len >= PATH_MAX)
+	if (strcmp(fileName + len, "/dev") != 0 || len >= PATH_MAX)
 		return FALSE;
 
 	strcpy(scratch, fileName);
@@ -387,7 +405,7 @@
 }
 
 int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int mdev_main(int argc, char **argv)
+int mdev_main(int argc UNUSED_PARAM, char **argv)
 {
 	char *action;
 	char *env_path;
@@ -410,7 +428,7 @@
 
 	xchdir("/dev");
 
-	if (argc == 2 && !strcmp(argv[1], "-s")) {
+	if (argv[1] && !strcmp(argv[1], "-s")) {
 		/* Scan:
 		 * mdev -s
 		 */