Commit 70f3bad8 authored by Jan Kara's avatar Jan Kara

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent d4f5258e
...@@ -667,9 +667,6 @@ struct ext2_inode_info { ...@@ -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 { ...@@ -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 @@ static ssize_t ext2_dax_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -81,7 +81,7 @@ static ssize_t ext2_dax_write_iter(struct kiocb *iocb, struct iov_iter *from)
* *
* 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 @@ static ssize_t ext2_dax_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -91,7 +91,6 @@ static ssize_t ext2_dax_write_iter(struct kiocb *iocb, struct iov_iter *from)
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) ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment