2 * Inode operations for Coda filesystem
3 * Original version: (C) 1996 P. Braam and M. Callahan
4 * Rewritten for Linux 2.1. (C) 1997 Carnegie Mellon University
6 * Carnegie Mellon encourages users to contribute improvements to
7 * the Coda project. Contact Peter Braam (coda@cs.cmu.edu).
10 #include <linux/types.h>
11 #include <linux/kernel.h>
12 #include <linux/time.h>
14 #include <linux/stat.h>
15 #include <linux/errno.h>
16 #include <asm/uaccess.h>
17 #include <linux/string.h>
19 #include <linux/coda.h>
20 #include <linux/coda_linux.h>
21 #include <linux/coda_psdev.h>
22 #include <linux/coda_fs_i.h>
24 /* initialize the debugging variables */
28 char * coda_f2s(struct CodaFid
*f
)
31 #ifdef CONFIG_CODA_FS_OLD_API
32 sprintf(s
, "(%08x.%08x.%08x)", f
->opaque
[0], f
->opaque
[1], f
->opaque
[2]);
34 sprintf(s
, "(%08x.%08x.%08x.%08x)", f
->opaque
[0], f
->opaque
[1], f
->opaque
[2], f
->opaque
[3]);
39 /* recognize special .CONTROL name */
40 int coda_iscontrol(const char *name
, size_t length
)
42 return ((CODA_CONTROLLEN
== length
) &&
43 (strncmp(name
, CODA_CONTROL
, CODA_CONTROLLEN
) == 0));
46 /* recognize /coda inode */
47 int coda_isroot(struct inode
*i
)
49 return ( i
->i_sb
->s_root
->d_inode
== i
);
52 unsigned short coda_flags_to_cflags(unsigned short flags
)
54 unsigned short coda_flags
= 0;
56 if ((flags
& O_ACCMODE
) == O_RDONLY
)
57 coda_flags
|= C_O_READ
;
59 if ((flags
& O_ACCMODE
) == O_RDWR
)
60 coda_flags
|= C_O_READ
| C_O_WRITE
;
62 if ((flags
& O_ACCMODE
) == O_WRONLY
)
63 coda_flags
|= C_O_WRITE
;
66 coda_flags
|= C_O_TRUNC
;
69 coda_flags
|= C_O_CREAT
;
72 coda_flags
|= C_O_EXCL
;
78 /* utility functions below */
79 void coda_vattr_to_iattr(struct inode
*inode
, struct coda_vattr
*attr
)
82 /* inode's i_flags, i_ino are set by iget
83 XXX: is this all we need ??
85 switch (attr
->va_type
) {
101 inode
->i_mode
|= inode_type
;
103 if (attr
->va_mode
!= (u_short
) -1)
104 inode
->i_mode
= attr
->va_mode
| inode_type
;
105 if (attr
->va_uid
!= -1)
106 inode
->i_uid
= (uid_t
) attr
->va_uid
;
107 if (attr
->va_gid
!= -1)
108 inode
->i_gid
= (gid_t
) attr
->va_gid
;
109 if (attr
->va_nlink
!= -1)
110 inode
->i_nlink
= attr
->va_nlink
;
111 if (attr
->va_size
!= -1)
112 inode
->i_size
= attr
->va_size
;
113 if (attr
->va_size
!= -1)
114 inode
->i_blocks
= (attr
->va_size
+ 511) >> 9;
115 if (attr
->va_atime
.tv_sec
!= -1)
116 inode
->i_atime
= attr
->va_atime
;
117 if (attr
->va_mtime
.tv_sec
!= -1)
118 inode
->i_mtime
= attr
->va_mtime
;
119 if (attr
->va_ctime
.tv_sec
!= -1)
120 inode
->i_ctime
= attr
->va_ctime
;
125 * BSD sets attributes that need not be modified to -1.
126 * Linux uses the valid field to indicate what should be
127 * looked at. The BSD type field needs to be deduced from linux
129 * So we have to do some translations here.
132 void coda_iattr_to_vattr(struct iattr
*iattr
, struct coda_vattr
*vattr
)
137 vattr
->va_mode
= (umode_t
) -1;
138 vattr
->va_uid
= (vuid_t
) -1;
139 vattr
->va_gid
= (vgid_t
) -1;
140 vattr
->va_size
= (off_t
) -1;
141 vattr
->va_atime
.tv_sec
= (time_t) -1;
142 vattr
->va_atime
.tv_nsec
= (time_t) -1;
143 vattr
->va_mtime
.tv_sec
= (time_t) -1;
144 vattr
->va_mtime
.tv_nsec
= (time_t) -1;
145 vattr
->va_ctime
.tv_sec
= (time_t) -1;
146 vattr
->va_ctime
.tv_nsec
= (time_t) -1;
147 vattr
->va_type
= C_VNON
;
148 vattr
->va_fileid
= -1;
150 vattr
->va_bytes
= -1;
151 vattr
->va_nlink
= -1;
152 vattr
->va_blocksize
= -1;
156 /* determine the type */
158 mode
= iattr
->ia_mode
;
159 if ( S_ISDIR(mode
) ) {
160 vattr
->va_type
= C_VDIR
;
161 } else if ( S_ISREG(mode
) ) {
162 vattr
->va_type
= C_VREG
;
163 } else if ( S_ISLNK(mode
) ) {
164 vattr
->va_type
= C_VLNK
;
166 /* don't do others */
167 vattr
->va_type
= C_VNON
;
171 /* set those vattrs that need change */
172 valid
= iattr
->ia_valid
;
173 if ( valid
& ATTR_MODE
) {
174 vattr
->va_mode
= iattr
->ia_mode
;
176 if ( valid
& ATTR_UID
) {
177 vattr
->va_uid
= (vuid_t
) iattr
->ia_uid
;
179 if ( valid
& ATTR_GID
) {
180 vattr
->va_gid
= (vgid_t
) iattr
->ia_gid
;
182 if ( valid
& ATTR_SIZE
) {
183 vattr
->va_size
= iattr
->ia_size
;
185 if ( valid
& ATTR_ATIME
) {
186 vattr
->va_atime
= iattr
->ia_atime
;
188 if ( valid
& ATTR_MTIME
) {
189 vattr
->va_mtime
= iattr
->ia_mtime
;
191 if ( valid
& ATTR_CTIME
) {
192 vattr
->va_ctime
= iattr
->ia_ctime
;