13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * inline.c --- Includes the inlined functions defined in the header
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 	files as standalone functions, in case the application program
43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 	is compiled with inlining turned off.
5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright (C) 1993, 1994 Theodore Ts'o.
719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o *
819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header%
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
1119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header%
123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
14182acd17bef0cf8dcb66568448a528abb1dfcd71Andreas Dilger#ifndef _XOPEN_SOURCE
15182acd17bef0cf8dcb66568448a528abb1dfcd71Andreas Dilger#define _XOPEN_SOURCE 600	/* for posix_memalign() */
16182acd17bef0cf8dcb66568448a528abb1dfcd71Andreas Dilger#endif
173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
18d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h"
193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h>
203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h>
214cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#if HAVE_UNISTD_H
223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h>
234cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#endif
243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h>
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <time.h>
261d2ff46ae7533ffd038534b189f272d2a4122e4eTheodore Ts'o#if HAVE_SYS_STAT_H
273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/stat.h>
281d2ff46ae7533ffd038534b189f272d2a4122e4eTheodore Ts'o#endif
291d2ff46ae7533ffd038534b189f272d2a4122e4eTheodore Ts'o#if HAVE_SYS_TYPES_H
303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/types.h>
311d2ff46ae7533ffd038534b189f272d2a4122e4eTheodore Ts'o#endif
323a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o#if HAVE_MALLOC_H
333a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o#include <malloc.h>
343a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o#endif
353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
36b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_fs.h"
373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define INCLUDE_INLINE_FUNCS
383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs.h"
393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
407f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o/*
417f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o * We used to define this as an inline, but since we are now using
427f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o * autoconf-defined #ifdef's, we need to export this as a
437f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o * library-provided function exclusively.
447f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o */
457f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'oerrcode_t ext2fs_get_memalign(unsigned long size,
467f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o			      unsigned long align, void *ptr)
477f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o{
48cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o	errcode_t retval = 0;
493a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o	void **p = ptr;
507f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o
51d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (align < 8)
527f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o		align = 8;
537f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#ifdef HAVE_POSIX_MEMALIGN
543a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o	retval = posix_memalign(p, align, size);
55cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o	if (retval == ENOMEM)
56cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o		return EXT2_ET_NO_MEMORY;
57cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o#else  /* !HAVE_POSIX_MEMALIGN */
587f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#ifdef HAVE_MEMALIGN
593a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o	*p = memalign(align, size);
603a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o	if (*p == NULL) {
617f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o		if (errno)
627f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o			return errno;
637f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o		else
647f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o			return EXT2_ET_NO_MEMORY;
657f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o	}
66cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o#else  /* !HAVE_MEMALIGN */
67d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#ifdef HAVE_VALLOC
68d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (align > sizeof(long long))
69d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		*p = valloc(size);
70d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	else
71d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#endif
72d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		*p = malloc(size);
73d4e5abfb1bb990a029005c1a801961fc1a0ba866Adrien Schildknecht	if ((uintptr_t) *p & (align - 1)) {
74d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		free(*p);
75d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		*p = 0;
76d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	}
77d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (*p == 0)
78d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		return EXT2_ET_NO_MEMORY;
79cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o#endif	/* HAVE_MEMALIGN */
80cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o#endif	/* HAVE_POSIX_MEMALIGN */
81cf491d3a64ac0d6c1349e9672a5edaca3901300cTheodore Ts'o	return retval;
827f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o}
837f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o
84d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#ifdef DEBUG
85d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'ostatic int isaligned(void *ptr, unsigned long align)
86d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{
87d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	return (((unsigned long) ptr & (align - 1)) == 0);
88d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o}
89d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o
90d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'ostatic errcode_t test_memalign(unsigned long align)
91d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{
92d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	void *ptr = 0;
93d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	errcode_t retval;
94d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o
95d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	retval = ext2fs_get_memalign(32, align, &ptr);
96d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (!retval && !isaligned(ptr, align))
97d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		retval = EINVAL;
98d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	free(ptr);
99f797cf3e37b476aac593fe9a9f4630448d335332Andreas Dilger	printf("tst_memalign(%lu) is %s\n", align,
100d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	       retval ? error_message(retval) : "OK");
101d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	return retval;
102d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o}
103d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o
104d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'oint main(int argc, char **argv)
105d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{
106d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	int err = 0;
107d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o
108d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (test_memalign(4))
109d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		err++;
110d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (test_memalign(32))
111d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		err++;
112d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (test_memalign(1024))
113d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		err++;
114d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	if (test_memalign(4096))
115d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o		err++;
116d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o	return err;
117d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o}
118d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#endif
119