Whamcloud - gitweb
Add 64-bit getsize interface.
authorJose R. Santos <jrs@us.ibm.com>
Wed, 20 Aug 2008 17:34:07 +0000 (12:34 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 20 Jan 2009 18:35:15 +0000 (13:35 -0500)
Added interface capable of opening 64-bit block device.

Signed-off-by: Jose R. Santos <jrs@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
debian/e2fslibs.symbols
lib/ext2fs/ext2fs.h
lib/ext2fs/getsize.c

index 3bea44e..8f6aab9 100644 (file)
@@ -161,6 +161,7 @@ libext2fs.so.2 e2fslibs #MINVER#
  ext2fs_get_data_io@Base 1.37
  ext2fs_get_device_sectsize@Base 1.37
  ext2fs_get_device_size@Base 1.37
+ ext2fs_get_device_size2@Base 1.41.4
  ext2fs_get_free_blocks@Base 1.37
  ext2fs_get_generic_bitmap_end@Base 1.41.0
  ext2fs_get_generic_bitmap_range@Base 1.41.0
index e02a55f..d5026bc 100644 (file)
@@ -928,6 +928,8 @@ extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
 /* getsize.c */
 extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
                                        blk_t *retblocks);
+extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
+                                       blk64_t *retblocks);
 
 /* getsectsize.c */
 errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
index b45e285..79fba59 100644 (file)
@@ -138,8 +138,8 @@ static int valid_offset (int fd, ext2_loff_t offset)
 /*
  * Returns the number of blocks in a partition
  */
-errcode_t ext2fs_get_device_size(const char *file, int blocksize,
-                                blk_t *retblocks)
+errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
+                                blk64_t *retblocks)
 {
        int     fd, rc = 0;
        int valid_blkgetsize64 = 1;
@@ -169,11 +169,6 @@ errcode_t ext2fs_get_device_size(const char *file, int blocksize,
 
 #ifdef DKIOCGETBLOCKCOUNT      /* For Apple Darwin */
        if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0) {
-               if ((sizeof(*retblocks) < sizeof(unsigned long long))
-                   && ((size64 / (blocksize / 512)) > 0xFFFFFFFF)) {
-                       rc = EFBIG;
-                       goto out;
-               }
                *retblocks = size64 / (blocksize / 512);
                goto out;
        }
@@ -188,11 +183,6 @@ errcode_t ext2fs_get_device_size(const char *file, int blocksize,
 #endif
        if (valid_blkgetsize64 &&
            ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
-               if ((sizeof(*retblocks) < sizeof(unsigned long long)) &&
-                   ((size64 / blocksize) > 0xFFFFFFFF)) {
-                       rc = EFBIG;
-                       goto out;
-               }
                *retblocks = size64 / blocksize;
                goto out;
        }
@@ -253,11 +243,6 @@ errcode_t ext2fs_get_device_size(const char *file, int blocksize,
                if (fstat(fd, &st) == 0)
 #endif
                        if (S_ISREG(st.st_mode)) {
-                               if ((sizeof(*retblocks) < sizeof(unsigned long long)) &&
-                                   ((st.st_size / blocksize) > 0xFFFFFFFF)) {
-                                       rc = EFBIG;
-                                       goto out;
-                               }
                                *retblocks = st.st_size / blocksize;
                                goto out;
                        }
@@ -282,17 +267,26 @@ errcode_t ext2fs_get_device_size(const char *file, int blocksize,
        }
        valid_offset (fd, 0);
        size64 = low + 1;
-       if ((sizeof(*retblocks) < sizeof(unsigned long long))
-           && ((size64 / blocksize) > 0xFFFFFFFF)) {
-               rc = EFBIG;
-               goto out;
-       }
        *retblocks = size64 / blocksize;
 out:
        close(fd);
        return rc;
 }
 
+errcode_t ext2fs_get_device_size(const char *file, int blocksize,
+                                blk_t *retblocks)
+{
+       errcode_t retval;
+       blk64_t blocks;
+       retval = ext2fs_get_device_size2(file, blocksize, &blocks);
+
+       if (!retval && blocks < (1ULL << 32)) {
+               *retblocks = (blk_t) blocks;
+               return retval;
+       }
+       return EFBIG;
+}
+
 #endif /* WIN32 */
 
 #ifdef DEBUG