diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-05 16:20:53 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-05 16:20:53 -0500 |
commit | e213e26ab3988c516c06eba4dcd030ac052f6dc9 (patch) | |
tree | 6e26fbdbb842b387697d73daf6e70cf718269a77 /fs/ext2 | |
parent | c812a51d11bbe983f4c24e32b59b265705ddd3c2 (diff) | |
parent | efd8f0e6f6c1faa041f228d7113bd3a9db802d49 (diff) |
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6: (33 commits)
quota: stop using QUOTA_OK / NO_QUOTA
dquot: cleanup dquot initialize routine
dquot: move dquot initialization responsibility into the filesystem
dquot: cleanup dquot drop routine
dquot: move dquot drop responsibility into the filesystem
dquot: cleanup dquot transfer routine
dquot: move dquot transfer responsibility into the filesystem
dquot: cleanup inode allocation / freeing routines
dquot: cleanup space allocation / freeing routines
ext3: add writepage sanity checks
ext3: Truncate allocated blocks if direct IO write fails to update i_size
quota: Properly invalidate caches even for filesystems with blocksize < pagesize
quota: generalize quota transfer interface
quota: sb_quota state flags cleanup
jbd: Delay discarding buffers in journal_unmap_buffer
ext3: quota_write cross block boundary behaviour
quota: drop permission checks from xfs_fs_set_xstate/xfs_fs_set_xquota
quota: split out compat_sys_quotactl support from quota.c
quota: split out netlink notification support from quota.c
quota: remove invalid optimization from quota_sync_all
...
Fixed trivial conflicts in fs/namei.c and fs/ufs/inode.c
Diffstat (limited to 'fs/ext2')
-rw-r--r-- | fs/ext2/balloc.c | 12 | ||||
-rw-r--r-- | fs/ext2/file.c | 5 | ||||
-rw-r--r-- | fs/ext2/ialloc.c | 14 | ||||
-rw-r--r-- | fs/ext2/inode.c | 7 | ||||
-rw-r--r-- | fs/ext2/namei.c | 51 | ||||
-rw-r--r-- | fs/ext2/super.c | 2 | ||||
-rw-r--r-- | fs/ext2/xattr.c | 10 |
7 files changed, 64 insertions, 37 deletions
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 7f8d2e5a7ea..1d081f0cfec 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c | |||
@@ -570,7 +570,7 @@ do_more: | |||
570 | error_return: | 570 | error_return: |
571 | brelse(bitmap_bh); | 571 | brelse(bitmap_bh); |
572 | release_blocks(sb, freed); | 572 | release_blocks(sb, freed); |
573 | vfs_dq_free_block(inode, freed); | 573 | dquot_free_block(inode, freed); |
574 | } | 574 | } |
575 | 575 | ||
576 | /** | 576 | /** |
@@ -1236,6 +1236,7 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, | |||
1236 | unsigned short windowsz = 0; | 1236 | unsigned short windowsz = 0; |
1237 | unsigned long ngroups; | 1237 | unsigned long ngroups; |
1238 | unsigned long num = *count; | 1238 | unsigned long num = *count; |
1239 | int ret; | ||
1239 | 1240 | ||
1240 | *errp = -ENOSPC; | 1241 | *errp = -ENOSPC; |
1241 | sb = inode->i_sb; | 1242 | sb = inode->i_sb; |
@@ -1247,8 +1248,9 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, | |||
1247 | /* | 1248 | /* |
1248 | * Check quota for allocation of this block. | 1249 | * Check quota for allocation of this block. |
1249 | */ | 1250 | */ |
1250 | if (vfs_dq_alloc_block(inode, num)) { | 1251 | ret = dquot_alloc_block(inode, num); |
1251 | *errp = -EDQUOT; | 1252 | if (ret) { |
1253 | *errp = ret; | ||
1252 | return 0; | 1254 | return 0; |
1253 | } | 1255 | } |
1254 | 1256 | ||
@@ -1409,7 +1411,7 @@ allocated: | |||
1409 | 1411 | ||
1410 | *errp = 0; | 1412 | *errp = 0; |
1411 | brelse(bitmap_bh); | 1413 | brelse(bitmap_bh); |
1412 | vfs_dq_free_block(inode, *count-num); | 1414 | dquot_free_block(inode, *count-num); |
1413 | *count = num; | 1415 | *count = num; |
1414 | return ret_block; | 1416 | return ret_block; |
1415 | 1417 | ||
@@ -1420,7 +1422,7 @@ out: | |||
1420 | * Undo the block allocation | 1422 | * Undo the block allocation |
1421 | */ | 1423 | */ |
1422 | if (!performed_allocation) | 1424 | if (!performed_allocation) |
1423 | vfs_dq_free_block(inode, *count); | 1425 | dquot_free_block(inode, *count); |
1424 | brelse(bitmap_bh); | 1426 | brelse(bitmap_bh); |
1425 | return 0; | 1427 | return 0; |
1426 | } | 1428 | } |
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 586e3589d4c..5d198d0697f 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <linux/time.h> | 21 | #include <linux/time.h> |
22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
23 | #include <linux/quotaops.h> | ||
23 | #include "ext2.h" | 24 | #include "ext2.h" |
24 | #include "xattr.h" | 25 | #include "xattr.h" |
25 | #include "acl.h" | 26 | #include "acl.h" |
@@ -70,7 +71,7 @@ const struct file_operations ext2_file_operations = { | |||
70 | .compat_ioctl = ext2_compat_ioctl, | 71 | .compat_ioctl = ext2_compat_ioctl, |
71 | #endif | 72 | #endif |
72 | .mmap = generic_file_mmap, | 73 | .mmap = generic_file_mmap, |
73 | .open = generic_file_open, | 74 | .open = dquot_file_open, |
74 | .release = ext2_release_file, | 75 | .release = ext2_release_file, |
75 | .fsync = ext2_fsync, | 76 | .fsync = ext2_fsync, |
76 | .splice_read = generic_file_splice_read, | 77 | .splice_read = generic_file_splice_read, |
@@ -87,7 +88,7 @@ const struct file_operations ext2_xip_file_operations = { | |||
87 | .compat_ioctl = ext2_compat_ioctl, | 88 | .compat_ioctl = ext2_compat_ioctl, |
88 | #endif | 89 | #endif |
89 | .mmap = xip_file_mmap, | 90 | .mmap = xip_file_mmap, |
90 | .open = generic_file_open, | 91 | .open = dquot_file_open, |
91 | .release = ext2_release_file, | 92 | .release = ext2_release_file, |
92 | .fsync = ext2_fsync, | 93 | .fsync = ext2_fsync, |
93 | }; | 94 | }; |
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index 15387c9c17d..ad7d572ee8d 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c | |||
@@ -121,8 +121,8 @@ void ext2_free_inode (struct inode * inode) | |||
121 | if (!is_bad_inode(inode)) { | 121 | if (!is_bad_inode(inode)) { |
122 | /* Quota is already initialized in iput() */ | 122 | /* Quota is already initialized in iput() */ |
123 | ext2_xattr_delete_inode(inode); | 123 | ext2_xattr_delete_inode(inode); |
124 | vfs_dq_free_inode(inode); | 124 | dquot_free_inode(inode); |
125 | vfs_dq_drop(inode); | 125 | dquot_drop(inode); |
126 | } | 126 | } |
127 | 127 | ||
128 | es = EXT2_SB(sb)->s_es; | 128 | es = EXT2_SB(sb)->s_es; |
@@ -586,10 +586,10 @@ got: | |||
586 | goto fail_drop; | 586 | goto fail_drop; |
587 | } | 587 | } |
588 | 588 | ||
589 | if (vfs_dq_alloc_inode(inode)) { | 589 | dquot_initialize(inode); |
590 | err = -EDQUOT; | 590 | err = dquot_alloc_inode(inode); |
591 | if (err) | ||
591 | goto fail_drop; | 592 | goto fail_drop; |
592 | } | ||
593 | 593 | ||
594 | err = ext2_init_acl(inode, dir); | 594 | err = ext2_init_acl(inode, dir); |
595 | if (err) | 595 | if (err) |
@@ -605,10 +605,10 @@ got: | |||
605 | return inode; | 605 | return inode; |
606 | 606 | ||
607 | fail_free_drop: | 607 | fail_free_drop: |
608 | vfs_dq_free_inode(inode); | 608 | dquot_free_inode(inode); |
609 | 609 | ||
610 | fail_drop: | 610 | fail_drop: |
611 | vfs_dq_drop(inode); | 611 | dquot_drop(inode); |
612 | inode->i_flags |= S_NOQUOTA; | 612 | inode->i_flags |= S_NOQUOTA; |
613 | inode->i_nlink = 0; | 613 | inode->i_nlink = 0; |
614 | unlock_new_inode(inode); | 614 | unlock_new_inode(inode); |
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 36ae1cac767..fc13cc119aa 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -60,6 +60,8 @@ static inline int ext2_inode_is_fast_symlink(struct inode *inode) | |||
60 | */ | 60 | */ |
61 | void ext2_delete_inode (struct inode * inode) | 61 | void ext2_delete_inode (struct inode * inode) |
62 | { | 62 | { |
63 | if (!is_bad_inode(inode)) | ||
64 | dquot_initialize(inode); | ||
63 | truncate_inode_pages(&inode->i_data, 0); | 65 | truncate_inode_pages(&inode->i_data, 0); |
64 | 66 | ||
65 | if (is_bad_inode(inode)) | 67 | if (is_bad_inode(inode)) |
@@ -1464,9 +1466,12 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) | |||
1464 | error = inode_change_ok(inode, iattr); | 1466 | error = inode_change_ok(inode, iattr); |
1465 | if (error) | 1467 | if (error) |
1466 | return error; | 1468 | return error; |
1469 | |||
1470 | if (iattr->ia_valid & ATTR_SIZE) | ||
1471 | dquot_initialize(inode); | ||
1467 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || | 1472 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || |
1468 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { | 1473 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { |
1469 | error = vfs_dq_transfer(inode, iattr) ? -EDQUOT : 0; | 1474 | error = dquot_transfer(inode, iattr); |
1470 | if (error) | 1475 | if (error) |
1471 | return error; | 1476 | return error; |
1472 | } | 1477 | } |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index dd7175ce560..71efb0e9a3f 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -31,6 +31,7 @@ | |||
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/pagemap.h> | 33 | #include <linux/pagemap.h> |
34 | #include <linux/quotaops.h> | ||
34 | #include "ext2.h" | 35 | #include "ext2.h" |
35 | #include "xattr.h" | 36 | #include "xattr.h" |
36 | #include "acl.h" | 37 | #include "acl.h" |
@@ -99,24 +100,27 @@ struct dentry *ext2_get_parent(struct dentry *child) | |||
99 | */ | 100 | */ |
100 | static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, struct nameidata *nd) | 101 | static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, struct nameidata *nd) |
101 | { | 102 | { |
102 | struct inode * inode = ext2_new_inode (dir, mode); | 103 | struct inode *inode; |
103 | int err = PTR_ERR(inode); | 104 | |
104 | if (!IS_ERR(inode)) { | 105 | dquot_initialize(dir); |
105 | inode->i_op = &ext2_file_inode_operations; | 106 | |
106 | if (ext2_use_xip(inode->i_sb)) { | 107 | inode = ext2_new_inode(dir, mode); |
107 | inode->i_mapping->a_ops = &ext2_aops_xip; | 108 | if (IS_ERR(inode)) |
108 | inode->i_fop = &ext2_xip_file_operations; | 109 | return PTR_ERR(inode); |
109 | } else if (test_opt(inode->i_sb, NOBH)) { | 110 | |
110 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 111 | inode->i_op = &ext2_file_inode_operations; |
111 | inode->i_fop = &ext2_file_operations; | 112 | if (ext2_use_xip(inode->i_sb)) { |
112 | } else { | 113 | inode->i_mapping->a_ops = &ext2_aops_xip; |
113 | inode->i_mapping->a_ops = &ext2_aops; | 114 | inode->i_fop = &ext2_xip_file_operations; |
114 | inode->i_fop = &ext2_file_operations; | 115 | } else if (test_opt(inode->i_sb, NOBH)) { |
115 | } | 116 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
116 | mark_inode_dirty(inode); | 117 | inode->i_fop = &ext2_file_operations; |
117 | err = ext2_add_nondir(dentry, inode); | 118 | } else { |
119 | inode->i_mapping->a_ops = &ext2_aops; | ||
120 | inode->i_fop = &ext2_file_operations; | ||
118 | } | 121 | } |
119 | return err; | 122 | mark_inode_dirty(inode); |
123 | return ext2_add_nondir(dentry, inode); | ||
120 | } | 124 | } |
121 | 125 | ||
122 | static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev) | 126 | static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev) |
@@ -127,6 +131,8 @@ static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_ | |||
127 | if (!new_valid_dev(rdev)) | 131 | if (!new_valid_dev(rdev)) |
128 | return -EINVAL; | 132 | return -EINVAL; |
129 | 133 | ||
134 | dquot_initialize(dir); | ||
135 | |||
130 | inode = ext2_new_inode (dir, mode); | 136 | inode = ext2_new_inode (dir, mode); |
131 | err = PTR_ERR(inode); | 137 | err = PTR_ERR(inode); |
132 | if (!IS_ERR(inode)) { | 138 | if (!IS_ERR(inode)) { |
@@ -151,6 +157,8 @@ static int ext2_symlink (struct inode * dir, struct dentry * dentry, | |||
151 | if (l > sb->s_blocksize) | 157 | if (l > sb->s_blocksize) |
152 | goto out; | 158 | goto out; |
153 | 159 | ||
160 | dquot_initialize(dir); | ||
161 | |||
154 | inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO); | 162 | inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO); |
155 | err = PTR_ERR(inode); | 163 | err = PTR_ERR(inode); |
156 | if (IS_ERR(inode)) | 164 | if (IS_ERR(inode)) |
@@ -194,6 +202,8 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, | |||
194 | if (inode->i_nlink >= EXT2_LINK_MAX) | 202 | if (inode->i_nlink >= EXT2_LINK_MAX) |
195 | return -EMLINK; | 203 | return -EMLINK; |
196 | 204 | ||
205 | dquot_initialize(dir); | ||
206 | |||
197 | inode->i_ctime = CURRENT_TIME_SEC; | 207 | inode->i_ctime = CURRENT_TIME_SEC; |
198 | inode_inc_link_count(inode); | 208 | inode_inc_link_count(inode); |
199 | atomic_inc(&inode->i_count); | 209 | atomic_inc(&inode->i_count); |
@@ -216,6 +226,8 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
216 | if (dir->i_nlink >= EXT2_LINK_MAX) | 226 | if (dir->i_nlink >= EXT2_LINK_MAX) |
217 | goto out; | 227 | goto out; |
218 | 228 | ||
229 | dquot_initialize(dir); | ||
230 | |||
219 | inode_inc_link_count(dir); | 231 | inode_inc_link_count(dir); |
220 | 232 | ||
221 | inode = ext2_new_inode (dir, S_IFDIR | mode); | 233 | inode = ext2_new_inode (dir, S_IFDIR | mode); |
@@ -262,6 +274,8 @@ static int ext2_unlink(struct inode * dir, struct dentry *dentry) | |||
262 | struct page * page; | 274 | struct page * page; |
263 | int err = -ENOENT; | 275 | int err = -ENOENT; |
264 | 276 | ||
277 | dquot_initialize(dir); | ||
278 | |||
265 | de = ext2_find_entry (dir, &dentry->d_name, &page); | 279 | de = ext2_find_entry (dir, &dentry->d_name, &page); |
266 | if (!de) | 280 | if (!de) |
267 | goto out; | 281 | goto out; |
@@ -304,6 +318,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, | |||
304 | struct ext2_dir_entry_2 * old_de; | 318 | struct ext2_dir_entry_2 * old_de; |
305 | int err = -ENOENT; | 319 | int err = -ENOENT; |
306 | 320 | ||
321 | dquot_initialize(old_dir); | ||
322 | dquot_initialize(new_dir); | ||
323 | |||
307 | old_de = ext2_find_entry (old_dir, &old_dentry->d_name, &old_page); | 324 | old_de = ext2_find_entry (old_dir, &old_dentry->d_name, &old_page); |
308 | if (!old_de) | 325 | if (!old_de) |
309 | goto out; | 326 | goto out; |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index f9cb54a585c..42e4a303b67 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -194,6 +194,8 @@ static void destroy_inodecache(void) | |||
194 | static void ext2_clear_inode(struct inode *inode) | 194 | static void ext2_clear_inode(struct inode *inode) |
195 | { | 195 | { |
196 | struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info; | 196 | struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info; |
197 | |||
198 | dquot_drop(inode); | ||
197 | ext2_discard_reservation(inode); | 199 | ext2_discard_reservation(inode); |
198 | EXT2_I(inode)->i_block_alloc_info = NULL; | 200 | EXT2_I(inode)->i_block_alloc_info = NULL; |
199 | if (unlikely(rsv)) | 201 | if (unlikely(rsv)) |
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 904f00642f8..e44dc92609b 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c | |||
@@ -644,8 +644,8 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, | |||
644 | the inode. */ | 644 | the inode. */ |
645 | ea_bdebug(new_bh, "reusing block"); | 645 | ea_bdebug(new_bh, "reusing block"); |
646 | 646 | ||
647 | error = -EDQUOT; | 647 | error = dquot_alloc_block(inode, 1); |
648 | if (vfs_dq_alloc_block(inode, 1)) { | 648 | if (error) { |
649 | unlock_buffer(new_bh); | 649 | unlock_buffer(new_bh); |
650 | goto cleanup; | 650 | goto cleanup; |
651 | } | 651 | } |
@@ -702,7 +702,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, | |||
702 | * as if nothing happened and cleanup the unused block */ | 702 | * as if nothing happened and cleanup the unused block */ |
703 | if (error && error != -ENOSPC) { | 703 | if (error && error != -ENOSPC) { |
704 | if (new_bh && new_bh != old_bh) | 704 | if (new_bh && new_bh != old_bh) |
705 | vfs_dq_free_block(inode, 1); | 705 | dquot_free_block(inode, 1); |
706 | goto cleanup; | 706 | goto cleanup; |
707 | } | 707 | } |
708 | } else | 708 | } else |
@@ -734,7 +734,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, | |||
734 | le32_add_cpu(&HDR(old_bh)->h_refcount, -1); | 734 | le32_add_cpu(&HDR(old_bh)->h_refcount, -1); |
735 | if (ce) | 735 | if (ce) |
736 | mb_cache_entry_release(ce); | 736 | mb_cache_entry_release(ce); |
737 | vfs_dq_free_block(inode, 1); | 737 | dquot_free_block(inode, 1); |
738 | mark_buffer_dirty(old_bh); | 738 | mark_buffer_dirty(old_bh); |
739 | ea_bdebug(old_bh, "refcount now=%d", | 739 | ea_bdebug(old_bh, "refcount now=%d", |
740 | le32_to_cpu(HDR(old_bh)->h_refcount)); | 740 | le32_to_cpu(HDR(old_bh)->h_refcount)); |
@@ -797,7 +797,7 @@ ext2_xattr_delete_inode(struct inode *inode) | |||
797 | mark_buffer_dirty(bh); | 797 | mark_buffer_dirty(bh); |
798 | if (IS_SYNC(inode)) | 798 | if (IS_SYNC(inode)) |
799 | sync_dirty_buffer(bh); | 799 | sync_dirty_buffer(bh); |
800 | vfs_dq_free_block(inode, 1); | 800 | dquot_free_block(inode, 1); |
801 | } | 801 | } |
802 | EXT2_I(inode)->i_file_acl = 0; | 802 | EXT2_I(inode)->i_file_acl = 0; |
803 | 803 | ||