2008-10-27 20:59:12

by Valerie Aurora

[permalink] [raw]
Subject: 64-bit dblists

Hi all,

In my continuing quest to finish the 64-bit conversion of e2fsprogs, I
ran into this structure exported in ext2fs.h:

struct ext2_db_entry {
ext2_ino_t ino;
blk_t blk;
int blockcnt;
};

The "blk_t" is the problem here - we need a blk64_t. A pointer to
this structure is passed to the user-provided directory block iterator
in ext2fs_dblist_iterate().

Assuming the goal is to preserve the ext2fs_dblist ABI, I can see two
ways of doing this:

1. Define ext2_db_entry2, ext2_dblist2, and ext2fs_dblist_*2() and do
the usual translation/conversion function business.

2. Use the magic number in the dblist to differentiate between old and
new-style dblists and keep the existing interfaces for functions that
only pass around pointers. We'll also need ext2fs_dblist_iterate2()
and ext2fs_get_last2().

I find option #1 slightly less unpalatable than #2. Does anyone have
an option #3?

-VAL


2008-11-03 03:09:39

by Theodore Ts'o

[permalink] [raw]
Subject: Re: 64-bit dblists

On Mon, Oct 27, 2008 at 04:59:10PM -0400, Valerie Aurora Henson wrote:
> Hi all,
>
> In my continuing quest to finish the 64-bit conversion of e2fsprogs, I
> ran into this structure exported in ext2fs.h:
>
> struct ext2_db_entry {
> ext2_ino_t ino;
> blk_t blk;
> int blockcnt;
> };
>
> The "blk_t" is the problem here - we need a blk64_t. A pointer to
> this structure is passed to the user-provided directory block iterator
> in ext2fs_dblist_iterate().
>
> Assuming the goal is to preserve the ext2fs_dblist ABI, I can see two
> ways of doing this:
>
> 1. Define ext2_db_entry2, ext2_dblist2, and ext2fs_dblist_*2() and do
> the usual translation/conversion function business.

The dblist.c and dblist_dir.c functions are so small that it's
probably not worth it to do translaction/conversation functions; it's
basically just a linked list convenience function implementation.

My suggestion is to just create a dblist2.c and dblist_dir2.c, and
just make a 64-bit version of the directory block list abstraction.
My guess that size of the conversaion functions would be bigger than a
new 64-bit version of the abstraction. (The object size of dblist.o
and dblist_dir.o combined is only about 1.5k)

- Ted

2008-11-12 16:48:39

by Valerie Aurora

[permalink] [raw]
Subject: Re: 64-bit dblists

On Sun, Nov 02, 2008 at 10:09:36PM -0500, Theodore Tso wrote:
> On Mon, Oct 27, 2008 at 04:59:10PM -0400, Valerie Aurora Henson wrote:
> > Hi all,
> >
> > In my continuing quest to finish the 64-bit conversion of e2fsprogs, I
> > ran into this structure exported in ext2fs.h:
> >
> > struct ext2_db_entry {
> > ext2_ino_t ino;
> > blk_t blk;
> > int blockcnt;
> > };
> >
> > The "blk_t" is the problem here - we need a blk64_t. A pointer to
> > this structure is passed to the user-provided directory block iterator
> > in ext2fs_dblist_iterate().
> >
> > Assuming the goal is to preserve the ext2fs_dblist ABI, I can see two
> > ways of doing this:
> >
> > 1. Define ext2_db_entry2, ext2_dblist2, and ext2fs_dblist_*2() and do
> > the usual translation/conversion function business.
>
> The dblist.c and dblist_dir.c functions are so small that it's
> probably not worth it to do translaction/conversation functions; it's
> basically just a linked list convenience function implementation.
>
> My suggestion is to just create a dblist2.c and dblist_dir2.c, and
> just make a 64-bit version of the directory block list abstraction.
> My guess that size of the conversaion functions would be bigger than a
> new 64-bit version of the abstraction. (The object size of dblist.o
> and dblist_dir.o combined is only about 1.5k)

Thanks! This is what I'm doing currently.

-VAL