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

Commit face1502 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd: use vfs_fsync_range(), not O_SYNC, for stable writes



NFSv4 shares the same struct file across multiple writes.  (And we'd
like NFSv2 and NFSv3 to do that as well some day.)

So setting O_SYNC on the struct file as a way to request a synchronous
write doesn't work.

Instead, do a vfs_fsync_range() in that case.

Reported-by: default avatarPeter Staubach <pstaubach@exagrid.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent fae5096a
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -1024,11 +1024,6 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,

	if (!EX_ISSYNC(exp))
		stable = 0;
	if (stable && !use_wgather) {
		spin_lock(&file->f_lock);
		file->f_flags |= O_SYNC;
		spin_unlock(&file->f_lock);
	}

	/* Write the data. */
	oldfs = get_fs(); set_fs(KERNEL_DS);
@@ -1044,8 +1039,12 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
	if (inode->i_mode & (S_ISUID | S_ISGID))
		kill_suid(dentry);

	if (stable && use_wgather)
	if (stable) {
		if (use_wgather)
			host_err = wait_for_concurrent_writes(file);
		else
			host_err = vfs_fsync_range(file, offset, offset+*cnt, 0);
	}

out_nfserr:
	dprintk("nfsd: write complete host_err=%d\n", host_err);