|
@@ -2253,6 +2253,19 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+int ext3_can_truncate(struct inode *inode)
|
|
|
+{
|
|
|
+ if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
|
|
|
+ return 0;
|
|
|
+ if (S_ISREG(inode->i_mode))
|
|
|
+ return 1;
|
|
|
+ if (S_ISDIR(inode->i_mode))
|
|
|
+ return 1;
|
|
|
+ if (S_ISLNK(inode->i_mode))
|
|
|
+ return !ext3_inode_is_fast_symlink(inode);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* ext3_truncate()
|
|
|
*
|
|
@@ -2297,12 +2310,7 @@ void ext3_truncate(struct inode *inode)
|
|
|
unsigned blocksize = inode->i_sb->s_blocksize;
|
|
|
struct page *page;
|
|
|
|
|
|
- if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
|
|
|
- S_ISLNK(inode->i_mode)))
|
|
|
- return;
|
|
|
- if (ext3_inode_is_fast_symlink(inode))
|
|
|
- return;
|
|
|
- if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
|
|
|
+ if (!ext3_can_truncate(inode))
|
|
|
return;
|
|
|
|
|
|
/*
|