Commit 1f0d4ab0 authored by Mike Snitzer's avatar Mike Snitzer Committed by Anna Schumaker
Browse files

NFS: add basic STATX_DIOALIGN and STATX_DIO_READ_ALIGN support



NFS doesn't have DIO alignment constraints, so have NFS respond with
accommodating DIO alignment attributes (rather than plumb in GETATTR
support for STATX_DIOALIGN and STATX_DIO_READ_ALIGN).

The most coarse-grained dio_offset_align is the most accommodating
(e.g. PAGE_SIZE, in future larger may be supported).

Now that NFS has support, NFS reexport will now handle unaligned DIO
(NFSD's NFSD_IO_DIRECT support requires the underlying filesystem
support STATX_DIOALIGN and/or STATX_DIO_READ_ALIGN).

Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
parent cda94457
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1073,6 +1073,21 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
	if (S_ISDIR(inode->i_mode))
		stat->blksize = NFS_SERVER(inode)->dtsize;
	stat->btime = NFS_I(inode)->btime;

	/* Special handling for STATX_DIOALIGN and STATX_DIO_READ_ALIGN
	 * - NFS doesn't have DIO alignment constraints, avoid getting
	 *   these DIO attrs from remote and just respond with most
	 *   accommodating limits (so client will issue supported DIO).
	 * - this is unintuitive, but the most coarse-grained
	 *   dio_offset_align is the most accommodating.
	 */
	if ((request_mask & (STATX_DIOALIGN | STATX_DIO_READ_ALIGN)) &&
	    S_ISREG(inode->i_mode)) {
		stat->result_mask |= STATX_DIOALIGN | STATX_DIO_READ_ALIGN;
		stat->dio_mem_align = 4; /* 4-byte alignment */
		stat->dio_offset_align = PAGE_SIZE;
		stat->dio_read_offset_align = stat->dio_offset_align;
	}
out:
	trace_nfs_getattr_exit(inode, err);
	return err;