ext2: Convert to using invalidate_lock
Ext2 has its private dax_sem used for synchronizing page faults and truncation. Use mapping->invalidate_lock instead as it is meant for this purpose. CC: <linux-ext4@vger.kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
d4f5258eae
commit
70f3bad8c3
|
@ -667,9 +667,6 @@ struct ext2_inode_info {
|
||||||
struct rw_semaphore xattr_sem;
|
struct rw_semaphore xattr_sem;
|
||||||
#endif
|
#endif
|
||||||
rwlock_t i_meta_lock;
|
rwlock_t i_meta_lock;
|
||||||
#ifdef CONFIG_FS_DAX
|
|
||||||
struct rw_semaphore dax_sem;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* truncate_mutex is for serialising ext2_truncate() against
|
* truncate_mutex is for serialising ext2_truncate() against
|
||||||
|
@ -685,14 +682,6 @@ struct ext2_inode_info {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_FS_DAX
|
|
||||||
#define dax_sem_down_write(ext2_inode) down_write(&(ext2_inode)->dax_sem)
|
|
||||||
#define dax_sem_up_write(ext2_inode) up_write(&(ext2_inode)->dax_sem)
|
|
||||||
#else
|
|
||||||
#define dax_sem_down_write(ext2_inode)
|
|
||||||
#define dax_sem_up_write(ext2_inode)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inode dynamic state flags
|
* Inode dynamic state flags
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -81,7 +81,7 @@ out_unlock:
|
||||||
*
|
*
|
||||||
* mmap_lock (MM)
|
* mmap_lock (MM)
|
||||||
* sb_start_pagefault (vfs, freeze)
|
* sb_start_pagefault (vfs, freeze)
|
||||||
* ext2_inode_info->dax_sem
|
* address_space->invalidate_lock
|
||||||
* address_space->i_mmap_rwsem or page_lock (mutually exclusive in DAX)
|
* address_space->i_mmap_rwsem or page_lock (mutually exclusive in DAX)
|
||||||
* ext2_inode_info->truncate_mutex
|
* ext2_inode_info->truncate_mutex
|
||||||
*
|
*
|
||||||
|
@ -91,7 +91,6 @@ out_unlock:
|
||||||
static vm_fault_t ext2_dax_fault(struct vm_fault *vmf)
|
static vm_fault_t ext2_dax_fault(struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
struct inode *inode = file_inode(vmf->vma->vm_file);
|
struct inode *inode = file_inode(vmf->vma->vm_file);
|
||||||
struct ext2_inode_info *ei = EXT2_I(inode);
|
|
||||||
vm_fault_t ret;
|
vm_fault_t ret;
|
||||||
bool write = (vmf->flags & FAULT_FLAG_WRITE) &&
|
bool write = (vmf->flags & FAULT_FLAG_WRITE) &&
|
||||||
(vmf->vma->vm_flags & VM_SHARED);
|
(vmf->vma->vm_flags & VM_SHARED);
|
||||||
|
@ -100,11 +99,11 @@ static vm_fault_t ext2_dax_fault(struct vm_fault *vmf)
|
||||||
sb_start_pagefault(inode->i_sb);
|
sb_start_pagefault(inode->i_sb);
|
||||||
file_update_time(vmf->vma->vm_file);
|
file_update_time(vmf->vma->vm_file);
|
||||||
}
|
}
|
||||||
down_read(&ei->dax_sem);
|
filemap_invalidate_lock_shared(inode->i_mapping);
|
||||||
|
|
||||||
ret = dax_iomap_fault(vmf, PE_SIZE_PTE, NULL, NULL, &ext2_iomap_ops);
|
ret = dax_iomap_fault(vmf, PE_SIZE_PTE, NULL, NULL, &ext2_iomap_ops);
|
||||||
|
|
||||||
up_read(&ei->dax_sem);
|
filemap_invalidate_unlock_shared(inode->i_mapping);
|
||||||
if (write)
|
if (write)
|
||||||
sb_end_pagefault(inode->i_sb);
|
sb_end_pagefault(inode->i_sb);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1177,7 +1177,7 @@ static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int de
|
||||||
ext2_free_data(inode, p, q);
|
ext2_free_data(inode, p, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dax_sem must be held when calling this function */
|
/* mapping->invalidate_lock must be held when calling this function */
|
||||||
static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
||||||
{
|
{
|
||||||
__le32 *i_data = EXT2_I(inode)->i_data;
|
__le32 *i_data = EXT2_I(inode)->i_data;
|
||||||
|
@ -1194,7 +1194,7 @@ static void __ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
||||||
iblock = (offset + blocksize-1) >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
|
iblock = (offset + blocksize-1) >> EXT2_BLOCK_SIZE_BITS(inode->i_sb);
|
||||||
|
|
||||||
#ifdef CONFIG_FS_DAX
|
#ifdef CONFIG_FS_DAX
|
||||||
WARN_ON(!rwsem_is_locked(&ei->dax_sem));
|
WARN_ON(!rwsem_is_locked(&inode->i_mapping->invalidate_lock));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
n = ext2_block_to_path(inode, iblock, offsets, NULL);
|
n = ext2_block_to_path(inode, iblock, offsets, NULL);
|
||||||
|
@ -1276,9 +1276,9 @@ static void ext2_truncate_blocks(struct inode *inode, loff_t offset)
|
||||||
if (ext2_inode_is_fast_symlink(inode))
|
if (ext2_inode_is_fast_symlink(inode))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dax_sem_down_write(EXT2_I(inode));
|
filemap_invalidate_lock(inode->i_mapping);
|
||||||
__ext2_truncate_blocks(inode, offset);
|
__ext2_truncate_blocks(inode, offset);
|
||||||
dax_sem_up_write(EXT2_I(inode));
|
filemap_invalidate_unlock(inode->i_mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext2_setsize(struct inode *inode, loff_t newsize)
|
static int ext2_setsize(struct inode *inode, loff_t newsize)
|
||||||
|
@ -1308,10 +1308,10 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
dax_sem_down_write(EXT2_I(inode));
|
filemap_invalidate_lock(inode->i_mapping);
|
||||||
truncate_setsize(inode, newsize);
|
truncate_setsize(inode, newsize);
|
||||||
__ext2_truncate_blocks(inode, newsize);
|
__ext2_truncate_blocks(inode, newsize);
|
||||||
dax_sem_up_write(EXT2_I(inode));
|
filemap_invalidate_unlock(inode->i_mapping);
|
||||||
|
|
||||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||||
if (inode_needs_sync(inode)) {
|
if (inode_needs_sync(inode)) {
|
||||||
|
|
|
@ -206,9 +206,6 @@ static void init_once(void *foo)
|
||||||
init_rwsem(&ei->xattr_sem);
|
init_rwsem(&ei->xattr_sem);
|
||||||
#endif
|
#endif
|
||||||
mutex_init(&ei->truncate_mutex);
|
mutex_init(&ei->truncate_mutex);
|
||||||
#ifdef CONFIG_FS_DAX
|
|
||||||
init_rwsem(&ei->dax_sem);
|
|
||||||
#endif
|
|
||||||
inode_init_once(&ei->vfs_inode);
|
inode_init_once(&ei->vfs_inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue