xref: /openbmc/linux/fs/sysv/file.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *  linux/fs/sysv/file.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  *  minix/file.c
61da177e4SLinus Torvalds  *  Copyright (C) 1991, 1992  Linus Torvalds
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  *  coh/file.c
91da177e4SLinus Torvalds  *  Copyright (C) 1993  Pascal Haible, Bruno Haible
101da177e4SLinus Torvalds  *
111da177e4SLinus Torvalds  *  sysv/file.c
121da177e4SLinus Torvalds  *  Copyright (C) 1993  Bruno Haible
131da177e4SLinus Torvalds  *
141da177e4SLinus Torvalds  *  SystemV/Coherent regular file handling primitives
151da177e4SLinus Torvalds  */
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds #include "sysv.h"
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds /*
201da177e4SLinus Torvalds  * We have mostly NULLs here: the current defaults are OK for
211da177e4SLinus Torvalds  * the coh filesystem.
221da177e4SLinus Torvalds  */
234b6f5d20SArjan van de Ven const struct file_operations sysv_file_operations = {
241da177e4SLinus Torvalds 	.llseek		= generic_file_llseek,
25aad4f8bbSAl Viro 	.read_iter	= generic_file_read_iter,
268174202bSAl Viro 	.write_iter	= generic_file_write_iter,
271da177e4SLinus Torvalds 	.mmap		= generic_file_mmap,
281b061d92SChristoph Hellwig 	.fsync		= generic_file_fsync,
29*2cb1e089SDavid Howells 	.splice_read	= filemap_splice_read,
301da177e4SLinus Torvalds };
311da177e4SLinus Torvalds 
sysv_setattr(struct mnt_idmap * idmap,struct dentry * dentry,struct iattr * attr)32c1632a0fSChristian Brauner static int sysv_setattr(struct mnt_idmap *idmap,
33549c7297SChristian Brauner 			struct dentry *dentry, struct iattr *attr)
34d39aae9eSChristoph Hellwig {
352b0143b5SDavid Howells 	struct inode *inode = d_inode(dentry);
36d39aae9eSChristoph Hellwig 	int error;
37d39aae9eSChristoph Hellwig 
38c1632a0fSChristian Brauner 	error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
39d39aae9eSChristoph Hellwig 	if (error)
40d39aae9eSChristoph Hellwig 		return error;
411025774cSChristoph Hellwig 
421025774cSChristoph Hellwig 	if ((attr->ia_valid & ATTR_SIZE) &&
431025774cSChristoph Hellwig 	    attr->ia_size != i_size_read(inode)) {
44fa4d62aeSMarco Stornelli 		error = inode_newsize_ok(inode, attr->ia_size);
451025774cSChristoph Hellwig 		if (error)
461025774cSChristoph Hellwig 			return error;
47fa4d62aeSMarco Stornelli 		truncate_setsize(inode, attr->ia_size);
48fa4d62aeSMarco Stornelli 		sysv_truncate(inode);
491025774cSChristoph Hellwig 	}
501025774cSChristoph Hellwig 
51c1632a0fSChristian Brauner 	setattr_copy(&nop_mnt_idmap, inode, attr);
521025774cSChristoph Hellwig 	mark_inode_dirty(inode);
531025774cSChristoph Hellwig 	return 0;
54d39aae9eSChristoph Hellwig }
55d39aae9eSChristoph Hellwig 
56c5ef1c42SArjan van de Ven const struct inode_operations sysv_file_inode_operations = {
57d39aae9eSChristoph Hellwig 	.setattr	= sysv_setattr,
581da177e4SLinus Torvalds 	.getattr	= sysv_getattr,
591da177e4SLinus Torvalds };
60