[UPDATE][PATCH]add ext3_fileblk_t for file relative offset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

On June 28, 2006, I wrote:
> On May 26, 2006, I wrote:
>> On May 26, 2006, Mingming wrote:
>>> As we have discussed before, it's saner to define ext3 fs blocks type
>>> and group block type and then fix the kernel ext3 block variable type
>>> bugs....So above patches from me are going to be replaced by a new
>>> set of ext3 filesystem blocks patches, I have sent out a RFC to the
>>> ext2-devel list in the last few weeks:
>> I agree. But the aim of this fix is to keep as much compatibility as
>> possible by making only >2TB file incompatible(RO). So I didn't add
>> typedef for ext3 block type.
>>
>> Now I'm working on changing the type of variables related to block,
>> including ext3_fileblk_t. I'll send the update patches later.
>
> I've finished this work finally.


I rewrite this patch comment to describe ext3_fileblk_t more clearly.
Nothing changed about my patch itself.

There are two new types in Mingming's patches.  One is "ext3_fsblk_t"
for filesystem relative block and the other is "ext3_grpblk_t" for
blockgroup relative offset.  But they have no type for file relative
offset.  Moreover variables for file relative offset are used as
various types(int, long and unsigned long) in current kernel.

Therefore I added "ext3_fileblk_t" for file relative offset.
It gives unity, which makes maintenance easier and code clearer.
ext3_fileblk_t is unsigned long which is the maximum size of
current type for file relative offset.

