inline.c revision 182acd17bef0cf8dcb66568448a528abb1dfcd71
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{ 487f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o errcode_t retval; 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); 557f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o if (retval) { 567f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o if (retval == ENOMEM) 577f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o return EXT2_ET_NO_MEMORY; 587f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o return retval; 597f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o } 607f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#else 617f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#ifdef HAVE_MEMALIGN 623a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o *p = memalign(align, size); 633a6db9bbc8a5aa85c200e66fc0563a1e87417efeTheodore Ts'o if (*p == NULL) { 647f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o if (errno) 657f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o return errno; 667f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o else 677f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o return EXT2_ET_NO_MEMORY; 687f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o } 697f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#else 70d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#ifdef HAVE_VALLOC 71d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (align > sizeof(long long)) 72d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o *p = valloc(size); 73d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o else 74d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#endif 75d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o *p = malloc(size); 76d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if ((unsigned long) *p & (align - 1)) { 77d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o free(*p); 78d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o *p = 0; 79d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o } 80d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (*p == 0) 81d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o return EXT2_ET_NO_MEMORY; 827f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#endif 837f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o#endif 847f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o return 0; 857f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o} 867f21666a3da39fd335f5d4b27499d4ff76b53375Theodore Ts'o 87d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#ifdef DEBUG 88d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'ostatic int isaligned(void *ptr, unsigned long align) 89d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{ 90d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o return (((unsigned long) ptr & (align - 1)) == 0); 91d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o} 92d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o 93d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'ostatic errcode_t test_memalign(unsigned long align) 94d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{ 95d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o void *ptr = 0; 96d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o errcode_t retval; 97d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o 98d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o retval = ext2fs_get_memalign(32, align, &ptr); 99d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (!retval && !isaligned(ptr, align)) 100d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o retval = EINVAL; 101d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o free(ptr); 102d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o printf("tst_memliagn(%lu): %s\n", align, 103d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o retval ? error_message(retval) : "OK"); 104d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o return retval; 105d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o} 106d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o 107d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'oint main(int argc, char **argv) 108d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o{ 109d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o int err = 0; 110d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o 111d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (test_memalign(4)) 112d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o err++; 113d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (test_memalign(32)) 114d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o err++; 115d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (test_memalign(1024)) 116d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o err++; 117d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o if (test_memalign(4096)) 118d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o err++; 119d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o return err; 120d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o} 121d71520751ecfb9e0196ff154122f54f2e0f12d0fTheodore Ts'o#endif 122