/** * Dual to ll_vm_open(). */ static void ll_vm_close(struct vm_area_struct *vma) { struct inode *inode = file_inode(vma->vm_file); struct ccc_object *vob = cl_inode2ccc(inode); LASSERT(vma->vm_file); atomic_dec(&vob->cob_mmap_cnt); LASSERT(atomic_read(&vob->cob_mmap_cnt) >= 0); }
/* * Check whether file has possible unwriten pages. * * \retval 1 file is mmap-ed or has dirty pages * 0 otherwise */ blkcnt_t dirty_cnt(struct inode *inode) { blkcnt_t cnt = 0; struct ccc_object *vob = cl_inode2ccc(inode); void *results[1]; if (inode->i_mapping != NULL) cnt += radix_tree_gang_lookup_tag(&inode->i_mapping->page_tree, results, 0, 1, PAGECACHE_TAG_DIRTY); if (cnt == 0 && atomic_read(&vob->cob_mmap_cnt) > 0) cnt = 1; return (cnt > 0) ? 1 : 0; }