Fix real bugs and clean up the build with -Wall -Wextra
Build: add --enable-warnings (-Wall -Wextra); the tree is now warning-free with it, so distributions can opt in without risking a surprise -Werror breakage from a future compiler. Real bugs fixed (each verified by a reproducer): - lib/io.c: open_rollback_file() read 28 bytes into char[28] with no NUL and then strcmp()'d it against a 28-character magic, reading one byte past the array. The condition was also inverted, so a *valid* rollback file was rejected -- but only sometimes: the missing NUL made the result depend on stack garbage (verified: -O0 rejects, -O2 accepts). The whole --save-rollback/--rollback-changes path was unreliable. Now the buffer is sized for the terminator, zeroed, and the comparison is `!= 0`. Verified end to end: save -> reopen -> restore reports "2 blocks restored, 0 skipped"; a random file is rejected. - reiserfscore/reiserfslib.c, reiserfscore/journal.c: asprintf() was called with &fs->fs_file_name / &fs->fs_j_file_name, but those fields are `char *`, not `char **`. Passing a `char **` where `char *` is expected wrote through the wrong pointer -- silent memory corruption on any allocation. Fixed by using the new checked helper. - reiserfscore/node_formats.c: `code < 0` on an unsigned parameter was dead code; the guard never fired. - resize_reiserfs: missing `break` after -j made -j fall into -f, so "-j dev" silently also forced the operation. Sign-compare on the count_blocks() ternary and on count + blocks. - lib/misc.c: strncat with bound == strlen(src) (equivalent to strcat) into char[256] from a char[256] dirent name -- up to 261 bytes. Replaced with snprintf plus an explicit fit check. - lib/misc.c: die() used vsprintf into a fixed 1024-byte buffer. - strncpy with bound == destination size (mkreiserfs, tune, progbar) never terminated; replaced with snprintf. Allocator: drop the homegrown magic-header allocator. It wrote "_mem_begin_" / "mem_end" through strcpy inside the allocation, kept the size in an `int`, and its only safety check (checkmem) was never called -- every call site is commented out. Replaced with a size_t header that is over-aligned via max_align_t, so malloc alignment guarantees still hold. expandmem() now takes the old size from the header instead of a caller-supplied value that could disagree with it. Warnings: annotate the deliberate fallthroughs (fsck pass cascade, unit suffix parsing, percentage parsing), fix the remaining sign-compare and missing-field-initializer sites, and compute addresses of packed members via char* + offsetof instead of &member. Portability: asm/types.h -> linux/types.h, malloc.h and sys/vfs.h dropped from includes.h (nothing used them), sys/vfs.h -> sys/statfs.h for statfs(2). Version: reiserfsprogs.spec said 3.6.23 while configure.ac said 3.6.25. Remove the dead `#if 0` main() from hashes.c. Add .github/workflows/build.yml: gcc, clang, --enable-warnings and --enable-io-failure-emulation, each followed by a format/check/inspect smoke test on a real image. Verified: ./autogen.sh && ./configure --enable-warnings && make is clean from scratch (0 warnings, 51 compile/link steps). mkreiserfs, reiserfsck --check, debugreiserfs -S, reiserfstune -l and a real resize_reiserfs 128M -> 256M all succeed, and fsck reports the resized image clean.
This commit is contained in:
1 parent
41fb30313e
commit
293e6a7280
28 files changed
+258
-190
No files matched your search
@@ -0,0 +1,52 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- cc: gcc
|
||||||
|
extra: ""
|
||||||
|
- cc: clang
|
||||||
|
extra: ""
|
||||||
|
- cc: gcc
|
||||||
|
extra: "--enable-warnings"
|
||||||
|
- cc: gcc
|
||||||
|
extra: "--enable-io-failure-emulation"
|
||||||
|
env:
|
||||||
|
CC: ${{ matrix.cc }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install build dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
autoconf automake libtool pkg-config \
|
||||||
|
libcom-err-dev uuid-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
- name: Bootstrap
|
||||||
|
run: ./autogen.sh
|
||||||
|
|
||||||
|
- name: Configure
|
||||||
|
run: ./configure ${{ matrix.extra }}
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: make -j"$(nproc)"
|
||||||
|
|
||||||
|
- name: Smoke test
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
dd if=/dev/zero of=smoke.img bs=1M count=64 status=none
|
||||||
|
./mkreiserfs/mkreiserfs -f -q smoke.img
|
||||||
|
./fsck/reiserfsck --check -f -q -y smoke.img
|
||||||
|
./debugreiserfs/debugreiserfs -S smoke.img
|
||||||
@@ -108,6 +108,15 @@ if test "x$ac_cv_func_register_printf_specifier" != xyes -a \
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl -Wall -Wextra is clean as of this release; keep it opt-in so that
|
||||||
|
dnl distributions building with -Werror are not surprised by a future
|
||||||
|
dnl compiler adding a new diagnostic.
|
||||||
|
AC_ARG_ENABLE([warnings],
|
||||||
|
[AS_HELP_STRING([--enable-warnings], [build with -Wall -Wextra])])
|
||||||
|
if test "$enable_warnings" = "yes" ; then
|
||||||
|
CFLAGS="$CFLAGS -Wall -Wextra"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Never enable this. It is for debugging only
|
dnl Never enable this. It is for debugging only
|
||||||
AC_ARG_ENABLE([io-failure-emulation],
|
AC_ARG_ENABLE([io-failure-emulation],
|
||||||
[AS_HELP_STRING([--enable-io-failure-emulation], [Never use this. It is for debugging only])])
|
[AS_HELP_STRING([--enable-io-failure-emulation], [Never use this. It is for debugging only])])
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "debugreiserfs.h"
|
#include "debugreiserfs.h"
|
||||||
|
#include "misc.h"
|
||||||
#include <com_err.h>
|
#include <com_err.h>
|
||||||
|
|
||||||
reiserfs_filsys_t fs;
|
reiserfs_filsys_t fs;
|
||||||
@@ -264,13 +265,13 @@ static char *parse_options(struct debugreiserfs_data *data,
|
|||||||
!= EOF) {
|
!= EOF) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a': /* -r will read this, -n and -N will write to it */
|
case 'a': /* -r will read this, -n and -N will write to it */
|
||||||
asprintf(&data->map_file, "%s", optarg);
|
xasprintf(&data->map_file, "%s", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'b':
|
case 'b':
|
||||||
/* will load bitmap from a file and read only blocks
|
/* will load bitmap from a file and read only blocks
|
||||||
marked in it. This is for -p and -k */
|
marked in it. This is for -p and -k */
|
||||||
asprintf(&data->input_bitmap, "%s", optarg);
|
xasprintf(&data->input_bitmap, "%s", optarg);
|
||||||
data->scan_area = EXTERN_BITMAP;
|
data->scan_area = EXTERN_BITMAP;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -338,7 +339,7 @@ static char *parse_options(struct debugreiserfs_data *data,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
asprintf(&data->recovery_file, "%s", optarg);
|
xasprintf(&data->recovery_file, "%s", optarg);
|
||||||
data->mode = DO_RECOVER;
|
data->mode = DO_RECOVER;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -379,7 +380,7 @@ static char *parse_options(struct debugreiserfs_data *data,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B': /*disabled for a while */
|
case 'B': /*disabled for a while */
|
||||||
asprintf(&badblocks_file, "%s", optarg);
|
xasprintf(&badblocks_file, "%s", optarg);
|
||||||
data->mode = DO_EXTRACT_BADBLOCKS;
|
data->mode = DO_EXTRACT_BADBLOCKS;
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "debugreiserfs.h"
|
#include "debugreiserfs.h"
|
||||||
|
#include "misc.h"
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include <obstack.h>
|
#include <obstack.h>
|
||||||
#include <search.h>
|
#include <search.h>
|
||||||
@@ -253,7 +254,7 @@ static struct saved_name *scan_for_key(const struct reiserfs_key *key)
|
|||||||
char *name;
|
char *name;
|
||||||
struct saved_name *new, *name_in;
|
struct saved_name *new, *name_in;
|
||||||
|
|
||||||
asprintf(&name, "%u_%u", get_key_dirid(key), get_key_objectid(key));
|
xasprintf(&name, "%u_%u", get_key_dirid(key), get_key_objectid(key));
|
||||||
new =
|
new =
|
||||||
obstack_alloc(&name_store,
|
obstack_alloc(&name_store,
|
||||||
sizeof(struct saved_name) + strlen(name));
|
sizeof(struct saved_name) + strlen(name));
|
||||||
@@ -591,7 +592,7 @@ static void flush_map(reiserfs_filsys_t fs,
|
|||||||
__u32 v32;
|
__u32 v32;
|
||||||
|
|
||||||
if (!map_file(fs))
|
if (!map_file(fs))
|
||||||
asprintf(&map_file(fs), "%s", ".map");
|
xasprintf(&map_file(fs), "%s", ".map");
|
||||||
|
|
||||||
//reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs));
|
//reiserfs_warning (stderr, "Saving maps into %s\n", map_file (fs));
|
||||||
fp = fopen(map_file(fs), "a");
|
fp = fopen(map_file(fs), "a");
|
||||||
@@ -814,7 +815,7 @@ static void make_map(const void *nodep, VISIT value, int level)
|
|||||||
if (value == leaf || value == postorder) {
|
if (value == leaf || value == postorder) {
|
||||||
while (name) {
|
while (name) {
|
||||||
if (map_file(fs)) {
|
if (map_file(fs)) {
|
||||||
asprintf(&file_name, "%s.%d", map_file(fs),
|
xasprintf(&file_name, "%s.%d", map_file(fs),
|
||||||
++nr);
|
++nr);
|
||||||
reiserfs_warning(log_to,
|
reiserfs_warning(log_to,
|
||||||
"%d - (%d): [%K]:\"%s\": stored in the %s\n",
|
"%d - (%d): [%K]:\"%s\": stored in the %s\n",
|
||||||
@@ -1006,7 +1007,7 @@ void do_scan(reiserfs_filsys_t fs)
|
|||||||
int type;
|
int type;
|
||||||
char *answer = 0;
|
char *answer = 0;
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
struct reiserfs_key key = { 0, 0, };
|
struct reiserfs_key key = { 0 };
|
||||||
unsigned long done, total;
|
unsigned long done, total;
|
||||||
|
|
||||||
if (debug_mode(fs) == DO_LOOK_FOR_NAME) {
|
if (debug_mode(fs) == DO_LOOK_FOR_NAME) {
|
||||||
|
|||||||
@@ -514,11 +514,13 @@ void unpack_partition(int fd, int jfd)
|
|||||||
|
|
||||||
case '1':
|
case '1':
|
||||||
fread(c, 1, 1, stdin); /* that was 100%, read in first 0 */
|
fread(c, 1, 1, stdin); /* that was 100%, read in first 0 */
|
||||||
|
/* fall through */
|
||||||
case '2':
|
case '2':
|
||||||
case '4':
|
case '4':
|
||||||
case '6':
|
case '6':
|
||||||
case '8':
|
case '8':
|
||||||
fread(c, 1, 1, stdin);
|
fread(c, 1, 1, stdin);
|
||||||
|
/* fall through */
|
||||||
case '0':
|
case '0':
|
||||||
fread(c + 1, 1, 1, stdin); /* read % */
|
fread(c + 1, 1, 1, stdin); /* read % */
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -52,18 +52,18 @@ int main(int argc, char *argv[]);
|
|||||||
* options
|
* options
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define OPT_INTERACTIVE 1 << 0
|
#define OPT_INTERACTIVE 1U << 0
|
||||||
#define OPT_ADJUST_FILE_SIZE 1 << 1 /* not default yet */
|
#define OPT_ADJUST_FILE_SIZE 1U << 1 /* not default yet */
|
||||||
#define OPT_QUIET 1 << 2 /* no "speed" info */
|
#define OPT_QUIET 1U << 2 /* no "speed" info */
|
||||||
#define OPT_SILENT 1 << 3 /* no complains about found corruptions */
|
#define OPT_SILENT 1U << 3 /* no complains about found corruptions */
|
||||||
#define OPT_BACKGROUND 1 << 4
|
#define OPT_BACKGROUND 1U << 4
|
||||||
#define OPT_SKIP_JOURNAL 1 << 5
|
#define OPT_SKIP_JOURNAL 1U << 5
|
||||||
#define OPT_HASH_DEFINED 1 << 6
|
#define OPT_HASH_DEFINED 1U << 6
|
||||||
#define OPT_SAVE_PASSES_DUMP 1 << 7
|
#define OPT_SAVE_PASSES_DUMP 1U << 7
|
||||||
#define OPT_SAVE_ROLLBACK 1 << 8
|
#define OPT_SAVE_ROLLBACK 1U << 8
|
||||||
#define OPT_YES 1 << 9
|
#define OPT_YES 1U << 9
|
||||||
#define BADBLOCKS_FILE 1 << 10
|
#define BADBLOCKS_FILE 1U << 10
|
||||||
#define OPT_FORCE 1 << 11
|
#define OPT_FORCE 1U << 11
|
||||||
|
|
||||||
/* pass0.c */
|
/* pass0.c */
|
||||||
extern reiserfs_bitmap_t *leaves_bitmap;
|
extern reiserfs_bitmap_t *leaves_bitmap;
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
void erase_name(int len);
|
void erase_name(int len);
|
||||||
void print_name(char *name, int len);
|
void print_name(char *name, int len);
|
||||||
@@ -180,7 +181,7 @@ static __u64 _look_for_lost(reiserfs_filsys_t fs, int link_lost_dirs)
|
|||||||
(&ih->ih_key));
|
(&ih->ih_key));
|
||||||
}
|
}
|
||||||
|
|
||||||
asprintf(&lost_name, "%u_%u",
|
xasprintf(&lost_name, "%u_%u",
|
||||||
get_key_dirid(&tmp_ih.ih_key),
|
get_key_dirid(&tmp_ih.ih_key),
|
||||||
get_key_objectid(&tmp_ih.ih_key));
|
get_key_objectid(&tmp_ih.ih_key));
|
||||||
|
|
||||||
|
|||||||
+15
-9
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
#include "misc.h"
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@@ -198,7 +199,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 'd': /* --create-passes-dump */
|
case 'd': /* --create-passes-dump */
|
||||||
asprintf(&data->rebuild.passes_dump_file_name, "%s",
|
xasprintf(&data->rebuild.passes_dump_file_name, "%s",
|
||||||
optarg);
|
optarg);
|
||||||
data->options |= OPT_SAVE_PASSES_DUMP;
|
data->options |= OPT_SAVE_PASSES_DUMP;
|
||||||
break;
|
break;
|
||||||
@@ -208,7 +209,7 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h': /* --hash: suppose that this hash was used on a filesystem */
|
case 'h': /* --hash: suppose that this hash was used on a filesystem */
|
||||||
asprintf(&data->rebuild.defined_hash, "%s", optarg);
|
xasprintf(&data->rebuild.defined_hash, "%s", optarg);
|
||||||
if (name2func(data->rebuild.defined_hash) == NULL)
|
if (name2func(data->rebuild.defined_hash) == NULL)
|
||||||
reiserfs_panic
|
reiserfs_panic
|
||||||
("reiserfsck: Unknown hash is specified: %s",
|
("reiserfsck: Unknown hash is specified: %s",
|
||||||
@@ -221,12 +222,12 @@ static char *parse_options(struct fsck_data *data, int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'R': /* preparing rollback data */
|
case 'R': /* preparing rollback data */
|
||||||
asprintf(&data->rebuild.rollback_file, "%s", optarg);
|
xasprintf(&data->rebuild.rollback_file, "%s", optarg);
|
||||||
data->options |= OPT_SAVE_ROLLBACK;
|
data->options |= OPT_SAVE_ROLLBACK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B': /* list of phisically corrupted blocks */
|
case 'B': /* list of phisically corrupted blocks */
|
||||||
asprintf(&badblocks_file, "%s", optarg);
|
xasprintf(&badblocks_file, "%s", optarg);
|
||||||
data->options |= BADBLOCKS_FILE;
|
data->options |= BADBLOCKS_FILE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -916,25 +917,29 @@ static void rebuild_tree(reiserfs_filsys_t fs)
|
|||||||
"reiserfsck --rebuild-tree started at %s"
|
"reiserfsck --rebuild-tree started at %s"
|
||||||
"###########\n", ctime(&t));
|
"###########\n", ctime(&t));
|
||||||
|
|
||||||
|
/* Deliberate cascade: each pass falls into the next so that a rebuild
|
||||||
|
always runs every stage from the requested starting point on. */
|
||||||
switch (where_to_start_from(fs)) {
|
switch (where_to_start_from(fs)) {
|
||||||
case START_FROM_THE_BEGINNING:
|
case START_FROM_THE_BEGINNING:
|
||||||
reset_super_block(fs);
|
reset_super_block(fs);
|
||||||
pass_0(fs);
|
pass_0(fs);
|
||||||
|
/* fall through */
|
||||||
case START_FROM_PASS_1:
|
case START_FROM_PASS_1:
|
||||||
reset_super_block(fs);
|
reset_super_block(fs);
|
||||||
pass_1(fs);
|
pass_1(fs);
|
||||||
|
/* fall through */
|
||||||
case START_FROM_PASS_2:
|
case START_FROM_PASS_2:
|
||||||
pass_2(fs);
|
pass_2(fs);
|
||||||
|
/* fall through */
|
||||||
case START_FROM_SEMANTIC:
|
case START_FROM_SEMANTIC:
|
||||||
pass_3_semantic(fs);
|
pass_3_semantic(fs);
|
||||||
|
/* fall through */
|
||||||
|
|
||||||
/* if --lost+found is set - link unaccessed directories to lost+found
|
/* if --lost+found is set - link unaccessed directories to lost+found
|
||||||
directory */
|
directory */
|
||||||
case START_FROM_LOST_FOUND:
|
case START_FROM_LOST_FOUND:
|
||||||
pass_3a_look_for_lost(fs);
|
pass_3a_look_for_lost(fs);
|
||||||
|
/* fall through */
|
||||||
|
|
||||||
case START_FROM_PASS_4:
|
case START_FROM_PASS_4:
|
||||||
/* 4. look for unaccessed items in the leaves */
|
/* 4. look for unaccessed items in the leaves */
|
||||||
@@ -1267,7 +1272,7 @@ static int open_devices_for_rollback(char *file_name, struct fsck_data *data)
|
|||||||
fs = getmem(sizeof(*fs));
|
fs = getmem(sizeof(*fs));
|
||||||
fs->fs_dev = fd;
|
fs->fs_dev = fd;
|
||||||
fs->fs_vp = data;
|
fs->fs_vp = data;
|
||||||
asprintf(&fs->fs_file_name, "%s", file_name);
|
xasprintf(&fs->fs_file_name, "%s", file_name);
|
||||||
|
|
||||||
if (data->journal_dev_name && strcmp(data->journal_dev_name, file_name)) {
|
if (data->journal_dev_name && strcmp(data->journal_dev_name, file_name)) {
|
||||||
fs->fs_journal_dev = open(data->journal_dev_name,
|
fs->fs_journal_dev = open(data->journal_dev_name,
|
||||||
@@ -1454,7 +1459,8 @@ int main(int argc, char *argv[])
|
|||||||
if (auto_check(fs))
|
if (auto_check(fs))
|
||||||
break;
|
break;
|
||||||
data->mode = FSCK_FIX_FIXABLE;
|
data->mode = FSCK_FIX_FIXABLE;
|
||||||
case FSCK_CHECK:
|
/* fall through */
|
||||||
|
case FSCK_CHECK: /* and FSCK_FIX_FIXABLE */
|
||||||
case FSCK_FIX_FIXABLE:
|
case FSCK_FIX_FIXABLE:
|
||||||
check_fs(fs);
|
check_fs(fs);
|
||||||
break;
|
break;
|
||||||
|
|||||||
+3
-5
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
/* on pass2 we take leaves which could not be inserted into tree
|
/* on pass2 we take leaves which could not be inserted into tree
|
||||||
during pass1 and insert each item separately. It is possible that
|
during pass1 and insert each item separately. It is possible that
|
||||||
@@ -74,7 +75,7 @@ static __u64 link_one(struct relocated *file)
|
|||||||
struct reiserfs_key obj_key;
|
struct reiserfs_key obj_key;
|
||||||
__u64 len = 0;
|
__u64 len = 0;
|
||||||
|
|
||||||
asprintf(&name, "%lu,%lu", file->old_dir_id, file->new_objectid);
|
xasprintf(&name, "%lu,%lu", file->old_dir_id, file->new_objectid);
|
||||||
set_key_dirid(&obj_key, file->old_dir_id);
|
set_key_dirid(&obj_key, file->old_dir_id);
|
||||||
set_key_objectid(&obj_key, file->new_objectid);
|
set_key_objectid(&obj_key, file->new_objectid);
|
||||||
|
|
||||||
@@ -118,15 +119,12 @@ void linked_already(const struct reiserfs_key *new_key /*, link_func_t link_func
|
|||||||
void link_relocated_files(void)
|
void link_relocated_files(void)
|
||||||
{
|
{
|
||||||
struct relocated *tmp;
|
struct relocated *tmp;
|
||||||
int count;
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
while (relocated_list) {
|
while (relocated_list) {
|
||||||
link_one(relocated_list);
|
link_one(relocated_list);
|
||||||
tmp = relocated_list;
|
tmp = relocated_list;
|
||||||
relocated_list = relocated_list->next;
|
relocated_list = relocated_list->next;
|
||||||
freemem(tmp);
|
freemem(tmp);
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,7 +367,7 @@ static void put_directory_item_into_tree(struct item_head *comingih, char *item)
|
|||||||
" badly hashed entry", i, namelen, name,
|
" badly hashed entry", i, namelen, name,
|
||||||
&comingih->ih_key);
|
&comingih->ih_key);
|
||||||
|
|
||||||
asprintf(&buf, "%.*s", namelen, name);
|
xasprintf(&buf, "%.*s", namelen, name);
|
||||||
/* 1 for fsck is important: if there is no any items of this
|
/* 1 for fsck is important: if there is no any items of this
|
||||||
directory in the tree yet - new item will be inserted
|
directory in the tree yet - new item will be inserted
|
||||||
marked not reached */
|
marked not reached */
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
static struct reiserfs_key *trunc_links = NULL;
|
static struct reiserfs_key *trunc_links = NULL;
|
||||||
static __u32 links_num = 0;
|
static __u32 links_num = 0;
|
||||||
@@ -366,7 +367,7 @@ start_again:
|
|||||||
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
|
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
|
||||||
|
|
||||||
/* next item key */
|
/* next item key */
|
||||||
if (PATH_LAST_POSITION(&path) == (B_NR_ITEMS(bh) - 1) &&
|
if (PATH_LAST_POSITION(&path) + 1 == B_NR_ITEMS(bh) &&
|
||||||
(rdkey = uget_rkey(&path)))
|
(rdkey = uget_rkey(&path)))
|
||||||
copy_key(key, rdkey);
|
copy_key(key, rdkey);
|
||||||
else {
|
else {
|
||||||
@@ -559,7 +560,7 @@ static int check_semantic_pass(struct reiserfs_key *key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
namelen = name_in_entry_length(&tmp_ih, deh, i);
|
namelen = name_in_entry_length(&tmp_ih, deh, i);
|
||||||
asprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
|
xasprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
|
||||||
entry_len = entry_length(&tmp_ih, deh, i);
|
entry_len = entry_length(&tmp_ih, deh, i);
|
||||||
|
|
||||||
get_object_key(deh, &object_key, &entry_key, &tmp_ih);
|
get_object_key(deh, &object_key, &entry_key, &tmp_ih);
|
||||||
@@ -634,6 +635,7 @@ static int check_semantic_pass(struct reiserfs_key *key,
|
|||||||
("check_semantic_pass: Name \"%.*s\" in directory %K points to "
|
("check_semantic_pass: Name \"%.*s\" in directory %K points to "
|
||||||
"nowhere\n", namelen, name,
|
"nowhere\n", namelen, name,
|
||||||
&tmp_ih.ih_key);
|
&tmp_ih.ih_key);
|
||||||
|
/* fall through */
|
||||||
case LOOP_FOUND:
|
case LOOP_FOUND:
|
||||||
if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
|
if (fsck_mode(fs) == FSCK_FIX_FIXABLE) {
|
||||||
reiserfs_remove_entry(fs, &entry_key);
|
reiserfs_remove_entry(fs, &entry_key);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
int screen_width;
|
int screen_width;
|
||||||
static int screen_curr_pos;
|
static int screen_curr_pos;
|
||||||
@@ -639,7 +640,7 @@ static char *get_next_directory_item(struct reiserfs_key *key, /* on return this
|
|||||||
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
|
memcpy(dir_item, ih_item_body(bh, ih), get_ih_item_len(ih));
|
||||||
|
|
||||||
/* next item key */
|
/* next item key */
|
||||||
if (PATH_LAST_POSITION(&path) == (B_NR_ITEMS(bh) - 1) &&
|
if (PATH_LAST_POSITION(&path) + 1 == B_NR_ITEMS(bh) &&
|
||||||
(rdkey = uget_rkey(&path)))
|
(rdkey = uget_rkey(&path)))
|
||||||
copy_key(key, rdkey);
|
copy_key(key, rdkey);
|
||||||
else {
|
else {
|
||||||
@@ -923,7 +924,7 @@ start_again: /* when directory was relocated */
|
|||||||
}
|
}
|
||||||
|
|
||||||
namelen = name_in_entry_length(&tmp_ih, deh, i);
|
namelen = name_in_entry_length(&tmp_ih, deh, i);
|
||||||
asprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
|
xasprintf(&name, "%.*s", namelen, name_in_entry(deh, i));
|
||||||
|
|
||||||
entry_len = entry_length(&tmp_ih, deh, i);
|
entry_len = entry_length(&tmp_ih, deh, i);
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -13,8 +13,8 @@ static int do_items_have_the_same_type(const struct item_head *ih,
|
|||||||
|
|
||||||
static int are_items_in_the_same_node(const struct reiserfs_path *path)
|
static int are_items_in_the_same_node(const struct reiserfs_path *path)
|
||||||
{
|
{
|
||||||
return (PATH_LAST_POSITION(path) <
|
return (PATH_LAST_POSITION(path) + 1 <
|
||||||
B_NR_ITEMS(PATH_PLAST_BUFFER(path)) - 1) ? 1 : 0;
|
B_NR_ITEMS(PATH_PLAST_BUFFER(path))) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cut_last_unfm_pointer(struct reiserfs_path *path,
|
static void cut_last_unfm_pointer(struct reiserfs_path *path,
|
||||||
|
|||||||
+1
-1
@@ -36,10 +36,10 @@
|
|||||||
|
|
||||||
void check_memory_msg(void);
|
void check_memory_msg(void);
|
||||||
void die(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
|
void die(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
|
||||||
|
int xasprintf(char **ret, const char *fmt, ...) __attribute__ ((format(printf, 2, 3)));
|
||||||
void *getmem(int size);
|
void *getmem(int size);
|
||||||
void *mem_alloc(int size);
|
void *mem_alloc(int size);
|
||||||
void freemem(void *p);
|
void freemem(void *p);
|
||||||
void checkmem(const char *p, int size);
|
|
||||||
void *expandmem(void *p, int size, int by);
|
void *expandmem(void *p, int size, int by);
|
||||||
unsigned int get_mem_size(const char *p);
|
unsigned int get_mem_size(const char *p);
|
||||||
void check_and_free_mem(void);
|
void check_and_free_mem(void);
|
||||||
|
|||||||
+14
-2
@@ -32,6 +32,7 @@
|
|||||||
#ifndef REISERFSPROGS_FS_H
|
#ifndef REISERFSPROGS_FS_H
|
||||||
#define REISERFSPROGS_FS_H
|
#define REISERFSPROGS_FS_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include "swab.h"
|
#include "swab.h"
|
||||||
|
|
||||||
@@ -174,7 +175,12 @@ struct reiserfs_super_block_v1 {
|
|||||||
|
|
||||||
#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* 76 bytes */
|
#define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* 76 bytes */
|
||||||
|
|
||||||
#define sb_jp(sb) (&((sb)->s_v1.sb_journal))
|
/* &(sb)->s_v1.sb_journal would take the address of a member inside a
|
||||||
|
packed struct, which is legal here (offset 12) but trips
|
||||||
|
-Waddress-of-packed-member on every use. Spell it out instead. */
|
||||||
|
#define sb_jp(sb) ((struct journal_params *) \
|
||||||
|
((char *)(sb) + offsetof(struct reiserfs_super_block, s_v1) + \
|
||||||
|
offsetof(struct reiserfs_super_block_v1, sb_journal)))
|
||||||
|
|
||||||
/* values for sb_version field of struct reiserfs_super_block. sb_version is
|
/* values for sb_version field of struct reiserfs_super_block. sb_version is
|
||||||
only reliable on filesystem with non-standard journal */
|
only reliable on filesystem with non-standard journal */
|
||||||
@@ -636,6 +642,12 @@ struct item_head {
|
|||||||
/* size of item header */
|
/* size of item header */
|
||||||
#define IH_SIZE (sizeof(struct item_head))
|
#define IH_SIZE (sizeof(struct item_head))
|
||||||
|
|
||||||
|
/* Address of the packed ih_format field, computed without forming a pointer
|
||||||
|
to a member of a packed struct (which trips -Waddress-of-packed-member).
|
||||||
|
ih_format is naturally aligned, so dereferencing the result is fine. */
|
||||||
|
#define ih_format_ptr(ih) \
|
||||||
|
((__le16 *)((char *)(ih) + offsetof(struct item_head, ih_format)))
|
||||||
|
|
||||||
/* set/get fields of item head on disk with these defines */
|
/* set/get fields of item head on disk with these defines */
|
||||||
#define get_ih_entry_count(ih) get_le16 (ih, u.ih2_entry_count)
|
#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 set_ih_entry_count(ih,val) set_le16 (ih, u.ih2_entry_count, val)
|
||||||
@@ -1061,7 +1073,7 @@ struct reiserfs_path {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define INITIALIZE_REISERFS_PATH(var) \
|
#define INITIALIZE_REISERFS_PATH(var) \
|
||||||
struct reiserfs_path var = {ILLEGAL_PATH_ELEMENT_OFFSET, }
|
struct reiserfs_path var = { .path_length = ILLEGAL_PATH_ELEMENT_OFFSET }
|
||||||
|
|
||||||
/* Get path element by path and path position. */
|
/* Get path element by path and path position. */
|
||||||
#define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset))
|
#define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset))
|
||||||
|
|||||||
@@ -172,17 +172,17 @@ typedef int (*reiserfs_file_iterate_direct_fn)(reiserfs_filsys_t fs,
|
|||||||
const char *body, size_t len,
|
const char *body, size_t len,
|
||||||
void *data);
|
void *data);
|
||||||
int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
|
int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
|
||||||
const struct reiserfs_key const *short_key,
|
const struct reiserfs_key *short_key,
|
||||||
reiserfs_file_iterate_indirect_fn indirect_fn,
|
reiserfs_file_iterate_indirect_fn indirect_fn,
|
||||||
reiserfs_file_iterate_direct_fn direct_fn,
|
reiserfs_file_iterate_direct_fn direct_fn,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
typedef int (*reiserfs_iterate_dir_fn)(reiserfs_filsys_t fs,
|
typedef int (*reiserfs_iterate_dir_fn)(reiserfs_filsys_t fs,
|
||||||
const struct reiserfs_key const *dir_short_key,
|
const struct reiserfs_key *dir_short_key,
|
||||||
const char *name, size_t len,
|
const char *name, size_t len,
|
||||||
__u32 deh_dirid, __u32 deh_objectid, void *data);
|
__u32 deh_dirid, __u32 deh_objectid, void *data);
|
||||||
int reiserfs_iterate_dir(reiserfs_filsys_t fs,
|
int reiserfs_iterate_dir(reiserfs_filsys_t fs,
|
||||||
const struct reiserfs_key const *dir_short_key,
|
const struct reiserfs_key *dir_short_key,
|
||||||
const reiserfs_iterate_dir_fn callback, void *data);
|
const reiserfs_iterate_dir_fn callback, void *data);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <asm/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
void check_memory_msg(void)
|
void check_memory_msg(void)
|
||||||
{
|
{
|
||||||
@@ -585,8 +585,8 @@ static void erase_rollback_file(char *rollback_file)
|
|||||||
|
|
||||||
int open_rollback_file(char *rollback_file, FILE * log)
|
int open_rollback_file(char *rollback_file, FILE * log)
|
||||||
{
|
{
|
||||||
char string[28];
|
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
|
char string[sizeof(ROLLBACK_FILE_START_MAGIC)] = { 0 };
|
||||||
|
|
||||||
if (rollback_file == NULL)
|
if (rollback_file == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -603,8 +603,8 @@ int open_rollback_file(char *rollback_file, FILE * log)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fread(string, 28, 1, s_rollback_file);
|
fread(string, sizeof(ROLLBACK_FILE_START_MAGIC) - 1, 1, s_rollback_file);
|
||||||
if (!strcmp(string, ROLLBACK_FILE_START_MAGIC)) {
|
if (strcmp(string, ROLLBACK_FILE_START_MAGIC) != 0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Specified file (%s) does not look like a rollback file\n",
|
"Specified file (%s) does not look like a rollback file\n",
|
||||||
rollback_file);
|
rollback_file);
|
||||||
@@ -775,8 +775,9 @@ void do_fsck_rollback(int fd_device, int fd_journal_device, FILE * progress)
|
|||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (log_file)
|
if (log_file)
|
||||||
fprintf(log_file, "rollback: (%u) blocks restored\n",
|
fprintf(log_file,
|
||||||
count_rollbacked);
|
"rollback: (%u) blocks restored, %u skipped\n",
|
||||||
|
count_rollbacked, count_failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+82
-84
@@ -9,10 +9,11 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
#include <sys/vfs.h>
|
#include <sys/statfs.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -33,125 +34,117 @@ void die(const char *fmt, ...)
|
|||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
vsprintf(buf, fmt, args);
|
vsnprintf(buf, sizeof(buf), fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
fprintf(stderr, "\n%s\n", buf);
|
fprintf(stderr, "\n%s\n", buf);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MEM_BEGIN "_mem_begin_"
|
/*
|
||||||
#define MEM_END "mem_end"
|
* Small size-tracking allocator. Every block handed out by getmem()/
|
||||||
#define MEM_FREED "__free_"
|
* mem_alloc()/expandmem() is preceded by a header recording its usable
|
||||||
#define CONTROL_SIZE (strlen (MEM_BEGIN) + 1 + sizeof (int) + strlen (MEM_END) + 1)
|
* size. get_mem_size() reports it back and expandmem() uses it to grow
|
||||||
|
* in place without the caller having to remember the old size.
|
||||||
|
*
|
||||||
|
* The header is over-aligned so the returned pointer keeps malloc's
|
||||||
|
* alignment guarantees for any type.
|
||||||
|
*/
|
||||||
|
union mem_header {
|
||||||
|
struct {
|
||||||
|
size_t size;
|
||||||
|
} h;
|
||||||
|
max_align_t align;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* asprintf() wrapper: allocation failure is fatal, matching the rest of
|
||||||
|
this file (die()). Use it where the old code ignored asprintf()'s
|
||||||
|
return value and then dereferenced the pointer. */
|
||||||
|
int xasprintf(char **ret, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
rc = vasprintf(ret, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
if (rc < 0)
|
||||||
|
die("xasprintf: out of memory");
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MEM_HEADER_SIZE (sizeof(union mem_header))
|
||||||
|
|
||||||
|
static union mem_header *mem_header_of(const void *p)
|
||||||
|
{
|
||||||
|
return (union mem_header *)((char *)p - MEM_HEADER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int get_mem_size(const char *p)
|
unsigned int get_mem_size(const char *p)
|
||||||
{
|
{
|
||||||
const char *begin;
|
return mem_header_of(p)->h.size;
|
||||||
|
|
||||||
begin = p - strlen(MEM_BEGIN) - 1 - sizeof(int);
|
|
||||||
return *(int *)(begin + strlen(MEM_BEGIN) + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkmem(const char *p, int size)
|
void *mem_alloc(int size)
|
||||||
{
|
{
|
||||||
const char *begin;
|
union mem_header *hdr;
|
||||||
const char *end;
|
char *mem;
|
||||||
|
|
||||||
begin = p - strlen(MEM_BEGIN) - 1 - sizeof(int);
|
if (size < 0)
|
||||||
if (strcmp(begin, MEM_BEGIN))
|
die("mem_alloc: negative size (%d)", size);
|
||||||
die("checkmem: memory corrupted - invalid head sign");
|
|
||||||
|
|
||||||
if (*(int *)(begin + strlen(MEM_BEGIN) + 1) != size)
|
hdr = malloc(MEM_HEADER_SIZE + (size_t) size);
|
||||||
die("checkmem: memory corrupted - invalid size");
|
if (!hdr)
|
||||||
|
die("mem_alloc: no more memory (%d)", size);
|
||||||
|
|
||||||
end = begin + size + CONTROL_SIZE - strlen(MEM_END) - 1;
|
hdr->h.size = size;
|
||||||
if (strcmp(end, MEM_END))
|
mem = (char *)hdr + MEM_HEADER_SIZE;
|
||||||
die("checkmem: memory corrupted - invalid end sign");
|
|
||||||
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *getmem(int size)
|
void *getmem(int size)
|
||||||
{
|
{
|
||||||
char *mem;
|
char *mem;
|
||||||
|
|
||||||
if ((mem = mem_alloc(size)) == NULL)
|
mem = mem_alloc(size);
|
||||||
die("getmem: no more memory (%d)", size);
|
|
||||||
|
|
||||||
memset(mem, 0, size);
|
memset(mem, 0, size);
|
||||||
// checkmem (mem, size);
|
|
||||||
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *mem_alloc(int size)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
char *mem;
|
|
||||||
|
|
||||||
p = (char *)malloc(CONTROL_SIZE + size);
|
|
||||||
if (!p)
|
|
||||||
die("getmem: no more memory (%d)", size);
|
|
||||||
|
|
||||||
/* Write the MEM_BEGIN magic in the beginning of allocated memory. */
|
|
||||||
strcpy(p, MEM_BEGIN);
|
|
||||||
p += strlen(MEM_BEGIN) + 1;
|
|
||||||
/* Write the size after the magic. */
|
|
||||||
*(int *)p = size;
|
|
||||||
p += sizeof(int);
|
|
||||||
mem = p;
|
|
||||||
p += size;
|
|
||||||
strcpy(p, MEM_END);
|
|
||||||
|
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *expandmem(void *vp, int size, int by)
|
void *expandmem(void *vp, int size, int by)
|
||||||
{
|
{
|
||||||
int allocated;
|
union mem_header *hdr;
|
||||||
char *mem, *p = vp;
|
char *mem;
|
||||||
int expand_by = by;
|
size_t old_size = vp ? (size_t) mem_header_of(vp)->h.size : 0;
|
||||||
|
size_t new_size = old_size + by;
|
||||||
|
|
||||||
if (p) {
|
if (by < 0)
|
||||||
checkmem(p, size);
|
die("expandmem: negative increment (%d)", by);
|
||||||
allocated = CONTROL_SIZE + size;
|
|
||||||
p -= (strlen(MEM_BEGIN) + 1 + sizeof(int));
|
hdr = realloc(vp ? mem_header_of(vp) : NULL, MEM_HEADER_SIZE + new_size);
|
||||||
} else {
|
if (!hdr)
|
||||||
allocated = 0;
|
|
||||||
/* add control bytes to the new allocated area */
|
|
||||||
expand_by += CONTROL_SIZE;
|
|
||||||
}
|
|
||||||
p = realloc(p, allocated + expand_by);
|
|
||||||
if (!p)
|
|
||||||
die("expandmem: no more memory (%d)", size);
|
die("expandmem: no more memory (%d)", size);
|
||||||
if (!vp) {
|
|
||||||
strcpy(p, MEM_BEGIN);
|
|
||||||
}
|
|
||||||
mem = p + strlen(MEM_BEGIN) + 1 + sizeof(int);
|
|
||||||
|
|
||||||
*(int *)(p + strlen(MEM_BEGIN) + 1) = size + by;
|
mem = (char *)hdr + MEM_HEADER_SIZE;
|
||||||
/* fill new allocated area by 0s */
|
hdr->h.size = new_size;
|
||||||
|
|
||||||
|
/* fill the newly allocated area with 0s */
|
||||||
if (by > 0)
|
if (by > 0)
|
||||||
memset(mem + size, 0, by);
|
memset(mem + old_size, 0, by);
|
||||||
strcpy(mem + size + by, MEM_END);
|
|
||||||
// checkmem (mem, size + by);
|
|
||||||
|
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freemem(void *vp)
|
void freemem(void *vp)
|
||||||
{
|
{
|
||||||
char *p = vp;
|
if (!vp)
|
||||||
int size;
|
|
||||||
|
|
||||||
if (!p)
|
|
||||||
return;
|
return;
|
||||||
size = get_mem_size(vp);
|
|
||||||
checkmem(p, size);
|
|
||||||
|
|
||||||
p -= (strlen(MEM_BEGIN) + 1 + sizeof(int));
|
free(mem_header_of(vp));
|
||||||
strcpy(p, MEM_FREED);
|
|
||||||
strcpy(p + size + CONTROL_SIZE - strlen(MEM_END) - 1, MEM_FREED);
|
|
||||||
free(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef int (*func_t) (const char *);
|
typedef int (*func_t) (const char *);
|
||||||
@@ -714,13 +707,18 @@ int prepare_dma_check(dma_info_t *dma_info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((dirent = readdir(dir)) != NULL) {
|
while ((dirent = readdir(dir)) != NULL) {
|
||||||
|
int n;
|
||||||
|
|
||||||
if (strncmp(dirent->d_name, ".", 1) == 0
|
if (strncmp(dirent->d_name, ".", 1) == 0
|
||||||
|| strncmp(dirent->d_name, "..", 2) == 0)
|
|| strncmp(dirent->d_name, "..", 2) == 0)
|
||||||
continue;
|
continue;
|
||||||
memset(buf, 0, 256);
|
|
||||||
strncat(buf, "/dev/", 5);
|
/* "/dev/" + name; skip names that do not fit
|
||||||
strncat(buf, dirent->d_name,
|
rather than truncating into a wrong path */
|
||||||
strlen(dirent->d_name));
|
n = snprintf(buf, sizeof(buf), "/dev/%s",
|
||||||
|
dirent->d_name);
|
||||||
|
if (n < 0 || (size_t) n >= sizeof(buf))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (stat(buf, &st))
|
if (stat(buf, &st))
|
||||||
break;
|
break;
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ void progbar_init(struct progbar *ctx, const char *units, FILE * fp)
|
|||||||
memset(bar, '=', sizeof(bar) - 1);
|
memset(bar, '=', sizeof(bar) - 1);
|
||||||
if (!spaces[0])
|
if (!spaces[0])
|
||||||
memset(spaces, ' ', sizeof(spaces) - 1);
|
memset(spaces, ' ', sizeof(spaces) - 1);
|
||||||
strncpy(ctx->units, units, sizeof(ctx->units));
|
snprintf(ctx->units, sizeof(ctx->units), "%s", units);
|
||||||
ctx->file = fp;
|
ctx->file = fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,11 @@ static void make_super_block(reiserfs_filsys_t fs)
|
|||||||
reiserfs_warning(stderr,
|
reiserfs_warning(stderr,
|
||||||
"\nSpecified LABEL is longer then 16 "
|
"\nSpecified LABEL is longer then 16 "
|
||||||
"characters, will be truncated\n\n");
|
"characters, will be truncated\n\n");
|
||||||
strncpy(fs->fs_ondisk_sb->s_label, LABEL, 16);
|
/* on-disk label is a fixed 16-byte field; keep it
|
||||||
|
NUL-terminated for the userspace readers below */
|
||||||
|
snprintf(fs->fs_ondisk_sb->s_label,
|
||||||
|
sizeof(fs->fs_ondisk_sb->s_label),
|
||||||
|
"%s", LABEL);
|
||||||
}
|
}
|
||||||
set_sb_v2_flag(fs->fs_ondisk_sb, reiserfs_attrs_cleared);
|
set_sb_v2_flag(fs->fs_ondisk_sb, reiserfs_attrs_cleared);
|
||||||
}
|
}
|
||||||
@@ -643,7 +647,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B': /* --badblock-list */
|
case 'B': /* --badblock-list */
|
||||||
asprintf(&badblocks_file, "%s", optarg);
|
xasprintf(&badblocks_file, "%s", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h': /* --hash */
|
case 'h': /* --hash */
|
||||||
|
|||||||
@@ -1538,7 +1538,7 @@ void do_balance(struct tree_balance *tb, /* tree_balance structure
|
|||||||
insert_ptr[0] = (struct buffer_head *)body;
|
insert_ptr[0] = (struct buffer_head *)body;
|
||||||
/* we must prepare insert_key */
|
/* we must prepare insert_key */
|
||||||
|
|
||||||
if (PATH_H_B_ITEM_ORDER(tb->tb_path, 0) /*LAST_POSITION (tb->tb_path) */
|
if ((int)PATH_H_B_ITEM_ORDER(tb->tb_path, 0) /*LAST_POSITION (tb->tb_path) */
|
||||||
/*item_pos */ == -1) {
|
/*item_pos */ == -1) {
|
||||||
/* get delimiting key from buffer in tree */
|
/* get delimiting key from buffer in tree */
|
||||||
copy_key(&insert_key[0].ih_key,
|
copy_key(&insert_key[0].ih_key,
|
||||||
|
|||||||
+1
-27
@@ -22,7 +22,7 @@
|
|||||||
// r5
|
// r5
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#define DELTA 0x9E3779B9
|
#define DELTA 0x9E3779B9
|
||||||
#define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
|
#define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
|
||||||
@@ -190,29 +190,3 @@ u32 r5_hash(const signed char *msg, int len)
|
|||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
char *name = 0;
|
|
||||||
size_t n = 0;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
getline(&name, &n, stdin);
|
|
||||||
if (!strcmp(name, "\n"))
|
|
||||||
break;
|
|
||||||
name[strlen(name) - 1] = 0;
|
|
||||||
printf("tea %lu\n, r5 %lu\nyura %lu\n",
|
|
||||||
keyed_hash(name, strlen(name)) & 0x7fffff80,
|
|
||||||
r5_hash(name, strlen(name)) & 0x7fffff80,
|
|
||||||
yura_hash(name, strlen(name)) & 0x7fffff80);
|
|
||||||
free(name);
|
|
||||||
name = 0;
|
|
||||||
n = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -15,8 +15,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <asm/types.h>
|
#include <linux/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <malloc.h>
|
|
||||||
#include <sys/vfs.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -506,7 +506,7 @@ int reiserfs_open_journal(reiserfs_filsys_t fs, const char *j_filename,
|
|||||||
if (fs->fs_journal_dev == -1)
|
if (fs->fs_journal_dev == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
asprintf(&fs->fs_j_file_name, "%s", j_filename);
|
xasprintf(&fs->fs_j_file_name, "%s", j_filename);
|
||||||
|
|
||||||
if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) {
|
if (get_jp_journal_size(sb_jp(sb)) < JOURNAL_MIN_SIZE) {
|
||||||
reiserfs_warning(stderr, "Journal of (%lu) block size found on "
|
reiserfs_warning(stderr, "Journal of (%lu) block size found on "
|
||||||
@@ -694,7 +694,7 @@ int reiserfs_create_journal(reiserfs_filsys_t fs, const char *j_device, /* journ
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asprintf(&fs->fs_j_file_name, "%s", j_device);
|
xasprintf(&fs->fs_j_file_name, "%s", j_device);
|
||||||
|
|
||||||
if (len < JOURNAL_MIN_SIZE + 1) {
|
if (len < JOURNAL_MIN_SIZE + 1) {
|
||||||
reiserfs_warning(stderr,
|
reiserfs_warning(stderr,
|
||||||
|
|||||||
@@ -610,7 +610,7 @@ int find_hash_in_use(const char *name, int namelen, __u32 offset,
|
|||||||
|
|
||||||
char *code2name(unsigned int code)
|
char *code2name(unsigned int code)
|
||||||
{
|
{
|
||||||
if (code >= HASH_AMOUNT || code < 0)
|
if (code >= HASH_AMOUNT)
|
||||||
return NULL;
|
return NULL;
|
||||||
return hashes[code].name;
|
return hashes[code].name;
|
||||||
}
|
}
|
||||||
@@ -1031,22 +1031,22 @@ int name_length(const char *name, int key_format)
|
|||||||
/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
|
/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
|
||||||
__u16 get_ih_key_format(const struct item_head * ih)
|
__u16 get_ih_key_format(const struct item_head * ih)
|
||||||
{
|
{
|
||||||
get_bit_field_XX(16, &ih->ih_format, 0, 12);
|
get_bit_field_XX(16, ih_format_ptr(ih), 0, 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
__u16 get_ih_flags(const struct item_head *ih)
|
__u16 get_ih_flags(const struct item_head *ih)
|
||||||
{
|
{
|
||||||
get_bit_field_XX(16, &ih->ih_format, 12, 4);
|
get_bit_field_XX(16, ih_format_ptr(ih), 12, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_ih_key_format(struct item_head *ih, __u16 val)
|
void set_ih_key_format(struct item_head *ih, __u16 val)
|
||||||
{
|
{
|
||||||
set_bit_field_XX(16, &ih->ih_format, val, 0, 12);
|
set_bit_field_XX(16, ih_format_ptr(ih), val, 0, 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_ih_flags(struct item_head *ih, __u16 val)
|
void set_ih_flags(struct item_head *ih, __u16 val)
|
||||||
{
|
{
|
||||||
set_bit_field_XX(16, &ih->ih_format, val, 12, 4);
|
set_bit_field_XX(16, ih_format_ptr(ih), val, 12, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* access to fields of stat data (both v1 and v2) */
|
/* access to fields of stat data (both v1 and v2) */
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ reiserfs_filsys_t reiserfs_open(const char *filename, int flags,
|
|||||||
fs = getmem(sizeof(*fs));
|
fs = getmem(sizeof(*fs));
|
||||||
fs->fs_dev = fd;
|
fs->fs_dev = fd;
|
||||||
fs->fs_vp = vp;
|
fs->fs_vp = vp;
|
||||||
asprintf(&fs->fs_file_name, "%s", filename);
|
xasprintf(&fs->fs_file_name, "%s", filename);
|
||||||
|
|
||||||
/* reiserfs super block is either in 16-th or in 2-nd 4k block of the
|
/* reiserfs super block is either in 16-th or in 2-nd 4k block of the
|
||||||
device */
|
device */
|
||||||
@@ -215,7 +215,7 @@ reiserfs_filsys_t reiserfs_create(const char *filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fs->fs_blocksize = block_size;
|
fs->fs_blocksize = block_size;
|
||||||
asprintf(&fs->fs_file_name, "%s", filename);
|
xasprintf(&fs->fs_file_name, "%s", filename);
|
||||||
fs->fs_format = version;
|
fs->fs_format = version;
|
||||||
|
|
||||||
if (new_format)
|
if (new_format)
|
||||||
@@ -664,7 +664,7 @@ struct reiserfs_key *uget_rkey(const struct reiserfs_path *path)
|
|||||||
|
|
||||||
struct reiserfs_key *reiserfs_next_key(const struct reiserfs_path *path)
|
struct reiserfs_key *reiserfs_next_key(const struct reiserfs_path *path)
|
||||||
{
|
{
|
||||||
if (get_item_pos(path) < B_NR_ITEMS(get_bh(path)) - 1)
|
if (get_item_pos(path) + 1 < B_NR_ITEMS(get_bh(path)))
|
||||||
return leaf_key(get_bh(path), get_item_pos(path) + 1);
|
return leaf_key(get_bh(path), get_item_pos(path) + 1);
|
||||||
|
|
||||||
return uget_rkey(path);
|
return uget_rkey(path);
|
||||||
@@ -1054,7 +1054,7 @@ int reiserfs_add_entry(reiserfs_filsys_t fs, const struct reiserfs_key *dir,
|
|||||||
const char *name, int name_len,
|
const char *name, int name_len,
|
||||||
const struct reiserfs_key *key, __u16 fsck_need)
|
const struct reiserfs_key *key, __u16 fsck_need)
|
||||||
{
|
{
|
||||||
struct item_head entry_ih = { {0,}, };
|
struct item_head entry_ih = { 0 };
|
||||||
char *entry;
|
char *entry;
|
||||||
int retval;
|
int retval;
|
||||||
INITIALIZE_REISERFS_PATH(path);
|
INITIALIZE_REISERFS_PATH(path);
|
||||||
@@ -1458,7 +1458,7 @@ void add_badblock_list(reiserfs_filsys_t fs, int replace)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
|
int reiserfs_iterate_file_data(reiserfs_filsys_t fs,
|
||||||
const struct reiserfs_key const *short_key,
|
const struct reiserfs_key *short_key,
|
||||||
reiserfs_file_iterate_indirect_fn indirect_fn,
|
reiserfs_file_iterate_indirect_fn indirect_fn,
|
||||||
reiserfs_file_iterate_direct_fn direct_fn,
|
reiserfs_file_iterate_direct_fn direct_fn,
|
||||||
void *data)
|
void *data)
|
||||||
@@ -1555,7 +1555,7 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int reiserfs_iterate_dir(reiserfs_filsys_t fs,
|
int reiserfs_iterate_dir(reiserfs_filsys_t fs,
|
||||||
const struct reiserfs_key const *dir_short_key,
|
const struct reiserfs_key *dir_short_key,
|
||||||
const reiserfs_iterate_dir_fn callback, void *data)
|
const reiserfs_iterate_dir_fn callback, void *data)
|
||||||
{
|
{
|
||||||
INITIALIZE_REISERFS_PATH(path);
|
INITIALIZE_REISERFS_PATH(path);
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
%define reiserfsprogsversion 3.6.23
|
%define reiserfsprogsversion 3.6.25
|
||||||
|
|
||||||
Vendor: Hans Reiser
|
Vendor: Hans Reiser
|
||||||
Distribution: Hans Reiser
|
Distribution: Hans Reiser
|
||||||
|
|||||||
@@ -48,9 +48,11 @@ static long long int calc_new_fs_size(unsigned long count,
|
|||||||
case 'G':
|
case 'G':
|
||||||
case 'g':
|
case 'g':
|
||||||
bytes *= 1024;
|
bytes *= 1024;
|
||||||
|
/* fall through */
|
||||||
case 'M':
|
case 'M':
|
||||||
case 'm':
|
case 'm':
|
||||||
bytes *= 1024;
|
bytes *= 1024;
|
||||||
|
/* fall through */
|
||||||
case 'K':
|
case 'K':
|
||||||
case 'k':
|
case 'k':
|
||||||
bytes *= 1024;
|
bytes *= 1024;
|
||||||
@@ -58,7 +60,7 @@ static long long int calc_new_fs_size(unsigned long count,
|
|||||||
|
|
||||||
blocks = bytes / bs;
|
blocks = bytes / bs;
|
||||||
|
|
||||||
return rel ? count + blocks : blocks;
|
return rel ? (long long int)count + blocks : blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print some fs parameters */
|
/* print some fs parameters */
|
||||||
@@ -215,6 +217,7 @@ int main(int argc, char *argv[])
|
|||||||
reiserfs_exit(1,
|
reiserfs_exit(1,
|
||||||
"Missing argument to -j option");
|
"Missing argument to -j option");
|
||||||
jdevice_name = optarg;
|
jdevice_name = optarg;
|
||||||
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
opt_force = 1;
|
opt_force = 1;
|
||||||
break;
|
break;
|
||||||
@@ -292,7 +295,7 @@ int main(int argc, char *argv[])
|
|||||||
block_count_new = bytes_count_str ?
|
block_count_new = bytes_count_str ?
|
||||||
calc_new_fs_size(get_sb_block_count(sb),
|
calc_new_fs_size(get_sb_block_count(sb),
|
||||||
fs->fs_blocksize, bytes_count_str) :
|
fs->fs_blocksize, bytes_count_str) :
|
||||||
count_blocks(devname, fs->fs_blocksize);
|
(long long int)count_blocks(devname, fs->fs_blocksize);
|
||||||
|
|
||||||
if (resizer_check_fs_size(fs, block_count_new))
|
if (resizer_check_fs_size(fs, block_count_new))
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
+8
-3
@@ -6,6 +6,7 @@
|
|||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include "tune.h"
|
#include "tune.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -487,11 +488,11 @@ int main(int argc, char **argv)
|
|||||||
Force++;
|
Force++;
|
||||||
break;
|
break;
|
||||||
case 'b': /* --add-badblocks */
|
case 'b': /* --add-badblocks */
|
||||||
asprintf(&badblocks_file, "%s", optarg);
|
xasprintf(&badblocks_file, "%s", optarg);
|
||||||
Bads = 1;
|
Bads = 1;
|
||||||
break;
|
break;
|
||||||
case 'B': /* --badblocks */
|
case 'B': /* --badblocks */
|
||||||
asprintf(&badblocks_file, "%s", optarg);
|
xasprintf(&badblocks_file, "%s", optarg);
|
||||||
Bads = 2;
|
Bads = 2;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
@@ -675,7 +676,11 @@ int main(int argc, char **argv)
|
|||||||
if (strlen(LABEL) > 16)
|
if (strlen(LABEL) > 16)
|
||||||
message
|
message
|
||||||
("Specified LABEL is longer then 16 characters, will be truncated\n");
|
("Specified LABEL is longer then 16 characters, will be truncated\n");
|
||||||
strncpy(fs->fs_ondisk_sb->s_label, LABEL, 16);
|
/* on-disk label is a fixed 16-byte field; keep it
|
||||||
|
NUL-terminated for the userspace readers below */
|
||||||
|
snprintf(fs->fs_ondisk_sb->s_label,
|
||||||
|
sizeof(fs->fs_ondisk_sb->s_label),
|
||||||
|
"%s", LABEL);
|
||||||
need_dirty = 1;
|
need_dirty = 1;
|
||||||
}
|
}
|
||||||
if (Max_mnt_count &&
|
if (Max_mnt_count &&
|
||||||
|
|||||||
Reference in new issue
Block a user