2005-04-04 22:56:48

by Vineet Joglekar

[permalink] [raw]
Subject: Adding a field to ext2_dir_entry_2



Hi All,

I working with linux kernel 2.4.28. I want to add 1 more field to ext2_dir_entry_2 - the new version of directory entry for ext2fs.

I did add the __u32 field to the struct ext2_dir_entry_2 defined in ext2_fs.h I also modified the EXT2_DIR_REC_LEN macro to:

(((name_len) + 12 + EXT2_DIR_ROUND) & ~EXT2_DIR_ROUND)

(+12 instead of +8) to incorporate newly added 4 bytes field.

I made the similar changes to the mke2fs utility also.

When I try to copy a file on that file system, I am getting the following error:

"ext2-fs error (device fd(2,0)): ext2_check_page: bad entry in directory #2: unaligned directory entry - offset=0, inode=2, rec_len=46, name_len=0"

Can someone please tell me where am I going wrong or what other changes do I need to do to add the field I want?

Thanks and regards,

Vineet Joglekar

_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!


2005-04-04 23:20:02

by Andreas Dilger

[permalink] [raw]
Subject: Re: Adding a field to ext2_dir_entry_2

On Apr 04, 2005 18:54 -0400, Vineet Joglekar wrote:
> I working with linux kernel 2.4.28. I want to add 1 more field to
> ext2_dir_entry_2 - the new version of directory entry for ext2fs.
>
> I did add the __u32 field to the struct ext2_dir_entry_2 defined in
> ext2_fs.h I also modified the EXT2_DIR_REC_LEN macro to:
>
> (((name_len) + 12 + EXT2_DIR_ROUND) & ~EXT2_DIR_ROUND)
>
> (+12 instead of +8) to incorporate newly added 4 bytes field.
>
> I made the similar changes to the mke2fs utility also.

This means your filesystem will not be mountable by any other version of
Linux. What is more important is why you want to do this - there are
other mechanisms that may be more appropriate depending on what you are
doing.

Cheers, Andreas
--
Andreas Dilger
Principal Software Engineer
Cluster File Systems, Inc.


Attachments:
(No filename) (822.00 B)
(No filename) (189.00 B)
Download all attachments

2005-04-05 00:10:22

by Vineet Joglekar

[permalink] [raw]
Subject: Re: Adding a field to ext2_dir_entry_2


Hi Andreas,

I have created another file system - copied everything from ext2, renaming it as some different file system and doing some experiments on that.

Let me be more clear about what I am trying to do. In my masters project, I am encrypting inodes along with the data part of the file. Keys of different users are different. In the same directory, if there are 2 files stored by different users, their inodes will be encrypted with different keys. If user1 is doing "ls" on that directory, the inode of the other file - which is encrypted by user2, will be decrypted by using user1's key, resulting into garbage. To avoid this, I am trying to store the uid in the directry entry, so that I can match it with current->fsuid and skip decrypting the inode if the file doesn't belong to the current user. (assuming user1 doesnt want to share that file and different users can store different files under same directory.)

Thanks and regards,

Vineet

--- On Mon 04/04, Andreas Dilger < [email protected] > wrote:
From: Andreas Dilger [mailto: [email protected]]
To: [email protected]
Cc: [email protected], [email protected]
Date: Mon, 4 Apr 2005 17:17:59 -0600
Subject: Re: Adding a field to ext2_dir_entry_2

On Apr 04, 2005 18:54 -0400, Vineet Joglekar wrote:<br>> I working with linux kernel 2.4.28. I want to add 1 more field to<br>> ext2_dir_entry_2 - the new version of directory entry for ext2fs.<br>> <br>> I did add the __u32 field to the struct ext2_dir_entry_2 defined in<br>> ext2_fs.h I also modified the EXT2_DIR_REC_LEN macro to:<br>> <br>> (((name_len) + 12 + EXT2_DIR_ROUND) & ~EXT2_DIR_ROUND)<br>> <br>> (+12 instead of +8) to incorporate newly added 4 bytes field.<br>> <br>> I made the similar changes to the mke2fs utility also.<br><br>This means your filesystem will not be mountable by any other version of<br>Linux. What is more important is why you want to do this - there are<br>other mechanisms that may be more appropriate depending on what you are<br>doing.<br><br>Cheers, Andreas<br>--<br>Andreas Dilger<br>Principal Software Engineer<br>Cluster File Systems, Inc.<br><br>Attachment: Attachment (0.19KB)<br>

_______________________________________________
Join Excite! - http://www.excite.com
The most personalized portal on the Web!

2005-04-05 01:13:01

by Andreas Dilger

[permalink] [raw]
Subject: Re: Adding a field to ext2_dir_entry_2

On Apr 04, 2005 20:08 -0400, Vineet Joglekar wrote:
> I have created another file system - copied everything from ext2,
> renaming it as some different file system and doing some experiments on that.
>
> Let me be more clear about what I am trying to do. In my masters
> project, I am encrypting inodes along with the data part of the file. Keys
> of different users are different. In the same directory, if there are
> 2 files stored by different users, their inodes will be encrypted with
> different keys. If user1 is doing "ls" on that directory, the inode
> of the other file - which is encrypted by user2, will be decrypted by
> using user1's key, resulting into garbage. To avoid this, I am trying
> to store the uid in the directry entry, so that I can match it with
> current->fsuid and skip decrypting the inode if the file doesn't belong
> to the current user. (assuming user1 doesnt want to share that file and
> different users can store different files under same directory.)

