diff options
Diffstat (limited to 'fs/attr.c')
-rw-r--r-- | fs/attr.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/attr.c b/fs/attr.c index 1fcfdcc5b367..7480d5dd22c0 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -134,6 +134,14 @@ EXPORT_SYMBOL(setattr_prepare); */ int inode_newsize_ok(const struct inode *inode, loff_t offset) { + /* + * Truncation of in-use swapfiles is disallowed - the kernel owns the + * disk space now. We must prevent subsequent swapout to scribble on + * the now-freed blocks. + */ + if (IS_SWAPFILE(inode) && inode->i_size != offset) + return -ETXTBSY; + if (inode->i_size < offset) { unsigned long limit; @@ -142,14 +150,6 @@ int inode_newsize_ok(const struct inode *inode, loff_t offset) goto out_sig; if (offset > inode->i_sb->s_maxbytes) goto out_big; - } else { - /* - * truncation of in-use swapfiles is disallowed - it would - * cause subsequent swapout to scribble on the now-freed - * blocks. - */ - if (IS_SWAPFILE(inode)) - return -ETXTBSY; } return 0; |