IO buffer allocation cleanup

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/memory.c b/memory.c
index b5a71d5..f67dd6d 100644
--- a/memory.c
+++ b/memory.c
@@ -53,72 +53,99 @@
 	return 0;
 }
 
+static int alloc_mem_shm(struct thread_data *td)
+{
+	int flags = IPC_CREAT | SHM_R | SHM_W;
+
+	if (td->o.mem_type == MEM_SHMHUGE)
+		flags |= SHM_HUGETLB;
+
+	td->shm_id = shmget(IPC_PRIVATE, td->orig_buffer_size, flags);
+	if (td->shm_id < 0) {
+		td_verror(td, errno, "shmget");
+		if (geteuid() != 0 && errno == ENOMEM)
+			log_err("fio: you may need to run this job as root\n");
+		if (errno == EINVAL && td->o.mem_type == MEM_SHMHUGE)
+			log_err("fio: check that you have free huge pages and that hugepage-size is correct.\n");
+		
+		return 1;
+	}
+
+	td->orig_buffer = shmat(td->shm_id, NULL, 0);
+	if (td->orig_buffer == (void *) -1) {
+		td_verror(td, errno, "shmat");
+		td->orig_buffer = NULL;
+		return 1;
+	}
+
+	return 0;
+}
+
+static int alloc_mem_mmap(struct thread_data *td)
+{
+	int flags = MAP_PRIVATE;
+
+	td->mmapfd = 0;
+
+	if (td->mmapfile) {
+		td->mmapfd = open(td->mmapfile, O_RDWR|O_CREAT, 0644);
+
+		if (td->mmapfd < 0) {
+			td_verror(td, errno, "open mmap file");
+			td->orig_buffer = NULL;
+			return 1;
+		}
+		if (ftruncate(td->mmapfd, td->orig_buffer_size) < 0) {
+			td_verror(td, errno, "truncate mmap file");
+			td->orig_buffer = NULL;
+			return 1;
+		}
+	} else
+		flags |= OS_MAP_ANON;
+
+	td->orig_buffer = mmap(NULL, td->orig_buffer_size, PROT_READ | PROT_WRITE, flags, td->mmapfd, 0);
+	if (td->orig_buffer == MAP_FAILED) {
+		td_verror(td, errno, "mmap");
+		td->orig_buffer = NULL;
+		if (td->mmapfd) {
+			close(td->mmapfd);
+			unlink(td->mmapfile);
+		}
+			
+		return 1;
+	}
+
+	return 0;
+}
+
+static int alloc_mem_malloc(struct thread_data *td)
+{
+	td->orig_buffer = malloc(td->orig_buffer_size);
+	if (td->orig_buffer)
+		return 0;
+
+	return 1;
+}
+
 /*
  * Setup the buffer area we need for io.
  */
 int allocate_io_mem(struct thread_data *td)
 {
+	int ret = 0;
+
 	if (td->o.mem_type == MEM_MALLOC)
-		td->orig_buffer = malloc(td->orig_buffer_size);
-	else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE) {
-		int flags = IPC_CREAT | SHM_R | SHM_W;
-
-		if (td->o.mem_type == MEM_SHMHUGE)
-			flags |= SHM_HUGETLB;
-
-		td->shm_id = shmget(IPC_PRIVATE, td->orig_buffer_size, flags);
-		if (td->shm_id < 0) {
-			td_verror(td, errno, "shmget");
-			if (geteuid() != 0 && errno == ENOMEM)
-				log_err("fio: you may need to run this job as root\n");
-			if (errno == EINVAL && td->o.mem_type == MEM_SHMHUGE)
-				log_err("fio: check that you have free huge pages and that hugepage-size is correct.\n");
-			
-			return 1;
-		}
-
-		td->orig_buffer = shmat(td->shm_id, NULL, 0);
-		if (td->orig_buffer == (void *) -1) {
-			td_verror(td, errno, "shmat");
-			td->orig_buffer = NULL;
-			return 1;
-		}
-	} else if (td->o.mem_type == MEM_MMAP ||
-		   td->o.mem_type == MEM_MMAPHUGE) {
-		int flags = MAP_PRIVATE;
-
-		td->mmapfd = 0;
-
-		if (td->mmapfile) {
-			td->mmapfd = open(td->mmapfile, O_RDWR|O_CREAT, 0644);
-
-			if (td->mmapfd < 0) {
-				td_verror(td, errno, "open mmap file");
-				td->orig_buffer = NULL;
-				return 1;
-			}
-			if (ftruncate(td->mmapfd, td->orig_buffer_size) < 0) {
-				td_verror(td, errno, "truncate mmap file");
-				td->orig_buffer = NULL;
-				return 1;
-			}
-		} else
-			flags |= OS_MAP_ANON;
-
-		td->orig_buffer = mmap(NULL, td->orig_buffer_size, PROT_READ | PROT_WRITE, flags, td->mmapfd, 0);
-		if (td->orig_buffer == MAP_FAILED) {
-			td_verror(td, errno, "mmap");
-			td->orig_buffer = NULL;
-			if (td->mmapfd) {
-				close(td->mmapfd);
-				unlink(td->mmapfile);
-			}
-				
-			return 1;
-		}
+		ret = alloc_mem_malloc(td);
+	else if (td->o.mem_type == MEM_SHM || td->o.mem_type == MEM_SHMHUGE)
+		ret = alloc_mem_shm(td);
+	else if (td->o.mem_type == MEM_MMAP || td->o.mem_type == MEM_MMAPHUGE)
+		ret = alloc_mem_mmap(td);
+	else {
+		log_err("fio: bad mem type: %d\n", td->o.mem_type);
+		ret = 1;
 	}
 
-	return 0;
+	return ret;
 }
 
 void free_io_mem(struct thread_data *td)