Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Subject | [RFC][PATCH]add ext3_fileblk_t for file relative offset | From | sho@tnes ... | Date | Wed, 28 Jun 2006 22:31:09 +0900 |
| |
Hi all,
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.
In Mingming's patch set, the single type `ext3_fsblk_t' deal with two different values, which are file relative offset and filesystem relative offset. I think it is confusing.
Therefore I added "ext3_fileblk_t" for file relative offset. It makes maintenance easier and code clearer if file size needs to be larger. 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 <sho@tnes.nec.co.jp> --- 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |