diff options
Diffstat (limited to 'fs/ext3/inode.c')
-rw-r--r-- | fs/ext3/inode.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 6ae4ecf3ce40..74b432fa166b 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -2253,6 +2253,19 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode, | |||
2253 | } | 2253 | } |
2254 | } | 2254 | } |
2255 | 2255 | ||
2256 | int ext3_can_truncate(struct inode *inode) | ||
2257 | { | ||
2258 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | ||
2259 | return 0; | ||
2260 | if (S_ISREG(inode->i_mode)) | ||
2261 | return 1; | ||
2262 | if (S_ISDIR(inode->i_mode)) | ||
2263 | return 1; | ||
2264 | if (S_ISLNK(inode->i_mode)) | ||
2265 | return !ext3_inode_is_fast_symlink(inode); | ||
2266 | return 0; | ||
2267 | } | ||
2268 | |||
2256 | /* | 2269 | /* |
2257 | * ext3_truncate() | 2270 | * ext3_truncate() |
2258 | * | 2271 | * |
@@ -2297,12 +2310,7 @@ void ext3_truncate(struct inode *inode) | |||
2297 | unsigned blocksize = inode->i_sb->s_blocksize; | 2310 | unsigned blocksize = inode->i_sb->s_blocksize; |
2298 | struct page *page; | 2311 | struct page *page; |
2299 | 2312 | ||
2300 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || | 2313 | if (!ext3_can_truncate(inode)) |
2301 | S_ISLNK(inode->i_mode))) | ||
2302 | return; | ||
2303 | if (ext3_inode_is_fast_symlink(inode)) | ||
2304 | return; | ||
2305 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | ||
2306 | return; | 2314 | return; |
2307 | 2315 | ||
2308 | /* | 2316 | /* |