diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index bfd29c0c60fb5ba46b2ec60b5f1a90602975b1cc..ed3ba7b6248156502e701aadb2e346c00e62c4dc 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -193,7 +193,6 @@ static const char *backend_options = "--single -F -O -j -c search_path=pg_catalo
 
 static const char *const subdirs[] = {
 	"global",
-	"pg_xlog",
 	"pg_xlog/archive_status",
 	"pg_clog",
 	"pg_commit_ts",
@@ -280,7 +279,7 @@ void		setup_locale_encoding(void);
 void		setup_signals(void);
 void		setup_text_search(void);
 void		create_data_directory(void);
-void		create_xlog_symlink(void);
+void		create_xlog_or_symlink(void);
 void		warn_on_mount_point(int error);
 void		initialize_data_directory(void);
 
@@ -2948,13 +2947,17 @@ create_data_directory(void)
 }
 
 
+/* Create transaction log directory, and symlink if required */
 void
-create_xlog_symlink(void)
+create_xlog_or_symlink(void)
 {
-	/* Create transaction log symlink, if required */
+	char	   *subdirloc;
+
+	/* form name of the place for the subdirectory or symlink */
+	subdirloc = psprintf("%s/pg_xlog", pg_data);
+
 	if (strcmp(xlog_dir, "") != 0)
 	{
-		char	   *linkloc;
 		int			ret;
 
 		/* clean up xlog directory name, check it's absolute */
@@ -3027,22 +3030,30 @@ create_xlog_symlink(void)
 				exit_nicely();
 		}
 
-		/* form name of the place where the symlink must go */
-		linkloc = psprintf("%s/pg_xlog", pg_data);
-
 #ifdef HAVE_SYMLINK
-		if (symlink(xlog_dir, linkloc) != 0)
+		if (symlink(xlog_dir, subdirloc) != 0)
 		{
 			fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"),
-					progname, linkloc, strerror(errno));
+					progname, subdirloc, strerror(errno));
 			exit_nicely();
 		}
 #else
 		fprintf(stderr, _("%s: symlinks are not supported on this platform"));
 		exit_nicely();
 #endif
-		free(linkloc);
 	}
+	else
+	{
+		/* Without -X option, just make the subdirectory normally */
+		if (mkdir(subdirloc, S_IRWXU) < 0)
+		{
+			fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
+					progname, subdirloc, strerror(errno));
+			exit_nicely();
+		}
+	}
+
+	free(subdirloc);
 }
 
 
@@ -3074,9 +3085,9 @@ initialize_data_directory(void)
 
 	create_data_directory();
 
-	create_xlog_symlink();
+	create_xlog_or_symlink();
 
-	/* Create required subdirectories */
+	/* Create required subdirectories (other than pg_xlog) */
 	printf(_("creating subdirectories ... "));
 	fflush(stdout);