2006-08-10 01:22:41

by Mingming Cao

[permalink] [raw]
Subject: [PATCH 8/9] 48-bit block numbers for extended attributes


As we are planning to support 48-bit block numbers for ext4,
we need to support 48-bit block numbers for extended attributes.
In the short term, we can do this by reuse (on-disk) 16-bit
padding (linux2.i_pad1 currently used only by "hurd") as high
order bits for xattr. This patch basically does that.

Signed-off-by: Badari Pulavarty <[email protected]>


---

linux-2.6.18-rc4-ming/fs/ext4/inode.c | 8 ++++++++
linux-2.6.18-rc4-ming/include/linux/ext4_fs.h | 6 ++++--
2 files changed, 12 insertions(+), 2 deletions(-)

diff -puN fs/ext4/inode.c~ext4_48bit_i_file_acl fs/ext4/inode.c
--- linux-2.6.18-rc4/fs/ext4/inode.c~ext4_48bit_i_file_acl 2006-08-09 15:42:05.848401839 -0700
+++ linux-2.6.18-rc4-ming/fs/ext4/inode.c 2006-08-09 15:42:05.858401920 -0700
@@ -2641,6 +2641,10 @@ void ext4_read_inode(struct inode * inod
ei->i_frag_size = raw_inode->i_fsize;
#endif
ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl);
+ if ((sizeof(sector_t) > 4) &&
+ (EXT4_SB(inode->i_sb)->s_es->s_creator_os != EXT4_OS_HURD))
+ ei->i_file_acl |=
+ ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;
if (!S_ISREG(inode->i_mode)) {
ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl);
} else {
@@ -2774,6 +2778,10 @@ static int ext4_do_update_inode(handle_t
raw_inode->i_frag = ei->i_frag_no;
raw_inode->i_fsize = ei->i_frag_size;
#endif
+ if ((sizeof(sector_t) > 4) &&
+ (EXT4_SB(inode->i_sb)->s_es->s_creator_os != EXT4_OS_HURD))
+ raw_inode->i_file_acl_high =
+ cpu_to_le16((__u64)ei->i_file_acl >> 32);
raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl);
if (!S_ISREG(inode->i_mode)) {
raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
diff -puN include/linux/ext4_fs.h~ext4_48bit_i_file_acl include/linux/ext4_fs.h
--- linux-2.6.18-rc4/include/linux/ext4_fs.h~ext4_48bit_i_file_acl 2006-08-09 15:42:05.851401864 -0700
+++ linux-2.6.18-rc4-ming/include/linux/ext4_fs.h 2006-08-09 15:42:05.860401937 -0700
@@ -285,7 +285,7 @@ struct ext4_inode {
struct {
__u8 l_i_frag; /* Fragment number */
__u8 l_i_fsize; /* Fragment size */
- __u16 i_pad1;
+ __u16 l_i_file_acl_high;
__le16 l_i_uid_high; /* these 2 fields */
__le16 l_i_gid_high; /* were reserved2[0] */
__u32 l_i_reserved2;
@@ -301,7 +301,7 @@ struct ext4_inode {
struct {
__u8 m_i_frag; /* Fragment number */
__u8 m_i_fsize; /* Fragment size */
- __u16 m_pad1;
+ __u16 m_i_file_acl_high;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* OS dependent 2 */
@@ -315,6 +315,7 @@ struct ext4_inode {
#define i_reserved1 osd1.linux1.l_i_reserved1
#define i_frag osd2.linux2.l_i_frag
#define i_fsize osd2.linux2.l_i_fsize
+#define i_file_acl_high osd2.linux2.l_i_file_acl_high
#define i_uid_low i_uid
#define i_gid_low i_gid
#define i_uid_high osd2.linux2.l_i_uid_high
@@ -335,6 +336,7 @@ struct ext4_inode {
#define i_reserved1 osd1.masix1.m_i_reserved1
#define i_frag osd2.masix2.m_i_frag
#define i_fsize osd2.masix2.m_i_fsize
+#define i_file_acl_high osd2.masix2.m_i_file_acl_high
#define i_reserved2 osd2.masix2.m_i_reserved2

#endif /* defined(__KERNEL__) || defined(__linux__) */

_



2006-08-10 06:41:51

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH 8/9] 48-bit block numbers for extended attributes

On Wed, 09 Aug 2006 18:22:09 -0700
Mingming Cao <[email protected]> wrote:

> As we are planning to support 48-bit block numbers for ext4,
> we need to support 48-bit block numbers for extended attributes.
> In the short term, we can do this by reuse (on-disk) 16-bit
> padding (linux2.i_pad1 currently used only by "hurd") as high
> order bits for xattr. This patch basically does that.

Short-term tends to become medium-term, then you're stuck with it.

What is the plan here?

2006-08-10 17:27:57

by Mingming Cao

[permalink] [raw]
Subject: Re: [PATCH 8/9] 48-bit block numbers for extended attributes

Andrew Morton wrote:

> On Wed, 09 Aug 2006 18:22:09 -0700
> Mingming Cao <[email protected]> wrote:
>
>
>>As we are planning to support 48-bit block numbers for ext4,
>>we need to support 48-bit block numbers for extended attributes.
>>In the short term, we can do this by reuse (on-disk) 16-bit
>>padding (linux2.i_pad1 currently used only by "hurd") as high
>>order bits for xattr. This patch basically does that.
>
>
> Short-term tends to become medium-term, then you're stuck with it.
>
> What is the plan here?

At the time we discuss how to support 48 bit xattr in the current inode,
we were thinking about patching ext3, thus it's not likely we will going
to do a deep surgery on the on-disk ext3 inode itself to have room for
another 16bit xattr. So the plan at that is to steal some unused bits
and construct with existing 32bit xattr to come with a 48bit xattr in total.

Given the fact that we are creating a new filesystem ext4, the ideal way
(long term) probably we should support 64bit xattr in the ext4 inode,
that is possible. The plan is to focus on support 48bit ext4 first, then
probably move on next few things that also requires on-disk format
changes, this is an experiment filesystem at this moment....

Thanks,
Mingming