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