b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 2) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 3) * linux/fs/sysv/file.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) * minix/file.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6) * Copyright (C) 1991, 1992 Linus Torvalds
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) * coh/file.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9) * Copyright (C) 1993 Pascal Haible, Bruno Haible
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 10) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) * sysv/file.c
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 12) * Copyright (C) 1993 Bruno Haible
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 14) * SystemV/Coherent regular file handling primitives
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 15) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 16)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 17) #include "sysv.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 18)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 19) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 20) * We have mostly NULLs here: the current defaults are OK for
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 21) * the coh filesystem.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 22) */
4b6f5d20b04dc (Arjan van de Ven 2006-03-28 01:56:42 -0800 23) const struct file_operations sysv_file_operations = {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 24) .llseek = generic_file_llseek,
aad4f8bb42af0 (Al Viro 2014-04-02 14:33:16 -0400 25) .read_iter = generic_file_read_iter,
8174202b34c30 (Al Viro 2014-04-03 03:17:43 -0400 26) .write_iter = generic_file_write_iter,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 27) .mmap = generic_file_mmap,
1b061d9247f71 (Christoph Hellwig 2010-05-26 17:53:41 +0200 28) .fsync = generic_file_fsync,
5ffc4ef45b3b0 (Jens Axboe 2007-06-01 11:49:19 +0200 29) .splice_read = generic_file_splice_read,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 30) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 31)
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 32) static int sysv_setattr(struct user_namespace *mnt_userns,
549c7297717c3 (Christian Brauner 2021-01-21 14:19:43 +0100 33) struct dentry *dentry, struct iattr *attr)
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 34) {
2b0143b5c986b (David Howells 2015-03-17 22:25:59 +0000 35) struct inode *inode = d_inode(dentry);
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 36) int error;
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 37)
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 38) error = setattr_prepare(&init_user_ns, dentry, attr);
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 39) if (error)
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 40) return error;
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 41)
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 42) if ((attr->ia_valid & ATTR_SIZE) &&
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 43) attr->ia_size != i_size_read(inode)) {
fa4d62ae17c74 (Marco Stornelli 2012-12-15 11:45:58 +0100 44) error = inode_newsize_ok(inode, attr->ia_size);
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 45) if (error)
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 46) return error;
fa4d62ae17c74 (Marco Stornelli 2012-12-15 11:45:58 +0100 47) truncate_setsize(inode, attr->ia_size);
fa4d62ae17c74 (Marco Stornelli 2012-12-15 11:45:58 +0100 48) sysv_truncate(inode);
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 49) }
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 50)
2f221d6f7b881 (Christian Brauner 2021-01-21 14:19:26 +0100 51) setattr_copy(&init_user_ns, inode, attr);
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 52) mark_inode_dirty(inode);
1025774ce411f (Christoph Hellwig 2010-06-04 11:30:02 +0200 53) return 0;
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 54) }
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 55)
c5ef1c42c51b1 (Arjan van de Ven 2007-02-12 00:55:40 -0800 56) const struct inode_operations sysv_file_inode_operations = {
d39aae9ec447d (Christoph Hellwig 2010-06-04 11:29:59 +0200 57) .setattr = sysv_setattr,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 58) .getattr = sysv_getattr,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 59) };