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) * Inode operations for Coda filesystem
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4) * Original version: (C) 1996 P. Braam and M. Callahan
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) * Rewritten for Linux 2.1. (C) 1997 Carnegie Mellon University
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6) *
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7) * Carnegie Mellon encourages users to contribute improvements to
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) * the Coda project. Contact Peter Braam (coda@cs.cmu.edu).
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 10)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) #include <linux/types.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 12) #include <linux/kernel.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) #include <linux/time.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 14) #include <linux/fs.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 15) #include <linux/stat.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 16) #include <linux/errno.h>
834b46c37a290 (Fabian Frederick 2014-08-08 14:20:33 -0700 17) #include <linux/uaccess.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 18) #include <linux/string.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 19)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 20) #include <linux/coda.h>
8fc8b9df83138 (David Howells 2019-07-16 16:28:47 -0700 21) #include "coda_psdev.h"
31a203df9c109 (Al Viro 2011-01-12 16:36:09 -0500 22) #include "coda_linux.h"
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 23)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 24) /* initialize the debugging variables */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 25) int coda_fake_statfs;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 26)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 27) /* print a fid */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 28) char * coda_f2s(struct CodaFid *f)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 29) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 30) static char s[60];
de0ca06a99c33 (Adrian Bunk 2008-07-25 01:46:34 -0700 31)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 32) sprintf(s, "(%08x.%08x.%08x.%08x)", f->opaque[0], f->opaque[1], f->opaque[2], f->opaque[3]);
de0ca06a99c33 (Adrian Bunk 2008-07-25 01:46:34 -0700 33)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 34) return s;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 35) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 36)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 37) /* recognize special .CONTROL name */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 38) int coda_iscontrol(const char *name, size_t length)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 39) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 40) return ((CODA_CONTROLLEN == length) &&
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 41) (strncmp(name, CODA_CONTROL, CODA_CONTROLLEN) == 0));
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 42) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 43)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 44) unsigned short coda_flags_to_cflags(unsigned short flags)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 45) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 46) unsigned short coda_flags = 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 47)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 48) if ((flags & O_ACCMODE) == O_RDONLY)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 49) coda_flags |= C_O_READ;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 50)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 51) if ((flags & O_ACCMODE) == O_RDWR)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 52) coda_flags |= C_O_READ | C_O_WRITE;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 53)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 54) if ((flags & O_ACCMODE) == O_WRONLY)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 55) coda_flags |= C_O_WRITE;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 56)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 57) if (flags & O_TRUNC)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 58) coda_flags |= C_O_TRUNC;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 59)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 60) if (flags & O_CREAT)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 61) coda_flags |= C_O_CREAT;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 62)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 63) if (flags & O_EXCL)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 64) coda_flags |= C_O_EXCL;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 65)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 66) return coda_flags;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 67) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 68)
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 69) static struct timespec64 coda_to_timespec64(struct coda_timespec ts)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 70) {
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 71) struct timespec64 ts64 = {
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 72) .tv_sec = ts.tv_sec,
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 73) .tv_nsec = ts.tv_nsec,
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 74) };
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 75)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 76) return ts64;
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 77) }
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 78)
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 79) static struct coda_timespec timespec64_to_coda(struct timespec64 ts64)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 80) {
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 81) struct coda_timespec ts = {
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 82) .tv_sec = ts64.tv_sec,
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 83) .tv_nsec = ts64.tv_nsec,
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 84) };
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 85)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 86) return ts;
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 87) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 88)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 89) /* utility functions below */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 90) void coda_vattr_to_iattr(struct inode *inode, struct coda_vattr *attr)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 91) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 92) int inode_type;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 93) /* inode's i_flags, i_ino are set by iget
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 94) XXX: is this all we need ??
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 95) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 96) switch (attr->va_type) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 97) case C_VNON:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 98) inode_type = 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 99) break;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 100) case C_VREG:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 101) inode_type = S_IFREG;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 102) break;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 103) case C_VDIR:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 104) inode_type = S_IFDIR;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 105) break;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 106) case C_VLNK:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 107) inode_type = S_IFLNK;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 108) break;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 109) default:
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 110) inode_type = 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 111) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 112) inode->i_mode |= inode_type;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 113)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 114) if (attr->va_mode != (u_short) -1)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 115) inode->i_mode = attr->va_mode | inode_type;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 116) if (attr->va_uid != -1)
d83f5901bc0cd (Eric W. Biederman 2013-01-30 19:21:14 -0800 117) inode->i_uid = make_kuid(&init_user_ns, (uid_t) attr->va_uid);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 118) if (attr->va_gid != -1)
d83f5901bc0cd (Eric W. Biederman 2013-01-30 19:21:14 -0800 119) inode->i_gid = make_kgid(&init_user_ns, (gid_t) attr->va_gid);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 120) if (attr->va_nlink != -1)
bfe8684869601 (Miklos Szeredi 2011-10-28 14:13:29 +0200 121) set_nlink(inode, attr->va_nlink);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 122) if (attr->va_size != -1)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 123) inode->i_size = attr->va_size;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 124) if (attr->va_size != -1)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 125) inode->i_blocks = (attr->va_size + 511) >> 9;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 126) if (attr->va_atime.tv_sec != -1)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 127) inode->i_atime = coda_to_timespec64(attr->va_atime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 128) if (attr->va_mtime.tv_sec != -1)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 129) inode->i_mtime = coda_to_timespec64(attr->va_mtime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 130) if (attr->va_ctime.tv_sec != -1)
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 131) inode->i_ctime = coda_to_timespec64(attr->va_ctime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 132) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 133)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 134)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 135) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 136) * BSD sets attributes that need not be modified to -1.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 137) * Linux uses the valid field to indicate what should be
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 138) * looked at. The BSD type field needs to be deduced from linux
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 139) * mode.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 140) * So we have to do some translations here.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 141) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 142)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 143) void coda_iattr_to_vattr(struct iattr *iattr, struct coda_vattr *vattr)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 144) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 145) unsigned int valid;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 146)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 147) /* clean out */
a2d416dcc92e5 (Andrew Morton 2008-04-29 00:59:22 -0700 148) vattr->va_mode = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 149) vattr->va_uid = (vuid_t) -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 150) vattr->va_gid = (vgid_t) -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 151) vattr->va_size = (off_t) -1;
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 152) vattr->va_atime.tv_sec = (int64_t) -1;
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 153) vattr->va_atime.tv_nsec = (long) -1;
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 154) vattr->va_mtime.tv_sec = (int64_t) -1;
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 155) vattr->va_mtime.tv_nsec = (long) -1;
5e7c31dfe7470 (Jan Harkes 2019-07-16 16:28:35 -0700 156) vattr->va_ctime.tv_sec = (int64_t) -1;
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 157) vattr->va_ctime.tv_nsec = (long) -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 158) vattr->va_type = C_VNON;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 159) vattr->va_fileid = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 160) vattr->va_gen = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 161) vattr->va_bytes = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 162) vattr->va_nlink = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 163) vattr->va_blocksize = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 164) vattr->va_rdev = -1;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 165) vattr->va_flags = 0;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 166)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 167) /* determine the type */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 168) #if 0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 169) mode = iattr->ia_mode;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 170) if ( S_ISDIR(mode) ) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 171) vattr->va_type = C_VDIR;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 172) } else if ( S_ISREG(mode) ) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 173) vattr->va_type = C_VREG;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 174) } else if ( S_ISLNK(mode) ) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 175) vattr->va_type = C_VLNK;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 176) } else {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 177) /* don't do others */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 178) vattr->va_type = C_VNON;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 179) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 180) #endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 181)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 182) /* set those vattrs that need change */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 183) valid = iattr->ia_valid;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 184) if ( valid & ATTR_MODE ) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 185) vattr->va_mode = iattr->ia_mode;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 186) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 187) if ( valid & ATTR_UID ) {
d83f5901bc0cd (Eric W. Biederman 2013-01-30 19:21:14 -0800 188) vattr->va_uid = (vuid_t) from_kuid(&init_user_ns, iattr->ia_uid);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 189) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 190) if ( valid & ATTR_GID ) {
d83f5901bc0cd (Eric W. Biederman 2013-01-30 19:21:14 -0800 191) vattr->va_gid = (vgid_t) from_kgid(&init_user_ns, iattr->ia_gid);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 192) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 193) if ( valid & ATTR_SIZE ) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 194) vattr->va_size = iattr->ia_size;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 195) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 196) if ( valid & ATTR_ATIME ) {
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 197) vattr->va_atime = timespec64_to_coda(iattr->ia_atime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 198) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 199) if ( valid & ATTR_MTIME ) {
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 200) vattr->va_mtime = timespec64_to_coda(iattr->ia_mtime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 201) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 202) if ( valid & ATTR_CTIME ) {
6ced9aa7b56ba (Arnd Bergmann 2019-07-16 16:28:32 -0700 203) vattr->va_ctime = timespec64_to_coda(iattr->ia_ctime);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 204) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 205) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 206)