Whamcloud - gitweb
Add an option to debugfs to open filesystems in exclusive mode
[tools/e2fsprogs.git] / lib / ext2fs / icount.c
index a91496a..5997792 100644 (file)
@@ -9,18 +9,13 @@
  * %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"
 
 /*
@@ -43,7 +38,7 @@
  */
 
 struct ext2_icount_el {
-       ino_t   ino;
+       ext2_ino_t      ino;
        __u16   count;
 };
 
@@ -51,10 +46,10 @@ struct ext2_icount {
        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;
 };
 
@@ -65,21 +60,21 @@ void ext2fs_free_icount(ext2_icount_t icount)
 
        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);
@@ -87,9 +82,9 @@ errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
                        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, 
@@ -124,8 +119,8 @@ errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
        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);
 
@@ -153,7 +148,8 @@ errout:
        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);
@@ -164,29 +160,32 @@ errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, int size,
  *     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)
@@ -208,11 +207,11 @@ static struct ext2_icount_el *insert_icount_el(ext2_icount_t icount,
  *     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;
@@ -275,34 +274,34 @@ static struct ext2_icount_el *get_icount_el(ext2_icount_t icount,
 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;
@@ -322,7 +321,7 @@ errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ino_t ino, __u16 *ret)
        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;
@@ -330,7 +329,7 @@ errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
        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)) {
                /*
@@ -339,7 +338,7 @@ errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t 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) {
@@ -352,7 +351,7 @@ errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
                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 {
                        /*
@@ -377,7 +376,7 @@ errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
                }
                el = get_icount_el(icount, ino, 1);
                if (!el)
-                       return ENOMEM;
+                       return EXT2_ET_NO_MEMORY;
                el->count++;
        }
        if (icount->multiple)
@@ -387,13 +386,13 @@ errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
        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);
 
@@ -413,11 +412,11 @@ errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ino_t ino,
 
        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)
@@ -430,13 +429,13 @@ errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ino_t ino,
        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);
 
@@ -467,7 +466,7 @@ errcode_t ext2fs_icount_store(ext2_icount_t icount, ino_t ino,
         */
        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)
@@ -475,7 +474,7 @@ errcode_t ext2fs_icount_store(ext2_icount_t icount, ino_t ino,
        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;