diff options
Diffstat (limited to 'fs/ext2/inode.c')
-rw-r--r-- | fs/ext2/inode.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index ade634076d0a..fc13cc119aad 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -41,6 +41,8 @@ MODULE_AUTHOR("Remy Card and others"); | |||
41 | MODULE_DESCRIPTION("Second Extended Filesystem"); | 41 | MODULE_DESCRIPTION("Second Extended Filesystem"); |
42 | MODULE_LICENSE("GPL"); | 42 | MODULE_LICENSE("GPL"); |
43 | 43 | ||
44 | static int __ext2_write_inode(struct inode *inode, int do_sync); | ||
45 | |||
44 | /* | 46 | /* |
45 | * Test whether an inode is a fast symlink. | 47 | * Test whether an inode is a fast symlink. |
46 | */ | 48 | */ |
@@ -58,13 +60,15 @@ static inline int ext2_inode_is_fast_symlink(struct inode *inode) | |||
58 | */ | 60 | */ |
59 | void ext2_delete_inode (struct inode * inode) | 61 | void ext2_delete_inode (struct inode * inode) |
60 | { | 62 | { |
63 | if (!is_bad_inode(inode)) | ||
64 | dquot_initialize(inode); | ||
61 | truncate_inode_pages(&inode->i_data, 0); | 65 | truncate_inode_pages(&inode->i_data, 0); |
62 | 66 | ||
63 | if (is_bad_inode(inode)) | 67 | if (is_bad_inode(inode)) |
64 | goto no_delete; | 68 | goto no_delete; |
65 | EXT2_I(inode)->i_dtime = get_seconds(); | 69 | EXT2_I(inode)->i_dtime = get_seconds(); |
66 | mark_inode_dirty(inode); | 70 | mark_inode_dirty(inode); |
67 | ext2_write_inode(inode, inode_needs_sync(inode)); | 71 | __ext2_write_inode(inode, inode_needs_sync(inode)); |
68 | 72 | ||
69 | inode->i_size = 0; | 73 | inode->i_size = 0; |
70 | if (inode->i_blocks) | 74 | if (inode->i_blocks) |
@@ -137,7 +141,8 @@ static int ext2_block_to_path(struct inode *inode, | |||
137 | int final = 0; | 141 | int final = 0; |
138 | 142 | ||
139 | if (i_block < 0) { | 143 | if (i_block < 0) { |
140 | ext2_warning (inode->i_sb, "ext2_block_to_path", "block < 0"); | 144 | ext2_msg(inode->i_sb, KERN_WARNING, |
145 | "warning: %s: block < 0", __func__); | ||
141 | } else if (i_block < direct_blocks) { | 146 | } else if (i_block < direct_blocks) { |
142 | offsets[n++] = i_block; | 147 | offsets[n++] = i_block; |
143 | final = direct_blocks; | 148 | final = direct_blocks; |
@@ -157,7 +162,8 @@ static int ext2_block_to_path(struct inode *inode, | |||
157 | offsets[n++] = i_block & (ptrs - 1); | 162 | offsets[n++] = i_block & (ptrs - 1); |
158 | final = ptrs; | 163 | final = ptrs; |
159 | } else { | 164 | } else { |
160 | ext2_warning (inode->i_sb, "ext2_block_to_path", "block > big"); | 165 | ext2_msg(inode->i_sb, KERN_WARNING, |
166 | "warning: %s: block is too big", __func__); | ||
161 | } | 167 | } |
162 | if (boundary) | 168 | if (boundary) |
163 | *boundary = final - 1 - (i_block & (ptrs - 1)); | 169 | *boundary = final - 1 - (i_block & (ptrs - 1)); |
@@ -1333,7 +1339,7 @@ bad_inode: | |||
1333 | return ERR_PTR(ret); | 1339 | return ERR_PTR(ret); |
1334 | } | 1340 | } |
1335 | 1341 | ||
1336 | int ext2_write_inode(struct inode *inode, int do_sync) | 1342 | static int __ext2_write_inode(struct inode *inode, int do_sync) |
1337 | { | 1343 | { |
1338 | struct ext2_inode_info *ei = EXT2_I(inode); | 1344 | struct ext2_inode_info *ei = EXT2_I(inode); |
1339 | struct super_block *sb = inode->i_sb; | 1345 | struct super_block *sb = inode->i_sb; |
@@ -1438,6 +1444,11 @@ int ext2_write_inode(struct inode *inode, int do_sync) | |||
1438 | return err; | 1444 | return err; |
1439 | } | 1445 | } |
1440 | 1446 | ||
1447 | int ext2_write_inode(struct inode *inode, struct writeback_control *wbc) | ||
1448 | { | ||
1449 | return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); | ||
1450 | } | ||
1451 | |||
1441 | int ext2_sync_inode(struct inode *inode) | 1452 | int ext2_sync_inode(struct inode *inode) |
1442 | { | 1453 | { |
1443 | struct writeback_control wbc = { | 1454 | struct writeback_control wbc = { |
@@ -1455,9 +1466,12 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) | |||
1455 | error = inode_change_ok(inode, iattr); | 1466 | error = inode_change_ok(inode, iattr); |
1456 | if (error) | 1467 | if (error) |
1457 | return error; | 1468 | return error; |
1469 | |||
1470 | if (iattr->ia_valid & ATTR_SIZE) | ||
1471 | dquot_initialize(inode); | ||
1458 | 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) || |
1459 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { | 1473 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { |
1460 | error = vfs_dq_transfer(inode, iattr) ? -EDQUOT : 0; | 1474 | error = dquot_transfer(inode, iattr); |
1461 | if (error) | 1475 | if (error) |
1462 | return error; | 1476 | return error; |
1463 | } | 1477 | } |