162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/fs/sysv/file.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  minix/file.c
662306a36Sopenharmony_ci *  Copyright (C) 1991, 1992  Linus Torvalds
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci *  coh/file.c
962306a36Sopenharmony_ci *  Copyright (C) 1993  Pascal Haible, Bruno Haible
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci *  sysv/file.c
1262306a36Sopenharmony_ci *  Copyright (C) 1993  Bruno Haible
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci *  SystemV/Coherent regular file handling primitives
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include "sysv.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * We have mostly NULLs here: the current defaults are OK for
2162306a36Sopenharmony_ci * the coh filesystem.
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ciconst struct file_operations sysv_file_operations = {
2462306a36Sopenharmony_ci	.llseek		= generic_file_llseek,
2562306a36Sopenharmony_ci	.read_iter	= generic_file_read_iter,
2662306a36Sopenharmony_ci	.write_iter	= generic_file_write_iter,
2762306a36Sopenharmony_ci	.mmap		= generic_file_mmap,
2862306a36Sopenharmony_ci	.fsync		= generic_file_fsync,
2962306a36Sopenharmony_ci	.splice_read	= filemap_splice_read,
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic int sysv_setattr(struct mnt_idmap *idmap,
3362306a36Sopenharmony_ci			struct dentry *dentry, struct iattr *attr)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	struct inode *inode = d_inode(dentry);
3662306a36Sopenharmony_ci	int error;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
3962306a36Sopenharmony_ci	if (error)
4062306a36Sopenharmony_ci		return error;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if ((attr->ia_valid & ATTR_SIZE) &&
4362306a36Sopenharmony_ci	    attr->ia_size != i_size_read(inode)) {
4462306a36Sopenharmony_ci		error = inode_newsize_ok(inode, attr->ia_size);
4562306a36Sopenharmony_ci		if (error)
4662306a36Sopenharmony_ci			return error;
4762306a36Sopenharmony_ci		truncate_setsize(inode, attr->ia_size);
4862306a36Sopenharmony_ci		sysv_truncate(inode);
4962306a36Sopenharmony_ci	}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	setattr_copy(&nop_mnt_idmap, inode, attr);
5262306a36Sopenharmony_ci	mark_inode_dirty(inode);
5362306a36Sopenharmony_ci	return 0;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ciconst struct inode_operations sysv_file_inode_operations = {
5762306a36Sopenharmony_ci	.setattr	= sysv_setattr,
5862306a36Sopenharmony_ci	.getattr	= sysv_getattr,
5962306a36Sopenharmony_ci};
60