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