zonefs: Convert to using invalidate_lock
Use invalidate_lock instead of zonefs' private i_mmap_sem. The intended purpose is exactly the same. CC: Damien Le Moal <damien.lemoal@wdc.com> CC: Johannes Thumshirn <jth@kernel.org> CC: <linux-fsdevel@vger.kernel.org> Acked-by: Damien Le Moal <damien.lemoal@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -462,7 +462,7 @@ static int zonefs_file_truncate(struct inode *inode, loff_t isize)
|
|||||||
inode_dio_wait(inode);
|
inode_dio_wait(inode);
|
||||||
|
|
||||||
/* Serialize against page faults */
|
/* Serialize against page faults */
|
||||||
down_write(&zi->i_mmap_sem);
|
filemap_invalidate_lock(inode->i_mapping);
|
||||||
|
|
||||||
/* Serialize against zonefs_iomap_begin() */
|
/* Serialize against zonefs_iomap_begin() */
|
||||||
mutex_lock(&zi->i_truncate_mutex);
|
mutex_lock(&zi->i_truncate_mutex);
|
||||||
@@ -500,7 +500,7 @@ static int zonefs_file_truncate(struct inode *inode, loff_t isize)
|
|||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
mutex_unlock(&zi->i_truncate_mutex);
|
mutex_unlock(&zi->i_truncate_mutex);
|
||||||
up_write(&zi->i_mmap_sem);
|
filemap_invalidate_unlock(inode->i_mapping);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -575,18 +575,6 @@ static int zonefs_file_fsync(struct file *file, loff_t start, loff_t end,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static vm_fault_t zonefs_filemap_fault(struct vm_fault *vmf)
|
|
||||||
{
|
|
||||||
struct zonefs_inode_info *zi = ZONEFS_I(file_inode(vmf->vma->vm_file));
|
|
||||||
vm_fault_t ret;
|
|
||||||
|
|
||||||
down_read(&zi->i_mmap_sem);
|
|
||||||
ret = filemap_fault(vmf);
|
|
||||||
up_read(&zi->i_mmap_sem);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static vm_fault_t zonefs_filemap_page_mkwrite(struct vm_fault *vmf)
|
static vm_fault_t zonefs_filemap_page_mkwrite(struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
struct inode *inode = file_inode(vmf->vma->vm_file);
|
struct inode *inode = file_inode(vmf->vma->vm_file);
|
||||||
@@ -607,16 +595,16 @@ static vm_fault_t zonefs_filemap_page_mkwrite(struct vm_fault *vmf)
|
|||||||
file_update_time(vmf->vma->vm_file);
|
file_update_time(vmf->vma->vm_file);
|
||||||
|
|
||||||
/* Serialize against truncates */
|
/* Serialize against truncates */
|
||||||
down_read(&zi->i_mmap_sem);
|
filemap_invalidate_lock_shared(inode->i_mapping);
|
||||||
ret = iomap_page_mkwrite(vmf, &zonefs_iomap_ops);
|
ret = iomap_page_mkwrite(vmf, &zonefs_iomap_ops);
|
||||||
up_read(&zi->i_mmap_sem);
|
filemap_invalidate_unlock_shared(inode->i_mapping);
|
||||||
|
|
||||||
sb_end_pagefault(inode->i_sb);
|
sb_end_pagefault(inode->i_sb);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct vm_operations_struct zonefs_file_vm_ops = {
|
static const struct vm_operations_struct zonefs_file_vm_ops = {
|
||||||
.fault = zonefs_filemap_fault,
|
.fault = filemap_fault,
|
||||||
.map_pages = filemap_map_pages,
|
.map_pages = filemap_map_pages,
|
||||||
.page_mkwrite = zonefs_filemap_page_mkwrite,
|
.page_mkwrite = zonefs_filemap_page_mkwrite,
|
||||||
};
|
};
|
||||||
@@ -1158,7 +1146,6 @@ static struct inode *zonefs_alloc_inode(struct super_block *sb)
|
|||||||
|
|
||||||
inode_init_once(&zi->i_vnode);
|
inode_init_once(&zi->i_vnode);
|
||||||
mutex_init(&zi->i_truncate_mutex);
|
mutex_init(&zi->i_truncate_mutex);
|
||||||
init_rwsem(&zi->i_mmap_sem);
|
|
||||||
zi->i_wr_refcnt = 0;
|
zi->i_wr_refcnt = 0;
|
||||||
|
|
||||||
return &zi->i_vnode;
|
return &zi->i_vnode;
|
||||||
|
|||||||
@@ -70,12 +70,11 @@ struct zonefs_inode_info {
|
|||||||
* and changes to the inode private data, and in particular changes to
|
* and changes to the inode private data, and in particular changes to
|
||||||
* a sequential file size on completion of direct IO writes.
|
* a sequential file size on completion of direct IO writes.
|
||||||
* Serialization of mmap read IOs with truncate and syscall IO
|
* Serialization of mmap read IOs with truncate and syscall IO
|
||||||
* operations is done with i_mmap_sem in addition to i_truncate_mutex.
|
* operations is done with invalidate_lock in addition to
|
||||||
* Only zonefs_seq_file_truncate() takes both lock (i_mmap_sem first,
|
* i_truncate_mutex. Only zonefs_seq_file_truncate() takes both lock
|
||||||
* i_truncate_mutex second).
|
* (invalidate_lock first, i_truncate_mutex second).
|
||||||
*/
|
*/
|
||||||
struct mutex i_truncate_mutex;
|
struct mutex i_truncate_mutex;
|
||||||
struct rw_semaphore i_mmap_sem;
|
|
||||||
|
|
||||||
/* guarded by i_truncate_mutex */
|
/* guarded by i_truncate_mutex */
|
||||||
unsigned int i_wr_refcnt;
|
unsigned int i_wr_refcnt;
|
||||||
|
|||||||
Reference in New Issue
Block a user