diff options
author | Jim Meyering <meyering@redhat.com> | 2011-05-16 14:33:04 +0200 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2011-05-27 17:07:45 +0200 |
commit | 48140b7cf9e0d86253dcf46a1979de17bee63077 (patch) | |
tree | b85c06c403f4c3e9f580e0078d5431daab49b66a /libparted | |
parent | 71cc20bc9a6dbd31ebaa962c41be76fddb80d045 (diff) | |
download | parted-48140b7cf9e0d86253dcf46a1979de17bee63077.tar.gz |
reiserfs: remove all-but-probe FS-related code
Diffstat (limited to 'libparted')
-rw-r--r-- | libparted/fs/reiserfs/Makefile.am | 3 | ||||
-rw-r--r-- | libparted/fs/reiserfs/geom_dal.c | 138 | ||||
-rw-r--r-- | libparted/fs/reiserfs/geom_dal.h | 60 | ||||
-rw-r--r-- | libparted/fs/reiserfs/reiserfs.c | 733 |
4 files changed, 4 insertions, 930 deletions
diff --git a/libparted/fs/reiserfs/Makefile.am b/libparted/fs/reiserfs/Makefile.am index ce65ab4..7df005a 100644 --- a/libparted/fs/reiserfs/Makefile.am +++ b/libparted/fs/reiserfs/Makefile.am @@ -1,8 +1,9 @@ +AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) partedincludedir = -I$(top_srcdir)/include noinst_LTLIBRARIES = libreiserfs.la -libreiserfs_la_SOURCES = reiserfs.c reiserfs.h geom_dal.c geom_dal.h +libreiserfs_la_SOURCES = reiserfs.c reiserfs.h INCLUDES = $(partedincludedir) $(INTLINCS) diff --git a/libparted/fs/reiserfs/geom_dal.c b/libparted/fs/reiserfs/geom_dal.c deleted file mode 100644 index 17bb685..0000000 --- a/libparted/fs/reiserfs/geom_dal.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - geom_dal.c -- parted device abstraction layer - Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc. - - 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 3 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, see <http://www.gnu.org/licenses/>. -*/ - -#include <config.h> - -#if (DYNAMIC_LOADING || HAVE_LIBREISERFS) && !DISCOVER_ONLY - -#include "geom_dal.h" - -#include <parted/parted.h> -#include <parted/debug.h> - -static blk_t __len(dal_t *dal) { - PED_ASSERT(dal != NULL); - - return ((PedGeometry *)dal->dev)->length / - (dal->block_size / PED_SECTOR_SIZE_DEFAULT); -} - -static int __read(dal_t *dal, void *buff, blk_t block, blk_t count) { - blk_t k; - PedSector block_pos; - PedSector block_count; - - PED_ASSERT(dal != NULL); - - k = dal->block_size / PED_SECTOR_SIZE_DEFAULT; - block_pos = (PedSector)(block * k); - block_count = (PedSector)(count * k); - - return ped_geometry_read((PedGeometry *)dal->dev, buff, block_pos, block_count); -} - -static int __write(dal_t *dal, void *buff, blk_t block, blk_t count) { - blk_t k; - PedSector block_pos; - PedSector block_count; - - PED_ASSERT(dal != NULL); - - k = dal->block_size / PED_SECTOR_SIZE_DEFAULT; - block_pos = (PedSector)(block * k); - block_count = (PedSector)(count * k); - - return ped_geometry_write((PedGeometry *)dal->dev, buff, block_pos, - block_count); -} - -static int __sync(dal_t *dal) { - PED_ASSERT(dal != NULL); - return ped_geometry_sync((PedGeometry *)dal->dev); -} - -static int __flags(dal_t *dal) { - PED_ASSERT(dal != NULL); - return dal->flags; -} - -static int __equals(dal_t *dal1, dal_t *dal2) { - PED_ASSERT(dal1 != NULL); - PED_ASSERT(dal2 != NULL); - - return ped_geometry_test_equal((PedGeometry *)dal1->dev, - (PedGeometry *)dal2->dev); -} - -static int __stat(dal_t *dal, struct stat *st) { - - PED_ASSERT(dal != NULL); - PED_ASSERT(st != NULL); - - if (stat(((PedGeometry *)dal->dev)->dev->path, st)) - return 0; - - return 1; -} - -static dev_t __dev(dal_t *dal) { - struct stat st; - - if (!__stat(dal, &st)) - return (dev_t)0; - - return st.st_dev; -} - -static struct dal_ops ops = { - __len, __read, __write, __sync, - __flags, __equals, __stat, __dev -}; - -dal_t *geom_dal_create(PedGeometry *geom, size_t block_size, int flags) { - dal_t *dal; - - if (!geom) - return NULL; - - if (!(dal = ped_malloc(sizeof(dal_t)))) - return NULL; - - dal->ops = &ops; - dal->dev = geom; - dal->block_size = block_size; - dal->flags = flags; - dal->len = 0; - - return dal; -} - -int geom_dal_reopen(dal_t *dal, int flags) { - - if (!dal) return 0; - dal->flags = flags; - - return 1; -} - -void geom_dal_free(dal_t *dal) { - PED_ASSERT(dal != NULL); - free(dal); -} - -#endif diff --git a/libparted/fs/reiserfs/geom_dal.h b/libparted/fs/reiserfs/geom_dal.h deleted file mode 100644 index 288e009..0000000 --- a/libparted/fs/reiserfs/geom_dal.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - geom_dal.h -- parted device abstraction layer - Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc. - - 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 3 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, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef GEOM_DAL_H -#define GEOM_DAL_H - -#include <parted/parted.h> - -#if DYNAMIC_LOADING || !DISCOVER_ONLY - -#include <sys/stat.h> - -typedef unsigned long blk_t; - -struct dal_ops; - -struct _dal { - struct dal_ops *ops; - const void *dev; - size_t block_size; - int flags; - void *data; - blk_t len; -}; - -typedef struct _dal dal_t; - -struct dal_ops { - blk_t (*len)(dal_t *); - int (*read)(dal_t *, void *, blk_t, blk_t); - int (*write)(dal_t *, void *, blk_t, blk_t); - int (*sync)(dal_t *); - int (*flags)(dal_t *); - int (*equals)(dal_t *, dal_t *); - int (*stat)(dal_t *, struct stat *); - dev_t (*dev)(dal_t *); -}; - -extern dal_t *geom_dal_create(PedGeometry *geom, size_t block_size, int flags); -extern int geom_dal_reopen(dal_t *dal, int flags); -extern void geom_dal_free(dal_t *dal); - -#endif - -#endif diff --git a/libparted/fs/reiserfs/reiserfs.c b/libparted/fs/reiserfs/reiserfs.c index 85c83c8..8d64ef6 100644 --- a/libparted/fs/reiserfs/reiserfs.c +++ b/libparted/fs/reiserfs/reiserfs.c @@ -29,18 +29,10 @@ #include <config.h> -#if (HAVE_LIBREISERFS || DYNAMIC_LOADING) && !DISCOVER_ONLY -# define REISER_FULL_SUPPORT -#endif - #include <uuid/uuid.h> #include <fcntl.h> #include <errno.h> -#ifdef DYNAMIC_LOADING -# include <dlfcn.h> -#endif - #include <parted/parted.h> #include <parted/debug.h> #include <parted/endian.h> @@ -53,146 +45,14 @@ #endif #include "reiserfs.h" -#include "geom_dal.h" #define REISERFS_BLOCK_SIZES ((int[2]){512, 0}) static PedSector reiserfs_super_offset[] = { 128, 16, -1 }; static PedFileSystemType* reiserfs_type; -#ifdef DYNAMIC_LOADING -# define FPTR * -# define FCLASS static -#else -# define FPTR -# define FCLASS extern -#endif - -#ifdef DYNAMIC_LOADING - -static int libreiserfs_present; - -static void *libdal_handle; -static void *libreiserfs_handle; - -#endif /* DYNAMIC_LOADING */ - -#ifdef REISER_FULL_SUPPORT - -FCLASS blk_t (FPTR reiserfs_fs_probe) (dal_t *); - -FCLASS int (FPTR libreiserfs_exception_type) (reiserfs_exception_t *); -FCLASS int (FPTR libreiserfs_exception_option) (reiserfs_exception_t *); -FCLASS char *(FPTR libreiserfs_exception_message) (reiserfs_exception_t *); -FCLASS void (FPTR libreiserfs_exception_set_handler) - (int(FPTR)(reiserfs_exception_t *)); - -FCLASS void (FPTR dal_realize) (dal_t *); -FCLASS size_t (FPTR dal_block_size) (dal_t *); -FCLASS blk_t (FPTR dal_len) (dal_t *); -FCLASS int (FPTR dal_flags) (dal_t *); - -FCLASS reiserfs_fs_t* (FPTR reiserfs_fs_open) (dal_t *, dal_t *); -FCLASS reiserfs_fs_t* (FPTR reiserfs_fs_create) (dal_t *, dal_t *, - blk_t, blk_t, blk_t, size_t, - int, int, const char *, - const char *, blk_t, - reiserfs_gauge_t *); - -FCLASS int (FPTR reiserfs_fs_resize) (reiserfs_fs_t *, blk_t, reiserfs_gauge_t *); -#ifdef HAVE_REISERFS_FS_CHECK -FCLASS int (FPTR reiserfs_fs_check) (reiserfs_fs_t *, reiserfs_gauge_t *); -#endif - -FCLASS reiserfs_fs_t *(FPTR reiserfs_fs_copy) (reiserfs_fs_t *, dal_t *, - reiserfs_gauge_t *); - -FCLASS int (FPTR reiserfs_fs_clobber) (dal_t *); -FCLASS void (FPTR reiserfs_fs_close) (reiserfs_fs_t *); - -FCLASS int (FPTR reiserfs_fs_is_resizeable) (reiserfs_fs_t *); -FCLASS int (FPTR reiserfs_fs_is_consistent) (reiserfs_fs_t *); - -FCLASS blk_t (FPTR reiserfs_fs_min_size) (reiserfs_fs_t *); -FCLASS blk_t (FPTR reiserfs_fs_block_size) (reiserfs_fs_t *); -FCLASS dal_t* (FPTR reiserfs_fs_host_dal) (reiserfs_fs_t *); - -FCLASS blk_t (FPTR reiserfs_fs_bitmap_used) (reiserfs_fs_t *); -FCLASS int (FPTR reiserfs_fs_bitmap_check) (reiserfs_fs_t *); - -FCLASS reiserfs_gauge_t *(FPTR libreiserfs_gauge_create) ( - char *, reiserfs_gauge_handler_t, void *); - -FCLASS void (FPTR libreiserfs_gauge_free) (reiserfs_gauge_t *); - -static void gauge_handler(const char *name, unsigned int value, void *data, - int determined, int update_header, - int update_footer) -{ - PedTimer *timer = (PedTimer *) data; - ped_timer_set_state_name(timer, name); - ped_timer_update(timer, 1.0 * value / 100); -} - -static PedExceptionOption -exopt_libreiserfs_to_parted(reiserfs_exception_option_t option) -{ - switch (option) { - case EXCEPTION_UNHANDLED: - return PED_EXCEPTION_UNHANDLED; - case EXCEPTION_FIX: - return PED_EXCEPTION_FIX; - case EXCEPTION_YES: - return PED_EXCEPTION_YES; - case EXCEPTION_NO: - return PED_EXCEPTION_NO; - case EXCEPTION_OK: - return PED_EXCEPTION_OK; - case EXCEPTION_RETRY: - return PED_EXCEPTION_RETRY; - case EXCEPTION_IGNORE: - return PED_EXCEPTION_IGNORE; - case EXCEPTION_CANCEL: - return PED_EXCEPTION_CANCEL; - - default: - return PED_EXCEPTION_UNHANDLED; - } -} - -static PedExceptionType -extype_libreiserfs_to_parted(reiserfs_exception_type_t type) -{ - switch (type) { - case EXCEPTION_INFORMATION: - return PED_EXCEPTION_INFORMATION; - case EXCEPTION_WARNING: - return PED_EXCEPTION_WARNING; - case EXCEPTION_ERROR: - return PED_EXCEPTION_ERROR; - case EXCEPTION_FATAL: - return PED_EXCEPTION_FATAL; - case EXCEPTION_BUG: - return PED_EXCEPTION_BUG; - case EXCEPTION_NO_FEATURE: - return PED_EXCEPTION_NO_FEATURE; - - default: - return PED_EXCEPTION_NO_FEATURE; - } -} - -static int exception_handler(reiserfs_exception_t *exception) -{ - int ex_type = libreiserfs_exception_type(exception); - int ex_option = libreiserfs_exception_option(exception); - char *ex_message = libreiserfs_exception_message(exception); - - return ped_exception_throw (extype_libreiserfs_to_parted (ex_type), - exopt_libreiserfs_to_parted (ex_option), - ex_message); -} -#endif /* REISER_FULL_SUPPORT */ +#define FPTR +#define FCLASS extern static PedGeometry *reiserfs_probe(PedGeometry *geom) { @@ -227,580 +87,9 @@ static PedGeometry *reiserfs_probe(PedGeometry *geom) return NULL; } -#ifndef DISCOVER_ONLY -static int reiserfs_clobber(PedGeometry *geom) -{ - int i; - char buf[512]; - - PED_ASSERT(geom != NULL); - - memset(buf, 0, 512); - for (i = 0; reiserfs_super_offset[i] != -1; i++) { - if (reiserfs_super_offset[i] >= geom->length) - continue; - if (!ped_geometry_write - (geom, buf, reiserfs_super_offset[i], 1)) - return 0; - } - return 1; -} -#endif /* !DISCOVER_ONLY */ - -#ifdef REISER_FULL_SUPPORT - -static PedFileSystem *reiserfs_open(PedGeometry *geom) -{ - PedFileSystem *fs; - PedGeometry *fs_geom; - dal_t *dal; - reiserfs_fs_t *fs_info; - - PED_ASSERT(geom != NULL); - - if (!(fs_geom = ped_geometry_duplicate(geom))) - goto error; - - if (! (dal = geom_dal_create(fs_geom, DEFAULT_BLOCK_SIZE, O_RDONLY))) - goto error_fs_geom_free; - - /* - We are passing NULL as DAL for journal. Therefore we let libreiserfs know, - that journal not available and parted will be working fine for reiserfs - with relocated journal too. - */ - if (!(fs = (PedFileSystem *) ped_malloc(sizeof(PedFileSystem)))) - goto error_free_dal; - - if (!(fs_info = reiserfs_fs_open(dal, NULL))) - goto error_free_fs; - - fs->type = reiserfs_type; - fs->geom = fs_geom; - fs->type_specific = (void *) fs_info; - - return fs; - -error_free_fs: - free(fs); -error_free_dal: - geom_dal_free(dal); -error_fs_geom_free: - ped_geometry_destroy(fs_geom); -error: - return NULL; -} - -static PedFileSystem *reiserfs_create(PedGeometry *geom, PedTimer *timer) -{ - dal_t *dal; - uuid_t uuid; - PedFileSystem *fs; - PedGeometry *fs_geom; - reiserfs_fs_t *fs_info; - reiserfs_gauge_t *gauge = NULL; - - PED_ASSERT(geom != NULL); - - fs_geom = ped_geometry_duplicate(geom); - - if (!(dal = geom_dal_create(fs_geom, DEFAULT_BLOCK_SIZE, O_RDWR))) - goto error_fs_geom_free; - - memset(uuid, 0, sizeof(uuid)); - uuid_generate(uuid); - - ped_timer_reset(timer); - ped_timer_set_state_name(timer, _("creating")); - - if (libreiserfs_gauge_create && libreiserfs_gauge_free) { - if (! (gauge = - libreiserfs_gauge_create(NULL, gauge_handler, timer))) - goto error_free_dal; - } - - if (!(fs_info = reiserfs_fs_create(dal, dal, 0, JOURNAL_MAX_TRANS, - DEFAULT_JOURNAL_SIZE, - DEFAULT_BLOCK_SIZE, - FS_FORMAT_3_6, R5_HASH, NULL, - (char *) uuid, dal_len(dal), - gauge))) - goto error_free_gauge; - - ped_timer_update(timer, 1.0); - - if (gauge) - libreiserfs_gauge_free(gauge); - - if (!(fs = (PedFileSystem *) ped_malloc(sizeof(PedFileSystem)))) - goto error_free_fs_info; - - fs->type = reiserfs_type; - fs->geom = fs_geom; - fs->type_specific = (void *) fs_info; - - return fs; - -error_free_fs_info: - free(fs_info); -error_free_gauge: - if (gauge) - libreiserfs_gauge_free(gauge); -error_free_dal: - geom_dal_free(dal); -error_fs_geom_free: - ped_geometry_destroy(fs_geom); - return NULL; -} - -static int reiserfs_close(PedFileSystem *fs) -{ - dal_t *dal; - - PED_ASSERT(fs != NULL); - - dal = reiserfs_fs_host_dal(fs->type_specific); - reiserfs_fs_close(fs->type_specific); - - geom_dal_free(dal); - ped_geometry_sync(fs->geom); - - free(fs); - return 1; -} - -static PedConstraint *reiserfs_get_create_constraint(const PedDevice *dev) -{ - PedGeometry full_dev; - PedSector min_blks = (SUPER_OFFSET_IN_BYTES / DEFAULT_BLOCK_SIZE) - + 2 + DEFAULT_JOURNAL_SIZE + 1 + 100 + 1; - - if (!ped_geometry_init(&full_dev, dev, 0, dev->length - 1)) - return NULL; - - return ped_constraint_new(ped_alignment_any, ped_alignment_any, - &full_dev, &full_dev, - min_blks * (DEFAULT_BLOCK_SIZE / 512), - dev->length); -} - -static int reiserfs_check(PedFileSystem *fs, PedTimer *timer) -{ - reiserfs_fs_t *fs_info; -#ifdef HAVE_REISERFS_FS_CHECK - reiserfs_gauge_t *gauge = NULL; -#endif - - PED_ASSERT(fs != NULL); - - fs_info = fs->type_specific; - - if (!reiserfs_fs_is_consistent(fs_info)) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("The file system is in an invalid " - "state. Perhaps it is mounted?")); - return 0; - } - - if (!reiserfs_fs_is_resizeable(fs_info)) - ped_exception_throw(PED_EXCEPTION_WARNING, - PED_EXCEPTION_IGNORE, - _("The file system is in old " - "(unresizeable) format.")); - - if (!reiserfs_fs_bitmap_check(fs_info)) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Invalid free blocks count. Run " - "reiserfsck --check first.")); - return 0; - } - -#ifdef HAVE_REISERFS_FS_CHECK - ped_timer_reset(timer); - - if (libreiserfs_gauge_create && libreiserfs_gauge_free) { - if (! - (gauge = - libreiserfs_gauge_create(NULL, gauge_handler, timer))) - return 0; - } - - ped_timer_set_state_name(timer, _("checking")); - ped_timer_update(timer, 0.0); - - if (!reiserfs_fs_check(fs_info, gauge)) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Reiserfs tree seems to be corrupted. " - "Run reiserfsck --check first.")); - return 0; - } - - ped_timer_update(timer, 1.0); - - if (gauge) - libreiserfs_gauge_free(gauge); -#endif - - ped_exception_throw(PED_EXCEPTION_INFORMATION, PED_EXCEPTION_OK, - _("The reiserfs file system passed a basic check. " - "For a more comprehensive check, run " - "reiserfsck --check.")); - - return 1; -} - -static int reiserfs_resize(PedFileSystem *fs, PedGeometry *geom, - PedTimer *timer) -{ - dal_t *dal; - blk_t fs_len; - PedSector old_length; - reiserfs_fs_t *fs_info; - reiserfs_gauge_t *gauge = NULL; - - PED_ASSERT(fs != NULL); - - old_length = fs->geom->length; - - PED_ASSERT (fs->geom->dev == geom->dev); - - if (fs->geom->start != geom->start) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Sorry, can't move the start of " - "reiserfs partitions yet.")); - return 0; - } - - fs_info = fs->type_specific; - - fs_len = (blk_t) (geom->length / (reiserfs_fs_block_size(fs_info) / - PED_SECTOR_SIZE_DEFAULT)); - - dal = reiserfs_fs_host_dal(fs_info); - - if (dal_flags(dal) && O_RDONLY) { - if (!geom_dal_reopen(dal, O_RDWR)) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Couldn't reopen device " - "abstraction layer for " - "read/write.")); - return 0; - } - } - - ped_timer_reset(timer); - - if (libreiserfs_gauge_create && libreiserfs_gauge_free) { - if (! - (gauge = - libreiserfs_gauge_create(NULL, gauge_handler, timer))) - return 0; - } - - if (old_length > geom->length) { - - ped_timer_set_state_name(timer, _("shrinking")); - ped_timer_update(timer, 0.0); - - if (!reiserfs_fs_resize(fs_info, fs_len, gauge)) - goto error_free_gauge; - - ped_geometry_set_end (fs->geom, geom->end); - dal_realize(dal); - } else { - ped_geometry_set_end (fs->geom, geom->end); - dal_realize(dal); - - ped_timer_set_state_name(timer, _("expanding")); - ped_timer_update(timer, 0.0); - - if (!reiserfs_fs_resize(fs_info, fs_len, gauge)) - goto error_free_gauge; - } - - ped_timer_update(timer, 1.0); - - if (gauge) - libreiserfs_gauge_free(gauge); - - return 1; - -error_free_gauge: - if (gauge) - libreiserfs_gauge_free(gauge); - ped_geometry_set_end (fs->geom, fs->geom->start + old_length - 1); - return 0; -} - -static PedConstraint *reiserfs_get_resize_constraint(const PedFileSystem * - fs) -{ - PedDevice *dev; - PedSector min_size; - PedGeometry full_disk; - reiserfs_fs_t *fs_info; - PedAlignment start_align; - PedGeometry start_sector; - - PED_ASSERT(fs != NULL); - - fs_info = fs->type_specific; - dev = fs->geom->dev; - - if (!ped_alignment_init(&start_align, fs->geom->start, 0)) - return NULL; - if (!ped_geometry_init(&full_disk, dev, 0, dev->length - 1)) - return NULL; - if (!ped_geometry_init(&start_sector, dev, fs->geom->start, 1)) - return NULL; - - /* - Minsize for reiserfs is area occupied by data blocks and - metadata blocks minus free space blocks and minus bitmap - blocks which describes free space blocks. - */ - min_size = reiserfs_fs_min_size(fs_info) * - (reiserfs_fs_block_size(fs_info) / PED_SECTOR_SIZE_DEFAULT); - - return ped_constraint_new(&start_align, ped_alignment_any, - &start_sector, &full_disk, min_size, - dev->length); -} - -static PedFileSystem *reiserfs_copy(const PedFileSystem *fs, - PedGeometry *geom, PedTimer *timer) -{ - dal_t *dal; - PedGeometry *fs_geom; - PedFileSystem *new_fs; - blk_t fs_len, min_needed_blk; - - reiserfs_fs_t *dest_fs, *src_fs; - reiserfs_gauge_t *gauge = NULL; - - fs_geom = ped_geometry_duplicate(geom); - - if (!(dal = geom_dal_create(fs_geom, DEFAULT_BLOCK_SIZE, O_RDWR))) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Couldn't create reiserfs device " - "abstraction handler.")); - goto error_free_fs_geom; - } - - src_fs = fs->type_specific; - - fs_len = - (geom->length / (reiserfs_fs_block_size(src_fs) / PED_SECTOR_SIZE_DEFAULT)); - min_needed_blk = reiserfs_fs_bitmap_used(src_fs); - - if (fs_len <= min_needed_blk) { - ped_exception_throw(PED_EXCEPTION_ERROR, - PED_EXCEPTION_CANCEL, - _("Device is too small for %lu blocks."), - min_needed_blk); - goto error_free_dal; - } - - if (! (new_fs = (PedFileSystem *) ped_malloc(sizeof(PedFileSystem)))) - goto error_free_dal; - - ped_timer_reset(timer); - ped_timer_set_state_name(timer, _("copying")); - ped_timer_update(timer, 0.0); - - if (libreiserfs_gauge_create && libreiserfs_gauge_free) { - if (! (gauge = - libreiserfs_gauge_create(NULL, gauge_handler, timer))) - goto error_free_new_fs; - } - - if (!(dest_fs = reiserfs_fs_copy(src_fs, dal, gauge))) - goto error_free_gauge; - - ped_timer_update(timer, 1.0); - - if (gauge) - libreiserfs_gauge_free(gauge); - - new_fs->type = reiserfs_type; - new_fs->geom = fs_geom; - new_fs->type_specific = (void *) dest_fs; - - return new_fs; - -error_free_gauge: - if (gauge) - libreiserfs_gauge_free(gauge); -error_free_new_fs: - free(new_fs); -error_free_dal: - geom_dal_free(dal); -error_free_fs_geom: - ped_geometry_destroy(fs_geom); - return NULL; -} - -static PedConstraint *reiserfs_get_copy_constraint(const PedFileSystem *fs, - const PedDevice *dev) -{ - PedGeometry full_dev; - - PED_ASSERT(fs != NULL); - PED_ASSERT(dev != NULL); - - if (!ped_geometry_init(&full_dev, dev, 0, dev->length - 1)) - return NULL; - - return ped_constraint_new(ped_alignment_any, ped_alignment_any, - &full_dev, &full_dev, - reiserfs_fs_bitmap_used(fs->type_specific), - dev->length); -} - -#endif /* !REISER_FULL_SUPPORT */ - -#ifdef DYNAMIC_LOADING - -#define INIT_SYM(SYM) SYM = getsym (libreiserfs_handle, #SYM) - -static void *getsym(void *handle, const char *symbol) -{ - void *entry; - char *error; - - entry = dlsym(handle, symbol); - if ((error = dlerror()) != NULL) { - ped_exception_throw(PED_EXCEPTION_WARNING, - PED_EXCEPTION_IGNORE, - _("Couldn't resolve symbol %s. " - "Error: %s."), - symbol, error); - return NULL; - } - - return entry; -} - -static int reiserfs_ops_interface_version_check(void) -{ - int min_interface_version, max_interface_version; - int (*libreiserfs_get_max_interface_version) (void); - int (*libreiserfs_get_min_interface_version) (void); - - INIT_SYM(libreiserfs_get_max_interface_version); - INIT_SYM(libreiserfs_get_min_interface_version); - - if (!libreiserfs_get_min_interface_version || - !libreiserfs_get_max_interface_version) { - ped_exception_throw( - PED_EXCEPTION_WARNING, PED_EXCEPTION_CANCEL, - _("GNU Parted found an invalid libreiserfs library.")); - return 0; - } - - min_interface_version = libreiserfs_get_min_interface_version(); - max_interface_version = libreiserfs_get_max_interface_version(); - - if (REISERFS_API_VERSION < min_interface_version || - REISERFS_API_VERSION > max_interface_version) { - ped_exception_throw( - PED_EXCEPTION_WARNING, PED_EXCEPTION_CANCEL, - _("GNU Parted has detected libreiserfs interface " - "version mismatch. Found %d-%d, required %d. " - "ReiserFS support will be disabled."), - min_interface_version, - max_interface_version, - REISERFS_API_VERSION); - return 0; - } - - return 1; -} - -static int reiserfs_ops_init(void) -{ - if (!(libreiserfs_handle = dlopen("libreiserfs.so", RTLD_NOW))) - goto error; - - if (!reiserfs_ops_interface_version_check()) - goto error_free_libreiserfs_handle; - - if (!(libdal_handle = dlopen("libdal.so", RTLD_NOW))) - goto error_free_libreiserfs_handle; - - INIT_SYM(reiserfs_fs_probe); - INIT_SYM(libreiserfs_exception_type); - - INIT_SYM(libreiserfs_exception_option); - INIT_SYM(libreiserfs_exception_message); - INIT_SYM(libreiserfs_exception_set_handler); - - INIT_SYM(reiserfs_fs_clobber); - INIT_SYM(reiserfs_fs_open); - INIT_SYM(reiserfs_fs_create); - INIT_SYM(reiserfs_fs_resize); - INIT_SYM(reiserfs_fs_copy); - - INIT_SYM(reiserfs_fs_is_resizeable); - INIT_SYM(reiserfs_fs_is_consistent); - - INIT_SYM(reiserfs_fs_bitmap_check); - INIT_SYM(reiserfs_fs_bitmap_used); - - INIT_SYM(reiserfs_fs_min_size); - INIT_SYM(reiserfs_fs_block_size); - - INIT_SYM(reiserfs_fs_host_dal); - INIT_SYM(reiserfs_fs_close); - - INIT_SYM(libreiserfs_gauge_create); - INIT_SYM(libreiserfs_gauge_free); - - INIT_SYM(dal_realize); - INIT_SYM(dal_flags); - - INIT_SYM(dal_block_size); - INIT_SYM(dal_len); - - return 1; - -error_free_libreiserfs_handle: - dlclose(libreiserfs_handle); - libreiserfs_handle = NULL; -error: - return 0; -} - -static void reiserfs_ops_done() -{ - if (libdal_handle) - dlclose(libdal_handle); - if (libreiserfs_handle) - dlclose(libreiserfs_handle); -} -#endif /* DYNAMIC_LOADING */ #define REISER_BLOCK_SIZES ((int[]){512, 1024, 2048, 4096, 8192, 0}) -#ifdef REISER_FULL_SUPPORT -static PedFileSystemOps reiserfs_full_ops = { - probe: reiserfs_probe, -}; - -static PedFileSystemType reiserfs_full_type = { - next: NULL, - ops: &reiserfs_full_ops, - name: "reiserfs", - block_sizes: REISER_BLOCK_SIZES -}; -#endif /* REISER_FULL_SUPPORT */ - static PedFileSystemOps reiserfs_simple_ops = { probe: reiserfs_probe, }; @@ -814,29 +103,11 @@ static PedFileSystemType reiserfs_simple_type = { void ped_file_system_reiserfs_init() { -#ifdef DYNAMIC_LOADING - libreiserfs_present = reiserfs_ops_init(); - if (libreiserfs_present) { - reiserfs_type = &reiserfs_full_type; - libreiserfs_exception_set_handler(exception_handler); - } else { - reiserfs_type = &reiserfs_simple_type; - } -#else /* !DYNAMIC_LOADING */ -#ifdef REISER_FULL_SUPPORT - libreiserfs_exception_set_handler(exception_handler); - reiserfs_type = &reiserfs_full_type; -#else reiserfs_type = &reiserfs_simple_type; -#endif -#endif /* !DYNAMIC_LOADING */ ped_file_system_type_register(reiserfs_type); } void ped_file_system_reiserfs_done() { ped_file_system_type_unregister(reiserfs_type); -#ifdef DYNAMIC_LOADING - reiserfs_ops_done(); -#endif /* DYNAMIC_LOADING */ } |