For example:
static unsigned long blocks_for_truncate(struct inode *inode)
{
unsigned long needed; <- for file relative offset


This patch applies on top of Mingming's patches which were posted at:
  http://marc.theaimsgroup.com/?l=ext2-devel&m=114981607414944&w=2


Signed-off-by: Takashi Sato <[email protected]>
---
diff -Nurp -x CVS ../../linux-2.6.17.org/fs/ext3/dir.c linux-2.6.17-rc6-48bitext3/fs/ext3/dir.c
--- ../../linux-2.6.17.org/fs/ext3/dir.c	2006-06-19 17:29:39.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/fs/ext3/dir.c	2006-06-20 14:58:51.000000000 +0800
@@ -126,7 +126,7 @@ static int ext3_readdir(struct file * fi
 	offset = filp->f_pos & (sb->s_blocksize - 1);
 
 	while (!error && !stored && filp->f_pos < inode->i_size) {
-		unsigned long blk = filp->f_pos >> EXT3_BLOCK_SIZE_BITS(sb);
+		ext3_fileblk_t blk = filp->f_pos >> EXT3_BLOCK_SIZE_BITS(sb);
 		struct buffer_head map_bh;
 		struct buffer_head *bh = NULL;
 
diff -Nurp -x CVS ../../linux-2.6.17.org/fs/ext3/inode.c linux-2.6.17-rc6-48bitext3/fs/ext3/inode.c
--- ../../linux-2.6.17.org/fs/ext3/inode.c	2006-06-19 17:31:49.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/fs/ext3/inode.c	2006-06-21 10:46:24.000000000 +0800
@@ -105,7 +105,7 @@ int ext3_forget(handle_t *handle, int is
  */
 static unsigned long blocks_for_truncate(struct inode *inode) 
 {
-	unsigned long needed;
+	ext3_fileblk_t needed;
 
 	needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
 
@@ -282,7 +282,7 @@ static int verify_chain(Indirect *from, 
  */
 
 static int ext3_block_to_path(struct inode *inode,
-			long i_block, int offsets[4], int *boundary)
+			ext3_fileblk_t i_block, int offsets[4], int *boundary)
 {
 	int ptrs = EXT3_ADDR_PER_BLOCK(inode->i_sb);
 	int ptrs_bits = EXT3_ADDR_PER_BLOCK_BITS(inode->i_sb);
@@ -445,7 +445,7 @@ static ext3_fsblk_t ext3_find_near(struc
  *	stores it in *@goal and returns zero.
  */
 
-static ext3_fsblk_t ext3_find_goal(struct inode *inode, long block,
+static ext3_fsblk_t ext3_find_goal(struct inode *inode, ext3_fileblk_t block,
 		Indirect chain[4], Indirect *partial)
 {
 	struct ext3_block_alloc_info *block_i;
@@ -680,7 +680,7 @@ failed:
  * chain to new block and return 0.
  */
 static int ext3_splice_branch(handle_t *handle, struct inode *inode,
-			long block, Indirect *where, int num, int blks)
+			ext3_fileblk_t block, Indirect *where, int num, int blks)
 {
 	int i;
 	int err = 0;
@@ -784,7 +784,7 @@ err_out:
  * return < 0, error case.
  */
 int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
-		sector_t iblock, unsigned long maxblocks,
+		ext3_fileblk_t iblock, unsigned long maxblocks,
 		struct buffer_head *bh_result,
 		int create, int extend_disksize)
 {
@@ -996,7 +996,7 @@ get_block:
  * `handle' can be NULL if create is zero
  */
 struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
-				long block, int create, int *errp)
+				ext3_fileblk_t block, int create, int *errp)
 {
 	struct buffer_head dummy;
 	int fatal = 0, err;
@@ -1060,7 +1060,7 @@ err:
 }
 
 struct buffer_head *ext3_bread(handle_t *handle, struct inode *inode,
-			       int block, int create, int *err)
+			       ext3_fileblk_t block, int create, int *err)
 {
 	struct buffer_head * bh;
 
@@ -1759,7 +1759,8 @@ int ext3_block_truncate_page(handle_t *h
 {
 	ext3_fsblk_t index = from >> PAGE_CACHE_SHIFT;
 	unsigned offset = from & (PAGE_CACHE_SIZE-1);
-	unsigned blocksize, iblock, length, pos;
+	unsigned blocksize, length, pos;
+	ext3_fileblk_t iblock;
 	struct inode *inode = mapping->host;
 	struct buffer_head *bh;
 	int err = 0;
@@ -2232,7 +2233,7 @@ void ext3_truncate(struct inode *inode)
 	Indirect *partial;
 	__le32 nr = 0;
 	int n;
-	long last_block;
+	ext3_fileblk_t last_block;
 	unsigned blocksize = inode->i_sb->s_blocksize;
 	struct page *page;
 
diff -Nurp -x CVS ../../linux-2.6.17.org/fs/ext3/namei.c linux-2.6.17-rc6-48bitext3/fs/ext3/namei.c
--- ../../linux-2.6.17.org/fs/ext3/namei.c	2006-03-20 13:53:29.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/fs/ext3/namei.c	2006-06-20 14:58:51.000000000 +0800
@@ -51,7 +51,7 @@
 
 static struct buffer_head *ext3_append(handle_t *handle,
 					struct inode *inode,
-					u32 *block, int *err)
+					ext3_fileblk_t *block, int *err)
 {
 	struct buffer_head *bh;
 
@@ -144,8 +144,8 @@ struct dx_map_entry
 };
 
 #ifdef CONFIG_EXT3_INDEX
-static inline unsigned dx_get_block (struct dx_entry *entry);
-static void dx_set_block (struct dx_entry *entry, unsigned value);
+static inline ext3_fileblk_t dx_get_block (struct dx_entry *entry);
+static void dx_set_block (struct dx_entry *entry, ext3_fileblk_t value);
 static inline unsigned dx_get_hash (struct dx_entry *entry);
 static void dx_set_hash (struct dx_entry *entry, unsigned value);
 static unsigned dx_get_count (struct dx_entry *entries);
@@ -166,7 +166,7 @@ static void dx_sort_map(struct dx_map_en
 static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to,
 		struct dx_map_entry *offsets, int count);
 static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size);
-static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block);
+static void dx_insert_block (struct dx_frame *frame, u32 hash, ext3_fileblk_t block);
 static int ext3_htree_next_block(struct inode *dir, __u32 hash,
 				 struct dx_frame *frame,
 				 struct dx_frame *frames, 
@@ -181,12 +181,12 @@ static int ext3_dx_add_entry(handle_t *h
  * Mask them off for now.
  */
 
-static inline unsigned dx_get_block (struct dx_entry *entry)
+static inline ext3_fileblk_t dx_get_block (struct dx_entry *entry)
 {
 	return le32_to_cpu(entry->block) & 0x00ffffff;
 }
 
-static inline void dx_set_block (struct dx_entry *entry, unsigned value)
+static inline void dx_set_block (struct dx_entry *entry, ext3_fileblk_t value)
 {
 	entry->block = cpu_to_le32(value);
 }
@@ -244,7 +244,7 @@ static void dx_show_index (char * label,
         printk("%s index ", label);
         for (i = 0; i < n; i++)
         {
-                printk("%x->%u ", i? dx_get_hash(entries + i): 0, dx_get_block(entries + i));
+                printk("%x->%lu ", i? dx_get_hash(entries + i): 0, dx_get_block(entries + i));
         }
         printk("\n");
 }
@@ -297,7 +297,7 @@ struct stats dx_show_entries(struct dx_h
 	printk("%i indexed blocks...\n", count);
 	for (i = 0; i < count; i++, entries++)
 	{
-		u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0;
+		ext3_fileblk_t block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0;
 		u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
 		struct stats stats;
 		printk("%s%3u:%03u hash %8x/%8x ",levels?"":"   ", i, block, hash, range);
@@ -534,7 +534,7 @@ static inline struct ext3_dir_entry_2 *e
  * into the tree.  If there is an error it is returned in err.
  */
 static int htree_dirblock_to_tree(struct file *dir_file,
-				  struct inode *dir, int block,
+				  struct inode *dir, ext3_fileblk_t block,
 				  struct dx_hash_info *hinfo,
 				  __u32 start_hash, __u32 start_minor_hash)
 {
@@ -542,7 +542,7 @@ static int htree_dirblock_to_tree(struct
 	struct ext3_dir_entry_2 *de, *top;
 	int err, count = 0;
 
-	dxtrace(printk("In htree dirblock_to_tree: block %d\n", block));
+	dxtrace(printk("In htree dirblock_to_tree: block %lu\n", block));
 	if (!(bh = ext3_bread (NULL, dir, block, 0, &err)))
 		return err;
 
@@ -585,7 +585,8 @@ int ext3_htree_fill_tree(struct file *di
 	struct ext3_dir_entry_2 *de;
 	struct dx_frame frames[2], *frame;
 	struct inode *dir;
-	int block, err;
+	ext3_fileblk_t block;
+	int err;
 	int count = 0;
 	int ret;
 	__u32 hashval;
@@ -713,7 +714,7 @@ static void dx_sort_map (struct dx_map_e
 	} while(more);
 }
 
-static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block)
+static void dx_insert_block(struct dx_frame *frame, u32 hash, ext3_fileblk_t block)
 {
 	struct dx_entry *entries = frame->entries;
 	struct dx_entry *old = frame->at, *new = old + 1;
@@ -810,13 +811,14 @@ static struct buffer_head * ext3_find_en
 	struct super_block * sb;
 	struct buffer_head * bh_use[NAMEI_RA_SIZE];
 	struct buffer_head * bh, *ret = NULL;
-	unsigned long start, block, b;
+	ext3_fileblk_t start, block, b;
 	int ra_max = 0;		/* Number of bh's in the readahead
 				   buffer, bh_use[] */
 	int ra_ptr = 0;		/* Current index into readahead
 				   buffer */
 	int num = 0;
-	int nblocks, i, err;
+	ext3_fileblk_t nblocks;
+	int i, err;
 	struct inode *dir = dentry->d_parent->d_inode;
 	int namelen;
 	const u8 *name;
@@ -927,7 +929,7 @@ static struct buffer_head * ext3_dx_find
 	struct dx_frame frames[2], *frame;
 	struct ext3_dir_entry_2 *de, *top;
 	struct buffer_head *bh;
-	unsigned long block;
+	ext3_fileblk_t block;
 	int retval;
 	int namelen = dentry->d_name.len;
 	const u8 *name = dentry->d_name.name;
@@ -1107,7 +1109,7 @@ static struct ext3_dir_entry_2 *do_split
 	unsigned blocksize = dir->i_sb->s_blocksize;
 	unsigned count, continued;
 	struct buffer_head *bh2;
-	u32 newblock;
+	ext3_fileblk_t newblock;
 	u32 hash2;
 	struct dx_map_entry *map;
 	char *data1 = (*bh)->b_data, *data2;
@@ -1148,7 +1150,7 @@ static struct ext3_dir_entry_2 *do_split
 	dx_sort_map (map, count);
 	hash2 = map[split].hash;
 	continued = hash2 == map[split - 1].hash;
-	dxtrace(printk("Split block %i at %x, %i/%i\n",
+	dxtrace(printk("Split block %lu at %x, %i/%i\n",
 		dx_get_block(frame->at), hash2, split, count-split));
 
 	/* Fancy dance to stay within two buffers */
@@ -1296,7 +1298,7 @@ static int make_indexed_dir(handle_t *ha
 	int		retval;
 	unsigned	blocksize;
 	struct dx_hash_info hinfo;
-	u32		block;
+	ext3_fileblk_t		block;
 	struct fake_dirent *fde;
 
 	blocksize =  dir->i_sb->s_blocksize;
@@ -1380,7 +1382,7 @@ static int ext3_add_entry (handle_t *han
 #endif
 	unsigned blocksize;
 	unsigned nlen, rlen;
-	u32 block, blocks;
+	ext3_fileblk_t block, blocks;
 
 	sb = dir->i_sb;
 	blocksize = sb->s_blocksize;
@@ -1463,7 +1465,7 @@ static int ext3_dx_add_entry(handle_t *h
 		       dx_get_count(entries), dx_get_limit(entries)));
 	/* Need to split index? */
 	if (dx_get_count(entries) == dx_get_limit(entries)) {
-		u32 newblock;
+		ext3_fileblk_t newblock;
 		unsigned icount = dx_get_count(entries);
 		int levels = frame - frames;
 		struct dx_entry *entries2;
diff -Nurp -x CVS ../../linux-2.6.17.org/fs/ext3/super.c linux-2.6.17-rc6-48bitext3/fs/ext3/super.c
--- ../../linux-2.6.17.org/fs/ext3/super.c	2006-06-19 17:31:49.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/fs/ext3/super.c	2006-06-20 14:58:51.000000000 +0800
@@ -2577,7 +2577,7 @@ static ssize_t ext3_quota_read(struct su
 			       size_t len, loff_t off)
 {
 	struct inode *inode = sb_dqopt(sb)->files[type];
-	sector_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb);
+	ext3_fileblk_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb);
 	int err = 0;
 	int offset = off & (sb->s_blocksize - 1);
 	int tocopy;
@@ -2615,7 +2615,7 @@ static ssize_t ext3_quota_write(struct s
 				const char *data, size_t len, loff_t off)
 {
 	struct inode *inode = sb_dqopt(sb)->files[type];
-	sector_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb);
+	ext3_fileblk_t blk = off >> EXT3_BLOCK_SIZE_BITS(sb);
 	int err = 0;
 	int offset = off & (sb->s_blocksize - 1);
 	int tocopy;
diff -Nurp -x CVS ../../linux-2.6.17.org/include/linux/ext3_fs.h linux-2.6.17-rc6-48bitext3/include/linux/ext3_fs.h
--- ../../linux-2.6.17.org/include/linux/ext3_fs.h	2006-06-19 17:31:49.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/include/linux/ext3_fs.h	2006-06-20 14:59:41.000000000 +0800
@@ -897,10 +897,10 @@ extern unsigned long ext3_count_free (st
 /* inode.c */
 int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
 		struct buffer_head *bh, ext3_fsblk_t blocknr);
-struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
-struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
+struct buffer_head * ext3_getblk (handle_t *, struct inode *, ext3_fileblk_t, int, int *);
+struct buffer_head * ext3_bread (handle_t *, struct inode *, ext3_fileblk_t, int, int *);
 int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
-	sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result,
+	ext3_fileblk_t iblock, unsigned long maxblocks, struct buffer_head *bh_result,
 	int create, int extend_disksize);
 
 extern void ext3_read_inode (struct inode *);
diff -Nurp -x CVS ../../linux-2.6.17.org/include/linux/ext3_fs_i.h linux-2.6.17-rc6-48bitext3/include/linux/ext3_fs_i.h
--- ../../linux-2.6.17.org/include/linux/ext3_fs_i.h	2006-06-19 17:31:20.000000000 +0800
+++ linux-2.6.17-rc6-48bitext3/include/linux/ext3_fs_i.h	2006-06-20 14:59:41.000000000 +0800
@@ -27,6 +27,9 @@ typedef int ext3_grpblk_t;
 /* data type for filesystem-wide blocks number */
 typedef sector_t ext3_fsblk_t;
 
+/* data type for block offset of file */
+typedef unsigned long ext3_fileblk_t;
+
 #define E3FSBLK SECTOR_FMT
 
 struct ext3_reserve_window {
@@ -50,7 +53,7 @@ struct ext3_block_alloc_info {
 	 * most-recently-allocated block in this file.
 	 * We use this for detecting linearly ascending allocation requests.
 	 */
-	__u32                   last_alloc_logical_block;
+	ext3_fileblk_t                   last_alloc_logical_block;
 	/*
 	 * Was i_next_alloc_goal in ext3_inode_info
 	 * is the *physical* companion to i_next_alloc_block.
@@ -102,7 +105,7 @@ struct ext3_inode_info {
 	/* block reservation info */
 	struct ext3_block_alloc_info *i_block_alloc_info;
 
-	__u32	i_dir_start_lookup;
+	ext3_fileblk_t	i_dir_start_lookup;
 #ifdef CONFIG_EXT3_FS_XATTR
 	/*
 	 * Extended attributes can be read independently of the main file


Cheers, sho

-
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/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux