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/ext3/inode.c | |
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/ext3/inode.c')
-rw-r--r-- | fs/ext3/inode.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 7aca55fcc976..7f920b7263a4 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -196,6 +196,9 @@ void ext3_delete_inode (struct inode * inode) | |||
196 | { | 196 | { |
197 | handle_t *handle; | 197 | handle_t *handle; |
198 | 198 | ||
199 | if (!is_bad_inode(inode)) | ||
200 | dquot_initialize(inode); | ||
201 | |||
199 | truncate_inode_pages(&inode->i_data, 0); | 202 | truncate_inode_pages(&inode->i_data, 0); |
200 | 203 | ||
201 | if (is_bad_inode(inode)) | 204 | if (is_bad_inode(inode)) |
@@ -1378,7 +1381,7 @@ static int ext3_journalled_write_end(struct file *file, | |||
1378 | */ | 1381 | */ |
1379 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) | 1382 | if (pos + len > inode->i_size && ext3_can_truncate(inode)) |
1380 | ext3_orphan_add(handle, inode); | 1383 | ext3_orphan_add(handle, inode); |
1381 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; | 1384 | ext3_set_inode_state(inode, EXT3_STATE_JDATA); |
1382 | if (inode->i_size > EXT3_I(inode)->i_disksize) { | 1385 | if (inode->i_size > EXT3_I(inode)->i_disksize) { |
1383 | EXT3_I(inode)->i_disksize = inode->i_size; | 1386 | EXT3_I(inode)->i_disksize = inode->i_size; |
1384 | ret2 = ext3_mark_inode_dirty(handle, inode); | 1387 | ret2 = ext3_mark_inode_dirty(handle, inode); |
@@ -1417,7 +1420,7 @@ static sector_t ext3_bmap(struct address_space *mapping, sector_t block) | |||
1417 | journal_t *journal; | 1420 | journal_t *journal; |
1418 | int err; | 1421 | int err; |
1419 | 1422 | ||
1420 | if (EXT3_I(inode)->i_state & EXT3_STATE_JDATA) { | 1423 | if (ext3_test_inode_state(inode, EXT3_STATE_JDATA)) { |
1421 | /* | 1424 | /* |
1422 | * This is a REALLY heavyweight approach, but the use of | 1425 | * This is a REALLY heavyweight approach, but the use of |
1423 | * bmap on dirty files is expected to be extremely rare: | 1426 | * bmap on dirty files is expected to be extremely rare: |
@@ -1436,7 +1439,7 @@ static sector_t ext3_bmap(struct address_space *mapping, sector_t block) | |||
1436 | * everything they get. | 1439 | * everything they get. |
1437 | */ | 1440 | */ |
1438 | 1441 | ||
1439 | EXT3_I(inode)->i_state &= ~EXT3_STATE_JDATA; | 1442 | ext3_clear_inode_state(inode, EXT3_STATE_JDATA); |
1440 | journal = EXT3_JOURNAL(inode); | 1443 | journal = EXT3_JOURNAL(inode); |
1441 | journal_lock_updates(journal); | 1444 | journal_lock_updates(journal); |
1442 | err = journal_flush(journal); | 1445 | err = journal_flush(journal); |
@@ -1528,6 +1531,7 @@ static int ext3_ordered_writepage(struct page *page, | |||
1528 | int err; | 1531 | int err; |
1529 | 1532 | ||
1530 | J_ASSERT(PageLocked(page)); | 1533 | J_ASSERT(PageLocked(page)); |
1534 | WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1531 | 1535 | ||
1532 | /* | 1536 | /* |
1533 | * We give up here if we're reentered, because it might be for a | 1537 | * We give up here if we're reentered, because it might be for a |
@@ -1600,6 +1604,9 @@ static int ext3_writeback_writepage(struct page *page, | |||
1600 | int ret = 0; | 1604 | int ret = 0; |
1601 | int err; | 1605 | int err; |
1602 | 1606 | ||
1607 | J_ASSERT(PageLocked(page)); | ||
1608 | WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1609 | |||
1603 | if (ext3_journal_current_handle()) | 1610 | if (ext3_journal_current_handle()) |
1604 | goto out_fail; | 1611 | goto out_fail; |
1605 | 1612 | ||
@@ -1642,6 +1649,9 @@ static int ext3_journalled_writepage(struct page *page, | |||
1642 | int ret = 0; | 1649 | int ret = 0; |
1643 | int err; | 1650 | int err; |
1644 | 1651 | ||
1652 | J_ASSERT(PageLocked(page)); | ||
1653 | WARN_ON_ONCE(IS_RDONLY(inode)); | ||
1654 | |||
1645 | if (ext3_journal_current_handle()) | 1655 | if (ext3_journal_current_handle()) |
1646 | goto no_write; | 1656 | goto no_write; |
1647 | 1657 | ||
@@ -1670,7 +1680,7 @@ static int ext3_journalled_writepage(struct page *page, | |||
1670 | PAGE_CACHE_SIZE, NULL, write_end_fn); | 1680 | PAGE_CACHE_SIZE, NULL, write_end_fn); |
1671 | if (ret == 0) | 1681 | if (ret == 0) |
1672 | ret = err; | 1682 | ret = err; |
1673 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; | 1683 | ext3_set_inode_state(inode, EXT3_STATE_JDATA); |
1674 | unlock_page(page); | 1684 | unlock_page(page); |
1675 | } else { | 1685 | } else { |
1676 | /* | 1686 | /* |
@@ -1785,8 +1795,9 @@ retry: | |||
1785 | handle = ext3_journal_start(inode, 2); | 1795 | handle = ext3_journal_start(inode, 2); |
1786 | if (IS_ERR(handle)) { | 1796 | if (IS_ERR(handle)) { |
1787 | /* This is really bad luck. We've written the data | 1797 | /* This is really bad luck. We've written the data |
1788 | * but cannot extend i_size. Bail out and pretend | 1798 | * but cannot extend i_size. Truncate allocated blocks |
1789 | * the write failed... */ | 1799 | * and pretend the write failed... */ |
1800 | ext3_truncate(inode); | ||
1790 | ret = PTR_ERR(handle); | 1801 | ret = PTR_ERR(handle); |
1791 | goto out; | 1802 | goto out; |
1792 | } | 1803 | } |
@@ -2402,7 +2413,7 @@ void ext3_truncate(struct inode *inode) | |||
2402 | goto out_notrans; | 2413 | goto out_notrans; |
2403 | 2414 | ||
2404 | if (inode->i_size == 0 && ext3_should_writeback_data(inode)) | 2415 | if (inode->i_size == 0 && ext3_should_writeback_data(inode)) |
2405 | ei->i_state |= EXT3_STATE_FLUSH_ON_CLOSE; | 2416 | ext3_set_inode_state(inode, EXT3_STATE_FLUSH_ON_CLOSE); |
2406 | 2417 | ||
2407 | /* | 2418 | /* |
2408 | * We have to lock the EOF page here, because lock_page() nests | 2419 | * We have to lock the EOF page here, because lock_page() nests |
@@ -2721,7 +2732,7 @@ int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc) | |||
2721 | { | 2732 | { |
2722 | /* We have all inode data except xattrs in memory here. */ | 2733 | /* We have all inode data except xattrs in memory here. */ |
2723 | return __ext3_get_inode_loc(inode, iloc, | 2734 | return __ext3_get_inode_loc(inode, iloc, |
2724 | !(EXT3_I(inode)->i_state & EXT3_STATE_XATTR)); | 2735 | !ext3_test_inode_state(inode, EXT3_STATE_XATTR)); |
2725 | } | 2736 | } |
2726 | 2737 | ||
2727 | void ext3_set_inode_flags(struct inode *inode) | 2738 | void ext3_set_inode_flags(struct inode *inode) |
@@ -2893,7 +2904,7 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino) | |||
2893 | EXT3_GOOD_OLD_INODE_SIZE + | 2904 | EXT3_GOOD_OLD_INODE_SIZE + |
2894 | ei->i_extra_isize; | 2905 | ei->i_extra_isize; |
2895 | if (*magic == cpu_to_le32(EXT3_XATTR_MAGIC)) | 2906 | if (*magic == cpu_to_le32(EXT3_XATTR_MAGIC)) |
2896 | ei->i_state |= EXT3_STATE_XATTR; | 2907 | ext3_set_inode_state(inode, EXT3_STATE_XATTR); |
2897 | } | 2908 | } |
2898 | } else | 2909 | } else |
2899 | ei->i_extra_isize = 0; | 2910 | ei->i_extra_isize = 0; |
@@ -2955,7 +2966,7 @@ again: | |||
2955 | 2966 | ||
2956 | /* For fields not not tracking in the in-memory inode, | 2967 | /* For fields not not tracking in the in-memory inode, |
2957 | * initialise them to zero for new inodes. */ | 2968 | * initialise them to zero for new inodes. */ |
2958 | if (ei->i_state & EXT3_STATE_NEW) | 2969 | if (ext3_test_inode_state(inode, EXT3_STATE_NEW)) |
2959 | memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size); | 2970 | memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size); |
2960 | 2971 | ||
2961 | ext3_get_inode_flags(ei); | 2972 | ext3_get_inode_flags(ei); |
@@ -3052,7 +3063,7 @@ again: | |||
3052 | rc = ext3_journal_dirty_metadata(handle, bh); | 3063 | rc = ext3_journal_dirty_metadata(handle, bh); |
3053 | if (!err) | 3064 | if (!err) |
3054 | err = rc; | 3065 | err = rc; |
3055 | ei->i_state &= ~EXT3_STATE_NEW; | 3066 | ext3_clear_inode_state(inode, EXT3_STATE_NEW); |
3056 | 3067 | ||
3057 | atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid); | 3068 | atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid); |
3058 | out_brelse: | 3069 | out_brelse: |
@@ -3140,6 +3151,8 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) | |||
3140 | if (error) | 3151 | if (error) |
3141 | return error; | 3152 | return error; |
3142 | 3153 | ||
3154 | if (ia_valid & ATTR_SIZE) | ||
3155 | dquot_initialize(inode); | ||
3143 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 3156 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || |
3144 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 3157 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { |
3145 | handle_t *handle; | 3158 | handle_t *handle; |
@@ -3152,7 +3165,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) | |||
3152 | error = PTR_ERR(handle); | 3165 | error = PTR_ERR(handle); |
3153 | goto err_out; | 3166 | goto err_out; |
3154 | } | 3167 | } |
3155 | error = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0; | 3168 | error = dquot_transfer(inode, attr); |
3156 | if (error) { | 3169 | if (error) { |
3157 | ext3_journal_stop(handle); | 3170 | ext3_journal_stop(handle); |
3158 | return error; | 3171 | return error; |
@@ -3237,7 +3250,7 @@ static int ext3_writepage_trans_blocks(struct inode *inode) | |||
3237 | ret = 2 * (bpp + indirects) + 2; | 3250 | ret = 2 * (bpp + indirects) + 2; |
3238 | 3251 | ||
3239 | #ifdef CONFIG_QUOTA | 3252 | #ifdef CONFIG_QUOTA |
3240 | /* We know that structure was already allocated during vfs_dq_init so | 3253 | /* We know that structure was already allocated during dquot_initialize so |
3241 | * we will be updating only the data blocks + inodes */ | 3254 | * we will be updating only the data blocks + inodes */ |
3242 | ret += EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); | 3255 | ret += EXT3_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); |
3243 | #endif | 3256 | #endif |
@@ -3328,7 +3341,7 @@ int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode) | |||
3328 | * i_size has been changed by generic_commit_write() and we thus need | 3341 | * i_size has been changed by generic_commit_write() and we thus need |
3329 | * to include the updated inode in the current transaction. | 3342 | * to include the updated inode in the current transaction. |
3330 | * | 3343 | * |
3331 | * Also, vfs_dq_alloc_space() will always dirty the inode when blocks | 3344 | * Also, dquot_alloc_space() will always dirty the inode when blocks |
3332 | * are allocated to the file. | 3345 | * are allocated to the file. |
3333 | * | 3346 | * |
3334 | * If the inode is marked synchronous, we don't honour that here - doing | 3347 | * If the inode is marked synchronous, we don't honour that here - doing |