Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 562c72aa authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro
Browse files

fs: move inode_dio_wait calls into ->setattr



Let filesystems handle waiting for direct I/O requests themselves instead
of doing it beforehand.  This means filesystem-specific locks to prevent
new dio referenes from appearing can be held.  This is important to allow
generalizing i_dio_count to non-DIO_LOCKING filesystems.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 11b80f45
Loading
Loading
Loading
Loading
+0 −3
Original line number Original line Diff line number Diff line
@@ -232,9 +232,6 @@ int notify_change(struct dentry * dentry, struct iattr * attr)
	if (error)
	if (error)
		return error;
		return error;


	if (ia_valid & ATTR_SIZE)
		inode_dio_wait(inode);

	if (inode->i_op->setattr)
	if (inode->i_op->setattr)
		error = inode->i_op->setattr(dentry, attr);
		error = inode->i_op->setattr(dentry, attr);
	else
	else
+2 −0
Original line number Original line Diff line number Diff line
@@ -1184,6 +1184,8 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
	if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
	if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
		return -EPERM;
		return -EPERM;


	inode_dio_wait(inode);

	if (mapping_is_xip(inode->i_mapping))
	if (mapping_is_xip(inode->i_mapping))
		error = xip_truncate_page(inode->i_mapping, newsize);
		error = xip_truncate_page(inode->i_mapping, newsize);
	else if (test_opt(inode->i_sb, NOBH))
	else if (test_opt(inode->i_sb, NOBH))
+3 −0
Original line number Original line Diff line number Diff line
@@ -3216,6 +3216,9 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)
		ext3_journal_stop(handle);
		ext3_journal_stop(handle);
	}
	}


	if (attr->ia_valid & ATTR_SIZE)
		inode_dio_wait(inode);

	if (S_ISREG(inode->i_mode) &&
	if (S_ISREG(inode->i_mode) &&
	    attr->ia_valid & ATTR_SIZE && attr->ia_size < inode->i_size) {
	    attr->ia_valid & ATTR_SIZE && attr->ia_size < inode->i_size) {
		handle_t *handle;
		handle_t *handle;
+2 −0
Original line number Original line Diff line number Diff line
@@ -5351,6 +5351,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
	}
	}


	if (attr->ia_valid & ATTR_SIZE) {
	if (attr->ia_valid & ATTR_SIZE) {
		inode_dio_wait(inode);

		if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
		if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
			struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
			struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);


+2 −0
Original line number Original line Diff line number Diff line
@@ -397,6 +397,8 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
	 * sequence.
	 * sequence.
	 */
	 */
	if (attr->ia_valid & ATTR_SIZE) {
	if (attr->ia_valid & ATTR_SIZE) {
		inode_dio_wait(inode);

		if (attr->ia_size > inode->i_size) {
		if (attr->ia_size > inode->i_size) {
			error = fat_cont_expand(inode, attr->ia_size);
			error = fat_cont_expand(inode, attr->ia_size);
			if (error || attr->ia_valid == ATTR_SIZE)
			if (error || attr->ia_valid == ATTR_SIZE)
Loading