diff --git a/aclocal.m4 b/aclocal.m4 index 4ab64a82f..07ea0b664 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -69,32 +69,63 @@ AC_DEFUN([AX_PYTHON_MODULE],[ fi ]) -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 1 (pkg-config-0.24) -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) @@ -116,18 +147,19 @@ if test -n "$PKG_CONFIG"; then PKG_CONFIG="" fi fi[]dnl -])# PKG_PROG_PKG_CONFIG +])dnl PKG_PROG_PKG_CONFIG -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -# only at the first occurence in configure.ac, so if the first place -# it's called might be skipped (such as if it is within an "if", you -# have to call PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ @@ -137,8 +169,10 @@ m4_ifvaln([$3], [else $3])dnl fi]) -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" @@ -150,10 +184,11 @@ m4_define([_PKG_CONFIG], else pkg_failed=untried fi[]dnl -])# _PKG_CONFIG +])dnl _PKG_CONFIG -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -161,19 +196,17 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then else _pkg_short_errors_supported=no fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED +])dnl _PKG_SHORT_ERRORS_SUPPORTED -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl @@ -227,16 +260,40 @@ else AC_MSG_RESULT([yes]) $3 fi[]dnl -])# PKG_CHECK_MODULES +])dnl PKG_CHECK_MODULES -# PKG_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable pkgconfigdir as the location where a module -# should install pkg-config .pc files. By default the directory is -# $libdir/pkgconfig, but the default can be changed by passing -# DIRECTORY. The user can override through the --with-pkgconfigdir -# parameter. +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], @@ -247,16 +304,18 @@ AC_ARG_WITH([pkgconfigdir], AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) -]) dnl PKG_INSTALLDIR +])dnl PKG_INSTALLDIR -# PKG_NOARCH_INSTALLDIR(DIRECTORY) -# ------------------------- -# Substitutes the variable noarch_pkgconfigdir as the location where a -# module should install arch-independent pkg-config .pc files. By -# default the directory is $datadir/pkgconfig, but the default can be -# changed by passing DIRECTORY. The user can override through the -# --with-noarch-pkgconfigdir parameter. +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], @@ -267,13 +326,15 @@ AC_ARG_WITH([noarch-pkgconfigdir], AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) -]) dnl PKG_NOARCH_INSTALLDIR +])dnl PKG_NOARCH_INSTALLDIR -# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, -# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# ------------------------------------------- -# Retrieves the value of the pkg-config variable for the given module. +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl @@ -282,7 +343,7 @@ _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl -])# PKG_CHECK_VAR +])dnl PKG_CHECK_VAR # Copyright (C) 1999-2014 Free Software Foundation, Inc. # @@ -536,5 +597,4 @@ AC_DEFUN([AM_RUN_LOG], echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) - m4_include([acinclude.m4]) diff --git a/configure b/configure index 5409f6847..7f412492c 100755 --- a/configure +++ b/configure @@ -886,6 +886,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -1101,6 +1102,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' @@ -1353,6 +1355,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1490,7 +1501,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1643,6 +1654,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -12967,7 +12979,7 @@ if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else - for am_cv_pathless_PYTHON in python python2 python3 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros @@ -13535,7 +13547,7 @@ if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else - for am_cv_pathless_PYTHON in python python2 python3 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + for am_cv_pathless_PYTHON in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros diff --git a/include/configure.h.in b/include/configure.h.in index be2f66031..a4c93d6f2 100644 --- a/include/configure.h.in +++ b/include/configure.h.in @@ -347,9 +347,6 @@ /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T -/* Define to 1 if the compiler has the `__builtin_clz` builtin. */ -#undef HAVE___BUILTIN_CLZ - /* Define to 1 if you have the header file. */ #undef HAVE_READLINE_HISTORY_H @@ -478,9 +475,16 @@ /* Define to 1 if you have the `strtoull' function. */ #undef HAVE_STRTOULL +/* Define to 1 if `st_blocks' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLOCKS + /* Define to 1 if `st_rdev' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_RDEV +/* Define to 1 if your `struct stat' has `st_blocks'. Deprecated, use + `HAVE_STRUCT_STAT_ST_BLOCKS' instead. */ +#undef HAVE_ST_BLOCKS + /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H @@ -552,6 +556,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFS_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H @@ -591,6 +598,9 @@ /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL +/* Define to 1 if the system has the `__builtin_clz' built-in function */ +#undef HAVE___BUILTIN_CLZ + /* Internalization package */ #undef INTL_PACKAGE diff --git a/lib/Makefile.in b/lib/Makefile.in index 1fdaca8ee..bd68edc34 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -55,6 +55,7 @@ SOURCES =\ config/config.c \ datastruct/btree.c \ datastruct/str_list.c \ + device/bcache.c \ device/dev-cache.c \ device/dev-ext.c \ device/dev-io.c \ diff --git a/lib/device/bcache.c b/lib/device/bcache.c index 1be626c6d..3b8cf789b 100644 --- a/lib/device/bcache.c +++ b/lib/device/bcache.c @@ -1,3 +1,17 @@ +/* + * Copyright (C) 2018 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License v.2.1. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #define _GNU_SOURCE #include @@ -22,6 +36,11 @@ //---------------------------------------------------------------- +static void log_sys_warn(const char *syscall) +{ + log_warn("%s failed: %s", syscall, strerror(errno)); +} + // Assumes the list is not empty. static inline struct dm_list *_list_pop(struct dm_list *head) { @@ -49,14 +68,14 @@ struct cb_set { static struct cb_set *_cb_set_create(unsigned nr) { int i; - struct cb_set *cbs = malloc(sizeof(*cbs)); + struct cb_set *cbs = dm_malloc(sizeof(*cbs)); if (!cbs) return NULL; - cbs->vec = malloc(nr * sizeof(*cbs->vec)); + cbs->vec = dm_malloc(nr * sizeof(*cbs->vec)); if (!cbs->vec) { - free(cbs); + dm_free(cbs); return NULL; } @@ -69,17 +88,18 @@ static struct cb_set *_cb_set_create(unsigned nr) return cbs; } -static bool _cb_set_destroy(struct cb_set *cbs) +static void _cb_set_destroy(struct cb_set *cbs) { + // We know this is always called after a wait_all. So there should + // never be in flight IO. if (!dm_list_empty(&cbs->allocated)) { - // FIXME: I think we should propogate this up. + // bail out log_error("async io still in flight"); - return false; + return; } - free(cbs->vec); - free(cbs); - return 0; + dm_free(cbs->vec); + dm_free(cbs); } static struct control_block *_cb_alloc(struct cb_set *cbs, void *context) @@ -123,7 +143,7 @@ struct io_engine { static struct io_engine *_engine_create(unsigned max_io) { int r; - struct io_engine *e = malloc(sizeof(*e)); + struct io_engine *e = dm_malloc(sizeof(*e)); if (!e) return NULL; @@ -138,7 +158,7 @@ static struct io_engine *_engine_create(unsigned max_io) e->cbs = _cb_set_create(max_io); if (!e->cbs) { log_warn("couldn't create control block set"); - free(e); + dm_free(e); return NULL; } @@ -149,7 +169,7 @@ static void _engine_destroy(struct io_engine *e) { _cb_set_destroy(e->cbs); io_destroy(e->aio_context); - free(e); + dm_free(e); } static bool _engine_issue(struct io_engine *e, int fd, enum dir d, @@ -160,13 +180,13 @@ static bool _engine_issue(struct io_engine *e, int fd, enum dir d, struct control_block *cb; if (((uint64_t) data) & (PAGE_SIZE - 1)) { - log_err("misaligned data buffer"); + log_warn("misaligned data buffer"); return false; } cb = _cb_alloc(e->cbs, context); if (!cb) { - log_err("couldn't allocate control block"); + log_warn("couldn't allocate control block"); return false; } @@ -181,7 +201,7 @@ static bool _engine_issue(struct io_engine *e, int fd, enum dir d, cb_array[0] = &cb->cb; r = io_submit(e->aio_context, 1, cb_array); if (r < 0) { - log_sys_error("io_submit", ""); + log_sys_warn("io_submit"); _cb_free(e->cbs, cb); return false; } @@ -201,7 +221,7 @@ static bool _engine_wait(struct io_engine *e, complete_fn fn) memset(&event, 0, sizeof(event)); r = io_getevents(e->aio_context, 1, MAX_IO, event, NULL); if (r < 0) { - log_sys_error("io_getevents", ""); + log_sys_warn("io_getevents"); return false; } @@ -217,7 +237,7 @@ static bool _engine_wait(struct io_engine *e, complete_fn fn) fn(cb->context, (int) ev->res); else { - log_err("short io"); + log_warn("short io"); fn(cb->context, -ENODATA); } @@ -341,7 +361,7 @@ static void _hash_insert(struct block *b) dm_list_add_h(b->cache->buckets + h, &b->hash); } -static void _hash_remove(struct block *b) +static inline void _hash_remove(struct block *b) { dm_list_del(&b->hash); } @@ -363,30 +383,30 @@ static unsigned _calc_nr_buckets(unsigned nr_blocks) return r; } -static int _hash_table_init(struct bcache *cache, unsigned nr_entries) +static bool _hash_table_init(struct bcache *cache, unsigned nr_entries) { unsigned i; cache->nr_buckets = _calc_nr_buckets(nr_entries); cache->hash_mask = cache->nr_buckets - 1; - cache->buckets = malloc(cache->nr_buckets * sizeof(*cache->buckets)); + cache->buckets = dm_malloc(cache->nr_buckets * sizeof(*cache->buckets)); if (!cache->buckets) - return -ENOMEM; + return false; for (i = 0; i < cache->nr_buckets; i++) dm_list_init(cache->buckets + i); - return 0; + return true; } static void _hash_table_exit(struct bcache *cache) { - free(cache->buckets); + dm_free(cache->buckets); } //---------------------------------------------------------------- -static int _init_free_list(struct bcache *cache, unsigned count) +static bool _init_free_list(struct bcache *cache, unsigned count) { unsigned i; size_t block_size = cache->block_sectors << SECTOR_SHIFT; @@ -395,13 +415,13 @@ static int _init_free_list(struct bcache *cache, unsigned count) /* Allocate the data for each block. We page align the data. */ if (!data) - return -ENOMEM; + return false; cache->raw_data = data; - cache->raw_blocks = malloc(count * sizeof(*cache->raw_blocks)); + cache->raw_blocks = dm_malloc(count * sizeof(*cache->raw_blocks)); if (!cache->raw_blocks) - free(cache->raw_data); + dm_free(cache->raw_data); for (i = 0; i < count; i++) { struct block *b = cache->raw_blocks + i; @@ -410,13 +430,13 @@ static int _init_free_list(struct bcache *cache, unsigned count) dm_list_add(&cache->free, &b->list); } - return 0; + return true; } static void _exit_free_list(struct bcache *cache) { - free(cache->raw_data); - free(cache->raw_blocks); + dm_free(cache->raw_data); + dm_free(cache->raw_blocks); } static struct block *_alloc_block(struct bcache *cache) @@ -519,7 +539,7 @@ static void _complete_io(void *context, int err) } } -static int _wait_io(struct bcache *cache) +static bool _wait_io(struct bcache *cache) { return _engine_wait(cache->engine, _complete_io); } @@ -646,7 +666,7 @@ static struct block *_lookup_or_read_block(struct bcache *cache, // FIXME: this is insufficient. We need to also catch a read // lock of a write locked block. Ref count needs to distinguish. if (b->ref_count && (flags & (GF_DIRTY | GF_ZERO))) { - log_err("concurrent write lock attempted"); + log_warn("concurrent write lock attempted"); return NULL; } @@ -706,10 +726,9 @@ static void _preemptive_writeback(struct bcache *cache) *--------------------------------------------------------------*/ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks) { - int r; struct bcache *cache; - cache = malloc(sizeof(*cache)); + cache = dm_malloc(sizeof(*cache)); if (!cache) return NULL; @@ -718,7 +737,7 @@ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks) cache->engine = _engine_create(nr_cache_blocks < 1024u ? nr_cache_blocks : 1024u); if (!cache->engine) { - free(cache); + dm_free(cache); return NULL; } @@ -732,9 +751,10 @@ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks) dm_list_init(&cache->clean); dm_list_init(&cache->io_pending); - if (_hash_table_init(cache, nr_cache_blocks)) { + if (!_hash_table_init(cache, nr_cache_blocks)) { _engine_destroy(cache->engine); - free(cache); + dm_free(cache); + return NULL; } cache->read_hits = 0; @@ -744,11 +764,11 @@ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks) cache->write_misses = 0; cache->prefetches = 0; - r = _init_free_list(cache, nr_cache_blocks); - if (r) { + if (!_init_free_list(cache, nr_cache_blocks)) { _engine_destroy(cache->engine); _hash_table_exit(cache); - free(cache); + dm_free(cache); + return NULL; } return cache; @@ -757,14 +777,14 @@ struct bcache *bcache_create(sector_t block_sectors, unsigned nr_cache_blocks) void bcache_destroy(struct bcache *cache) { if (cache->nr_locked) - log_warn("some blocks are still locked\n"); + log_warn("some blocks are still locked"); bcache_flush(cache); _wait_all(cache); _exit_free_list(cache); _hash_table_exit(cache); _engine_destroy(cache->engine); - free(cache); + dm_free(cache); } void bcache_prefetch(struct bcache *cache, int fd, block_address index) @@ -794,14 +814,14 @@ bool bcache_get(struct bcache *cache, int fd, block_address index, } *result = NULL; - log_err("couldn't get block"); + log_warn("couldn't get block"); return false; } void bcache_put(struct block *b) { if (!b->ref_count) { - log_err("ref count on bcache block already zero"); + log_warn("ref count on bcache block already zero"); return; } diff --git a/lib/device/bcache.h b/lib/device/bcache.h index 1f4262e96..322774469 100644 --- a/lib/device/bcache.h +++ b/lib/device/bcache.h @@ -1,3 +1,17 @@ +/* + * Copyright (C) 2018 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License v.2.1. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + #ifndef BCACHE_H #define BCACHE_H