* %End-Header%
*/
-#include <et/com_err.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#include <stdlib.h>
#include <string.h>
#include <stdio.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#include <linux/ext2_fs.h>
+#include "ext2_fs.h"
#include "ext2fs.h"
/*
*/
struct ext2_icount_el {
- ino_t ino;
+ ext2_ino_t ino;
__u16 count;
};
errcode_t magic;
ext2fs_inode_bitmap single;
ext2fs_inode_bitmap multiple;
- ino_t count;
- ino_t size;
- ino_t num_inodes;
- int cursor;
+ ext2_ino_t count;
+ ext2_ino_t size;
+ ext2_ino_t num_inodes;
+ ext2_ino_t cursor;
struct ext2_icount_el *list;
};
icount->magic = 0;
if (icount->list)
- free(icount->list);
+ ext2fs_free_mem(&icount->list);
if (icount->single)
ext2fs_free_inode_bitmap(icount->single);
if (icount->multiple)
ext2fs_free_inode_bitmap(icount->multiple);
- free(icount);
+ ext2fs_free_mem(&icount);
}
-errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
+errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, unsigned int size,
ext2_icount_t hint, ext2_icount_t *ret)
{
ext2_icount_t icount;
errcode_t retval;
size_t bytes;
- int i;
+ ext2_ino_t i;
if (hint) {
EXT2_CHECK_MAGIC(hint, EXT2_ET_MAGIC_ICOUNT);
size = (size_t) hint->size;
}
- icount = malloc(sizeof(struct ext2_icount));
- if (!icount)
- return ENOMEM;
+ retval = ext2fs_get_mem(sizeof(struct ext2_icount), &icount);
+ if (retval)
+ return retval;
memset(icount, 0, sizeof(struct ext2_icount));
retval = ext2fs_allocate_inode_bitmap(fs, 0,
printf("Icount allocated %d entries, %d bytes.\n",
icount->size, bytes);
#endif
- icount->list = malloc(bytes);
- if (!icount->list)
+ retval = ext2fs_get_mem(bytes, &icount->list);
+ if (retval)
goto errout;
memset(icount->list, 0, bytes);
return(retval);
}
-errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, int size,
+errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
+ unsigned int size,
ext2_icount_t *ret)
{
return ext2fs_create_icount2(fs, flags, size, 0, ret);
* specified position.
*/
static struct ext2_icount_el *insert_icount_el(ext2_icount_t icount,
- ino_t ino, int pos)
+ ext2_ino_t ino, int pos)
{
- struct ext2_icount_el *el, *new_list;
- ino_t new_size = 0;
+ struct ext2_icount_el *el;
+ errcode_t retval;
+ ext2_ino_t new_size = 0;
int num;
if (icount->count >= icount->size) {
if (icount->count) {
new_size = icount->list[(unsigned)icount->count-1].ino;
- new_size = icount->count *
- ((float) new_size / icount->num_inodes);
+ new_size = (ext2_ino_t) (icount->count *
+ ((float) icount->num_inodes / new_size));
}
if (new_size < (icount->size + 100))
new_size = icount->size + 100;
#if 0
printf("Reallocating icount %d entries...\n", new_size);
#endif
- new_list = realloc(icount->list, (size_t) new_size *
- sizeof(struct ext2_icount_el));
- if (!new_list)
+ retval = ext2fs_resize_mem((size_t) icount->size *
+ sizeof(struct ext2_icount_el),
+ (size_t) new_size *
+ sizeof(struct ext2_icount_el),
+ &icount->list);
+ if (retval)
return 0;
icount->size = new_size;
- icount->list = new_list;
}
num = (int) icount->count - pos;
if (num < 0)
* and we can't find an entry, create one in the sorted list.
*/
static struct ext2_icount_el *get_icount_el(ext2_icount_t icount,
- ino_t ino, int create)
+ ext2_ino_t ino, int create)
{
float range;
int low, high, mid;
- ino_t lowval, highval;
+ ext2_ino_t lowval, highval;
if (!icount || !icount->list)
return 0;
errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *out)
{
errcode_t ret = 0;
- int i;
+ unsigned int i;
const char *bad = "bad icount";
EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT);
if (icount->count > icount->size) {
fprintf(out, "%s: count > size\n", bad);
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
}
for (i=1; i < icount->count; i++) {
if (icount->list[i-1].ino >= icount->list[i].ino) {
fprintf(out, "%s: list[%d].ino=%u, list[%d].ino=%u\n",
bad, i-1, icount->list[i-1].ino,
i, icount->list[i].ino);
- ret = EINVAL;
+ ret = EXT2_ET_INVALID_ARGUMENT;
}
}
return ret;
}
-errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ino_t ino, __u16 *ret)
+errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino, __u16 *ret)
{
struct ext2_icount_el *el;
EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT);
if (!ino || (ino > icount->num_inodes))
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
if (ext2fs_test_inode_bitmap(icount->single, ino)) {
*ret = 1;
return 0;
}
-errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
+errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
__u16 *ret)
{
struct ext2_icount_el *el;
EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT);
if (!ino || (ino > icount->num_inodes))
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
if (ext2fs_test_inode_bitmap(icount->single, ino)) {
/*
*/
el = get_icount_el(icount, ino, 1);
if (!el)
- return ENOMEM;
+ return EXT2_ET_NO_MEMORY;
ext2fs_unmark_inode_bitmap(icount->single, ino);
el->count = 2;
} else if (icount->multiple) {
if (ext2fs_test_inode_bitmap(icount->multiple, ino)) {
el = get_icount_el(icount, ino, 1);
if (!el)
- return ENOMEM;
+ return EXT2_ET_NO_MEMORY;
el->count++;
} else {
/*
}
el = get_icount_el(icount, ino, 1);
if (!el)
- return ENOMEM;
+ return EXT2_ET_NO_MEMORY;
el->count++;
}
if (icount->multiple)
return 0;
}
-errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ino_t ino,
+errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
__u16 *ret)
{
struct ext2_icount_el *el;
if (!ino || (ino > icount->num_inodes))
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT);
if (icount->multiple &&
!ext2fs_test_inode_bitmap(icount->multiple, ino))
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
el = get_icount_el(icount, ino, 0);
if (!el || el->count == 0)
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
el->count--;
if (el->count == 1)
return 0;
}
-errcode_t ext2fs_icount_store(ext2_icount_t icount, ino_t ino,
+errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
__u16 count)
{
struct ext2_icount_el *el;
if (!ino || (ino > icount->num_inodes))
- return EINVAL;
+ return EXT2_ET_INVALID_ARGUMENT;
EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT);
*/
el = get_icount_el(icount, ino, 1);
if (!el)
- return ENOMEM;
+ return EXT2_ET_NO_MEMORY;
el->count = count;
ext2fs_unmark_inode_bitmap(icount->single, ino);
if (icount->multiple)
return 0;
}
-ino_t ext2fs_get_icount_size(ext2_icount_t icount)
+ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount)
{
if (!icount || icount->magic != EXT2_ET_MAGIC_ICOUNT)
return 0;