Przeglądaj źródła

ext4: fix DAX write locking

Unlike O_DIRECT DAX is not an optional opt-in feature selected by the
application, so we'll have to provide the traditional synchronіzation
of overlapping writes as we do for buffered writes.

This was broken historically for DAX, but got fixed for ext2 and XFS
as part of the iomap conversion.  Fix up ext4 as well.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Christoph Hellwig 8 lat temu
rodzic
commit
ff5462e39c
1 zmienionych plików z 1 dodań i 9 usunięć
  1. 1 9
      fs/ext4/file.c

+ 1 - 9
fs/ext4/file.c

@@ -178,7 +178,6 @@ ext4_dax_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
 {
 	struct inode *inode = file_inode(iocb->ki_filp);
 	struct inode *inode = file_inode(iocb->ki_filp);
 	ssize_t ret;
 	ssize_t ret;
-	bool overwrite = false;
 
 
 	inode_lock(inode);
 	inode_lock(inode);
 	ret = ext4_write_checks(iocb, from);
 	ret = ext4_write_checks(iocb, from);
@@ -191,16 +190,9 @@ ext4_dax_write_iter(struct kiocb *iocb, struct iov_iter *from)
 	if (ret)
 	if (ret)
 		goto out;
 		goto out;
 
 
-	if (ext4_overwrite_io(inode, iocb->ki_pos, iov_iter_count(from))) {
-		overwrite = true;
-		downgrade_write(&inode->i_rwsem);
-	}
 	ret = dax_iomap_rw(iocb, from, &ext4_iomap_ops);
 	ret = dax_iomap_rw(iocb, from, &ext4_iomap_ops);
 out:
 out:
-	if (!overwrite)
-		inode_unlock(inode);
-	else
-		inode_unlock_shared(inode);
+	inode_unlock(inode);
 	if (ret > 0)
 	if (ret > 0)
 		ret = generic_write_sync(iocb, ret);
 		ret = generic_write_sync(iocb, ret);
 	return ret;
 	return ret;