|
@@ -2305,6 +2305,19 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+int ext4_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 !ext4_inode_is_fast_symlink(inode);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* ext4_truncate()
|
|
|
*
|
|
@@ -2349,12 +2362,7 @@ void ext4_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 (ext4_inode_is_fast_symlink(inode))
|
|
|
- return;
|
|
|
- if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
|
|
|
+ if (!ext4_can_truncate(inode))
|
|
|
return;
|
|
|
|
|
|
/*
|