diff options
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/balloc.c | 2 | ||||
-rw-r--r-- | fs/ext2/dir.c | 7 | ||||
-rw-r--r-- | fs/ext2/ialloc.c | 18 | ||||
-rw-r--r-- | fs/ext2/inode.c | 9 | ||||
-rw-r--r-- | fs/ext2/ioctl.c | 3 | ||||
-rw-r--r-- | fs/ext2/namei.c | 15 | ||||
-rw-r--r-- | fs/ext2/super.c | 10 |
7 files changed, 44 insertions, 20 deletions
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 6dac7ba2d22d..4a29d6376081 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c | |||
@@ -1193,7 +1193,7 @@ static int ext2_has_free_blocks(struct ext2_sb_info *sbi) | |||
1193 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); | 1193 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); |
1194 | root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); | 1194 | root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); |
1195 | if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && | 1195 | if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && |
1196 | sbi->s_resuid != current->fsuid && | 1196 | sbi->s_resuid != current_fsuid() && |
1197 | (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { | 1197 | (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { |
1198 | return 0; | 1198 | return 0; |
1199 | } | 1199 | } |
diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index 9a0fc400f91c..2999d72153b7 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c | |||
@@ -95,10 +95,13 @@ static int ext2_commit_chunk(struct page *page, loff_t pos, unsigned len) | |||
95 | mark_inode_dirty(dir); | 95 | mark_inode_dirty(dir); |
96 | } | 96 | } |
97 | 97 | ||
98 | if (IS_DIRSYNC(dir)) | 98 | if (IS_DIRSYNC(dir)) { |
99 | err = write_one_page(page, 1); | 99 | err = write_one_page(page, 1); |
100 | else | 100 | if (!err) |
101 | err = ext2_sync_inode(dir); | ||
102 | } else { | ||
101 | unlock_page(page); | 103 | unlock_page(page); |
104 | } | ||
102 | 105 | ||
103 | return err; | 106 | return err; |
104 | } | 107 | } |
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index f59741346760..66321a877e74 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c | |||
@@ -550,7 +550,7 @@ got: | |||
550 | 550 | ||
551 | sb->s_dirt = 1; | 551 | sb->s_dirt = 1; |
552 | mark_buffer_dirty(bh2); | 552 | mark_buffer_dirty(bh2); |
553 | inode->i_uid = current->fsuid; | 553 | inode->i_uid = current_fsuid(); |
554 | if (test_opt (sb, GRPID)) | 554 | if (test_opt (sb, GRPID)) |
555 | inode->i_gid = dir->i_gid; | 555 | inode->i_gid = dir->i_gid; |
556 | else if (dir->i_mode & S_ISGID) { | 556 | else if (dir->i_mode & S_ISGID) { |
@@ -558,19 +558,15 @@ got: | |||
558 | if (S_ISDIR(mode)) | 558 | if (S_ISDIR(mode)) |
559 | mode |= S_ISGID; | 559 | mode |= S_ISGID; |
560 | } else | 560 | } else |
561 | inode->i_gid = current->fsgid; | 561 | inode->i_gid = current_fsgid(); |
562 | inode->i_mode = mode; | 562 | inode->i_mode = mode; |
563 | 563 | ||
564 | inode->i_ino = ino; | 564 | inode->i_ino = ino; |
565 | inode->i_blocks = 0; | 565 | inode->i_blocks = 0; |
566 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; | 566 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; |
567 | memset(ei->i_data, 0, sizeof(ei->i_data)); | 567 | memset(ei->i_data, 0, sizeof(ei->i_data)); |
568 | ei->i_flags = EXT2_I(dir)->i_flags & ~EXT2_BTREE_FL; | 568 | ei->i_flags = |
569 | if (S_ISLNK(mode)) | 569 | ext2_mask_flags(mode, EXT2_I(dir)->i_flags & EXT2_FL_INHERITED); |
570 | ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); | ||
571 | /* dirsync is only applied to directories */ | ||
572 | if (!S_ISDIR(mode)) | ||
573 | ei->i_flags &= ~EXT2_DIRSYNC_FL; | ||
574 | ei->i_faddr = 0; | 570 | ei->i_faddr = 0; |
575 | ei->i_frag_no = 0; | 571 | ei->i_frag_no = 0; |
576 | ei->i_frag_size = 0; | 572 | ei->i_frag_size = 0; |
@@ -585,7 +581,10 @@ got: | |||
585 | spin_lock(&sbi->s_next_gen_lock); | 581 | spin_lock(&sbi->s_next_gen_lock); |
586 | inode->i_generation = sbi->s_next_generation++; | 582 | inode->i_generation = sbi->s_next_generation++; |
587 | spin_unlock(&sbi->s_next_gen_lock); | 583 | spin_unlock(&sbi->s_next_gen_lock); |
588 | insert_inode_hash(inode); | 584 | if (insert_inode_locked(inode) < 0) { |
585 | err = -EINVAL; | ||
586 | goto fail_drop; | ||
587 | } | ||
589 | 588 | ||
590 | if (DQUOT_ALLOC_INODE(inode)) { | 589 | if (DQUOT_ALLOC_INODE(inode)) { |
591 | err = -EDQUOT; | 590 | err = -EDQUOT; |
@@ -612,6 +611,7 @@ fail_drop: | |||
612 | DQUOT_DROP(inode); | 611 | DQUOT_DROP(inode); |
613 | inode->i_flags |= S_NOQUOTA; | 612 | inode->i_flags |= S_NOQUOTA; |
614 | inode->i_nlink = 0; | 613 | inode->i_nlink = 0; |
614 | unlock_new_inode(inode); | ||
615 | iput(inode); | 615 | iput(inode); |
616 | return ERR_PTR(err); | 616 | return ERR_PTR(err); |
617 | 617 | ||
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 7658b33e2653..23fff2f87783 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/buffer_head.h> | 32 | #include <linux/buffer_head.h> |
33 | #include <linux/mpage.h> | 33 | #include <linux/mpage.h> |
34 | #include <linux/fiemap.h> | 34 | #include <linux/fiemap.h> |
35 | #include <linux/namei.h> | ||
35 | #include "ext2.h" | 36 | #include "ext2.h" |
36 | #include "acl.h" | 37 | #include "acl.h" |
37 | #include "xip.h" | 38 | #include "xip.h" |
@@ -497,8 +498,6 @@ static int ext2_alloc_branch(struct inode *inode, | |||
497 | * ext2_splice_branch - splice the allocated branch onto inode. | 498 | * ext2_splice_branch - splice the allocated branch onto inode. |
498 | * @inode: owner | 499 | * @inode: owner |
499 | * @block: (logical) number of block we are adding | 500 | * @block: (logical) number of block we are adding |
500 | * @chain: chain of indirect blocks (with a missing link - see | ||
501 | * ext2_alloc_branch) | ||
502 | * @where: location of missing link | 501 | * @where: location of missing link |
503 | * @num: number of indirect blocks we are adding | 502 | * @num: number of indirect blocks we are adding |
504 | * @blks: number of direct blocks we are adding | 503 | * @blks: number of direct blocks we are adding |
@@ -1286,9 +1285,11 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) | |||
1286 | else | 1285 | else |
1287 | inode->i_mapping->a_ops = &ext2_aops; | 1286 | inode->i_mapping->a_ops = &ext2_aops; |
1288 | } else if (S_ISLNK(inode->i_mode)) { | 1287 | } else if (S_ISLNK(inode->i_mode)) { |
1289 | if (ext2_inode_is_fast_symlink(inode)) | 1288 | if (ext2_inode_is_fast_symlink(inode)) { |
1290 | inode->i_op = &ext2_fast_symlink_inode_operations; | 1289 | inode->i_op = &ext2_fast_symlink_inode_operations; |
1291 | else { | 1290 | nd_terminate_link(ei->i_data, inode->i_size, |
1291 | sizeof(ei->i_data) - 1); | ||
1292 | } else { | ||
1292 | inode->i_op = &ext2_symlink_inode_operations; | 1293 | inode->i_op = &ext2_symlink_inode_operations; |
1293 | if (test_opt(inode->i_sb, NOBH)) | 1294 | if (test_opt(inode->i_sb, NOBH)) |
1294 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 1295 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index de876fa793e1..7cb4badef927 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c | |||
@@ -50,8 +50,7 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
50 | goto setflags_out; | 50 | goto setflags_out; |
51 | } | 51 | } |
52 | 52 | ||
53 | if (!S_ISDIR(inode->i_mode)) | 53 | flags = ext2_mask_flags(inode->i_mode, flags); |
54 | flags &= ~EXT2_DIRSYNC_FL; | ||
55 | 54 | ||
56 | mutex_lock(&inode->i_mutex); | 55 | mutex_lock(&inode->i_mutex); |
57 | /* Is it quota file? Do not allow user to mess with it */ | 56 | /* Is it quota file? Do not allow user to mess with it */ |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 2a747252ec12..90ea17998a73 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -41,9 +41,11 @@ static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode) | |||
41 | int err = ext2_add_link(dentry, inode); | 41 | int err = ext2_add_link(dentry, inode); |
42 | if (!err) { | 42 | if (!err) { |
43 | d_instantiate(dentry, inode); | 43 | d_instantiate(dentry, inode); |
44 | unlock_new_inode(inode); | ||
44 | return 0; | 45 | return 0; |
45 | } | 46 | } |
46 | inode_dec_link_count(inode); | 47 | inode_dec_link_count(inode); |
48 | unlock_new_inode(inode); | ||
47 | iput(inode); | 49 | iput(inode); |
48 | return err; | 50 | return err; |
49 | } | 51 | } |
@@ -170,6 +172,7 @@ out: | |||
170 | 172 | ||
171 | out_fail: | 173 | out_fail: |
172 | inode_dec_link_count(inode); | 174 | inode_dec_link_count(inode); |
175 | unlock_new_inode(inode); | ||
173 | iput (inode); | 176 | iput (inode); |
174 | goto out; | 177 | goto out; |
175 | } | 178 | } |
@@ -178,6 +181,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, | |||
178 | struct dentry *dentry) | 181 | struct dentry *dentry) |
179 | { | 182 | { |
180 | struct inode *inode = old_dentry->d_inode; | 183 | struct inode *inode = old_dentry->d_inode; |
184 | int err; | ||
181 | 185 | ||
182 | if (inode->i_nlink >= EXT2_LINK_MAX) | 186 | if (inode->i_nlink >= EXT2_LINK_MAX) |
183 | return -EMLINK; | 187 | return -EMLINK; |
@@ -186,7 +190,14 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, | |||
186 | inode_inc_link_count(inode); | 190 | inode_inc_link_count(inode); |
187 | atomic_inc(&inode->i_count); | 191 | atomic_inc(&inode->i_count); |
188 | 192 | ||
189 | return ext2_add_nondir(dentry, inode); | 193 | err = ext2_add_link(dentry, inode); |
194 | if (!err) { | ||
195 | d_instantiate(dentry, inode); | ||
196 | return 0; | ||
197 | } | ||
198 | inode_dec_link_count(inode); | ||
199 | iput(inode); | ||
200 | return err; | ||
190 | } | 201 | } |
191 | 202 | ||
192 | static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) | 203 | static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) |
@@ -222,12 +233,14 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
222 | goto out_fail; | 233 | goto out_fail; |
223 | 234 | ||
224 | d_instantiate(dentry, inode); | 235 | d_instantiate(dentry, inode); |
236 | unlock_new_inode(inode); | ||
225 | out: | 237 | out: |
226 | return err; | 238 | return err; |
227 | 239 | ||
228 | out_fail: | 240 | out_fail: |
229 | inode_dec_link_count(inode); | 241 | inode_dec_link_count(inode); |
230 | inode_dec_link_count(inode); | 242 | inode_dec_link_count(inode); |
243 | unlock_new_inode(inode); | ||
231 | iput(inode); | 244 | iput(inode); |
232 | out_dir: | 245 | out_dir: |
233 | inode_dec_link_count(dir); | 246 | inode_dec_link_count(dir); |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 647cd888ac87..da8bdeaa2e6d 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -132,6 +132,7 @@ static void ext2_put_super (struct super_block * sb) | |||
132 | percpu_counter_destroy(&sbi->s_dirs_counter); | 132 | percpu_counter_destroy(&sbi->s_dirs_counter); |
133 | brelse (sbi->s_sbh); | 133 | brelse (sbi->s_sbh); |
134 | sb->s_fs_info = NULL; | 134 | sb->s_fs_info = NULL; |
135 | kfree(sbi->s_blockgroup_lock); | ||
135 | kfree(sbi); | 136 | kfree(sbi); |
136 | 137 | ||
137 | return; | 138 | return; |
@@ -756,6 +757,13 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
756 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 757 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
757 | if (!sbi) | 758 | if (!sbi) |
758 | return -ENOMEM; | 759 | return -ENOMEM; |
760 | |||
761 | sbi->s_blockgroup_lock = | ||
762 | kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); | ||
763 | if (!sbi->s_blockgroup_lock) { | ||
764 | kfree(sbi); | ||
765 | return -ENOMEM; | ||
766 | } | ||
759 | sb->s_fs_info = sbi; | 767 | sb->s_fs_info = sbi; |
760 | sbi->s_sb_block = sb_block; | 768 | sbi->s_sb_block = sb_block; |
761 | 769 | ||
@@ -983,7 +991,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
983 | printk ("EXT2-fs: not enough memory\n"); | 991 | printk ("EXT2-fs: not enough memory\n"); |
984 | goto failed_mount; | 992 | goto failed_mount; |
985 | } | 993 | } |
986 | bgl_lock_init(&sbi->s_blockgroup_lock); | 994 | bgl_lock_init(sbi->s_blockgroup_lock); |
987 | sbi->s_debts = kcalloc(sbi->s_groups_count, sizeof(*sbi->s_debts), GFP_KERNEL); | 995 | sbi->s_debts = kcalloc(sbi->s_groups_count, sizeof(*sbi->s_debts), GFP_KERNEL); |
988 | if (!sbi->s_debts) { | 996 | if (!sbi->s_debts) { |
989 | printk ("EXT2-fs: not enough memory\n"); | 997 | printk ("EXT2-fs: not enough memory\n"); |