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
This commit is contained in:
@@ -171,6 +171,9 @@ void ext4_delete_inode(struct inode *inode)
|
||||
handle_t *handle;
|
||||
int err;
|
||||
|
||||
if (!is_bad_inode(inode))
|
||||
dquot_initialize(inode);
|
||||
|
||||
if (ext4_should_order_data(inode))
|
||||
ext4_begin_ordered_truncate(inode, 0);
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
@@ -1108,9 +1111,9 @@ void ext4_da_update_reserve_space(struct inode *inode,
|
||||
|
||||
/* Update quota subsystem */
|
||||
if (quota_claim) {
|
||||
vfs_dq_claim_block(inode, used);
|
||||
dquot_claim_block(inode, used);
|
||||
if (mdb_free)
|
||||
vfs_dq_release_reservation_block(inode, mdb_free);
|
||||
dquot_release_reservation_block(inode, mdb_free);
|
||||
} else {
|
||||
/*
|
||||
* We did fallocate with an offset that is already delayed
|
||||
@@ -1121,8 +1124,8 @@ void ext4_da_update_reserve_space(struct inode *inode,
|
||||
* that
|
||||
*/
|
||||
if (allocated_meta_blocks)
|
||||
vfs_dq_claim_block(inode, allocated_meta_blocks);
|
||||
vfs_dq_release_reservation_block(inode, mdb_free + used);
|
||||
dquot_claim_block(inode, allocated_meta_blocks);
|
||||
dquot_release_reservation_block(inode, mdb_free + used);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1857,6 +1860,7 @@ static int ext4_da_reserve_space(struct inode *inode, sector_t lblock)
|
||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
unsigned long md_needed, md_reserved;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* recalculate the amount of metadata blocks to reserve
|
||||
@@ -1875,11 +1879,12 @@ repeat:
|
||||
* later. Real quota accounting is done at pages writeout
|
||||
* time.
|
||||
*/
|
||||
if (vfs_dq_reserve_block(inode, md_needed + 1))
|
||||
return -EDQUOT;
|
||||
ret = dquot_reserve_block(inode, md_needed + 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ext4_claim_free_blocks(sbi, md_needed + 1)) {
|
||||
vfs_dq_release_reservation_block(inode, md_needed + 1);
|
||||
dquot_release_reservation_block(inode, md_needed + 1);
|
||||
if (ext4_should_retry_alloc(inode->i_sb, &retries)) {
|
||||
yield();
|
||||
goto repeat;
|
||||
@@ -1936,7 +1941,7 @@ static void ext4_da_release_space(struct inode *inode, int to_free)
|
||||
|
||||
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
||||
|
||||
vfs_dq_release_reservation_block(inode, to_free);
|
||||
dquot_release_reservation_block(inode, to_free);
|
||||
}
|
||||
|
||||
static void ext4_da_page_release_reservation(struct page *page,
|
||||
@@ -5418,6 +5423,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (ia_valid & ATTR_SIZE)
|
||||
dquot_initialize(inode);
|
||||
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
|
||||
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
|
||||
handle_t *handle;
|
||||
@@ -5430,7 +5437,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
error = PTR_ERR(handle);
|
||||
goto err_out;
|
||||
}
|
||||
error = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0;
|
||||
error = dquot_transfer(inode, attr);
|
||||
if (error) {
|
||||
ext4_journal_stop(handle);
|
||||
return error;
|
||||
@@ -5816,7 +5823,7 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode)
|
||||
* i_size has been changed by generic_commit_write() and we thus need
|
||||
* to include the updated inode in the current transaction.
|
||||
*
|
||||
* Also, vfs_dq_alloc_block() will always dirty the inode when blocks
|
||||
* Also, dquot_alloc_block() will always dirty the inode when blocks
|
||||
* are allocated to the file.
|
||||
*
|
||||
* If the inode is marked synchronous, we don't honour that here - doing
|
||||
|
Reference in New Issue
Block a user