X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=fs%2Fopen.c;h=81b2d7c83addbcdd5e73514e8de1dbd4455d4756;hb=9dc34a67db46bbbac9ba8901578329549f6f711b;hp=daa324606a41f8141567cf4395d26458db76a924;hpb=e07af2626643293fa16df655979e7963250abc63;p=mirror_ubuntu-jammy-kernel.git diff --git a/fs/open.c b/fs/open.c index daa324606a41..81b2d7c83add 100644 --- a/fs/open.c +++ b/fs/open.c @@ -65,6 +65,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry, inode_unlock(dentry->d_inode); return ret; } +EXPORT_SYMBOL_GPL(do_truncate); long vfs_truncate(const struct path *path, loff_t length) { @@ -856,8 +857,20 @@ static int do_dentry_open(struct file *f, * of THPs into the page cache will fail. */ smp_mb(); - if (filemap_nr_thps(inode->i_mapping)) - truncate_pagecache(inode, 0); + if (filemap_nr_thps(inode->i_mapping)) { + struct address_space *mapping = inode->i_mapping; + + filemap_invalidate_lock(inode->i_mapping); + /* + * unmap_mapping_range just need to be called once + * here, because the private pages is not need to be + * unmapped mapping (e.g. data segment of dynamic + * shared libraries here). + */ + unmap_mapping_range(mapping, 0, 0, 0); + truncate_inode_pages(mapping, 0); + filemap_invalidate_unlock(inode->i_mapping); + } } return 0;