Skip to content

Commit a686cd8

Browse files
mblighLinus Torvalds
authored and
Linus Torvalds
committed
ext2 reservations
Val's cross-port of the ext3 reservations code into ext2. [mbligh@mbligh.org: Small type error for printk [akpm@linux-foundation.org: fix types, sync with ext3] [mbligh@mbligh.org: Bring ext2 reservations code in line with latest ext3] [akpm@linux-foundation.org: kill noisy printk] [akpm@linux-foundation.org: remember to dirty the gdp's block] [akpm@linux-foundation.org: cross-port the missed 5dea517] [akpm@linux-foundation.org: cross-port e602260] [akpm@linux-foundation.org: Port the omitted 08fb306] [akpm@linux-foundation.org: Backport the missed 20acaa1] [akpm@linux-foundation.org: fixes] [cmm@us.ibm.com: fix reservation extension] [bunk@stusta.de: make ext2_get_blocks() static] [hugh@veritas.com: fix hang] [hugh@veritas.com: ext2_new_blocks should reset the reservation window size] [hugh@veritas.com: ext2 balloc: fix off-by-one against rsv_end] [hugh@veritas.com: grp_goal 0 is a genuine goal (unlike -1), so ext2_try_to_allocate_with_rsv should treat it as such] [hugh@veritas.com: rbtree usage cleanup] [pbadari@us.ibm.com: Fix for ext2 reservation] [bunk@kernel.org: remove fs/ext2/balloc.c:reserve_blocks()] [hugh@veritas.com: ext2 balloc: use io_error label] Cc: "Martin J. Bligh" <mbligh@mbligh.org> Cc: Valerie Henson <val_henson@linux.intel.com> Cc: Mingming Cao <cmm@us.ibm.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Adrian Bunk <bunk@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 369f238 commit a686cd8

File tree

10 files changed

+1554
-485
lines changed

10 files changed

+1554
-485
lines changed

fs/ext2/balloc.c

+1,072-233
Large diffs are not rendered by default.

fs/ext2/ext2.h

+18-18
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,9 @@ struct ext2_inode_info {
3333
*/
3434
__u32 i_block_group;
3535

36-
/*
37-
* i_next_alloc_block is the logical (file-relative) number of the
38-
* most-recently-allocated block in this file. Yes, it is misnamed.
39-
* We use this for detecting linearly ascending allocation requests.
40-
*/
41-
__u32 i_next_alloc_block;
36+
/* block reservation info */
37+
struct ext2_block_alloc_info *i_block_alloc_info;
4238

43-
/*
44-
* i_next_alloc_goal is the *physical* companion to i_next_alloc_block.
45-
* it the the physical block number of the block which was most-recently
46-
* allocated to this file. This give us the goal (target) for the next
47-
* allocation when we detect linearly ascending requests.
48-
*/
49-
__u32 i_next_alloc_goal;
50-
__u32 i_prealloc_block;
51-
__u32 i_prealloc_count;
5239
__u32 i_dir_start_lookup;
5340
#ifdef CONFIG_EXT2_FS_XATTR
5441
/*
@@ -65,7 +52,16 @@ struct ext2_inode_info {
6552
struct posix_acl *i_default_acl;
6653
#endif
6754
rwlock_t i_meta_lock;
55+
56+
/*
57+
* truncate_mutex is for serialising ext2_truncate() against
58+
* ext2_getblock(). It also protects the internals of the inode's
59+
* reservation data structures: ext2_reserve_window and
60+
* ext2_reserve_window_node.
61+
*/
62+
struct mutex truncate_mutex;
6863
struct inode vfs_inode;
64+
struct list_head i_orphan; /* unlinked but open inodes */
6965
};
7066

7167
/*
@@ -91,8 +87,9 @@ static inline struct ext2_inode_info *EXT2_I(struct inode *inode)
9187
/* balloc.c */
9288
extern int ext2_bg_has_super(struct super_block *sb, int group);
9389
extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group);
94-
extern int ext2_new_block (struct inode *, unsigned long,
95-
__u32 *, __u32 *, int *);
90+
extern ext2_fsblk_t ext2_new_block(struct inode *, unsigned long, int *);
91+
extern ext2_fsblk_t ext2_new_blocks(struct inode *, unsigned long,
92+
unsigned long *, int *);
9693
extern void ext2_free_blocks (struct inode *, unsigned long,
9794
unsigned long);
9895
extern unsigned long ext2_count_free_blocks (struct super_block *);
@@ -101,6 +98,10 @@ extern void ext2_check_blocks_bitmap (struct super_block *);
10198
extern struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
10299
unsigned int block_group,
103100
struct buffer_head ** bh);
101+
extern void ext2_discard_reservation (struct inode *);
102+
extern int ext2_should_retry_alloc(struct super_block *sb, int *retries);
103+
extern void ext2_init_block_alloc_info(struct inode *);
104+
extern void ext2_rsv_window_add(struct super_block *sb, struct ext2_reserve_window_node *rsv);
104105

105106
/* dir.c */
106107
extern int ext2_add_link (struct dentry *, struct inode *);
@@ -128,7 +129,6 @@ extern int ext2_write_inode (struct inode *, int);
128129
extern void ext2_put_inode (struct inode *);
129130
extern void ext2_delete_inode (struct inode *);
130131
extern int ext2_sync_inode (struct inode *);
131-
extern void ext2_discard_prealloc (struct inode *);
132132
extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
133133
extern void ext2_truncate (struct inode *);
134134
extern int ext2_setattr (struct dentry *, struct iattr *);

fs/ext2/file.c

+5-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@
3030
*/
3131
static int ext2_release_file (struct inode * inode, struct file * filp)
3232
{
33-
if (filp->f_mode & FMODE_WRITE)
34-
ext2_discard_prealloc (inode);
33+
if (filp->f_mode & FMODE_WRITE) {
34+
mutex_lock(&EXT2_I(inode)->truncate_mutex);
35+
ext2_discard_reservation(inode);
36+
mutex_unlock(&EXT2_I(inode)->truncate_mutex);
37+
}
3538
return 0;
3639
}
3740

fs/ext2/ialloc.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -581,11 +581,8 @@ struct inode *ext2_new_inode(struct inode *dir, int mode)
581581
ei->i_file_acl = 0;
582582
ei->i_dir_acl = 0;
583583
ei->i_dtime = 0;
584+
ei->i_block_alloc_info = NULL;
584585
ei->i_block_group = group;
585-
ei->i_next_alloc_block = 0;
586-
ei->i_next_alloc_goal = 0;
587-
ei->i_prealloc_block = 0;
588-
ei->i_prealloc_count = 0;
589586
ei->i_dir_start_lookup = 0;
590587
ei->i_state = EXT2_STATE_NEW;
591588
ext2_set_inode_flags(inode);

0 commit comments

Comments
 (0)