This is broken by design. What happens if you chown a file? The UID will
change in the inode, but nothing will be updated in the directory. This
key must be stored in the inode along with the ownership info (it can be
an EA, and possibly a fast EA or fixed inode field in a large inode).

Cheers, Andreas
--
Andreas Dilger
Principal Software Engineer
Cluster File Systems, Inc.


Attachments:
(No filename) (1.34 kB)
(No filename) (189.00 B)
Download all attachments

2005-04-05 01:18:24

by Chris Li

[permalink] [raw]
Subject: Re: Adding a field to ext2_dir_entry_2

That design sounds bad.

Anyway, I guess the error you are getting might have some thing to do with
the "." and ".." entry. Your current directory need to in the same
format as well. That is the price you pay for breaking the compatibility.

Chris


On Mon, Apr 04, 2005 at 08:08:57PM -0400, Vineet Joglekar wrote:
>
> Hi Andreas,
>
> I have created another file system - copied everything from ext2, renaming it as some different file system and doing some experiments on that.
>
> Let me be more clear about what I am trying to do. In my masters project, I am encrypting inodes along with the data part of the file. Keys of different users are different. In the same directory, if there are 2 files stored by different users, their inodes will be encrypted with different keys. If user1 is doing "ls" on that directory, the inode of the other file - which is encrypted by user2, will be decrypted by using user1's key, resulting into garbage. To avoid this, I am trying to store the uid in the directry entry, so that I can match it with current->fsuid and skip decrypting the inode if the file doesn't belong to the current user. (assuming user1 doesnt want to share that file and different users can store different files under same directory.)
>
> Thanks and regards,
>
> Vineet
>
> --- On Mon 04/04, Andreas Dilger < [email protected] > wrote:
> From: Andreas Dilger [mailto: [email protected]]
> To: [email protected]
> Cc: [email protected], [email protected]
> Date: Mon, 4 Apr 2005 17:17:59 -0600
> Subject: Re: Adding a field to ext2_dir_entry_2
>
> On Apr 04, 2005 18:54 -0400, Vineet Joglekar wrote:<br>> I working with linux kernel 2.4.28. I want to add 1 more field to<br>> ext2_dir_entry_2 - the new version of directory entry for ext2fs.<br>> <br>> I did add the __u32 field to the struct ext2_dir_entry_2 defined in<br>> ext2_fs.h I also modified the EXT2_DIR_REC_LEN macro to:<br>> <br>> (((name_len) + 12 + EXT2_DIR_ROUND) & ~EXT2_DIR_ROUND)<br>> <br>> (+12 instead of +8) to incorporate newly added 4 bytes field.<br>> <br>> I made the similar changes to the mke2fs utility also.<br><br>This means your filesystem will not be mountable by any other version of<br>Linux. What is more important is why you want to do this - there are<br>other mechanisms that may be more appropriate depending on what you are<br>doing.<br><br>Cheers, Andreas<br>--<br>Andreas Dilger<br>Principal Software Engineer<br>Cluster File Systems, Inc.<br><br>Attachment: Attachment (0.19KB)<br>
>
> _______________________________________________
> Join Excite! - http://www.excite.com
> The most personalized portal on the Web!
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2005-04-05 03:53:58

by Theodore Ts'o

[permalink] [raw]
Subject: Re: Adding a field to ext2_dir_entry_2

On Mon, Apr 04, 2005 at 07:12:51PM -0600, Andreas Dilger wrote:
> > Let me be more clear about what I am trying to do. In my masters
> > project, I am encrypting inodes along with the data part of the file. Keys
> > of different users are different. In the same directory, if there are
> > 2 files stored by different users, their inodes will be encrypted with
> > different keys. If user1 is doing "ls" on that directory, the inode
> > of the other file - which is encrypted by user2, will be decrypted by
> > using user1's key, resulting into garbage. To avoid this, I am trying
> > to store the uid in the directry entry, so that I can match it with
> > current->fsuid and skip decrypting the inode if the file doesn't belong
> > to the current user. (assuming user1 doesnt want to share that file and
> > different users can store different files under same directory.)
>
> This is broken by design. What happens if you chown a file? The UID will
> change in the inode, but nothing will be updated in the directory. This
> key must be stored in the inode along with the ownership info (it can be
> an EA, and possibly a fast EA or fixed inode field in a large inode).

What else is broken about this design. Let me count the ways...

1) What about group access to files?

2) It means that you can't do a filesystem consistency check without
knowing all of the keys, since the block pointers in the inode would
also be encrypted.

3) If user1 has previously accessed the file, the encrypted inode
information will already be cached, and visible when user2 accesses
the file; stat() doesn't result in a call into filesystem code if the
information is already cached.

What's the point of encrypting the inode? What problem are you trying
to solve?

As to why you're having problems:

"ext2-fs error (device fd(2,0)): ext2_check_page: bad entry in directory #2:
unaligned directory entry - offset=0, inode=2, rec_len=46, name_len=0"

46 is ascii for '.'. You missed a spot in mke2fs where you changed
the directory entry structure. Specifically, in libext2fs, and note
that some portions of the ext2fs library which still use
ext2_dir_entry as well as ext2_dir_entry_2, for historical / ABI
backwards compatibility reasons.

- Ted