/* * Called to notify the module that there are no more references to * this file (i.e. no processes have it open). * * \note Not called when each file is closed. */ static int orangefs_file_release(struct inode *inode, struct file *file) { gossip_debug(GOSSIP_FILE_DEBUG, "orangefs_file_release: called on %pD\n", file); orangefs_flush_inode(inode); /* * remove all associated inode pages from the page cache and * readahead cache (if any); this forces an expensive refresh of * data for the next caller of mmap (or 'get_block' accesses) */ if (file_inode(file) && file_inode(file)->i_mapping && mapping_nrpages(&file_inode(file)->i_data)) { if (orangefs_features & ORANGEFS_FEATURE_READAHEAD) { gossip_debug(GOSSIP_INODE_DEBUG, "calling flush_racache on %pU\n", get_khandle_from_ino(inode)); flush_racache(inode); gossip_debug(GOSSIP_INODE_DEBUG, "flush_racache finished\n"); } truncate_inode_pages(file_inode(file)->i_mapping, 0); } return 0; }
/* * Called to notify the module that there are no more references to * this file (i.e. no processes have it open). * * \note Not called when each file is closed. */ static int orangefs_file_release(struct inode *inode, struct file *file) { gossip_debug(GOSSIP_FILE_DEBUG, "orangefs_file_release: called on %s\n", file->f_path.dentry->d_name.name); orangefs_flush_inode(inode); /* * remove all associated inode pages from the page cache and mmap * readahead cache (if any); this forces an expensive refresh of * data for the next caller of mmap (or 'get_block' accesses) */ if (file->f_path.dentry->d_inode && file->f_path.dentry->d_inode->i_mapping && mapping_nrpages(&file->f_path.dentry->d_inode->i_data)) truncate_inode_pages(file->f_path.dentry->d_inode->i_mapping, 0); return 0; }