[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
ReiserFS support patch
From: |
Yura Umanets |
Subject: |
ReiserFS support patch |
Date: |
Sat, 12 Jan 2002 22:26:29 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.7) Gecko/20011221 |
Hi Andrew!
This is a ReiserFS support patch for parted-1.4.22
It implements: reiserfs_open, reiserfs_create, reiserfs_close,
reiserfs_resize, reiserfs_get_resize_constraint, reiserfs_check.
--
Yury Umanets
IT Engineer of Priocom Corp.
Phone: +380 44 2011959, ICQ: 55494590
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/Makefile.am
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/Makefile.am
--- ./parted-1.4.22/libparted/fs_reiserfs/Makefile.am Sun Apr 8 01:04:38 2001
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/Makefile.am Sat Jan 12
21:40:10 2002
@@ -1,6 +1,11 @@
partedincludedir = -I$(top_srcdir)/include
noinst_LTLIBRARIES = libreiserfs.la
-libreiserfs_la_SOURCES = reiserfs.c
+libreiserfs_la_SOURCES = reiserfs.c \
+ reiserfs_fs.c reiserfs_fs.h \
+ reiserfs_bm.c reiserfs_bm.h \
+ reiserfs_io.c reiserfs_io.h \
+ reiserfs_blk.c reiserfs_blk.h \
+ reiserfs_tools.c reiserfs_tools.h
INCLUDES = $(partedincludedir) @INTLINCS@
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs.c Wed Sep 19 00:02:40 2001
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs.c Sat Jan 12
22:19:18 2002
@@ -17,6 +17,13 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+/*
+ Added reiserfs_open, reiserfs_create, reiserfs_close, reiserfs_resize,
+ reiserfs_get_resize_constraint, reiserfs_check by Yury Umanets
(address@hidden)
+*/
+
+static const char _reiserfs_c[] = "$Id: reiserfs.c,v 1.55 2002/01/04 19:57:11
yumanets Exp $";
+
#include "config.h"
#include <parted/parted.h>
@@ -27,39 +34,46 @@
#include <parted/disk_mac.h>
#include <parted/disk_gpt.h>
-#include <libintl.h>
#if ENABLE_NLS
+# include <libintl.h>
# define _(String) dgettext (PACKAGE, String)
#else
# define _(String) (String)
-#endif /* ENABLE_NLS */
+#endif
#include <string.h>
-#define REISERFS_SIGNATURE "ReIsErFs"
-#define REISER2FS_SIGNATURE "ReIsEr2Fs"
+#include "reiserfs_fs.h"
+#include "reiserfs_io.h"
+#include "reiserfs_tools.h"
-static PedSector reiser_super_offset[] = {
- 128,
- 16, /* versions 3.5 - 3.5.11 */
- -1
-};
+static int reiser_super_offset[] = {128, 16, -1};
static int reiserfs_probe (const PedGeometry* geom);
static int reiserfs_clobber (PedGeometry* geom);
+
+static PedFileSystem* reiserfs_open (const PedGeometry *geom);
+static PedFileSystem* reiserfs_create (PedGeometry *geom);
+
+static int reiserfs_close (PedFileSystem* fs);
+static int reiserfs_check (PedFileSystem *fs);
+
+static int reiserfs_resize (PedFileSystem* fs, const PedGeometry* geom);
+static PedConstraint* reiserfs_get_resize_constraint (const PedFileSystem* fs);
+
static int reiserfs_set_system (const PedFileSystem* fs, PedPartition* part,
const PedDiskType* disk_type);
static PedFileSystemOps reiserfs_ops = {
probe: reiserfs_probe,
clobber: reiserfs_clobber,
- open: NULL,
- create: NULL,
- close: NULL,
- check: NULL,
+ open: reiserfs_open,
+ create: reiserfs_create,
+ close: reiserfs_close,
+ check: reiserfs_check,
copy: NULL,
- resize: NULL,
- get_resize_constraint: NULL,
+ resize: reiserfs_resize,
+ get_resize_constraint: reiserfs_get_resize_constraint,
set_system: reiserfs_set_system
};
@@ -84,38 +98,36 @@ ped_file_system_reiserfs_done ()
static int
reiserfs_probe (const PedGeometry* geom)
{
- char buf[512];
- int i;
-
- for (i=0; reiser_super_offset[i] != -1; i++) {
- if (reiser_super_offset[i] >= geom->length)
- continue;
- if (!ped_geometry_read (geom, buf, reiser_super_offset[i], 1))
- continue;
- if (strncmp (REISERFS_SIGNATURE, buf + 52,
- strlen (REISERFS_SIGNATURE)) == 0)
- return 1;
- if (strncmp (REISER2FS_SIGNATURE, buf + 52,
- strlen (REISER2FS_SIGNATURE)) == 0)
- return 1;
- }
- return 0;
+ struct reiserfs_super_block *sb;
+ char buff[512];
+ int i;
+
+ for (i = 0; reiser_super_offset[i] != -1; i++) {
+ if (reiser_super_offset[i] >= geom->length)
+ continue;
+ if (!ped_geometry_read (geom, buff, reiser_super_offset[i], 1))
+ continue;
+ sb = (struct reiserfs_super_block *)buff;
+ if (is_any_reiserfs_magic_string (sb->s_v1.s_magic))
+ return 1;
+ }
+ return 0;
}
static int
reiserfs_clobber (PedGeometry* geom)
{
- char buf[512];
- int i;
+ int i;
+ char buf[512];
- memset (buf, 0, 512);
- for (i=0; reiser_super_offset[i] != -1; i++) {
- if (reiser_super_offset[i] >= geom->length)
- continue;
- if (!ped_geometry_write (geom, buf, reiser_super_offset[i], 1))
- return 0;
- }
- return 1;
+ memset (buf, 0, 512);
+ for (i=0; reiser_super_offset[i] != -1; i++) {
+ if (reiser_super_offset[i] >= geom->length)
+ continue;
+ if (!ped_geometry_write (geom, buf, reiser_super_offset[i], 1))
+ return 0;
+ }
+ return 1;
}
static int
@@ -193,4 +205,183 @@ reiserfs_set_system (const PedFileSystem
}
return 0;
+}
+
+static PedFileSystem *reiserfs_open (const PedGeometry *geom) {
+ PedFileSystem *fs;
+ reiserfs_fs_t *fs_info;
+ struct reiserfs_io_handler *io_handler;
+ PedGeometry *fs_geom = ped_geometry_duplicate(geom);
+
+ io_handler = reiserfs_io_handler_create(fs_geom);
+ if (!io_handler) goto error;
+
+ fs_info = _reiserfs_fs_open(io_handler);
+ if (!fs_info) goto error_free_io_handler;
+
+ fs = (PedFileSystem*) ped_malloc (sizeof(PedFileSystem));
+ if (!fs) goto error_free_fs_info;
+
+ fs->type = &reiserfs_type;
+ fs->geom = fs_geom;
+ fs->type_specific = (void*) fs_info;
+
+ return fs;
+
+error_free_fs:
+ ped_free(fs);
+error_free_fs_info:
+ _reiserfs_fs_close(fs_info);
+error_free_io_handler:
+ reiserfs_io_handler_destroy(io_handler);
+error:
+ return NULL;
+}
+
+#define REISERFS_DEFAULT_JOURNAL_BLOCKS 8192
+
+static PedFileSystem* reiserfs_create(PedGeometry *geom) {
+ PedFileSystem *fs;
+ PedGeometry *fs_geom;
+ reiserfs_fs_t *fs_info;
+ struct reiserfs_io_handler *io_handler;
+
+ fs_geom = ped_geometry_duplicate(geom);
+
+ if (!(io_handler = reiserfs_io_handler_create(fs_geom)))
+ goto error;
+
+ if (!(fs_info = _reiserfs_fs_create(io_handler,
REISERFS_DEFAULT_BLOCK_SIZE, REISERFS_DEFAULT_JOURNAL_BLOCKS,
+ io_handler->ops->blocks(io_handler, REISERFS_DEFAULT_BLOCK_SIZE))))
+ goto error_free_fs;
+
+ if (!(fs = (PedFileSystem *)ped_malloc(sizeof(PedFileSystem))))
+ goto error_free_io_handler;
+
+ fs->type = &reiserfs_type;
+ fs->geom = fs_geom;
+
+ fs->type_specific = (void *)fs_info;
+
+ return fs;
+
+error_free_io_handler:
+ reiserfs_io_handler_destroy(io_handler);
+error_free_fs:
+ ped_free(fs);
+error:
+ return NULL;
+}
+
+static int reiserfs_close (PedFileSystem* fs) {
+ struct reiserfs_io_handler *io_handler = ((reiserfs_fs_t
*)fs->type_specific)->io_handler;
+
+ if (io_handler) reiserfs_io_handler_destroy(io_handler);
+ _reiserfs_fs_close(fs->type_specific);
+ ped_free(fs);
+ return 1;
+}
+
+static PedConstraint* reiserfs_get_resize_constraint (const PedFileSystem* fs)
{
+ reiserfs_fs_t *fs_info = (reiserfs_fs_t *)fs->type_specific;
+ PedDisk *disk = fs->geom->disk;
+ PedAlignment start_align;
+ PedGeometry start_sector;
+ PedGeometry full_disk;
+ PedSector min_size;
+
+ if (!ped_alignment_init (&start_align, fs->geom->start, 0))
+ return NULL;
+ if (!ped_geometry_init (&full_disk, disk, 0, disk->dev->length - 1))
+ return NULL;
+ if (!ped_geometry_init (&start_sector, disk, fs->geom->start, 1))
+ return NULL;
+
+ min_size = (fs_info->fs_super_bh->b_blocknr +
fs_info->fs_ondisk_sb->s_v1.sb_block_count -
+ fs_info->fs_ondisk_sb->s_v1.sb_free_blocks) * (fs_info->fs_blocksize /
PED_SECTOR_SIZE);
+
+ return ped_constraint_new (&start_align, ped_alignment_any,
+ &start_sector, &full_disk, min_size);
+}
+
+static int reiserfs_resize (PedFileSystem* fs, const PedGeometry *geom) {
+ reiserfs_fs_t *fs_info;
+ PedSector old_length = fs->geom->length;
+ unsigned long blocks;
+
+ if (fs->geom->disk->dev != geom->disk->dev) {
+ ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Filesystem device isn't equals geometry device"));
+ return 0;
+ }
+
+ 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 = (reiserfs_fs_t *)fs->type_specific;
+
+ blocks = (unsigned long)(geom->length /
+ (fs_info->fs_blocksize / PED_SECTOR_SIZE)) -
+ fs_info->fs_super_bh->b_blocknr;
+
+ if (old_length > geom->length) {
+ if (!_reiserfs_fs_resize(fs_info, blocks))
+ goto error;
+
+ fs->geom->length = geom->length;
+ fs->geom->end = fs->geom->start + geom->length - 1;
+ } else {
+ fs->geom->length = geom->length;
+ fs->geom->end = fs->geom->start + geom->length - 1;
+
+ if (!_reiserfs_fs_resize(fs_info, blocks))
+ goto error;
+ }
+
+ return 1;
+
+error:
+ fs->geom->length = old_length;
+ fs->geom->end = fs->geom->start + old_length - 1;
+
+ return 0;
+}
+
+static int
+reiserfs_check (PedFileSystem *fs)
+{
+ reiserfs_fs_t *fs_info = (reiserfs_fs_t *)fs->type_specific;
+
+ if (!_reiserfs_fs_is_found(fs_info)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("No reiserfs found"));
+ return 0;
+ }
+
+ if (!_reiserfs_bm_is_spread(fs_info)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Can't resize reiserfs in old format"));
+ return 0;
+ }
+
+ if (!_reiserfs_fs_is_consistent(fs_info)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Filesystem isn't consistent. Run reiserfsck --check first"));
+ return 0;
+ }
+
+ if (get_sb_state(fs_info->fs_ondisk_sb) != REISERFS_FS_VALID) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Filesystem isn't in valid state"));
+ return 0;
+ }
+
+ ped_exception_throw (PED_EXCEPTION_INFORMATION, PED_EXCEPTION_OK,
+ _("The reiserfs filesystem passed a basic check. For a more "
+ "comprehensive check, use the reiserfsck --check"));
+
+ return 1;
}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_blk.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_blk.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_blk.c Thu Jan 1
03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_blk.c Sat Jan
12 22:07:57 2002
@@ -0,0 +1,72 @@
+/*
+ reiserfs_blk.h -- buffer_head functions
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Writen by Yury Umanets (address@hidden)
+*/
+
+static const char _reiserfs_blk_c[] = "$Id: reiserfs_blk.h,v 1.55 2002/01/12
20:16:19 yumanets Exp $";
+
+#include <sys/types.h>
+
+#include <parted/parted.h>
+
+#include "reiserfs_blk.h"
+#include "reiserfs_io.h"
+
+struct buffer_head *_reiserfs_block_alloc(reiserfs_blk_t block, size_t size) {
+ struct buffer_head *bh_blk;
+
+ bh_blk = (struct buffer_head *)ped_malloc(sizeof(*bh_blk));
+ memset(bh_blk, 0, sizeof(*bh_blk));
+ bh_blk->b_data = ped_malloc(size);
+ memset(bh_blk->b_data, 0, size);
+
+ bh_blk->b_size = size;
+ bh_blk->b_blocknr = block;
+
+ return bh_blk;
+}
+
+void _reiserfs_block_free(struct buffer_head *bh_blk) {
+ if (bh_blk == 0)
+ return;
+ ped_free(bh_blk->b_data);
+ ped_free(bh_blk);
+}
+
+struct buffer_head *_reiserfs_block_read(void *io_handler, reiserfs_blk_t
block, size_t size) {
+ struct buffer_head *bh_blk;
+
+ bh_blk = _reiserfs_block_alloc(block, size);
+ if (!((struct reiserfs_io_handler *)io_handler)->ops->read(io_handler,
bh_blk->b_data, block, 1, size)) {
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ return bh_blk;
+}
+
+int _reiserfs_block_write(void *io_handler, struct buffer_head *bh_blk) {
+
+ if (!((struct reiserfs_io_handler *)io_handler)->ops->write(io_handler,
bh_blk->b_data,
+ bh_blk->b_blocknr, 1, bh_blk->b_size))
+ return 0;
+
+ return 1;
+}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_blk.h
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_blk.h
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_blk.h Thu Jan 1
03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_blk.h Sat Jan
12 22:03:35 2002
@@ -0,0 +1,43 @@
+/*
+ reiserfs_blk.h -- buffer_head functions
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Writen by Yury Umanets (address@hidden)
+*/
+
+
+#ifndef REISERFS_BLK_H
+#define REISERFS_BLK_H
+
+static const char _reiserfs_blk_h[] = "$Id: reiserfs_blk.h,v 1.55 2002/01/12
20:16:19 yumanets Exp $";
+
+typedef unsigned long reiserfs_blk_t;
+
+struct buffer_head {
+ reiserfs_blk_t b_blocknr;
+ size_t b_size;
+ char *b_data;
+};
+
+extern struct buffer_head *_reiserfs_block_alloc(reiserfs_blk_t block, size_t
size);
+extern void _reiserfs_block_free(struct buffer_head *bh_blk);
+extern struct buffer_head *_reiserfs_block_read(void *io_handler,
reiserfs_blk_t block, size_t size);
+extern int _reiserfs_block_write(void *io_handler, struct buffer_head *bh_blk);
+
+#endif
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_bm.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_bm.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_bm.c Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_bm.c Sat Jan
12 21:25:53 2002
@@ -0,0 +1,422 @@
+/*
+ reiserfs_bm.c -- reiserfs bitmap stuff
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the linux kernel. Writen by Yury Umanets (address@hidden)
+*/
+
+static const char _reiserfs_fs_c[] = "$Id: reiserfs_bm.c,v 1.55 2002/01/11
19:55:11 yumanets Exp $";
+
+#include <parted/parted.h>
+
+#include "reiserfs_fs.h"
+#include "reiserfs_tools.h"
+
+#if ENABLE_NLS
+# include <libintl.h>
+# define _(String) dgettext (PACKAGE, String)
+#else
+# define _(String) (String)
+#endif
+
+/*
+ Bitmap utils.
+ Mark given block as used.
+*/
+void _reiserfs_bm_set_bit(reiserfs_bm_t *bm, reiserfs_blk_t bit) {
+ if (test_bit (bit, bm->bm_map))
+ return;
+ set_bit(bit, bm->bm_map);
+ bm->bm_set_bits++;
+}
+
+/*
+ Mark given block as free
+*/
+void _reiserfs_bm_clear_bit(reiserfs_bm_t *bm, reiserfs_blk_t bit) {
+ if (!test_bit (bit, bm->bm_map))
+ return;
+ clear_bit (bit, bm->bm_map);
+ bm->bm_set_bits--;
+}
+
+/*
+ Check for block status
+*/
+int _reiserfs_bm_test_bit(reiserfs_bm_t *bm, reiserfs_blk_t bit) {
+ return test_bit(bit, bm->bm_map);
+}
+
+/*
+ Find free block
+*/
+int _reiserfs_bm_find_zero_bit(reiserfs_bm_t *bm, reiserfs_blk_t *start) {
+ reiserfs_blk_t bit = *start;
+
+ bit = find_next_zero_bit(bm->bm_map, bm->bm_bit_size, *start);
+
+ if (bit >= bm->bm_bit_size)
+ return 1;
+
+ *start = bit;
+ return 0;
+}
+
+/*
+ Generic bitmap functions.
+ Allocating and setting up reiserfs bitmap.
+*/
+void _reiserfs_bm_free(reiserfs_bm_t *bm);
+
+reiserfs_bm_t *_reiserfs_bm_alloc(reiserfs_blk_t blocks) {
+ reiserfs_bm_t *bm;
+
+ PED_ASSERT((blocks > 0), goto error);
+
+ if (!(bm = (reiserfs_bm_t *)ped_malloc(sizeof(*bm))))
+ goto error;
+
+ memset(bm, 0, sizeof(*bm));
+
+ bm->bm_bit_size = blocks;
+ bm->bm_byte_size = (blocks + 7) / 8;
+ bm->bm_set_bits = 0;
+
+ if (!(bm->bm_map = (char *)ped_malloc(bm->bm_byte_size)))
+ goto error_free_bm;
+
+ memset(bm->bm_map, 0, bm->bm_byte_size);
+ return bm;
+
+error_free_bm:
+ _reiserfs_bm_free(bm);
+error:
+ return NULL;
+}
+
+/*
+ Free given bitmap
+*/
+void _reiserfs_bm_free(reiserfs_bm_t *bm) {
+
+ PED_ASSERT(bm != NULL, return);
+
+ if (bm->bm_map) {
+ ped_free(bm->bm_map);
+ bm->bm_map = 0;
+ }
+ bm->bm_bit_size = 0;
+ bm->bm_byte_size = 0;
+ ped_free(bm);
+}
+
+/*
+ Fetching bitmap. File system must be
+ allocated and super block must be initialazed
+*/
+int _reiserfs_bm_fetch(reiserfs_fs_t *fs, reiserfs_bm_t *bm) {
+ char *p;
+ size_t left;
+ reiserfs_blk_t block;
+ struct buffer_head *bh_blk;
+ int i, last_byte_unused_bits;
+
+ PED_ASSERT(fs != NULL && bm != NULL && fs->fs_ondisk_sb != NULL, return 0);
+
+ p = bm->bm_map;
+ for (left = (get_sb_block_count (fs->fs_ondisk_sb) + 7) / 8,
+ block = fs->fs_super_bh->b_blocknr + 1; left > 0;
+ left -= (left < fs->fs_blocksize ? left : fs->fs_blocksize))
+ {
+ if (!(bh_blk = _reiserfs_block_read (fs->io_handler, block,
fs->fs_blocksize))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Reading block (%lu) failed"), block);
+ return 0;
+ }
+
+ memcpy (p, bh_blk->b_data,
+ (left < fs->fs_blocksize ? left : fs->fs_blocksize));
+ _reiserfs_block_free(bh_blk);
+ p += (left < fs->fs_blocksize ? left : fs->fs_blocksize);
+
+ /* Next bitmap block */
+ if (_reiserfs_bm_is_spread (fs))
+ block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize *
8);
+ else
+ block++;
+ }
+
+ /*
+ On disk bitmap has bits out of SB_BLOCK_COUNT set to 1, where as
+ reiserfs_bm_t has those bits set to 0
+ */
+ last_byte_unused_bits = bm->bm_byte_size * 8 - bm->bm_bit_size;
+ for (i = 0; i < last_byte_unused_bits; i++)
+ clear_bit(bm->bm_bit_size + i, bm->bm_map);
+
+ bm->bm_set_bits = 0;
+
+ /*
+ Needed optimization
+ */
+ for (i = 0; i < (int)bm->bm_bit_size; i++) {
+ if (_reiserfs_bm_test_bit (bm, i))
+ bm->bm_set_bits++;
+ }
+
+ return 1;
+}
+
+/*
+ Flushing bitmap. File system must be initialized
+*/
+int _reiserfs_bm_flush(reiserfs_fs_t *fs, reiserfs_bm_t *bm) {
+ char *p;
+ size_t left;
+ reiserfs_blk_t block;
+ struct buffer_head *bh_blk;
+ int i, last_byte_unused_bits;
+
+ PED_ASSERT(fs && bm, return 0);
+
+ /*
+ Make sure that the device is big enough
+ */
+ if (!(bh_blk = _reiserfs_block_read (fs->io_handler, bm->bm_bit_size - 1,
fs->fs_blocksize))) {
+ ped_exception_throw(PED_EXCEPTION_WARNING, PED_EXCEPTION_IGNORE,
+ _("Reading block (%lu) failed"), bm->bm_bit_size - 1);
+ }
+ _reiserfs_block_free(bh_blk);
+
+ p = bm->bm_map;
+ for (left = bm->bm_byte_size, block = fs->fs_super_bh->b_blocknr + 1;
+ left > 0; left -= (left < fs->fs_blocksize ? left : fs->fs_blocksize))
+ {
+ /*
+ We read to make sure that filesystem
+ contains enough blocks
+ */
+ if (!(bh_blk = _reiserfs_block_alloc(block, fs->fs_blocksize))) {
+ ped_exception_throw(PED_EXCEPTION_WARNING, PED_EXCEPTION_IGNORE,
+ _("Allocating block (%lu) failed"), block);
+ return 0;
+ }
+ memset (bh_blk->b_data, 0xff, bh_blk->b_size);
+ memcpy (bh_blk->b_data, p, (left < fs->fs_blocksize ? left :
fs->fs_blocksize));
+ if (left == fs->fs_blocksize) {
+ /*
+ Set unused bits of last byte of the bitmap to 1
+ */
+ last_byte_unused_bits = bm->bm_byte_size * 8 - bm->bm_bit_size;
+ for (i = 0; i < last_byte_unused_bits; i ++)
+ set_bit ((bm->bm_bit_size % (fs->fs_blocksize * 8)) + i,
+ bh_blk->b_data);
+ }
+ if (!_reiserfs_block_write(fs->io_handler, bh_blk)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Writing block (%lu) failed"), bh_blk->b_blocknr);
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ _reiserfs_block_free(bh_blk);
+ p += (left < fs->fs_blocksize ? left : fs->fs_blocksize);
+
+ /*
+ Next bitmap block
+ */
+ if (_reiserfs_bm_is_spread(fs))
+ block = (block / (fs->fs_blocksize * 8) + 1) * (fs->fs_blocksize *
8);
+ else
+ block++;
+
+ }
+
+ return 1;
+}
+
+/*
+ Open bitmap. Allocating and fetching it.
+ File system super block must be initalized
+*/
+reiserfs_bm_t *_reiserfs_bm_open (reiserfs_fs_t *fs) {
+ reiserfs_bm_t *bm;
+
+ PED_ASSERT(fs != NULL, return NULL);
+
+ if (fs->fs_bitmap2) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Bitmap is initiaized already"));
+ goto error;
+ }
+
+ if(!(bm = _reiserfs_bm_alloc(get_sb_block_count(fs->fs_ondisk_sb)))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't allocate bitmap"));
+ goto error;
+ }
+
+ if (!_reiserfs_bm_fetch(fs, bm)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't fetch bitmap"));
+ goto error_free_bm;
+ }
+
+ fs->fs_bitmap2 = bm;
+ return bm;
+
+error_free_bm:
+ _reiserfs_bm_free(bm);
+error:
+ return NULL;
+}
+
+/*
+ Creating bitmap. File system must be initialized
+*/
+reiserfs_bm_t *_reiserfs_bm_create(reiserfs_fs_t *fs, reiserfs_blk_t blocks,
size_t block_size,
+ reiserfs_blk_t journal_blocks)
+{
+ reiserfs_bm_t *bm;
+ reiserfs_blk_t i, bmnr;
+ reiserfs_blk_t blk = REISERFS_DISK_OFFSET_IN_BYTES / block_size;
+
+ PED_ASSERT(fs != NULL, goto error);
+
+ if(!(bm = _reiserfs_bm_alloc(blocks))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't allocate bitmap"));
+ goto error;
+ }
+
+ /*
+ Marking skiped blocks used
+ */
+ for (i = 0; i < blk; i++)
+ _reiserfs_bm_set_bit(bm, i);
+
+ /*
+ Marking super block
+ */
+ _reiserfs_bm_set_bit(bm, i++);
+
+ /*
+ Marking first bitmap block
+ */
+ _reiserfs_bm_set_bit(bm, i++);
+
+ /*
+ Marking journal blocks
+ */
+ for (; i <= blk + 2 + journal_blocks; i++)
+ _reiserfs_bm_set_bit(bm, i);
+
+ /*
+ Make sure, that all journal blocks pointed by first bitmap
+ */
+ if (i >= block_size * 8)
+ goto error_free_bm;
+
+ /*
+ Make sure, that we still have some amount
+ (100 blocks) of free space
+ */
+ if (i + 100 > blocks) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Size of file system is too small. It must be at least %lu
blocks"), i + 100 + 1);
+ goto error_free_bm;
+ }
+
+ /*
+ Marking root block as used
+ */
+ _reiserfs_bm_set_bit(bm, i);
+
+ /* Setting up other bitmap blocks */
+ bmnr = (blocks + (block_size * 8 - 1)) / (block_size * 8);
+
+ for (i = 1; i < PED_LE16_TO_CPU(fs->fs_ondisk_sb->s_v1.sb_bmap_nr); i++)
+ _reiserfs_bm_set_bit(bm, i * block_size * 8);
+
+ /*
+ Unused space of last bitmap is filled by 1
+ */
+ for (i = bmnr * fs->fs_ondisk_sb->s_v1.sb_blocksize * 8;
+ --i >= fs->fs_ondisk_sb->s_v1.sb_block_count; )
+ _reiserfs_bm_set_bit(bm, i);
+
+ fs->fs_bitmap2 = bm;
+ return bm;
+
+error_free_bm:
+ _reiserfs_bm_free(bm);
+error:
+ return NULL;
+}
+
+/*
+ Realloc bitmap corresponding to given blocks value
+*/
+int _reiserfs_bm_realloc(reiserfs_bm_t *bm, reiserfs_blk_t blocks) {
+ size_t bytes = ((blocks + 7) / 8), chunk;
+
+ PED_ASSERT(bm != NULL && blocks > 0, return 0);
+
+ if (bytes - bm->bm_byte_size == 0)
+ return 0;
+
+ if (bytes - bm->bm_byte_size > 0)
+ chunk = bytes - bm->bm_byte_size;
+ else
+ chunk = bm->bm_byte_size - bytes;
+
+ if (!(bm->bm_map = realloc(bm->bm_map, chunk)))
+ return 0;
+
+ bm->bm_byte_size = bytes;
+ bm->bm_bit_size = blocks;
+
+ return 1;
+}
+
+/*
+ Synchronizing bitmap
+*/
+int _reiserfs_bm_sync(reiserfs_fs_t *fs, reiserfs_bm_t *bm) {
+
+ PED_ASSERT(fs != NULL && bm != NULL, return 0);
+
+ if (!_reiserfs_bm_flush(fs, bm)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't synchronize bitmap"));
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ Closing bitmap. Free all allocated memory
+*/
+void _reiserfs_bm_close(reiserfs_fs_t *fs, reiserfs_bm_t *bm) {
+
+ PED_ASSERT(fs != NULL, return);
+
+ _reiserfs_bm_free(bm);
+ fs->fs_bitmap2 = NULL;
+}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_bm.h
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_bm.h
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_bm.h Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_bm.h Sat Jan
12 21:39:30 2002
@@ -0,0 +1,49 @@
+/*
+ reiserfs_bm.h -- reiserfs bitmap stuff
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the linux kernel. Writen by Yury Umanets (address@hidden)
+*/
+
+#ifndef REISERFS_BM_H
+#define REISERFS_BM_H
+
+static const char _reiserfs_bm_h[] = "$Id: reiserfs_fs.h,v 1.55 2002/01/11
19:56:19 yumanets Exp $";
+
+#include "reiserfs_fs.h"
+#include "reiserfs_blk.h"
+
+extern void _reiserfs_bm_set_bit (reiserfs_bm_t *bm, reiserfs_blk_t bit);
+extern void _reiserfs_bm_clear_bit (reiserfs_bm_t *bm, reiserfs_blk_t bit);
+extern int _reiserfs_bm_test_bit (reiserfs_bm_t *bm, reiserfs_blk_t bit);
+extern int _reiserfs_bm_find_zero_bit (reiserfs_bm_t *bm, reiserfs_blk_t
*start);
+
+extern reiserfs_bm_t *_reiserfs_bm_alloc(reiserfs_blk_t blocks);
+extern int _reiserfs_bm_realloc(reiserfs_bm_t *bm, reiserfs_blk_t blocks);
+extern void _reiserfs_bm_free(reiserfs_bm_t *bm);
+extern int _reiserfs_bm_fetch(reiserfs_fs_t *fs, reiserfs_bm_t *bm);
+extern int _reiserfs_bm_flush(reiserfs_fs_t *fs, reiserfs_bm_t *bm);
+extern reiserfs_bm_t *_reiserfs_bm_open (reiserfs_fs_t *fs);
+extern reiserfs_bm_t *_reiserfs_bm_create(reiserfs_fs_t *fs, reiserfs_blk_t
blocks,
+ size_t block_size, reiserfs_blk_t journal_blocks);
+extern int _reiserfs_bm_sync(reiserfs_fs_t *fs, reiserfs_bm_t *bm);
+extern void _reiserfs_bm_close(reiserfs_fs_t *fs, reiserfs_bm_t *bm);
+
+#endif
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_fs.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_fs.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_fs.c Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_fs.c Sat Jan
12 21:38:59 2002
@@ -0,0 +1,877 @@
+/*
+ reiserfs_fs.c -- generic reiserfs stuff
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the linux kernel. Writen by Yury Umanets (address@hidden)
+*/
+
+static const char _reiserfs_fs_c[] = "$Id: reiserfs_fs.c,v 1.55 2002/01/04
19:55:11 yumanets Exp $";
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <parted/parted.h>
+
+#include "reiserfs_fs.h"
+#include "reiserfs_bm.h"
+#include "reiserfs_tools.h"
+
+#if ENABLE_NLS
+# include <libintl.h>
+# define _(String) dgettext (PACKAGE, String)
+#else
+# define _(String) (String)
+#endif
+
+#define _reiserfs_key_uniqueness get_key_uniqueness
+
+static struct key root_dir_key = {0, 0, {{0, 0},}};
+static struct key parent_root_dir_key = {0, 0, {{0, 0},}};
+
+static char *reiserfs_fs_state_names[] = {"undefined", "valid", "invalid"};
+
+static void _reiserfs_make_const_keys (void) {
+ set_key_dirid (&root_dir_key, REISERFS_ROOT_PARENT_OBJECTID);
+ set_key_objectid (&root_dir_key, REISERFS_ROOT_OBJECTID);
+
+ set_key_dirid (&parent_root_dir_key, 0);
+ set_key_objectid (&parent_root_dir_key, REISERFS_ROOT_PARENT_OBJECTID);
+}
+
+/*
+ Key functions.
+*/
+static int _reiserfs_uniqueness2type (__u32 uniqueness) {
+ switch (uniqueness) {
+ case V1_SD_UNIQUENESS: return KEY_TYPE_STAT_DATA;
+ case V1_INDIRECT_UNIQUENESS: return KEY_TYPE_INDIRECT;
+ case V1_DIRECT_UNIQUENESS: return KEY_TYPE_DIRECT;
+ case V1_DIRENTRY_UNIQUENESS: return KEY_TYPE_DIRENTRY;
+ }
+ return KEY_TYPE_UNKNOWN;
+}
+
+static __u32 _reiserfs_type2uniqueness (int type) {
+ switch (type) {
+ case KEY_TYPE_STAT_DATA: return V1_SD_UNIQUENESS;
+ case KEY_TYPE_INDIRECT: return V1_INDIRECT_UNIQUENESS;
+ case KEY_TYPE_DIRECT: return V1_DIRECT_UNIQUENESS;
+ case KEY_TYPE_DIRENTRY: return V1_DIRENTRY_UNIQUENESS;
+ }
+ return V1_UNKNOWN_UNIQUENESS;
+}
+
+#define V2_TYPE_MASK 0xf000000000000000LL
+
+static __u16 _reiserfs_key_type_v2 (const struct key *key) {
+ __u64 * p, tmp;
+
+ p = (__u64 *)(&(key->u.k2_offset_v2));
+ tmp = PED_LE64_TO_CPU (*p);
+ /* clear all bits but the ones the type is stored in */
+ tmp &= V2_TYPE_MASK;
+ /* type is stored in 4 highest bits */
+ tmp >>= 60;
+ return (__u16)tmp;
+}
+
+static int _reiserfs_key_format(const struct key *key) {
+ int type;
+
+ type = _reiserfs_key_type_v2 (key);
+
+ if (type == 0 || type == 15)
+ return KEY_FORMAT_1;
+
+ return KEY_FORMAT_2;
+}
+
+static int _reiserfs_key_type (const struct key *key) {
+ if (_reiserfs_key_format (key) == KEY_FORMAT_1)
+ return _reiserfs_uniqueness2type (_reiserfs_key_uniqueness (key));
+ return _reiserfs_key_type_v2 (key);
+}
+
+static int _reiserfs_journal_is_opened (reiserfs_fs_t *fs) {
+ return fs->fs_jh_bh ? 1 : 0;
+}
+
+static int _reiserfs_fs_is_newformat (reiserfs_fs_t *fs) {
+ return fs->fs_super_bh->b_blocknr != 2;
+}
+
+/*
+ Setting given state
+*/
+static int _reiserfs_fs_set_state(reiserfs_fs_t *fs, reiserfs_state_t state) {
+ set_sb_state(fs->fs_ondisk_sb, (int)state);
+ if (!_reiserfs_block_write(fs->io_handler, fs->fs_super_bh)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't set %s state. Writing (%lu) block failed"),
+ reiserfs_fs_state_names[state], fs->fs_super_bh->b_blocknr);
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ Moving of the generic file system block
+*/
+static reiserfs_blk_t _reiserfs_block_move(reiserfs_fs_t *fs,
+ reiserfs_blk_t old_blk, reiserfs_blk_t new_blk)
+{
+ struct buffer_head *bh_old_blk, *bh_new_blk;
+
+ PED_ASSERT((old_blk < get_sb_block_count(fs->fs_ondisk_sb)), return 0);
+
+ if (!(bh_old_blk = _reiserfs_block_read(fs->io_handler, old_blk,
fs->fs_blocksize)))
+ return 0;
+
+ bh_new_blk = _reiserfs_block_alloc(new_blk, fs->fs_blocksize);
+ memcpy(bh_new_blk->b_data, bh_old_blk->b_data, bh_new_blk->b_size);
+
+ _reiserfs_bm_clear_bit(fs->fs_bitmap2, old_blk);
+ _reiserfs_bm_set_bit(fs->fs_bitmap2, new_blk);
+
+ _reiserfs_block_free(bh_old_blk);
+
+ if (!_reiserfs_block_write(fs->io_handler, bh_new_blk)) {
+ _reiserfs_block_free(bh_new_blk);
+ return 0;
+ }
+
+ _reiserfs_block_free(bh_new_blk);
+
+ return new_blk;
+}
+
+/*
+ Moving formated and unformated blocks.
+*/
+static reiserfs_blk_t _reiserfs_block_move_unformatted(reiserfs_fs_t *fs,
+ reiserfs_blk_t block, reiserfs_blk_t blocks)
+{
+ reiserfs_blk_t new_blk = 1;
+
+ /*
+ Checking whether block is inside
+ */
+ if (block < blocks)
+ return 0;
+
+ /*
+ Finding free block
+ */
+ _reiserfs_bm_find_zero_bit(fs->fs_bitmap2, &new_blk);
+ if (new_blk == 0 || new_blk >= blocks)
+ return 0;
+
+ return _reiserfs_block_move(fs, block, new_blk);
+}
+
+static reiserfs_blk_t _reiserfs_block_move_formatted(reiserfs_fs_t *fs,
+ reiserfs_blk_t block, reiserfs_blk_t blocks)
+{
+ int i, j;
+ struct buffer_head *bh_blk;
+ struct item_head *ih;
+ reiserfs_blk_t new_blk = 1;
+
+ if (!(bh_blk = _reiserfs_block_read(fs->io_handler, block,
fs->fs_blocksize))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't move formated block. Reading block (%lu) failed"),
block);
+ return 0;
+ }
+
+ if (is_leaf_node (bh_blk)) {
+ /*
+ This is a leaf node. The small files lives directly in them.
+ And the big files, so called unformated blocks are chinden of
+ the leaves. Leaves references them. The unformated blocks are
+ files data. We move them here.
+ */
+ for (i = 0; i < B_NR_ITEMS(bh_blk); i++) {
+ ih = B_N_PITEM_HEAD(bh_blk, i);
+ if (is_indirect_ih(ih)) {
+ __u32 * indirect;
+
+ indirect = (__u32 *)B_I_PITEM (bh_blk, ih);
+ for (j = 0; j < (int)I_UNFM_NUM(ih); j++) {
+ reiserfs_blk_t unfm_blk;
+
+ if (indirect [j] == 0)
+ continue;
+
+ if ((unfm_blk = _reiserfs_block_move_unformatted(fs,
+ PED_LE32_TO_CPU (indirect [j]), blocks)))
+ indirect [j] = PED_CPU_TO_LE32(unfm_blk);
+ }
+ }
+ }
+ } else if (is_internal_node (bh_blk)) {
+
+ /*
+ This is an internal node. Internals nodes contains
+ other internals nodes and leaves. In all cases we
+ make recursive call to moving all children.
+ */
+
+ for (i = 0; i <= B_NR_ITEMS(bh_blk); i++) {
+ reiserfs_blk_t moved_blk;
+ if ((moved_blk = _reiserfs_block_move_formatted(fs,
+ get_dc_child_blocknr (B_N_CHILD (bh_blk, i)), blocks)))
+ set_dc_child_blocknr (B_N_CHILD (bh_blk, i), moved_blk);
+ }
+
+ } else {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't move formated block. Block (%lu) has invalid format"),
block);
+ return 0;
+ }
+
+ if (!_reiserfs_block_write(fs->io_handler, bh_blk)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Can't move formated block (%lu). Writing failed"),
+ bh_blk->b_blocknr);
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ _reiserfs_block_free(bh_blk);
+
+ /*
+ Checking whether block is inside
+ */
+ if (block < blocks)
+ return 0;
+
+ /*
+ Finding free block
+ */
+ _reiserfs_bm_find_zero_bit(fs->fs_bitmap2, &new_blk);
+ if (new_blk == 0 || new_blk >= blocks)
+ return 0;
+
+ return _reiserfs_block_move(fs, block, new_blk);
+}
+
+static int _reiserfs_fs_shrink(reiserfs_fs_t *fs, reiserfs_blk_t blocks) {
+ reiserfs_blk_t new_root_blk;
+ reiserfs_blk_t bmap_new_blknr;
+
+ bmap_new_blknr = (blocks - 1) / (8 * fs->fs_blocksize) + 1;
+
+ /* is shrinking possible ? */
+ if (get_sb_block_count(fs->fs_ondisk_sb) - blocks >
get_sb_free_blocks(fs->fs_ondisk_sb) +
+ get_sb_bmap_nr(fs->fs_ondisk_sb) - bmap_new_blknr)
+ {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Can't shrink filesystem. Too many blocks already allocated"));
+ return 0;
+ }
+
+ if ((new_root_blk = _reiserfs_block_move_formatted(fs,
get_sb_root_block(fs->fs_ondisk_sb), blocks)))
+ set_sb_root_block (fs->fs_ondisk_sb, new_root_blk);
+
+ /*
+ Shrinking bitmap
+ */
+ fs->fs_bitmap2->bm_bit_size = blocks;
+ fs->fs_bitmap2->bm_byte_size = (blocks + 7) / 8;
+
+ set_sb_free_blocks (fs->fs_ondisk_sb, get_sb_free_blocks(fs->fs_ondisk_sb)
-
+ (get_sb_block_count(fs->fs_ondisk_sb) - blocks) +
(get_sb_bmap_nr(fs->fs_ondisk_sb) - bmap_new_blknr));
+ set_sb_block_count (fs->fs_ondisk_sb, blocks);
+ set_sb_bmap_nr (fs->fs_ondisk_sb, bmap_new_blknr);
+
+ return 1;
+}
+
+static int _reiserfs_fs_expand(reiserfs_fs_t *fs, reiserfs_blk_t blocks) {
+
+ reiserfs_blk_t i;
+ struct reiserfs_super_block *sb;
+ reiserfs_blk_t bmap_new_blknr, bmap_old_blknr;
+
+ sb = fs->fs_ondisk_sb;
+
+ if (!_reiserfs_bm_realloc(fs->fs_bitmap2, blocks)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Can't expand bitmap"));
+ return 0;
+ }
+
+ /*
+ Computing bitmap blocks count in new fs. One bit in bitmap
+ points to big extent which consists of 8 reiserfs blocks.
+ Default it is 4096 * 8. In my case (14795376k hdd and one
+ big reiserfs partition) bitmap is about 113 blocks. It is
+ about 3Mb of address information.
+ */
+ bmap_old_blknr = get_sb_bmap_nr(sb);
+ bmap_new_blknr = (blocks - 1) / (fs->fs_blocksize * 8) + 1;
+
+ /*
+ Updating super block buffer
+ */
+ set_sb_free_blocks(sb, get_sb_free_blocks(sb) + (blocks -
get_sb_block_count(sb)) -
+ (bmap_new_blknr - bmap_old_blknr));
+ set_sb_block_count(sb, blocks);
+ set_sb_bmap_nr(sb, bmap_new_blknr);
+
+ /*
+ Mark new bitmap blocks as used
+ */
+
+ for (i = bmap_old_blknr; i < bmap_new_blknr; i++)
+ _reiserfs_bm_set_bit (fs->fs_bitmap2, i * fs->fs_blocksize * 8);
+
+ return 1;
+}
+
+static void _reiserfs_fs_free (reiserfs_fs_t *fs) {
+ if (fs->fs_jh_bh) {
+ _reiserfs_block_free(fs->fs_jh_bh);
+ fs->fs_jh_bh = 0;
+ }
+
+ _reiserfs_bm_close(fs, fs->fs_bitmap2);
+
+ if (fs->fs_super_bh) {
+ _reiserfs_block_free(fs->fs_super_bh);
+ fs->fs_super_bh = 0;
+ }
+
+ ped_free(fs);
+}
+
+static int _reiserfs_journal_open(reiserfs_fs_t *fs) {
+ struct buffer_head *bh_blk;
+ struct reiserfs_super_block *sb;
+
+ sb = fs->fs_ondisk_sb;
+
+ if (!(bh_blk = _reiserfs_block_read (fs->io_handler,
get_jp_journal_1st_block(sb_jp(sb)) +
+ get_jp_journal_size (sb_jp (sb)), fs->fs_blocksize)))
+ return 0;
+
+ fs->fs_jh_bh = bh_blk;
+ return 1;
+}
+
+/* Public functions */
+reiserfs_fs_t *_reiserfs_fs_open (struct reiserfs_io_handler *io_handler) {
+ int i;
+ reiserfs_fs_t *fs;
+ struct reiserfs_super_block *sb;
+ struct buffer_head *bh_blk;
+ int super_offset[] = {16, 2, -1};
+
+ /*
+ Convert root dir key and parent root dir key to little
+ endian format
+ */
+ _reiserfs_make_const_keys();
+
+ fs = (reiserfs_fs_t *)ped_malloc(sizeof(*fs));
+ memset(fs, 0, sizeof(*fs));
+
+ fs->io_handler = io_handler;
+
+ for (i = 0; super_offset[i] != -1; i++) {
+ if (!(bh_blk = _reiserfs_block_read (fs->io_handler, super_offset[i],
+ REISERFS_DEFAULT_BLOCK_SIZE)))
+ {
+ ped_exception_throw(PED_EXCEPTION_WARNING, PED_EXCEPTION_IGNORE,
+ _("Can't read block %d\n"), i);
+ } else {
+ sb = (struct reiserfs_super_block *)bh_blk->b_data;
+
+ if (is_any_reiserfs_magic_string ((const char *)sb->s_v1.s_magic)) {
+ /*
+ Making some check to make sure that super block looks
+ correctly. I mean, that fs block count must be less device
+ block count.
+ */
+ if (get_sb_block_count(sb) <=
io_handler->ops->blocks(io_handler, get_sb_block_size(sb)))
+ goto found;
+
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Super block has invalid block count"));
+ }
+
+ /*
+ Reiserfs signature isn't found at the
+ reiserfs_super_offset[i]-th 4k block
+ */
+ _reiserfs_block_free(bh_blk);
+ }
+ }
+
+ goto error_free_fs;
+
+found:
+ fs->fs_version = get_sb_version(sb);
+ fs->fs_blocksize = get_sb_block_size(sb);
+ fs->fs_super_bh = bh_blk;
+ fs->fs_ondisk_sb = sb;
+
+ if (!_reiserfs_journal_open(fs))
+ goto error_free_fs;
+
+ if (!_reiserfs_bm_open(fs))
+ goto error_free_journal;
+
+ return fs;
+
+error_free_journal:
+ _reiserfs_block_free(fs->fs_jh_bh);
+error_free_fs:
+ ped_free(fs);
+error:
+ return NULL;
+}
+
+static struct buffer_head *_reiserfs_sb_create(size_t block_size,
reiserfs_blk_t journal_blocks,
+ reiserfs_blk_t blocks)
+{
+ __u32 *oids;
+ reiserfs_blk_t blk;
+ struct reiserfs_super_block *sb;
+ struct buffer_head *super_bh_blk, **bm_bh_blks;
+
+ blk = REISERFS_DISK_OFFSET_IN_BYTES / block_size;
+
+ super_bh_blk = _reiserfs_block_alloc(blk, block_size);
+ sb = (struct reiserfs_super_block *)super_bh_blk->b_data;
+
+ memset(sb, 0, block_size);
+
+ sb->s_v1.sb_block_count = PED_CPU_TO_LE32(blocks);
+ sb->s_v1.sb_bmap_nr = PED_CPU_TO_LE16((blocks + (block_size * 8 - 1)) /
(block_size * 8));
+
+ /*
+ Used blocks are: blk-s skipped, super block,
+ bitmap blocks, journal, root block.
+ */
+ sb->s_v1.sb_free_blocks = PED_CPU_TO_LE32(blocks - blk - 1 -
journal_blocks - 1
+ - PED_LE16_TO_CPU (sb->s_v1.sb_bmap_nr) - 1);
+
+ /*
+ Root block is after skipped (super_block), super block (1), first
+ bitmap(1), journal (journal_size), journal header(1)
+ */
+ sb->s_v1.sb_root_block = PED_CPU_TO_LE32(blk + 1 + 1 + journal_blocks + 1);
+
+ sb->s_v1.sb_version = PED_CPU_TO_LE16(REISERFS_FORMAT_3_6);
+ sb->s_v1.sb_blocksize = PED_CPU_TO_LE16(block_size);
+ sb->s_v1.sb_state = PED_CPU_TO_LE16(REISERFS_FS_VALID);
+ sb->s_v1.sb_tree_height = PED_CPU_TO_LE16(2);
+ sb->s_v1.sb_journal.jp_journal_dev = PED_CPU_TO_LE32(0);
+ sb->s_v1.sb_journal.jp_journal_size = PED_CPU_TO_LE32(journal_blocks);
+ sb->s_v1.sb_journal.jp_journal_trans_max = PED_CPU_TO_LE32(0);
+ sb->s_v1.sb_journal.jp_journal_block_count = PED_CPU_TO_LE32(0);
+ sb->s_v1.sb_journal.jp_journal_max_batch = PED_CPU_TO_LE32(0);
+ sb->s_v1.sb_journal.jp_journal_max_commit_age = PED_CPU_TO_LE32(0);
+ sb->s_v1.sb_journal.jp_journal_max_trans_age = PED_CPU_TO_LE32(0);
+ memcpy (sb->s_v1.s_magic, REISER2FS_SUPER_MAGIC_STRING,
+ sizeof (REISER2FS_SUPER_MAGIC_STRING));
+ /*
+ Using R5 hash as recomended in reiserfsprogs
+ */
+ sb->s_v1.sb_hash_function_code = PED_CPU_TO_LE32(3);
+
+ oids = (__u32 *)(sb + 1);
+ oids[0] = PED_CPU_TO_LE32(1);
+ oids[1] = PED_CPU_TO_LE32(REISERFS_ROOT_OBJECTID + 1);
+
+ sb->s_v1.sb_oid_cursize = PED_CPU_TO_LE16 (2);
+ sb->s_v1.sb_oid_maxsize = PED_CPU_TO_LE16 ((block_size - SB_SIZE) /
+ sizeof (__u32) / 2 * 2);
+
+ sb->s_v1.sb_journal.jp_journal_1st_block =
PED_CPU_TO_LE32(super_bh_blk->b_blocknr + 2);
+
+ return super_bh_blk;
+}
+
+/*
+ Compose directory item containing "." and ".." entries
+*/
+static inline void make_empty_dir_item (char * body, __u32 dirid, __u32 objid,
+ __u32 par_dirid, __u32 par_objid)
+{
+ struct reiserfs_de_head *deh;
+
+ memset (body, 0, EMPTY_DIR_SIZE);
+ deh = (struct reiserfs_de_head *)body;
+
+ /*
+ Direntry header of "."
+ */
+ deh[0].deh2_offset = PED_CPU_TO_LE32(DOT_OFFSET);
+ deh[0].deh2_dir_id = PED_CPU_TO_LE32(dirid);
+ deh[0].deh2_objectid = PED_CPU_TO_LE32(objid);
+ deh[0].deh2_location = PED_CPU_TO_LE16(EMPTY_DIR_SIZE - ROUND_UP(strlen
(".")));
+ deh[0].deh2_state = 0;
+ mark_de_visible(&(deh[0]));
+
+ /*
+ Direntry header of ".."
+ */
+ deh[1].deh2_offset = PED_CPU_TO_LE32(DOT_DOT_OFFSET);
+
+ /*
+ Key of ".." for the root directory
+ */
+ deh[1].deh2_dir_id = PED_CPU_TO_LE32(par_dirid);
+ deh[1].deh2_objectid = PED_CPU_TO_LE32(par_objid);
+ deh[1].deh2_location =
PED_CPU_TO_LE16(PED_LE16_TO_CPU(deh[0].deh2_location) -
+ ROUND_UP(strlen ("..")));
+ deh[1].deh2_state = 0;
+ mark_de_visible(&(deh[1]));
+
+ /*
+ Copy ".." and "."
+ */
+ memcpy(body + deh[0].deh2_location, ".", 1);
+ memcpy(body + deh[1].deh2_location, "..", 2);
+}
+
+/*
+ Form the root block of the tree (the block head, the item head, the
+ root directory)
+*/
+static struct buffer_head *_reiserfs_root_create(reiserfs_fs_t *fs) {
+ char *rb;
+ struct reiserfs_super_block *sb = fs->fs_ondisk_sb;
+ struct buffer_head *root_bh_blk;
+ struct block_head *blkh;
+ struct item_head *ih;
+ struct stat_data *sd;
+ struct key maxkey = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff}, }};
+
+ PED_ASSERT(fs != NULL, return NULL);
+
+ root_bh_blk =
_reiserfs_block_alloc(PED_LE32_TO_CPU(sb->s_v1.sb_root_block),
+ fs->fs_super_bh->b_size);
+ rb = root_bh_blk->b_data;
+
+ /*
+ First item is stat data item of root directory
+ */
+ ih = (struct item_head *)(rb + BLKH_SIZE);
+ ih_version(ih) = PED_CPU_TO_LE16(ITEM_VERSION_2);
+ ih->ih_key.k2_dir_id = PED_CPU_TO_LE32(REISERFS_ROOT_PARENT_OBJECTID);
+ ih->ih_key.k2_objectid = PED_CPU_TO_LE32(REISERFS_ROOT_OBJECTID);
+
+ if (ih_version(ih) == ITEM_VERSION_1)
+ set_key_offset_v1(&ih->ih_key, SD_OFFSET);
+ else
+ ih->ih_key.u.k2_offset_v2.k_offset = PED_CPU_TO_LE64(SD_OFFSET);
+
+ if (ih_version(ih) == ITEM_VERSION_1)
+ set_key_uniqueness(&ih->ih_key,
_reiserfs_type2uniqueness(KEY_TYPE_STAT_DATA));
+ else
+ ih->ih_key.u.k2_offset_v2.k_type = PED_CPU_TO_LE16(KEY_TYPE_STAT_DATA);
+
+ ih->ih2_item_len = PED_CPU_TO_LE16 (SD_SIZE);
+ ih->ih2_item_location =
PED_CPU_TO_LE16(PED_LE16_TO_CPU(sb->s_v1.sb_blocksize) -
+ SD_SIZE);
+ set_ih_free_space(ih, MAX_US_INT);
+
+ /*
+ Fill new stat data
+ */
+ sd = (struct stat_data *)(rb + ih->ih2_item_location);
+ sd->sd_mode = PED_CPU_TO_LE16(S_IFDIR + 0755);
+ sd->sd_nlink = PED_CPU_TO_LE16(3);
+ sd->sd_uid = PED_CPU_TO_LE32(getuid());
+ sd->sd_gid = PED_CPU_TO_LE32(getgid());
+ sd->sd_size = PED_CPU_TO_LE64(EMPTY_DIR_SIZE);
+ sd->sd_atime = sd->sd_ctime = sd->sd_mtime = PED_CPU_TO_LE32(time(NULL));
+ sd->u.sd_rdev = PED_CPU_TO_LE32(0);
+
+ /*
+ Second item is root directory item,
+ containing "." and ".."
+ */
+ ih++;
+ ih_version(ih) = PED_CPU_TO_LE16(ITEM_VERSION_1);
+ ih->ih_key.k2_dir_id = PED_CPU_TO_LE32(REISERFS_ROOT_PARENT_OBJECTID);
+ ih->ih_key.k2_objectid = PED_CPU_TO_LE32(REISERFS_ROOT_OBJECTID);
+
+ if (ih_version(ih) == ITEM_VERSION_1)
+ set_key_offset_v1(&ih->ih_key, DOT_OFFSET);
+ else
+ ih->ih_key.u.k2_offset_v2.k_offset = PED_CPU_TO_LE64(DOT_OFFSET);
+
+ if (ih_version(ih) == ITEM_VERSION_1)
+ set_key_uniqueness(&ih->ih_key,
_reiserfs_type2uniqueness(KEY_TYPE_DIRENTRY));
+ else
+ ih->ih_key.u.k2_offset_v2.k_type = PED_CPU_TO_LE16(KEY_TYPE_DIRENTRY);
+
+ ih->ih2_item_len = PED_CPU_TO_LE16(DEH_SIZE * 2 + ROUND_UP(strlen (".")) +
+ ROUND_UP(strlen ("..")));
+ ih->ih2_item_location =
PED_CPU_TO_LE16(PED_LE16_TO_CPU((ih-1)->ih2_item_location) -
+ PED_LE16_TO_CPU(ih->ih2_item_len));
+ ih->u.ih2_entry_count = PED_CPU_TO_LE32(2);
+
+ /*
+ Compose item itself
+ */
+ make_empty_dir_item(rb + ih->ih2_item_location,
REISERFS_ROOT_PARENT_OBJECTID,
+ REISERFS_ROOT_OBJECTID, 0, REISERFS_ROOT_PARENT_OBJECTID);
+
+ /*
+ Block head
+ */
+ blkh = (struct block_head *)rb;
+ blkh->blk2_level = PED_CPU_TO_LE16 (REISERFS_DISK_LEAF_LEVEL);
+ blkh->blk2_nr_item = PED_CPU_TO_LE16 (2);
+ blkh->blk2_free_space = PED_CPU_TO_LE16
(PED_LE32_TO_CPU(sb->s_v1.sb_blocksize) - BLKH_SIZE -
+ 2 * IH_SIZE - SD_SIZE - PED_LE16_TO_CPU(ih->ih2_item_len));
+
+ return root_bh_blk;
+}
+
+/*
+ Initializing journal. Writes to device
+*/
+static int _reiserfs_journal_init(reiserfs_fs_t *fs, reiserfs_blk_t start,
+ reiserfs_blk_t len)
+{
+ reiserfs_blk_t i;
+ struct buffer_head *bh_blk;
+
+ for (i = 0; i < len; i++) {
+ bh_blk = _reiserfs_block_alloc(start + i, fs->fs_blocksize);
+ memset(bh_blk->b_data, 0, fs->fs_blocksize);
+ if (!_reiserfs_block_write(fs->io_handler, bh_blk)) {
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ _reiserfs_block_free(bh_blk);
+ }
+
+ if (!(bh_blk = _reiserfs_block_read (fs->io_handler,
get_jp_journal_1st_block(sb_jp(fs->fs_ondisk_sb)) +
+ get_jp_journal_size (sb_jp (fs->fs_ondisk_sb)), fs->fs_blocksize)))
+ return 0;
+
+ fs->fs_jh_bh = bh_blk;
+
+ return 1;
+}
+
+/*
+ Disables other fs and old versions of reiserfs
+ (super block lie at 2-th 4096 block). Wtrites to device too
+*/
+static int _reiserfs_fs_disable_other(reiserfs_fs_t *fs) {
+ struct buffer_head *bh_blk;
+
+ /*
+ Discard vfat/msods (0-th 512 byte sector)
+ and ext2 (1-st 1024 byte block)
+ */
+ bh_blk = _reiserfs_block_alloc(0, 2048);
+ memset (bh_blk->b_data, 0, 2048);
+ if (!_reiserfs_block_write(fs->io_handler, bh_blk)) {
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ _reiserfs_block_free(bh_blk);
+
+ /*
+ Discard super block of reiserfs of old
+ format (8-th 1024 byte block)
+ */
+ bh_blk = _reiserfs_block_alloc(8, 1024);
+ memset(bh_blk->b_data, 0, 1024);
+ if (!_reiserfs_block_write(fs->io_handler, bh_blk)) {
+ _reiserfs_block_free(bh_blk);
+ return 0;
+ }
+ _reiserfs_block_free(bh_blk);
+ return 1;
+}
+
+reiserfs_fs_t *_reiserfs_fs_create (struct reiserfs_io_handler *io_handler,
+ size_t block_size, reiserfs_blk_t journal_blocks, reiserfs_blk_t blocks)
+{
+ struct buffer_head *super_bh_blk, *root_bh_blk;
+ reiserfs_fs_t *fs;
+
+ if (block_size < PED_SECTOR_SIZE) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Block size is too small (%d)"), block_size);
+ return NULL;
+ }
+
+ if (block_size > REISERFS_DISK_OFFSET_IN_BYTES) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Block size is too big (%d)"), block_size);
+ return NULL;
+ }
+
+ if (!(fs = (reiserfs_fs_t *)ped_malloc(sizeof(*fs))))
+ return NULL;
+
+ memset(fs, 0, sizeof(*fs));
+ fs->io_handler = io_handler;
+ fs->fs_version = REISERFS_FORMAT_3_6;
+
+ /* Creating super */
+ if (!(super_bh_blk = _reiserfs_sb_create(block_size, journal_blocks,
blocks))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't create super block"));
+ goto error_free_fs;
+ }
+
+ fs->fs_super_bh = super_bh_blk;
+ fs->fs_ondisk_sb = (struct reiserfs_super_block *)super_bh_blk->b_data;
+ fs->fs_blocksize = block_size;
+
+ /*
+ Creating bitmap and setting it up
+ */
+ if (!_reiserfs_bm_create(fs, blocks, block_size, journal_blocks)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't create bitmap"));
+ goto error_free_super;
+ }
+
+ /*
+ Creating root
+ */
+ if (!(root_bh_blk = _reiserfs_root_create(fs))) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't create root block"));
+ goto error_free_bitmap;
+ }
+
+ /* Disabling other fs and older versions of reiserfs */
+ if (!_reiserfs_fs_disable_other(fs)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't disable other filesystems"));
+ goto error_free_root;
+ }
+
+ /* Writing initialized journal to disk */
+ if (!_reiserfs_journal_init(fs,
fs->fs_ondisk_sb->s_v1.sb_journal.jp_journal_1st_block,
+ fs->fs_ondisk_sb->s_v1.sb_journal.jp_journal_size))
+ {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't initialize journal"));
+ goto error_free_root;
+ }
+
+ /* Writing root block */
+ if (!_reiserfs_block_write(fs->io_handler, root_bh_blk)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't write root block"));
+ goto error_free_root;
+ }
+
+ /* Writing super block */
+ if (!_reiserfs_block_write(fs->io_handler, super_bh_blk)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't write super block"));
+ goto error_free_root;
+ }
+
+ /* Synchronizing bitmap */
+ if (!_reiserfs_bm_sync(fs, fs->fs_bitmap2)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Couldn't synchronize bitmap"));
+ goto error_free_root;
+ }
+
+ return fs;
+
+error_free_root:
+ _reiserfs_block_free(root_bh_blk);
+error_free_super:
+ _reiserfs_block_free(super_bh_blk);
+error_free_bitmap:
+ _reiserfs_bm_free(fs->fs_bitmap2);
+error_free_fs:
+ ped_free(fs);
+error:
+ return NULL;
+}
+
+void _reiserfs_fs_close (reiserfs_fs_t *fs) {
+ _reiserfs_fs_free(fs);
+}
+
+int _reiserfs_fs_is_consistent (reiserfs_fs_t *fs) {
+ if (!_reiserfs_journal_is_opened (fs)) {
+ ped_exception_throw(PED_EXCEPTION_WARNING, PED_EXCEPTION_IGNORE,
+ _("Standart journal not opened"));
+ return 0;
+ }
+
+ if (get_sb_fsck_state (fs->fs_ondisk_sb) != REISERFS_FS_CONSISTENT)
+ return 0;
+
+ return 1;
+}
+
+int _reiserfs_fs_is_found (reiserfs_fs_t *fs) {
+ return (fs->fs_blocksize == 0) ? 0 : 1;
+}
+
+int _reiserfs_bm_is_spread(reiserfs_fs_t *fs) {
+ return fs->fs_super_bh->b_blocknr != 2;
+}
+
+int _reiserfs_fs_resize(reiserfs_fs_t *fs, reiserfs_blk_t blocks) {
+
+ if (get_sb_state(fs->fs_ondisk_sb) != REISERFS_FS_VALID) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Filesystem isn't in valid state"));
+ return 0;
+ }
+
+ if (blocks > fs->io_handler->ops->blocks(fs->io_handler,
fs->fs_blocksize)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("Device is too small for %d blocks"), blocks);
+ return 0;
+ }
+
+ if (blocks == get_sb_block_count(fs->fs_ondisk_sb)) {
+ ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+ _("New size is the same as previous one"));
+ return 0;
+ }
+
+ _reiserfs_fs_set_state(fs, REISERFS_FS_INVALID);
+
+ if (!(blocks > get_sb_block_count(fs->fs_ondisk_sb) ?
+ _reiserfs_fs_expand(fs, blocks) : _reiserfs_fs_shrink(fs, blocks)))
+ return 0;
+
+ if (!_reiserfs_bm_sync(fs, fs->fs_bitmap2))
+ return 0;
+
+ _reiserfs_fs_set_state(fs, REISERFS_FS_VALID);
+
+ return 1;
+}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_fs.h
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_fs.h
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_fs.h Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_fs.h Sat Jan
12 21:59:16 2002
@@ -0,0 +1,549 @@
+/*
+ reiserfs_fs.h -- generic reiserfs stuff
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the linux kernel. Writen by Yury Umanets (address@hidden)
+*/
+
+#ifndef REISERFS_FS_H
+#define REISERFS_FS_H
+
+static const char _reiserfs_fs_h[] = "$Id: reiserfs_fs.h,v 1.55 2002/01/04
19:56:19 yumanets Exp $";
+
+#include <parted/endian.h>
+#include <parted/parted.h>
+
+#include "reiserfs_io.h"
+#include "reiserfs_blk.h"
+
+#define _ROUND_UP(x,n) (((x)+(n)-1u) & ~((n)-1u))
+#define ROUND_UP(x) _ROUND_UP(x,8LL)
+
+#define REISERFS_DISK_OFFSET_IN_BYTES 64 * 1024
+
+/*
+ Older and newer versions of the reiserfs
+*/
+#define REISERFS_FORMAT_3_5 0
+#define REISERFS_FORMAT_3_6 2
+
+/*
+ Max tree height in current version of the reiserfs,
+ but the grub-0.90 thinks tree height is 7
+*/
+#define REISERFS_TREE_MAX_HEIGHT 5
+
+/*
+ All operations which performed on fs mark fs as error first
+ and when operation is done mark it as valid again. So if operation
+ has failed we will have invalid file system and will needed
+ to reiserfsck it
+*/
+
+/*
+ Init key (id and parent id) for the tree root
+*/
+#define REISERFS_ROOT_OBJECTID 2
+#define REISERFS_ROOT_PARENT_OBJECTID 1
+
+/*
+ Tree levels
+*/
+#define REISERFS_FREE_LEVEL 0
+#define REISERFS_DISK_LEAF_LEVEL 1
+
+
+/*
+ Default block size. Needed by _reiserfs_fs_open
+ to read the super block and in other cases
+*/
+#define REISERFS_DEFAULT_BLOCK_SIZE 4096
+
+#define B_N_CHILD(p_s_bh,n_pos) \
+ ((struct disk_child *)((p_s_bh)->b_data + BLKH_SIZE + B_NR_ITEMS(p_s_bh) *\
+ KEY_SIZE + DC_SIZE * (n_pos)))
+
+#define MAX_CHILD_SIZE(blocksize) ((blocksize) - BLKH_SIZE)
+#define MAX_FREE_SPACE(blocksize) MAX_CHILD_SIZE(blocksize)
+
+#define B_CHILD_SIZE(cur) \
+ (MAX_CHILD_SIZE(cur->b_size)-(B_FREE_SPACE(cur)))
+
+#define B_I_PITEM(bh,ih) \
+ ((bh)->b_data + get_ih_location(ih))
+
+#define V1_SD_UNIQUENESS 0
+#define V1_DIRENTRY_UNIQUENESS 500
+#define V1_DIRECT_UNIQUENESS 0xffffffff
+#define V1_INDIRECT_UNIQUENESS 0xfffffffe
+#define V1_UNKNOWN_UNIQUENESS 555
+
+#define KEY_TYPE_STAT_DATA 0
+#define KEY_TYPE_INDIRECT 1
+#define KEY_TYPE_DIRECT 2
+#define KEY_TYPE_DIRENTRY 3
+#define KEY_TYPE_UNKNOWN 15
+
+#define KEY_FORMAT_1 0
+#define KEY_FORMAT_2 1
+
+#define KEY_IS_STAT_DATA_KEY(p_s_key) \
+ (_reiserfs_key_type (p_s_key) == KEY_TYPE_STAT_DATA)
+#define KEY_IS_DIRECTORY_KEY(p_s_key) \
+ (_reiserfs_key_type (p_s_key) == KEY_TYPE_DIRENTRY)
+#define KEY_IS_DIRECT_KEY(p_s_key) \
+ (_reiserfs_key_type (p_s_key) == KEY_TYPE_DIRECT)
+#define KEY_IS_INDIRECT_KEY(p_s_key) \
+ (_reiserfs_key_type (p_s_key) == KEY_TYPE_INDIRECT)
+
+#define is_indirect_key(key) KEY_IS_INDIRECT_KEY(key)
+#define is_direct_key(key) KEY_IS_DIRECT_KEY(key)
+#define is_direntry_key(key) KEY_IS_DIRECTORY_KEY(key)
+#define is_stat_data_key(key) KEY_IS_STAT_DATA_KEY(key)
+
+#define I_IS_STAT_DATA_ITEM(p_s_ih) \
+ KEY_IS_STAT_DATA_KEY(&((p_s_ih)->ih_key))
+#define I_IS_DIRECTORY_ITEM(p_s_ih) \
+ KEY_IS_DIRECTORY_KEY(&((p_s_ih)->ih_key))
+#define I_IS_DIRECT_ITEM(p_s_ih) \
+ KEY_IS_DIRECT_KEY(&((p_s_ih)->ih_key))
+#define I_IS_INDIRECT_ITEM(p_s_ih) \
+ KEY_IS_INDIRECT_KEY(&((p_s_ih)->ih_key))
+
+#define is_indirect_ih(ih) I_IS_INDIRECT_ITEM(ih)
+#define is_direct_ih(ih) I_IS_DIRECT_ITEM(ih)
+#define is_direntry_ih(ih) I_IS_DIRECTORY_ITEM(ih)
+#define is_stat_data_ih(ih) I_IS_STAT_DATA_ITEM(ih)
+
+#define B_N_PITEM_HEAD(bh, item_num) \
+ ((struct item_head * )((bh)->b_data + BLKH_SIZE) + (item_num))
+
+#define B_BLK_HEAD(p_s_bh) \
+ ((struct block_head *)((p_s_bh)->b_data))
+
+#define B_NR_ITEMS(bh) get_blkh_nr_items (B_BLK_HEAD(bh))
+#define B_LEVEL(bh) get_blkh_level (B_BLK_HEAD(bh))
+#define B_FREE_SPACE(bh) get_blkh_free_space (B_BLK_HEAD(bh))
+
+#define is_leaf_node(bh) is_leaf_block_head ((bh)->b_data)
+#define is_internal_node(bh) is_internal_block_head ((bh)->b_data)
+
+#define get_leXX(xx,p,field) \
+ (PED_LE##xx##_TO_CPU ((p)->##field))
+#define set_leXX(xx,p,field,val) \
+ do { (p)->##field = PED_CPU_TO_LE##xx(val); } while (0)
+
+#define get_le16(p,field) get_leXX (16, p, field)
+#define set_le16(p,field,val) set_leXX (16, p, field, val)
+
+#define get_le32(p,field) get_leXX (32, p, field)
+#define set_le32(p,field,val) set_leXX (32, p, field, val)
+
+#define get_le64(p,field) get_leXX (64, p, field)
+#define set_le64(p,field,val) set_leXX (64, p, field, val)
+
+struct block_head {
+ __u16 blk2_level;
+ __u16 blk2_nr_item;
+ __u16 blk2_free_space;
+ __u16 blk_reserved;
+ __u32 reserved[4];
+};
+
+#define BLKH_SIZE (sizeof(struct block_head))
+
+#define get_blkh_level(blkh) get_le16 (blkh, blk2_level)
+#define set_blkh_level(blkh,val) set_le16 (blkh, blk2_level, val)
+
+#define get_blkh_nr_items(blkh) get_le16 (blkh, blk2_nr_item)
+#define set_blkh_nr_items(blkh,val) set_le16 (blkh, blk2_nr_item, val)
+
+#define get_blkh_free_space(blkh) get_le16 (blkh, blk2_free_space)
+#define set_blkh_free_space(blkh,val) set_le16 (blkh, blk2_free_space, val)
+
+#define is_leaf_block_head(buf) \
+ (get_blkh_level ((struct block_head *)(buf)) == REISERFS_DISK_LEAF_LEVEL)
+#define is_internal_block_head(buf) \
+ ((get_blkh_level (((struct block_head *)(buf))) >
REISERFS_DISK_LEAF_LEVEL) && \
+ (get_blkh_level (((struct block_head *)(buf))) <=
REISERFS_TREE_MAX_HEIGHT))
+
+struct offset_v1 {
+ __u32 k_offset;
+ __u32 k_uniqueness;
+} __attribute__ ((__packed__));
+
+struct offset_v2 {
+ __u64 k_offset: 60;
+ __u64 k_type: 4;
+} __attribute__ ((__packed__));
+
+struct key {
+ __u32 k2_dir_id;
+ __u32 k2_objectid;
+
+ union {
+ struct offset_v1 k2_offset_v1;
+ struct offset_v2 k2_offset_v2;
+ } __attribute__ ((__packed__)) u;
+
+} __attribute__ ((__packed__));
+
+#define get_key_dirid(k) get_le32 (k, k2_dir_id)
+#define set_key_dirid(k,val) set_le32 (k, k2_dir_id, val)
+
+#define get_key_objectid(k) get_le32 (k, k2_objectid)
+#define set_key_objectid(k,val) set_le32 (k, k2_objectid, val)
+
+#define get_key_offset_v1(k) get_le32 (k, u.k2_offset_v1.k_offset)
+#define set_key_offset_v1(k,val) set_le32 (k, u.k2_offset_v1.k_offset, val)
+
+#define get_key_uniqueness(k) get_le32 (k, u.k2_offset_v1.k_uniqueness)
+#define set_key_uniqueness(k,val) set_le32 (k, u.k2_offset_v1.k_uniqueness,
val)
+
+#define KEY_SIZE (sizeof(struct key))
+#define SHORT_KEY_SIZE (sizeof(__u32) + sizeof(__u32))
+
+#define UNFM_P_SIZE sizeof(__u32)
+#define I_UNFM_NUM(p_s_ih) (get_ih_item_len(p_s_ih) / UNFM_P_SIZE)
+
+struct item_head {
+ struct key ih_key;
+
+ union {
+ __u16 ih2_free_space;
+ __u16 ih2_entry_count;
+ } __attribute__ ((__packed__)) u;
+
+ __u16 ih2_item_len;
+ __u16 ih2_item_location;
+ __u16 ih_version;
+} __attribute__ ((__packed__));
+
+#define IH_SIZE (sizeof(struct item_head))
+
+#define get_ih_entry_count(ih) get_le16 (ih, u.ih2_entry_count)
+#define set_ih_entry_count(ih,val) set_le16 (ih, u.ih2_entry_count, val)
+
+#define get_ih_free_space(ih) get_le16 (ih, u.ih2_free_space)
+#define set_ih_free_space(ih,val) set_le16 (ih, u.ih2_free_space, 0)
+
+#define get_ih_item_len(ih) get_le16 (ih, ih2_item_len)
+#define set_ih_item_len(ih,val) set_le16 (ih, ih2_item_len, val)
+
+#define get_ih_location(ih) get_le16 (ih, ih2_item_location)
+#define set_ih_location(ih,val) set_le16 (ih, ih2_item_location, val)
+
+#define ih_version(ih) get_le16(ih, ih_version)
+
+#define ITEM_VERSION_1 0
+#define ITEM_VERSION_2 1
+
+struct stat_data_v1 {
+ __u16 sd_mode;
+ __u16 sd_nlink;
+ __u16 sd_uid;
+ __u16 sd_gid;
+ __u32 sd_size;
+ __u32 sd_atime;
+ __u32 sd_mtime;
+ __u32 sd_ctime;
+
+ union {
+ __u32 sd_rdev;
+ __u32 sd_blocks;
+ } __attribute__ ((__packed__)) u;
+ __u32 sd_first_direct_byte;
+} __attribute__ ((__packed__));
+
+#define SD_V1_SIZE (sizeof(struct stat_data_v1))
+
+/*
+ This is used to check sd_size of stat data v1
+*/
+#define MAX_FILE_SIZE_V1 0x7fffffff
+
+#define NO_BYTES_IN_DIRECT_ITEM 0xffffffff
+
+/*
+ Stat Data on disk (reiserfs version of UFS disk inode minus the
+ address blocks)
+*/
+struct stat_data {
+ __u16 sd_mode;
+ __u16 sd_attrs;
+ __u32 sd_nlink;
+ __u64 sd_size;
+ __u32 sd_uid;
+ __u32 sd_gid;
+ __u32 sd_atime;
+ __u32 sd_mtime;
+ __u32 sd_ctime;
+ __u32 sd_blocks;
+ union {
+ __u32 sd_rdev;
+ } __attribute__ ((__packed__)) u;
+} __attribute__ ((__packed__));
+
+#define SD_SIZE (sizeof(struct stat_data))
+
+#define stat_data_v1(ih) (get_ih_key_format (ih) == KEY_FORMAT_1)
+
+#define SD_OFFSET 0
+#define DOT_OFFSET 1
+#define DOT_DOT_OFFSET 2
+
+struct journal_params {
+ __u32 jp_journal_1st_block;
+ __u32 jp_journal_dev;
+ __u32 jp_journal_size;
+ __u32 jp_journal_trans_max;
+ __u32 jp_journal_block_count;
+ __u32 jp_journal_max_batch;
+ __u32 jp_journal_max_commit_age;
+ __u32 jp_journal_max_trans_age;
+};
+
+struct reiserfs_journal_header {
+ __u32 jh_last_flush_trans_id;
+ __u32 jh_first_unflushed_offset;
+ __u32 jh_mount_id;
+ struct journal_params jh_journal;
+ __u32 jh_max_trans_age;
+};
+
+#define get_jp_journal_1st_block(jp) get_le32 (jp, jp_journal_1st_block)
+#define set_jp_journal_1st_block(jp,val) set_le32 (jp, jp_journal_1st_block,
val)
+
+#define get_jp_journal_dev(jp) get_le32 (jp, jp_journal_dev)
+#define set_jp_journal_dev(jp,val) set_le32 (jp, jp_journal_dev, val)
+
+#define get_jp_journal_size(jp) get_le32 (jp, jp_journal_size)
+#define set_jp_journal_size(jp,val) set_le32 (jp, jp_journal_size, val)
+
+#define get_jp_journal_max_trans_len(jp) get_le32 (jp, jp_journal_trans_max)
+#define set_jp_journal_max_trans_len(jp,val) set_le32 (jp,
jp_journal_trans_max, val)
+
+#define get_jp_journal_magic(jp) get_le32 (jp, jp_journal_magic)
+#define set_jp_journal_magic(jp,val) set_le32 (jp, jp_journal_magic, val)
+
+#define get_jp_journal_max_batch(jp) get_le32 (jp, jp_journal_max_batch)
+#define set_jp_journal_max_batch(jp,val) set_le32 (jp, jp_journal_max_batch,
val)
+
+#define get_jp_journal_max_commit_age(jp) get_le32 (jp,
jp_journal_max_commit_age)
+#define set_jp_journal_max_commit_age(jp,val) set_le32 (jp,
jp_journal_max_commit_age, val)
+
+#define get_jh_mount_id(jh) get_le32 (jh, jh_mount_id)
+#define set_jh_mount_id(jh,val) set_le32 (jh, jh_mount_id, val)
+
+#define get_jh_last_flushed(jh) get_le32 (jh, jh_last_flush_trans_id)
+#define set_jh_last_flushed(jh,val) set_le32 (jh, jh_last_flush_trans_id, val)
+
+#define get_jh_replay_start_offset(jh) get_le32 (jh, jh_first_unflushed_offset)
+#define set_jh_replay_start_offset(jh,val) set_le32 (jh,
jh_first_unflushed_offset, val)
+
+#define get_jh_max_trans_age(jh) get_le32 (jh, jh_max_trans_age)
+#define set_jh_max_trans_age(jh,val) set_le32 (jh, jh_max_trans_age, val)
+
+#define bh_desc(bh) ((struct reiserfs_journal_desc *)((bh)->b_data))
+#define bh_commit(bh) ((struct reiserfs_journal_commit *)((bh)->b_data))
+
+/*
+ Disk child pointer. The pointer from an internal node of the tree
+ to a node that is on disk.
+*/
+struct disk_child {
+ __u32 dc2_block_number;
+ __u16 dc2_size;
+ __u16 dc2_reserved;
+};
+
+#define DC_SIZE (sizeof(struct disk_child))
+
+#define get_dc_child_blocknr(dc) get_le32 (dc, dc2_block_number)
+#define set_dc_child_blocknr(dc,val) set_le32 (dc, dc2_block_number, val)
+
+#define get_dc_child_size(dc) get_le16 (dc, dc2_size)
+#define set_dc_child_size(dc,val) set_le16 (dc, dc2_size, val)
+
+struct reiserfs_super_block_v1 {
+ __u32 sb_block_count;
+ __u32 sb_free_blocks;
+ __u32 sb_root_block;
+
+ struct journal_params sb_journal;
+
+// __u32 sb_mountid;
+ __u16 sb_blocksize;
+ __u16 sb_oid_maxsize;
+ __u16 sb_oid_cursize;
+ __u16 sb_state;
+ char s_magic[10];
+ __u16 sb_fsck_state;
+ __u32 sb_hash_function_code;
+ __u16 sb_tree_height;
+ __u16 sb_bmap_nr;
+ __u16 sb_version;
+ __u16 sb_reserved_for_journal;
+} __attribute__ ((__packed__));
+
+#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1))
+#define sb_jp(sb) (&((sb)->s_v1.sb_journal))
+
+/*
+ Structure of super block on disk
+*/
+struct reiserfs_super_block {
+ struct reiserfs_super_block_v1 s_v1;
+ char sb_mnt_version[16];
+ char sb_mkfs_version[16];
+ char sb_fsck_version[16];
+ char sb_unused[204-16-16-16-SB_SIZE_V1];
+};
+
+#define SB_SIZE (sizeof(struct reiserfs_super_block))
+
+#define get_sb_block_count(sb) get_le32 (sb, s_v1.sb_block_count)
+#define set_sb_block_count(sb,val) set_le32 (sb, s_v1.sb_block_count, val)
+
+#define get_sb_free_blocks(sb) get_le32 (sb, s_v1.sb_free_blocks)
+#define set_sb_free_blocks(sb,val) set_le32 (sb, s_v1.sb_free_blocks, val)
+
+#define get_sb_root_block(sb) get_le32 (sb,s_v1.sb_root_block)
+#define set_sb_root_block(sb,val) set_le32 (sb, s_v1.sb_root_block, val)
+
+#define get_sb_mount_id(sb) get_le32 (sb,s_v1.sb_mountid)
+#define set_sb_mount_id(sb,val) set_le32 (sb, s_v1.sb_mountid, val)
+
+#define get_sb_block_size(sb) get_le16 (sb, s_v1.sb_blocksize)
+#define set_sb_block_size(sb,val) set_le16 (sb, s_v1.sb_blocksize, val)
+
+#define get_sb_oid_maxsize(sb) get_le16 (sb, s_v1.sb_oid_maxsize)
+#define set_sb_oid_maxsize(sb,val) set_le16 (sb, s_v1.sb_oid_maxsize, val)
+
+#define get_sb_oid_cursize(sb) get_le16 (sb, s_v1.sb_oid_cursize)
+#define set_sb_oid_cursize(sb,val) set_le16 (sb, s_v1.sb_oid_cursize, val)
+
+#define get_sb_state(sb) get_le16 (sb, s_v1.sb_state)
+#define set_sb_state(sb,val) set_le16 (sb, s_v1.sb_state, val)
+
+#define get_sb_fsck_state(sb) get_le16 (sb, s_v1.sb_fsck_state)
+#define set_sb_fsck_state(sb,val) set_le16 (sb, s_v1.sb_fsck_state, val)
+
+#define get_sb_hash_code(sb) get_le32 (sb, s_v1.sb_hash_function_code)
+#define set_sb_hash_code(sb,val) set_le32 (sb, s_v1.sb_hash_function_code, val)
+
+#define get_sb_tree_height(sb) get_le16 (sb, s_v1.sb_tree_height)
+#define set_sb_tree_height(sb,val) set_le16 (sb, s_v1.sb_tree_height, val)
+
+#define get_sb_bmap_nr(sb) get_le16 (sb, s_v1.sb_bmap_nr)
+#define set_sb_bmap_nr(sb,val) set_le16 (sb, s_v1.sb_bmap_nr, val)
+
+#define get_sb_version(sb) get_le16 (sb, s_v1.sb_version)
+#define set_sb_version(sb,val) set_le16 (sb, s_v1.sb_version, val)
+
+#define get_sb_reserved_for_journal(sb) get_le16 (sb,
s_v1.sb_reserved_for_journal)
+#define set_sb_reserved_for_journal(sb,val) set_le16 (sb,
s_v1.sb_reserved_for_journal, val)
+
+#define journal_is_relocated(sb) get_jp_journal_dev(sb_jp (sb))
+
+struct reiserfs_bm {
+ size_t bm_byte_size;
+ reiserfs_blk_t bm_bit_size;
+ reiserfs_blk_t bm_set_bits;
+ char *bm_map;
+};
+
+typedef struct reiserfs_bm reiserfs_bm_t;
+
+struct reiserfs_fs {
+ size_t fs_blocksize;
+ int fs_version;
+ struct buffer_head *fs_super_bh;
+ struct reiserfs_super_block *fs_ondisk_sb;
+
+ reiserfs_bm_t *fs_bitmap2;
+ struct buffer_head *fs_jh_bh;
+
+ struct reiserfs_io_handler *io_handler;
+};
+
+typedef struct reiserfs_fs reiserfs_fs_t;
+
+struct reiserfs_de_head {
+ __u32 deh2_offset;
+ __u32 deh2_dir_id;
+ __u32 deh2_objectid;
+ __u16 deh2_location;
+ __u16 deh2_state;
+} __attribute__ ((__packed__));
+
+#define DEH_SIZE sizeof(struct reiserfs_de_head)
+
+#define EMPTY_DIR_SIZE \
+ (DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))
+
+/*
+ Old format directories have this size when empty
+*/
+#define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
+
+#define get_deh_offset(deh) get_le32 (deh, deh2_offset)
+#define set_deh_offset(deh,val) set_le32 (deh, deh2_offset, val)
+
+#define get_deh_dirid(deh) get_le32 (deh, deh2_dir_id)
+#define set_deh_dirid(deh,val) set_le32 (deh, deh2_dir_id, val)
+
+#define get_deh_objectid(deh) get_le32 (deh, deh2_objectid)
+#define set_deh_objectid(deh,val) set_le32 (deh, deh2_objectid, val)
+
+#define get_deh_location(deh) get_le16 (deh, deh2_location)
+#define set_deh_location(deh,val) set_le16 (deh, deh2_location, val)
+
+#define get_deh_state(deh) get_le16 (deh, deh2_state)
+#define set_deh_state(deh,val) set_le16 (deh, deh2_state, val)
+
+#define DEH_Visible 2
+
+#define mark_de_visible(deh) \
+ set_bit(DEH_Visible, &((deh)->deh2_state))
+
+#define B_I_DEH(bh,ih) \
+ ((struct reiserfs_de_head *)(B_I_PITEM(bh,ih)))
+
+#define REISERFS_MAX_NAME_LEN(block_size) \
+ (block_size - BLKH_SIZE - IH_SIZE - DEH_SIZE)
+
+typedef enum {
+ REISERFS_FS_VALID = 1,
+ REISERFS_FS_INVALID = 2,
+ REISERFS_FS_CONSISTENT = 0xfaa0
+} reiserfs_state_t;
+
+extern reiserfs_fs_t *_reiserfs_fs_open (struct reiserfs_io_handler
*io_handler);
+extern reiserfs_fs_t *_reiserfs_fs_create (struct reiserfs_io_handler
*io_handler,
+ size_t block_size, reiserfs_blk_t journal_blocks, reiserfs_blk_t blocks);
+extern void _reiserfs_fs_close (reiserfs_fs_t *fs);
+extern int _reiserfs_fs_resize(reiserfs_fs_t *fs, reiserfs_blk_t blocks);
+
+extern int _reiserfs_fs_is_consistent (reiserfs_fs_t *fs);
+extern int _reiserfs_fs_is_found (reiserfs_fs_t *fs);
+extern int _reiserfs_bm_is_spread(reiserfs_fs_t *fs);
+
+#endif
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_io.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_io.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_io.c Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_io.c Sat Jan
12 22:02:03 2002
@@ -0,0 +1,80 @@
+/*
+ reiserfs_io.c -- parted device i/o abstraction code
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Writen by Yury Umanets (address@hidden)
+*/
+
+static const char _reiserfs_io_c[] = "$Id: reiserfs_io.c,v 1.55 2002/01/04
20:15:19 yumanets Exp $";
+
+#include <parted/parted.h>
+
+#include "reiserfs_io.h"
+
+static reiserfs_blk_t _reiserfs_blocks(struct reiserfs_io_handler *io_handler,
+ size_t block_size)
+{
+ reiserfs_blk_t k = block_size / PED_SECTOR_SIZE;
+ return (io_handler->geom->length) / k;
+}
+
+static int _reiserfs_read(struct reiserfs_io_handler *io_handler, void *buff,
+ reiserfs_blk_t block, reiserfs_blk_t count, size_t block_size)
+{
+ reiserfs_blk_t k = block_size / PED_SECTOR_SIZE;
+ PedSector block_pos = (PedSector)(block*k);
+ PedSector block_count = (PedSector)(count*k);
+
+ return ped_geometry_read(io_handler->geom, buff, block_pos, block_count);
+}
+
+static int _reiserfs_write(struct reiserfs_io_handler *io_handler, void *buff,
+ reiserfs_blk_t block, reiserfs_blk_t count, size_t block_size)
+{
+ reiserfs_blk_t k = block_size / PED_SECTOR_SIZE;
+ PedSector block_pos = (PedSector)(block*k);
+ PedSector block_count = (PedSector)(count*k);
+
+ return ped_geometry_write((PedGeometry *)io_handler->geom, buff,
block_pos, block_count);
+}
+
+static int _reiserfs_sync(struct reiserfs_io_handler *io_handler) {
+ return ped_geometry_sync((PedGeometry *)io_handler->geom);
+}
+
+static struct reiserfs_io_ops ops = {
+ blocks: _reiserfs_blocks,
+ read: _reiserfs_read,
+ write: _reiserfs_write,
+ sync: _reiserfs_sync
+};
+
+struct reiserfs_io_handler *reiserfs_io_handler_create(const PedGeometry
*geom) {
+ struct reiserfs_io_handler *io_handler =
+ (struct reiserfs_io_handler *)ped_malloc(sizeof(*io_handler));
+
+ io_handler->ops = &ops;
+ io_handler->geom = geom;
+
+ return io_handler;
+}
+
+void reiserfs_io_handler_destroy(struct reiserfs_io_handler *io_handler) {
+ ped_free(io_handler);
+}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_io.h
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_io.h
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_io.h Thu Jan 1 03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_io.h Sat Jan
12 22:00:41 2002
@@ -0,0 +1,54 @@
+/*
+ reiserfs_io.h -- parted device i/o abstraction code
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Writen by Yury Umanets (address@hidden)
+*/
+
+
+#ifndef REISERFS_IO_H
+#define REISERFS_IO_H
+
+static const char _reiserfs_io_h[] = "$Id: reiserfs_io.h,v 1.55 2002/01/04
20:16:19 yumanets Exp $";
+
+#include <parted/parted.h>
+
+#include "reiserfs_blk.h"
+
+struct reiserfs_io_handler;
+
+struct reiserfs_io_ops {
+ reiserfs_blk_t (*blocks)(struct reiserfs_io_handler *io_handler,
+ size_t block_size);
+ int (*read)(struct reiserfs_io_handler *io_handler, void *buff,
+ reiserfs_blk_t block, reiserfs_blk_t count, size_t block_size);
+ int (*write)(struct reiserfs_io_handler *io_handler, void *buff,
+ reiserfs_blk_t block, reiserfs_blk_t count, size_t block_size);
+ int (*sync)(struct reiserfs_io_handler *io_handler);
+};
+
+struct reiserfs_io_handler {
+ const PedGeometry *geom;
+ struct reiserfs_io_ops *ops;
+};
+
+extern struct reiserfs_io_handler *reiserfs_io_handler_create(const
PedGeometry *geom);
+extern void reiserfs_io_handler_destroy(struct reiserfs_io_handler
*io_handler);
+
+#endif
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_tools.c
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_tools.c
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_tools.c Thu Jan 1
03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_tools.c Sat Jan
12 18:25:27 2002
@@ -0,0 +1,261 @@
+/*
+ reiserfs_tools.c -- reiserfs tools
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the reiserfs-progs-3.x.0k-pre10.
+ Writen by Yury Umanets (address@hidden)
+*/
+
+static const char _reiserfs_tools_c[] = "$Id: reiserfs_tools.c,v 1.55
2002/01/04 20:17:19 yumanets Exp $";
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <parted/parted.h>
+#include <parted/endian.h>
+
+#include "reiserfs_tools.h"
+
+#if ENABLE_NLS
+# include <libintl.h>
+# define _(String) dgettext (PACKAGE, String)
+#else
+# define _(String) (String)
+#endif
+
+/* Bits manipulations and endianess functions */
+static inline int le_set_bit (int nr, void * addr) {
+ __u8 * p, mask;
+ int retval;
+
+ p = (__u8 *)addr;
+ p += nr >> 3;
+ mask = 1 << (nr & 0x7);
+ /*cli();*/
+ retval = (mask & *p) != 0;
+ *p |= mask;
+ /*sti();*/
+ return retval;
+}
+
+static inline int le_clear_bit (int nr, void * addr) {
+ __u8 * p, mask;
+ int retval;
+
+ p = (__u8 *)addr;
+ p += nr >> 3;
+ mask = 1 << (nr & 0x7);
+ /*cli();*/
+ retval = (mask & *p) != 0;
+ *p &= ~mask;
+ /*sti();*/
+ return retval;
+}
+
+static inline int le_test_bit(int nr, const void * addr) {
+ __u8 * p, mask;
+
+ p = (__u8 *)addr;
+ p += nr >> 3;
+ mask = 1 << (nr & 0x7);
+ return ((mask & *p) != 0);
+}
+
+static inline int le_find_first_zero_bit (const void *vaddr, unsigned size) {
+ const __u8 *p = vaddr, *addr = vaddr;
+ int res;
+
+ if (!size)
+ return 0;
+
+ size = (size >> 3) + ((size & 0x7) > 0);
+ while (*p++ == 255) {
+ if (--size == 0)
+ return (p - addr) << 3;
+ }
+
+ --p;
+ for (res = 0; res < 8; res++)
+ if (!test_bit (res, p))
+ break;
+ return (p - addr) * 8 + res;
+}
+
+static inline int le_find_next_zero_bit (const void *vaddr, unsigned size,
unsigned offset) {
+ const __u8 *addr = vaddr;
+ const __u8 *p = addr + (offset >> 3);
+ int bit = offset & 7, res;
+
+ if (offset >= size)
+ return size;
+
+ if (bit) {
+ /* Look for zero in first char */
+ for (res = bit; res < 8; res++)
+ if (!test_bit (res, p))
+ return (p - addr) * 8 + res;
+ p++;
+ }
+ /* No zero yet, search remaining full bytes for a zero */
+ res = find_first_zero_bit (p, size - 8 * (p - addr));
+ return (p - addr) * 8 + res;
+}
+
+static inline int be_set_bit (int nr, void * addr) {
+ __u8 mask = 1 << (nr & 0x7);
+ __u8 *p = (__u8 *) addr + (nr >> 3);
+ __u8 old = *p;
+
+ *p |= mask;
+
+ return (old & mask) != 0;
+}
+
+static inline int be_clear_bit (int nr, void * addr) {
+ __u8 mask = 1 << (nr & 0x07);
+ __u8 *p = (unsigned char *) addr + (nr >> 3);
+ __u8 old = *p;
+
+ *p = *p & ~mask;
+ return (old & mask) != 0;
+}
+
+static inline int be_test_bit(int nr, const void * addr) {
+ const __u8 *ADDR = (__const__ __u8 *) addr;
+
+ return ((ADDR[nr >> 3] >> (nr & 0x7)) & 1) != 0;
+}
+
+static inline int be_find_first_zero_bit (const void *vaddr, unsigned size) {
+ return find_next_zero_bit( vaddr, size, 0 );
+}
+
+static inline unsigned long ffz(unsigned long word) {
+ unsigned long result = 0;
+
+ while(word & 1) {
+ result++;
+ word >>= 1;
+ }
+ return result;
+}
+
+/* stolen from linux/include/asm-mips/bitops.h:ext2_find_next_zero_bit()
+ * the bitfield is assumed to be little endian, which is the case here,
+ * since we're reading/writing from the disk in LE order */
+static inline int be_find_next_zero_bit (const void *vaddr, unsigned size,
unsigned offset) {
+ __u32 *p = ((__u32 *) vaddr) + (offset >> 5);
+ __u32 result = offset & ~31UL;
+ __u32 tmp;
+
+ if (offset >= size)
+ return size;
+ size -= result;
+ offset &= 31UL;
+ if (offset) {
+ tmp = *(p++);
+ tmp |= PED_SWAP32(~0UL >> (32-offset));
+ if (size < 32)
+ goto found_first;
+ if (~tmp)
+ goto found_middle;
+ size -= 32;
+ result += 32;
+ }
+ while (size & ~31UL) {
+ if (~(tmp = *(p++)))
+ goto found_middle;
+ result += 32;
+ size -= 32;
+ }
+ if (!size)
+ return result;
+ tmp = *p;
+
+found_first:
+// return result + ffz(swab32(tmp) | (~0UL << size));
+ return result + ffz(PED_SWAP32(tmp) | (~0UL << size));
+found_middle:
+// return result + ffz(swab32(tmp));
+ return result + ffz(PED_SWAP32(tmp));
+}
+
+inline int set_bit (int nr, void * addr) {
+#ifndef WORDS_BIGENDIAN
+ return le_set_bit( nr, addr );
+#else
+ return be_set_bit( nr, addr );
+#endif
+ return 0;
+}
+
+inline int clear_bit (int nr, void * addr) {
+#ifndef WORDS_BIGENDIAN
+ return le_clear_bit( nr, addr );
+#else
+ return be_clear_bit( nr, addr );
+#endif
+ return 0;
+}
+
+inline int test_bit(int nr, const void * addr) {
+#ifndef WORDS_BIGENDIAN
+ return le_test_bit( nr, addr );
+#else
+ return be_test_bit( nr, addr );
+#endif
+ return 0;
+}
+
+inline int find_first_zero_bit (const void *vaddr, unsigned size) {
+#ifndef WORDS_BIGENDIAN
+ return le_find_first_zero_bit( vaddr, size );
+#else
+ return be_find_first_zero_bit( vaddr, size );
+#endif
+ return 0;
+}
+
+inline int find_next_zero_bit (const void *vaddr, unsigned size, unsigned
offset) {
+#ifndef WORDS_BIGENDIAN
+ return le_find_next_zero_bit( vaddr, size, offset );
+#else
+ return be_find_next_zero_bit( vaddr, size, offset );
+#endif
+ return 0;
+}
+
+/* Signature checking functions */
+int is_reiserfs_3_5_magic_string (const char *s_magic) {
+ return (!strncmp (s_magic, REISERFS_SUPER_MAGIC_STRING,
+ strlen (REISERFS_SUPER_MAGIC_STRING)));
+}
+
+int is_reiserfs_3_6_magic_string (const char *s_magic) {
+ return (!strncmp (s_magic, REISER2FS_SUPER_MAGIC_STRING,
+ strlen (REISER2FS_SUPER_MAGIC_STRING)));
+}
+
+int is_any_reiserfs_magic_string (const char *s_magic) {
+ if (is_reiserfs_3_5_magic_string (s_magic) ||
+ is_reiserfs_3_6_magic_string (s_magic))
+ return 1;
+ return 0;
+}
diff -rupN ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_tools.h
./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_tools.h
--- ./parted-1.4.22/libparted/fs_reiserfs/reiserfs_tools.h Thu Jan 1
03:00:00 1970
+++ ./parted-reiserfs-1.4.22/libparted/fs_reiserfs/reiserfs_tools.h Sat Jan
12 18:25:27 2002
@@ -0,0 +1,45 @@
+/*
+ reiserfs_tools.h -- reiserfs tools
+ Copyright (C) 1998, 1999, 2000, 2001 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/*
+ Some parts of this code are from original reiserfs code,
+ as found in the reiserfs-progs-3.x.0k-pre10.
+ Writen by Yury Umanets (address@hidden)
+*/
+
+#ifndef REISERFS_TOOLS_H
+#define REISERFS_TOOLS_H
+
+static const char _reiserfs_tools_h[] = "$Id: reiserfs_tools.h,v 1.55
2002/01/04 20:19:21 yumanets Exp $";
+
+extern inline int set_bit (int nr, void *addr);
+extern inline int clear_bit (int nr, void *addr);
+extern inline int test_bit(int nr, const void *addr);
+extern inline int find_first_zero_bit (const void *vaddr, unsigned size);
+extern inline int find_next_zero_bit (const void *vaddr, unsigned size,
unsigned offset);
+
+/* Signatures checking function */
+#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
+#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
+
+extern int is_reiserfs_3_5_magic_string (const char *s_magic);
+extern int is_reiserfs_3_6_magic_string (const char *s_magic);
+extern int is_any_reiserfs_magic_string (const char *s_magic);
+
+#endif
diff -rupN ./parted-1.4.22/po/ru.po ./parted-reiserfs-1.4.22/po/ru.po
--- ./parted-1.4.22/po/ru.po Sun Dec 30 02:55:37 2001
+++ ./parted-reiserfs-1.4.22/po/ru.po Sat Jan 12 21:42:28 2002
@@ -103,12 +103,12 @@ msgstr "ped_device_new() îÅÐÏÄÄÅÒÖÉ×ÁÅÍ
#: libparted/device.c:825
#, c-format
msgid "Error opening %s: %s"
-msgstr ""
+msgstr "ïÛÉÂËÁ ÐÒÉ ÏÔËÒÙÔÉÉ %s: %s"
#: libparted/device.c:835
#, c-format
msgid "Unable to open %s read-write (%s). %s has been opened read-only."
-msgstr ""
+msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s ÎÁ ÞÔÅÎÉÅ-ÚÁÐÉÓØ (%s). %s ÏÔËÒÙÔ ÎÁ ÞÔÅÎÉÅ"
#: libparted/device.c:878
msgid ""
@@ -119,6 +119,12 @@ msgid ""
"rescue disk, and reinstall your boot loader from the rescue disk. Read "
"section 4 of the Parted User documentation for more information."
msgstr ""
+"ñÄÒÏ ÓÉÓÔÅÍÙ ÎÅ ÓÍÏÇÌÏ ÐÅÒÅÞÉÔÁÔØ ÔÁÂÌÉÃÕ ÒÁÚÄÅÌÏ×. üÔÏ ÚÎÁÞÉÔ, ÞÔÏ ×ÁÍ
ÎÅÏÂÈÏÄÉÍÏ "
+"ÐÅÒÅÚÁÇÒÕÚÉÔØ ×ÁÛ ËÏÍÐØÀÔÅÒ ÐÅÒÅÄ ÔÅÍ ËÁË ÐÏÄÌÀÞÁÔØ ËÁËÉÅ-ÌÉÂÏ
ÍÏÄÉÆÉÃÉÒÏ×ÁÎÎÙÅ ÒÁÚÄÅÌÙ. "
+"÷ÁÍ ÔÁËÖÅ ÎÅÏÂÈÏÄÉÍÏ ÐÅÒÅÉÎÓÔÁÌÉÒÏ×ÁÔØ ÚÁÇÒÕÚÞÉË ÓÉÓÔÅÍÙ ÐÅÒÅÄ ÔÅÍ ËÁË ×Ù
ÐÅÒÅÇÒÕÚÉÔÅ "
+"×ÁÛ ËÏÍÐØÀÔÅÒ (ÜÔÏ ÍÏÖÅÔ ÐÏÔÒÅÂÏ×ÁÔØ ÐÏÄËÌÀÞÅÎÉÑ ÍÏÄÉÆÉÃÉÒÏ×ÁÎÎÙÈ ÒÁÚÄÅÌÏ×).
îÅ×ÏÚÍÏÖÎÏ "
+"ÓÄÅÌÁÔØ É ÔÏ É ÄÒÕÇÏÅ ÏÄÎÏ×ÒÅÍÅÎÎÏ, ÐÏÜÔÏÍÕ ÎÁÉÂÏÌÅÅ ÐÒÁ×ÉÌØÎÏ ÂÙÌÏ ÂÙ
ÐÅÒÅÉÎÓÔÁÌÉÒÏ×ÁÔØ "
+"ÚÁÇÒÕÚÞÉË ÚÁÇÚÕÚÉ×ÛÉÓØ ÉÚ Á×ÁÒÉÊÎÏÇÏ ÄÉÓËÁ. óÍÏÔÒÉÔÅ ÓÅËÃÉÀ 4 × Parted User
ÄÏËÕÍÅÎÔÁÃÉÉ."
#: libparted/device.c:895
#, c-format
@@ -136,6 +142,8 @@ msgid ""
"You should reinstall your boot loader before rebooting. Read section 4 of "
"the Parted User documentation for more information."
msgstr ""
+"÷ÁÍ ÓÌÅÄÕÅÔ ÐÅÒÅÉÎÓÔÁÌÉÒÏ×ÁÔØ ×ÁÛ ÓÉÓÔÅÍÎÙÊ ÚÁÇÒÕÚÞÉË ÐÅÒÅÄ ÐÅÒÅÇÒÕÚËÏÊ
ËÏÍÐØÀÔÅÒÁ. "
+"óÍÏÔÒÉÔÅ ÓÅËÃÉÀ 4 × Parted User ÄÏËÕÍÅÎÔÁÃÉÉ."
#: libparted/device.c:1006 libparted/device.c:1112
#, c-format
@@ -232,24 +240,28 @@ msgid ""
"have the correct BIOS geometry. It is safe to ignore,but ignoring may cause "
"(fixable) problems with some boot loaders."
msgstr ""
+"îÅ ÍÏÇÕ ËÏÒÒÅËÔÎÏ ×ÙÒÏ×ÎÑÔØ ÒÁÚÄÅÌ. üÔÏ ÍÏÖÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ ÄÒÕÇÁÑ ÐÒÏÇÒÁÍÍÁ
ÓÆÏÒÍÉÒÏ×ÁÌÁ "
+"ÎÅËÏÒÅÔÎÕÀ ÔÁÂÌÉÃÕ ÒÁÚÄÅÌÏ×, ÐÏÔÏÍÕ ÞÔÏ ÏÎÁ ÎÅ ÉÍÅÅÔ ËÏÒÒÅÔÎÙÈ
BIOS-ÐÁÒÁÍÅÔÒÏ×. üÔÏ ÓÏÏÂÝÅÎÉÅ "
+"ÍÏÖÎÏ ÐÒÏÉÇÎÏÒÉÒÏ×ÁÔØ, ÎÏ ÜÔÏ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë (ÕÓÔÒÁÎÉÍÙÍ) ÐÒÏÂÌÅÍÁÍ Ó
ÎÅËÏÔÏÒÙÍÉ ÓÉÓÔÅÍÎÙÊÍÉ "
+"ÚÁÇÒÕÚÞÉËÁÍÉ."
#: libparted/disk_gpt.c:520
msgid "GUID Partition Table Header Signature is wrong: "
-msgstr ""
+msgstr "GUID Partition Table Header Signature ÎÅ ×ÅÒÎÁ: "
#: libparted/disk_gpt.c:521
msgid " should be "
-msgstr ""
+msgstr " ÄÏÌÖÅÎ ÂÙÔØ "
#: libparted/disk_gpt.c:534
#, c-format
msgid "GPT Header CRC check failed, %x should be %x."
-msgstr ""
+msgstr "GPT Header CRC ÐÒÏ×ÅÒËÁ ÎÅ ÕÄÁÌÁÓØ, %x ÄÏÌÖÅÎ ÂÙÔØ %x."
#: libparted/disk_gpt.c:562
#, c-format
msgid "GPT Partition Entry Array CRC check failed, %x should be %x."
-msgstr ""
+msgstr "GPT Partition Entry Array CRC ÐÒÏ×ÅÒËÁ ÎÅ ÕÄÁÌÁÓØ, %x ÄÏÌÖÅÎ ÂÙÔØ %x."
#: libparted/disk_gpt.c:841
msgid ""
@@ -262,6 +274,14 @@ msgid ""
"No will assume that the MBR is correct, and erase the GPT information.\n"
"Ignore will assume that the MBR is correct, but not change the disk."
msgstr ""
+"üÔÏÔ ÄÉÓË ÓÏÄÅÒÖÉÔ ËÏÒÒÅËÔÎÕÀ Primary É Alternate GUID Partition Table
ÔÁÂÌÉÃÙ ÎÏ "
+"Protective MBR ÎÅËÏÒÒÅËÔÅÎ. üÔÏ ÍÏÖÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ ÄÉÓË ÉÍÅÅÔ GPT ÒÁÚÄÅÌÙ,
ÎÏ ÂÙÌÁ "
+"ÐÒÉÍÅÎÅÎÁ ÓÔÁÒÁÑ ÐÒÏÇÒÁÍÍÁ ÄÌÑ ÒÁÚÂÉ×ËÉ ÄÉÓËÁ, ËÏÔÏÒÁÑ ÓÏÈÒÁÎÉÌÁ ÔÁÂÌÉÃÕ
ÒÁÚÄÅÌÏ× × MBR "
+"×ÉÄÅ.\n"
+"ëÁËÉÅ ÄÁÎÎÙÅ Ñ×ÌÑÀÔÓÑ ÐÒÁ×ÉÌØÎÙÍÉ?\n"
+"õÔ×ÅÒÄÉÔÅÌØÎÙÊ ÏÔ×ÅÔ ÂÕÄÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ ×Ù ×ÙÂÒÁÌÉ GPT É ÐÅÒÅÚÁÐÉÓØ PMBR.\n"
+"ïÔÒÉÃÁÔÅÌØÎÙÊ - ×ÙÂÏÒ MBR É ÕÄÁÌÅÎÉÅ GPT.\n"
+"éÇÎÏÒÉÒÏ×ÁÎÉÅ ÖÅ ÂÕÄÅÔ ÚÎÁÞÉÔØ, ÞÔÏ MBR ËÏÒÒÅËÔÅÎ É ÎÉËÁËÉÈ ÉÚÍÅÎÅÎÉÊ ÓÄÅÌÁÎÏ
ÎÅ ÂÕÄÅÔ."
#: libparted/disk_gpt.c:855
msgid ""
@@ -275,6 +295,13 @@ msgid ""
"No will assume that the MBR is correct, and erase the GPT information.\n"
"Ignore will assume that the MBR is correct, but not change the disk."
msgstr ""
+"üÔÏÔ ÄÉÓË ÓÏÄÅÒÖÉÔ ËÏÒÒÅËÔÎÕÀ Alternate GUID Partition Table ÔÁÂÌÉÃÕ, ÎÏ
Primary "
+"GPT É Protective MBR ÎÅËÏÒÒÅËÔÎÙ. üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÄÉÓË ÉÍÅÅÔ GPT, ÎÏ ÄÌÑ
ÅÇÏ ÒÁÚÂÉ×ËÉ "
+"ÉÓÐÏÌØÚÏ×ÁÌÁÓØ ÓÔÁÒÁÑ ÐÒÏÇÒÁÍÍÁ, ËÏÔÏÒÁÑ ÓÏÈÒÁÎÉÌÁ ÔÁÂÌÉÃÕ ÒÁÚÄÅÌÏ× × MBR
ÆÏÒÍÁÔÅ.\n"
+"ëÁËÉÅ ÄÁÎÎÙÅ ËÏÒÒÅËÔÎÙ? GPT ÉÌÉ MBR?\n"
+"õÔ×ÅÒÄÉÔÅÌØÎÙÊ ÏÔ×ÅÔ ÂÕÄÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ ×Ù ×ÙÂÒÁÌÉ GPT É ÐÅÒÅÚÁÐÉÓØ PMBR É
Primary GPT.\n"
+"ïÔÒÉÃÁÔÅÌØÎÙÊ - ×ÙÂÏÒ MBR É ÕÄÁÌÅÎÉÅ GPT.\n"
+"éÇÎÏÒÉÒÏ×ÁÎÉÅ ÖÅ ÂÕÄÅÔ ÚÎÁÞÉÔØ, ÞÔÏ MBR ËÏÒÒÅËÔÅÎ É ÎÉËÁËÉÈ ÉÚÍÅÎÅÎÉÊ ÓÄÅÌÁÎÏ
ÎÅ ÂÕÄÅÔ."
#: libparted/disk_gpt.c:871
msgid ""
@@ -288,6 +315,13 @@ msgid ""
"No will assume that the MBR is correct, and erase the GPT information.\n"
"Ignore will assume that the MBR is correct, but not change the disk.\n"
msgstr ""
+"üÔÏÔ ÄÉÓË ÓÏÄÅÒÖÉÔ ËÏÒÒÅËÔÎÕÀ Partition Table ÔÁÂÌÉÃÕ, ÎÏ Alternate "
+"GPT É Protective MBR ÎÅËÏÒÒÅËÔÎÙ. üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÄÉÓË ÉÍÅÅÔ GPT ÒÁÚÄÅÌÙ,
ÎÏ ÄÌÑ ÅÇÏ "
+"ÒÁÚÂÉ×ËÉ ÉÓÐÏÌØÚÏ×ÁÌÁÓØ ÓÔÁÒÁÑ ÐÒÏÇÒÁÍÍÁ, ËÏÔÏÒÁÑ ÓÏÈÒÁÎÉÌÁ ÔÁÂÌÉÃÕ ÒÁÚÄÅÌÏ×
× MBR ÆÏÒÍÁÔÅ.\n"
+"ëÁËÉÅ ÄÁÎÎÙÅ ËÏÒÒÅËÔÎÙ? GPT ÉÌÉ MBR?\n"
+"õÔ×ÅÒÄÉÔÅÌØÎÙÊ ÏÔ×ÅÔ ÂÕÄÅÔ ÏÚÎÁÞÁÔØ, ÞÔÏ ×Ù ×ÙÂÒÁÌÉ GPT É ÐÅÒÅÚÁÐÉÓØ PMBR É
Alternate GPT.\n"
+"ïÔÒÉÃÁÔÅÌØÎÙÊ - ×ÙÂÏÒ MBR É ÕÄÁÌÅÎÉÅ GPT.\n"
+"éÇÎÏÒÉÒÏ×ÁÎÉÅ ÖÅ ÂÕÄÅÔ ÚÎÁÞÉÔØ, ÞÔÏ MBR ËÏÒÒÅËÔÅÎ É ÎÉËÁËÉÈ ÉÚÍÅÎÅÎÉÊ ÓÄÅÌÁÎÏ
ÎÅ ÂÕÄÅÔ.\n"
#: libparted/disk.c:1362 libparted/disk_gpt.c:1393
msgid "The new partition overlaps with another partition."
@@ -296,26 +330,26 @@ msgstr "îÏ×ÙÊ ÒÁÚÄÅÌ ÐÅÒÅËÒÙ×ÁÅÔÓÑ Ó ÄÒÕ
#: libparted/disk_mac.c:209
#, c-format
msgid "Invalid signature %x for Mac disk labels."
-msgstr ""
+msgstr "îÅËÏÒÒÅÔÎÁÑ ÓÉÇÎÁÔÕÒÁ %x ÄÌÑ Mac disk labels."
#: libparted/disk_mac.c:257
#, c-format
msgid "%s is too small for a Mac disk label!"
-msgstr ""
+msgstr "%s ÓÌÉÛËÏÍ ÍÁÌÅÎØËÉÊ ÄÌÑ Mac disk label!"
#: libparted/disk_mac.c:321
msgid "Partition map has no partition map entry!"
-msgstr ""
+msgstr "ëÁÒÔÁ ÒÁÚÄÅÌÏ× ÎÅ ÉÍÅÅÔ ÜÌÅÍÅÎÔÏ×!"
#: libparted/disk_mac.c:540
#, c-format
msgid "Partition %d has an invalid signature %x."
-msgstr ""
+msgstr "òÁÚÄÅÌ %d ÉÍÅÅÔ ÎÅËÏÒÒÅËÔÎÕÀ ÓÉÇÎÁÔÕÒÕ %x."
#: libparted/disk_mac.c:556
#, c-format
msgid "Partition %d has an invalid length of 0 bytes!"
-msgstr ""
+msgstr "òÁÚÄÅÌ %d ÉÍÅÅÔ ÎÅËÏÒÒÅËÔÎÕÀ ÄÌÉÎÕ × 0 ÂÁÊÔ!"
#: libparted/disk_mac.c:581
#, fuzzy
@@ -467,6 +501,10 @@ msgid ""
"either shrink the partition you are trying to copy, or copy to a bigger "
"partition."
msgstr ""
+"ëÏÐÉÒÏ×ÁÎÉÅ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ ÅÝÅ ÎÅ ÒÅÁÌÉÚÏ×ÁÎÏ ÄÌÑ %s. "
+"ïÄÎÁËÏ, ÉÚÍÅÎÅÎÉÅ ÚÁÒÍÅÒÏ× ÒÅÁÌÉÚÏ×ÁÎÏ. ôÁËÉÍ ÏÂÒÁÚÏÍ, ÆÁÊÌÏ×ÁÑ ÓÉÓÔÅÍÁ ÍÏÖÅÔ
"
+"ÂÙÔØ ÓËÏÐÉÒÏ×ÁÎÁ ÅÓÌÉ ÎÏ×ÙÊ ÒÁÚÄÅÌ ÂÏÌØÛÅ ÞÅÍ ÓÔÁÒÙÊ. ôÁË ÞÔÏ ×Ù ÍÏÖÅÔÅ
ÕÍÅÎØÛÉÔØ "
+"ÔÏÔ ÒÁÚÄÅÌ, ËÏÔÏÒÙÊ ×Ù ÐÙÔÁÅÔÅÓØ ÓËÏÐÉÒÏ×ÁÔØ ÉÌÉ ÓËÏÐÉÒÏ×ÁÔØ ÅÇÏ ÎÁ ÂÏÌØÛÉÊ
ÒÁÚÄÅÌ."
#: libparted/filesys.c:366
#, fuzzy, c-format
@@ -487,7 +525,7 @@ msgstr "îÅÔ get_min_size() ÄÌÑ %s!"
#: libparted/disk.c:745 libparted/filesys.c:422
#, c-format
msgid "The %s file system code doesn't support %s disk labels."
-msgstr ""
+msgstr "ëÏÄ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ %s ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ %s ÍÅÔËÉ ÄÉÓËÁ."
#: libparted/disk.c:136
#, c-format
@@ -621,7 +659,7 @@ msgstr ""
#: libparted/disk.c:1817
#, c-format
msgid "Unknown flag partition flag, %d."
-msgstr ""
+msgstr "îÅÉÚ×ÅÓÔÎÙÊ ÆÌÁÇ ÒÁÚÄÅÌÁ %d."
#: libparted/exception.c:45
msgid "Information"
@@ -940,7 +978,7 @@ msgstr "ïÛÉÂËÁ ÚÁÐÉÓÉ × ËÏÒÎÅ×ÏÊ ËÁÔÁÌÏÇ
#: libparted/fs_fat/resize.c:445
msgid "If leave your file system as FAT16, then you will have no problems."
-msgstr ""
+msgstr "åÓÌÉ ÏÓÔÁ×ÉÔØ ×ÁÛÕ ÆÁÊÌÏ×ÕÀ ÓÉÓÔÅÍÕ ËÁË FAT16, ×Ù ÎÅ ÂÕÄÅÔÅ ÉÍÅÔØ
ÎÉËÁËÉÈ ÎÅÐÒÉÑÔÎÏÓÔÅÊ."
#: libparted/fs_fat/resize.c:448
msgid ""
@@ -948,12 +986,16 @@ msgid ""
"you must re-install the MS Windows boot loader. If you want to do this, you "
"should consult the Parted manual (or your distribution's manual)."
msgstr ""
+"åÓÌÉ ×Ù ÐÒÅÏÂÒÁÚÕÅÔÅ × FAT16 É MS Windows ÕÓÔÁÎÏ×ÌÅÎÁ ÎÁ ÜÔÏÍ ÒÁÚÄÅÌÅ, ÔÏ "
+"×Ù ÄÏÌÖÎÙ ÐÅÒÅÉÎÓÔÁÌÉÒÏ×ÁÔØ ÓÉÓÔÅÍÎÙÊ ÚÁÇÒÕÚÞÉË MS Windows. åÓÌÉ ×Ù ÈÏÔÉÔÅ
ÓÄÅÌÁÔØ ÜÔÏ "
+"×Ù ÄÏÌÖÎÙ ÏÚÎÁËÏÍÉÔØÓÑ Ó Parted ÄÏËÕÍÅÎÔÁÃÉÅÊ (ÉÌÉ ÄÏËÕÍÅÎÔÁÃÉÅÊ ÉÚ ÎÁÂÏÒÁ
×ÁÛÅÇÏ ÄÉÓÔÒÉÂÕÔÉ×Á)."
#: libparted/fs_fat/resize.c:456
msgid ""
"If you leave your file system as FAT32, then you will not introduce any new "
"problems."
msgstr ""
+"åÓÌÉ ×Ù ÏÓÔÁ×ÉÔÅ ÎÁ ×ÁÛÅÊ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÅ FAT32, ×Ù ÎÅ ÂÕÄÅÔÅ ÉÍÅÔØ
ÎÅÐÒÉÑÔÎÏÓÔÅÊ."
#: libparted/fs_fat/resize.c:460
msgid ""
@@ -963,6 +1005,11 @@ msgid ""
"converting to FAT32 will make the file system unreadable by MS DOS, MS "
"Windows 95a, and MS Windows NT."
msgstr ""
+"åÓÌÉ ×Ù ÐÒÅÏÂÒÁÚÕÅÔÅ × FAT32 É MS Windows ÕÓÔÁÎÏ×ÌÅÎÁ ÎÁ ÜÔÏÍ ÒÁÚÄÅÌÅ, ÔÏ "
+"×Ù ÄÏÌÖÎÙ ÐÅÒÅÉÎÓÔÁÌÉÒÏ×ÁÔØ ÓÉÓÔÅÍÎÙÊ ÚÁÇÒÕÚÞÉË MS Windows. åÓÌÉ ×Ù ÈÏÔÉÔÅ
ÓÄÅÌÁÔØ ÜÔÏ "
+"×Ù ÄÏÌÖÎÙ ÏÚÎÁËÏÍÉÔØÓÑ Ó Parted ÄÏËÕÍÅÎÔÁÃÉÅÊ (ÉÌÉ ÄÏËÕÍÅÎÔÁÃÉÅÊ ÉÚ ÎÁÂÏÒÁ
×ÁÛÅÇÏ ÄÉÓÔÒÉÂÕÔÉ×Á). "
+"ðÏÓÌÅ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ × FAT32, MS DOS, MS Windows 95a, É
×ÏÚÍÏÖÎÏ MS Windows NT "
+"ÎÅ ÓÍÏÇÕÔ Ó ÎÅÊ ÒÁÂÏÔÁÔØ."
#: libparted/fs_fat/resize.c:474
#, c-format
@@ -971,7 +1018,7 @@ msgstr ""
#: libparted/fs_fat/resize.c:475
msgid "Would you like to use FAT32?"
-msgstr ""
+msgstr "èÏÔÉÔÅ ÌÉ ×Ù ÉÓÐÏÌØÚÏ×ÁÔØ FAT32?"
#: libparted/fs_fat/resize.c:502 libparted/fs_fat/resize.c:518
#, c-format
@@ -982,11 +1029,13 @@ msgstr ""
msgid ""
"The file system can only be resized to this size by converting to FAT16."
msgstr ""
+"òÁÚÍÅÒ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ ÍÏÖÅÔ ÂÙÔØ ÉÚÍÅÎÅÎ ÄÏ ÜÔÏÊ ×ÅÌÉÞÉÎÙ ÐÒÉ ËÏÎ×ÅÒÔÁÃÉÉ ×
FAT16."
#: libparted/fs_fat/resize.c:519
msgid ""
"The file system can only be resized to this size by converting to FAT32."
msgstr ""
+"òÁÚÍÅÒ ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÙ ÍÏÖÅÔ ÂÙÔØ ÉÚÍÅÎÅÎ ÄÏ ÜÔÏÊ ×ÅÌÉÞÉÎÙ ÐÒÉ ËÏÎ×ÅÒÔÁÃÉÉ ×
FAT32."
#: libparted/fs_fat/resize.c:532
msgid ""
@@ -1110,7 +1159,7 @@ msgstr "ïÛÉÂËÁ × FAT: ËÌÁÓÔÅÒ %d ÉÍÅÅÔ Ó
#: libparted/fs_fat/count.c:195
#, c-format
msgid "%s is %dk, but it has is %d clusters (%dk)."
-msgstr ""
+msgstr "%s %dk, ÎÏ ÏÎ ÉÍÅÅÔ %d ËÌÁÓÔÅÒÏ× (%dk)."
#: libparted/fs_fat/table.c:136
#, c-format
@@ -1295,6 +1344,8 @@ msgid ""
"You requested to create a partition at %.3f-%.3fMb. The closest Parted can "
"manage is %.3f-%.3fMb."
msgstr ""
+"÷Ù ÈÏÔÉÔÅ ÓÏÚÄÁÔØ ÒÁÚÄÅÌ ÄÉÓËÁ ÒÁÚÍÅÒÁÍÉ %.3f-%.3fMb. Parted ÍÏÖÅÔ ÕÐÒÁ×ÌÑÔØ
ÏÂÌÁÓÔØÀ "
+"%.3f-%.3fMb"
#: parted/parted.c:619
#, fuzzy
@@ -1314,6 +1365,8 @@ msgid ""
"You requested to move the partition to %.3f-%.3fMb. The closest Parted can "
"manage is %.3f-%.3fMb."
msgstr ""
+"÷Ù ÈÏÔÉÔÅ ÐÅÒÅÍÅÓÔÉÔØ ÒÁÚÄÅÌ ÄÉÓËÁ × %.3f-%.3fMb. Parted ÍÏÖÅÔ ÕÐÒÁ×ÌÑÔØ
ÏÂÌÁÓÔØÀ "
+"%.3f-%.3fMb"
#: parted/parted.c:752
#, fuzzy, c-format
@@ -1323,15 +1376,15 @@ msgstr "çÅÏÍÅÔÒÉÑ ÄÉÓËÁ: 1-%d, %dk ÃÉÌÉÎ
#: parted/parted.c:755
#, c-format
msgid "Disk label type: %s\n"
-msgstr ""
+msgstr "Disk label ÔÉÐ: %s\n"
#: parted/parted.c:762
msgid "Minor Start End "
-msgstr ""
+msgstr "îÏÍÅÒ îÁÞÁÌÏ ëÏÎÅà "
#: parted/parted.c:764
msgid "Type "
-msgstr ""
+msgstr "ôÉÐ "
#: parted/parted.c:765
#, fuzzy
@@ -1340,11 +1393,11 @@ msgstr "æÁÊÌÏ×ÁÑ ÓÉÓÔÅÍÁ ÐÏÌÎÁ!"
#: parted/parted.c:767
msgid "Name "
-msgstr ""
+msgstr "éÍÑ "
#: parted/parted.c:768
msgid "Flags"
-msgstr ""
+msgstr "æÌÁÇÉ"
#: parted/parted.c:884
#, c-format
@@ -1352,6 +1405,8 @@ msgid ""
"You requested to resize the partition to %.3f-%.3fMb. The closest Parted can "
"manage is %.3f-%.3fMb."
msgstr ""
+"÷Ù ÈÏÔÉÔÅ ÉÚÍÅÎÉÔØ ÚÁÚÍÅÒÙ ÒÁÚÄÅÌÁ ÎÁ %.3f-%.3fMb. Parted ÍÏÖÅÔ ÕÐÒÁ×ÌÑÔØ
ÏÂÌÁÓÔØÀ "
+"%.3f-%.3fMb"
#: parted/parted.c:1086
msgid "check"
@@ -1493,7 +1548,7 @@ msgstr ""
#: parted/parted.c:1207
msgid "select DEVICE choose the device to edit"
-msgstr ""
+msgstr "select õóôòïêóô÷ï ×ÙÂÒÁÔØ ÕÓÔÒÏÊÓÔ×Ï ÄÌÑ
ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ"
#: parted/parted.c:1212
msgid "set"
- ReiserFS support patch,
Yura Umanets <=