1 /* This file contains the wrapper functions for issuing a request
2 * and receiving response from FS processes.
3 * Each function builds a request message according to the request
4 * parameter, calls the most low-level fs_sendrec, and copies
12 #include <sys/statfs.h>
13 #include <sys/statvfs.h>
14 #include <minix/vfsif.h>
15 #include <minix/com.h>
16 #include <minix/const.h>
17 #include <minix/endpoint.h>
18 #include <minix/u64.h>
20 #include <minix/vfsif.h>
28 /*===========================================================================*
30 *===========================================================================*/
36 unsigned int num_of_bytes
,
44 cp_grant_id_t grant_id
;
47 grant_id
= cpf_grant_magic(fs_e
, user_e
, (vir_bytes
) user_addr
, num_of_bytes
,
48 (rw_flag
== READING
? CPF_WRITE
: CPF_READ
));
50 panic("req_breadwrite: cpf_grant_magic failed");
52 /* Fill in request message */
53 m
.m_type
= rw_flag
== READING
? REQ_BREAD
: REQ_BWRITE
;
55 m
.REQ_GRANT
= grant_id
;
56 m
.REQ_SEEK_POS_LO
= ex64lo(pos
);
57 m
.REQ_SEEK_POS_HI
= ex64hi(pos
);
58 m
.REQ_NBYTES
= num_of_bytes
;
60 /* Send/rec request */
61 r
= fs_sendrec(fs_e
, &m
);
63 if (r
!= OK
) return(r
);
65 /* Fill in response structure */
66 *new_posp
= make64(m
.RES_SEEK_POS_LO
, m
.RES_SEEK_POS_HI
);
67 *cum_iop
= m
.RES_NBYTES
;
73 /*===========================================================================*
75 *===========================================================================*/
86 /* Fill in request message */
88 m
.REQ_INODE_NR
= inode_nr
;
91 /* Send/rec request */
92 r
= fs_sendrec(fs_e
, &m
);
94 /* Copy back actual mode. */
95 *new_modep
= m
.RES_MODE
;
101 /*===========================================================================*
103 *===========================================================================*/
115 /* Fill in request message */
116 m
.m_type
= REQ_CHOWN
;
117 m
.REQ_INODE_NR
= inode_nr
;
121 /* Send/rec request */
122 r
= fs_sendrec(fs_e
, &m
);
124 /* Return new mode to caller. */
125 *new_modep
= m
.RES_MODE
;
131 /*===========================================================================*
133 *===========================================================================*/
145 cp_grant_id_t grant_id
;
150 panic("req_create: filename starts with '/'");
152 len
= strlen(path
) + 1;
153 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) path
, len
, CPF_READ
);
155 panic("req_create: cpf_grant_direct failed");
157 /* Fill in request message */
158 m
.m_type
= REQ_CREATE
;
159 m
.REQ_INODE_NR
= inode_nr
;
163 m
.REQ_GRANT
= grant_id
;
164 m
.REQ_PATH_LEN
= len
;
166 /* Send/rec request */
167 r
= fs_sendrec(fs_e
, &m
);
168 cpf_revoke(grant_id
);
169 if (r
!= OK
) return(r
);
171 /* Fill in response structure */
172 res
->fs_e
= m
.m_source
;
173 res
->inode_nr
= m
.RES_INODE_NR
;
174 res
->fmode
= m
.RES_MODE
;
175 res
->fsize
= m
.RES_FILE_SIZE_LO
;
176 res
->uid
= m
.RES_UID
;
177 res
->gid
= m
.RES_GID
;
178 res
->dev
= m
.RES_DEV
;
184 /*===========================================================================*
186 *===========================================================================*/
187 int req_flush(endpoint_t fs_e
, dev_t dev
)
191 /* Fill in request message */
192 m
.m_type
= REQ_FLUSH
;
195 /* Send/rec request */
196 return fs_sendrec(fs_e
, &m
);
200 /*===========================================================================*
202 *===========================================================================*/
203 int req_fstatfs(endpoint_t fs_e
, endpoint_t proc_e
, vir_bytes buf
)
206 cp_grant_id_t grant_id
;
209 grant_id
= cpf_grant_magic(fs_e
, proc_e
, buf
, sizeof(struct statfs
),
211 if (grant_id
== GRANT_INVALID
)
212 panic("req_fstatfs: cpf_grant_magic failed");
214 /* Fill in request message */
215 m
.m_type
= REQ_FSTATFS
;
216 m
.REQ_GRANT
= grant_id
;
218 /* Send/rec request */
219 r
= fs_sendrec(fs_e
, &m
);
220 cpf_revoke(grant_id
);
226 /*===========================================================================*
228 *===========================================================================*/
229 int req_statvfs(endpoint_t fs_e
, endpoint_t proc_e
, vir_bytes buf
)
232 cp_grant_id_t grant_id
;
235 grant_id
= cpf_grant_magic(fs_e
, proc_e
, buf
, sizeof(struct statvfs
),
237 if(grant_id
== GRANT_INVALID
)
238 panic("req_statvfs: cpf_grant_magic failed");
240 /* Fill in request message */
241 m
.m_type
= REQ_STATVFS
;
242 m
.REQ_GRANT
= grant_id
;
244 /* Send/rec request */
245 r
= fs_sendrec(fs_e
, &m
);
246 cpf_revoke(grant_id
);
252 /*===========================================================================*
254 *===========================================================================*/
255 int req_ftrunc(endpoint_t fs_e
, ino_t inode_nr
, off_t start
, off_t end
)
259 /* Fill in request message */
260 m
.m_type
= REQ_FTRUNC
;
261 m
.REQ_INODE_NR
= inode_nr
;
262 m
.REQ_TRC_START_LO
= start
;
263 m
.REQ_TRC_START_HI
= 0; /* Not used for now, so clear it. */
264 m
.REQ_TRC_END_LO
= end
;
265 m
.REQ_TRC_END_HI
= 0; /* Not used for now, so clear it. */
267 /* Send/rec request */
268 return fs_sendrec(fs_e
, &m
);
272 /*===========================================================================*
274 *===========================================================================*/
287 cp_grant_id_t grant_id
;
290 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) buf
, size
,
293 grant_id
= cpf_grant_magic(fs_e
, who_e
, (vir_bytes
) buf
, size
,
298 panic("req_getdents: cpf_grant_direct/cpf_grant_magic failed: %d",
301 m
.m_type
= REQ_GETDENTS
;
302 m
.REQ_INODE_NR
= inode_nr
;
303 m
.REQ_GRANT
= grant_id
;
304 m
.REQ_MEM_SIZE
= size
;
305 m
.REQ_SEEK_POS_LO
= ex64lo(pos
);
306 m
.REQ_SEEK_POS_HI
= 0; /* Not used for now, so clear it. */
308 r
= fs_sendrec(fs_e
, &m
);
309 cpf_revoke(grant_id
);
312 *new_pos
= cvul64(m
.RES_SEEK_POS_LO
);
319 /*===========================================================================*
321 *===========================================================================*/
322 int req_inhibread(endpoint_t fs_e
, ino_t inode_nr
)
326 /* Fill in request message */
327 m
.m_type
= REQ_INHIBREAD
;
328 m
.REQ_INODE_NR
= inode_nr
;
330 /* Send/rec request */
331 return fs_sendrec(fs_e
, &m
);
335 /*===========================================================================*
337 *===========================================================================*/
346 cp_grant_id_t grant_id
;
347 const size_t len
= strlen(lastc
) + 1;
350 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
)lastc
, len
, CPF_READ
);
352 panic("req_link: cpf_grant_direct failed");
354 /* Fill in request message */
356 m
.REQ_INODE_NR
= linked_file
;
357 m
.REQ_DIR_INO
= link_parent
;
358 m
.REQ_GRANT
= grant_id
;
359 m
.REQ_PATH_LEN
= len
;
361 /* Send/rec request */
362 r
= fs_sendrec(fs_e
, &m
);
363 cpf_revoke(grant_id
);
369 /*===========================================================================*
371 *===========================================================================*/
378 struct lookup
*resolve
,
385 cp_grant_id_t grant_id
=0, grant_id2
=0;
387 vfs_ucred_t credentials
;
390 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) resolve
->l_path
, PATH_MAX
,
391 CPF_READ
| CPF_WRITE
);
393 panic("req_lookup: cpf_grant_direct failed");
395 flags
= resolve
->l_flags
;
396 len
= strlen(resolve
->l_path
) + 1;
398 m
.m_type
= REQ_LOOKUP
;
399 m
.REQ_GRANT
= grant_id
;
400 m
.REQ_PATH_LEN
= len
;
401 m
.REQ_PATH_SIZE
= PATH_MAX
+ 1;
402 m
.REQ_DIR_INO
= dir_ino
;
403 m
.REQ_ROOT_INO
= root_ino
;
405 if(rfp
->fp_ngroups
> 0) { /* Is the process member of multiple groups? */
406 /* In that case the FS has to copy the uid/gid credentials */
409 /* Set credentials */
410 credentials
.vu_uid
= rfp
->fp_effuid
;
411 credentials
.vu_gid
= rfp
->fp_effgid
;
412 credentials
.vu_ngroups
= rfp
->fp_ngroups
;
413 for (i
= 0; i
< rfp
->fp_ngroups
; i
++)
414 credentials
.vu_sgroups
[i
] = rfp
->fp_sgroups
[i
];
416 grant_id2
= cpf_grant_direct(fs_e
, (vir_bytes
) &credentials
,
417 sizeof(credentials
), CPF_READ
);
419 panic("req_lookup: cpf_grant_direct failed");
421 m
.REQ_GRANT2
= grant_id2
;
422 m
.REQ_UCRED_SIZE
= sizeof(credentials
);
423 flags
|= PATH_GET_UCRED
;
425 /* When there's only one gid, we can send it directly */
428 flags
&= ~PATH_GET_UCRED
;
433 /* Send/rec request */
434 r
= fs_sendrec(fs_e
, &m
);
435 cpf_revoke(grant_id
);
436 if(rfp
->fp_ngroups
> 0) cpf_revoke(grant_id2
);
438 /* Fill in response according to the return value */
439 res
->fs_e
= m
.m_source
;
443 res
->inode_nr
= m
.RES_INODE_NR
;
444 res
->fmode
= m
.RES_MODE
;
445 res
->fsize
= m
.RES_FILE_SIZE_LO
;
446 res
->dev
= m
.RES_DEV
;
451 res
->inode_nr
= m
.RES_INODE_NR
;
452 res
->char_processed
= m
.RES_OFFSET
;
453 res
->symloop
= m
.RES_SYMLOOP
;
456 res
->char_processed
= m
.RES_OFFSET
;
457 res
->symloop
= m
.RES_SYMLOOP
;
460 res
->char_processed
= m
.RES_OFFSET
;
461 res
->symloop
= m
.RES_SYMLOOP
;
471 /*===========================================================================*
473 *===========================================================================*/
484 cp_grant_id_t grant_id
;
488 len
= strlen(lastc
) + 1;
489 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
)lastc
, len
, CPF_READ
);
491 panic("req_mkdir: cpf_grant_direct failed");
493 /* Fill in request message */
494 m
.m_type
= REQ_MKDIR
;
495 m
.REQ_INODE_NR
= inode_nr
;
499 m
.REQ_GRANT
= grant_id
;
500 m
.REQ_PATH_LEN
= len
;
502 /* Send/rec request */
503 r
= fs_sendrec(fs_e
, &m
);
504 cpf_revoke(grant_id
);
510 /*===========================================================================*
512 *===========================================================================*/
525 cp_grant_id_t grant_id
;
528 len
= strlen(lastc
) + 1;
529 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
)lastc
, len
, CPF_READ
);
531 panic("req_mknod: cpf_grant_direct failed");
533 /* Fill in request message */
534 m
.m_type
= REQ_MKNOD
;
535 m
.REQ_INODE_NR
= inode_nr
;
540 m
.REQ_GRANT
= grant_id
;
541 m
.REQ_PATH_LEN
= len
;
543 /* Send/rec request */
544 r
= fs_sendrec(fs_e
, &m
);
545 cpf_revoke(grant_id
);
551 /*===========================================================================*
553 *===========================================================================*/
554 int req_mountpoint(endpoint_t fs_e
, ino_t inode_nr
)
558 /* Fill in request message */
559 m
.m_type
= REQ_MOUNTPOINT
;
560 m
.REQ_INODE_NR
= inode_nr
;
562 /* Send/rec request */
563 return fs_sendrec(fs_e
, &m
);
567 /*===========================================================================*
569 *===========================================================================*/
576 struct node_details
*res
582 /* Fill in request message */
583 m
.m_type
= REQ_NEWNODE
;
589 /* Send/rec request */
590 r
= fs_sendrec(fs_e
, &m
);
592 res
->fs_e
= m
.m_source
;
593 res
->inode_nr
= m
.RES_INODE_NR
;
594 res
->fmode
= m
.RES_MODE
;
595 res
->fsize
= m
.RES_FILE_SIZE_LO
;
596 res
->dev
= m
.RES_DEV
;
597 res
->uid
= m
.RES_UID
;
598 res
->gid
= m
.RES_GID
;
604 /*===========================================================================*
606 *===========================================================================*/
613 cp_grant_id_t grant_id
;
618 /* Grant access to label */
619 len
= strlen(label
) + 1;
620 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) label
, len
, CPF_READ
);
622 panic("req_newdriver: cpf_grant_direct failed");
624 /* Fill in request message */
625 m
.m_type
= REQ_NEW_DRIVER
;
627 m
.REQ_GRANT
= grant_id
;
628 m
.REQ_PATH_LEN
= len
;
631 r
= fs_sendrec(fs_e
, &m
);
633 cpf_revoke(grant_id
);
639 /*===========================================================================*
641 *===========================================================================*/
642 int req_putnode(fs_e
, inode_nr
, count
)
649 /* Fill in request message */
650 m
.m_type
= REQ_PUTNODE
;
651 m
.REQ_INODE_NR
= inode_nr
;
654 /* Send/rec request */
655 return fs_sendrec(fs_e
, &m
);
659 /*===========================================================================*
661 *===========================================================================*/
662 int req_rdlink(fs_e
, inode_nr
, proc_e
, buf
, len
, direct
)
668 int direct
; /* set to 1 to use direct grants instead of magic grants */
672 cp_grant_id_t grant_id
;
675 grant_id
= cpf_grant_direct(fs_e
, buf
, len
, CPF_WRITE
);
677 grant_id
= cpf_grant_magic(fs_e
, proc_e
, buf
, len
, CPF_WRITE
);
680 panic("req_rdlink: cpf_grant_magic failed");
682 /* Fill in request message */
683 m
.m_type
= REQ_RDLINK
;
684 m
.REQ_INODE_NR
= inode_nr
;
685 m
.REQ_GRANT
= grant_id
;
686 m
.REQ_MEM_SIZE
= len
;
688 /* Send/rec request */
689 r
= fs_sendrec(fs_e
, &m
);
690 cpf_revoke(grant_id
);
692 if (r
== OK
) r
= m
.RES_NBYTES
;
698 /*===========================================================================*
700 *===========================================================================*/
707 struct node_details
*res_nodep
,
712 cp_grant_id_t grant_id
;
716 len
= strlen(label
)+1;
717 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) label
, len
, CPF_READ
);
719 panic("req_readsuper: cpf_grant_direct failed");
721 /* Fill in request message */
722 m
.m_type
= REQ_READSUPER
;
724 if(readonly
) m
.REQ_FLAGS
|= REQ_RDONLY
;
725 if(isroot
) m
.REQ_FLAGS
|= REQ_ISROOT
;
726 m
.REQ_GRANT
= grant_id
;
728 m
.REQ_PATH_LEN
= len
;
730 /* Send/rec request */
731 r
= fs_sendrec(fs_e
, &m
);
732 cpf_revoke(grant_id
);
735 /* Fill in response structure */
736 res_nodep
->fs_e
= m
.m_source
;
737 res_nodep
->inode_nr
= m
.RES_INODE_NR
;
738 res_nodep
->fmode
= m
.RES_MODE
;
739 res_nodep
->fsize
= m
.RES_FILE_SIZE_LO
;
740 res_nodep
->uid
= m
.RES_UID
;
741 res_nodep
->gid
= m
.RES_GID
;
742 *con_reqs
= m
.RES_CONREQS
;
749 /*===========================================================================*
751 *===========================================================================*/
752 int req_readwrite(fs_e
, inode_nr
, pos
, rw_flag
, user_e
,
753 user_addr
, num_of_bytes
, new_posp
, cum_iop
)
760 unsigned int num_of_bytes
;
762 unsigned int *cum_iop
;
765 cp_grant_id_t grant_id
;
768 if (ex64hi(pos
) != 0)
769 panic("req_readwrite: pos too large");
771 grant_id
= cpf_grant_magic(fs_e
, user_e
, (vir_bytes
) user_addr
, num_of_bytes
,
772 (rw_flag
==READING
? CPF_WRITE
:CPF_READ
));
774 panic("req_readwrite: cpf_grant_magic failed");
776 /* Fill in request message */
777 m
.m_type
= rw_flag
== READING
? REQ_READ
: REQ_WRITE
;
778 m
.REQ_INODE_NR
= inode_nr
;
779 m
.REQ_GRANT
= grant_id
;
780 m
.REQ_SEEK_POS_LO
= ex64lo(pos
);
781 m
.REQ_SEEK_POS_HI
= 0; /* Not used for now, so clear it. */
782 m
.REQ_NBYTES
= num_of_bytes
;
784 /* Send/rec request */
785 r
= fs_sendrec(fs_e
, &m
);
786 cpf_revoke(grant_id
);
789 /* Fill in response structure */
790 *new_posp
= cvul64(m
.RES_SEEK_POS_LO
);
791 *cum_iop
= m
.RES_NBYTES
;
798 /*===========================================================================*
800 *===========================================================================*/
801 int req_rename(fs_e
, old_dir
, old_name
, new_dir
, new_name
)
809 cp_grant_id_t gid_old
, gid_new
;
810 size_t len_old
, len_new
;
813 len_old
= strlen(old_name
) + 1;
814 gid_old
= cpf_grant_direct(fs_e
, (vir_bytes
) old_name
, len_old
, CPF_READ
);
816 panic("req_rename: cpf_grant_direct failed");
818 len_new
= strlen(new_name
) + 1;
819 gid_new
= cpf_grant_direct(fs_e
, (vir_bytes
) new_name
, len_new
, CPF_READ
);
821 panic("req_rename: cpf_grant_direct failed");
823 /* Fill in request message */
824 m
.m_type
= REQ_RENAME
;
825 m
.REQ_REN_OLD_DIR
= old_dir
;
826 m
.REQ_REN_NEW_DIR
= new_dir
;
827 m
.REQ_REN_GRANT_OLD
= gid_old
;
828 m
.REQ_REN_LEN_OLD
= len_old
;
829 m
.REQ_REN_GRANT_NEW
= gid_new
;
830 m
.REQ_REN_LEN_NEW
= len_new
;
832 /* Send/rec request */
833 r
= fs_sendrec(fs_e
, &m
);
841 /*===========================================================================*
843 *===========================================================================*/
844 int req_rmdir(fs_e
, inode_nr
, lastc
)
850 cp_grant_id_t grant_id
;
854 len
= strlen(lastc
) + 1;
855 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) lastc
, len
, CPF_READ
);
857 panic("req_rmdir: cpf_grant_direct failed");
859 /* Fill in request message */
860 m
.m_type
= REQ_RMDIR
;
861 m
.REQ_INODE_NR
= inode_nr
;
862 m
.REQ_GRANT
= grant_id
;
863 m
.REQ_PATH_LEN
= len
;
865 /* Send/rec request */
866 r
= fs_sendrec(fs_e
, &m
);
867 cpf_revoke(grant_id
);
873 /*===========================================================================*
875 *===========================================================================*/
889 cp_grant_id_t gid_name
, gid_buf
;
892 len
= strlen(lastc
) + 1;
893 gid_name
= cpf_grant_direct(fs_e
, (vir_bytes
) lastc
, len
, CPF_READ
);
894 if (gid_name
== GRANT_INVALID
)
895 panic("req_slink: cpf_grant_direct failed");
897 gid_buf
= cpf_grant_magic(fs_e
, proc_e
, path_addr
, path_length
, CPF_READ
);
898 if (gid_buf
== GRANT_INVALID
) {
899 cpf_revoke(gid_name
);
900 panic("req_slink: cpf_grant_magic failed");
903 /* Fill in request message */
904 m
.m_type
= REQ_SLINK
;
905 m
.REQ_INODE_NR
= inode_nr
;
908 m
.REQ_GRANT
= gid_name
;
909 m
.REQ_PATH_LEN
= len
;
910 m
.REQ_GRANT3
= gid_buf
;
911 m
.REQ_MEM_SIZE
= path_length
;
913 /* Send/rec request */
914 r
= fs_sendrec(fs_e
, &m
);
915 cpf_revoke(gid_name
);
922 /*===========================================================================*
924 *===========================================================================*/
925 int req_stat(endpoint_t fs_e
, ino_t inode_nr
, endpoint_t proc_e
, vir_bytes buf
,
928 cp_grant_id_t grant_id
;
932 struct minix_prev_stat old_sb
; /* for backward compatibility */
935 /* We're dealing with the old stat() call. First copy stat structure
936 * to VFS so we can convert the new struct stat to the old version.
938 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) &sb
, sizeof(struct stat
),
941 /* Grant FS access to copy straight into user provided buffer */
942 grant_id
= cpf_grant_magic(fs_e
, proc_e
, buf
, sizeof(struct stat
),
947 panic("req_stat: cpf_grant_* failed");
949 /* Fill in request message */
951 m
.REQ_INODE_NR
= inode_nr
;
952 m
.REQ_GRANT
= grant_id
;
954 /* Send/rec request */
955 r
= fs_sendrec(fs_e
, &m
);
956 cpf_revoke(grant_id
);
958 if (r
!= OK
|| old_stat
== 0)
961 #if defined(_NETBSD_SOURCE)
967 /* Copy field by field because of st_gid type mismatch and
968 * difference in order after atime.
970 old_sb
.st_dev
= sb
.st_dev
;
971 old_sb
.st_ino
= sb
.st_ino
;
972 old_sb
.st_mode
= sb
.st_mode
;
973 old_sb
.st_nlink
= sb
.st_nlink
;
974 old_sb
.st_uid
= sb
.st_uid
;
975 old_sb
.st_gid
= sb
.st_gid
;
976 old_sb
.st_rdev
= sb
.st_rdev
;
977 old_sb
.st_size
= sb
.st_size
;
978 #if defined(_NETBSD_SOURCE)
979 old_sb
.st_atime
= sb
.st_atimespec
.tv_sec
;
980 old_sb
.st_mtime
= sb
.st_mtimespec
.tv_sec
;
981 old_sb
.st_ctime
= sb
.st_ctimespec
.tv_sec
;
983 old_sb
.st_atime
= sb
.st_atime
;
984 old_sb
.st_mtime
= sb
.st_mtime
;
985 old_sb
.st_ctime
= sb
.st_ctime
;
988 r
= sys_vircopy(SELF
, (vir_bytes
) &old_sb
, proc_e
, buf
,
989 sizeof(struct minix_prev_stat
));
995 /*===========================================================================*
997 *===========================================================================*/
1003 /* Fill in request message */
1004 m
.m_type
= REQ_SYNC
;
1006 /* Send/rec request */
1007 return fs_sendrec(fs_e
, &m
);
1011 /*===========================================================================*
1013 *===========================================================================*/
1014 int req_unlink(fs_e
, inode_nr
, lastc
)
1019 cp_grant_id_t grant_id
;
1024 len
= strlen(lastc
) + 1;
1025 grant_id
= cpf_grant_direct(fs_e
, (vir_bytes
) lastc
, len
, CPF_READ
);
1027 panic("req_unlink: cpf_grant_direct failed");
1029 /* Fill in request message */
1030 m
.m_type
= REQ_UNLINK
;
1031 m
.REQ_INODE_NR
= inode_nr
;
1032 m
.REQ_GRANT
= grant_id
;
1033 m
.REQ_PATH_LEN
= len
;
1035 /* Send/rec request */
1036 r
= fs_sendrec(fs_e
, &m
);
1037 cpf_revoke(grant_id
);
1043 /*===========================================================================*
1045 *===========================================================================*/
1046 int req_unmount(fs_e
)
1051 /* Fill in request message */
1052 m
.m_type
= REQ_UNMOUNT
;
1054 /* Send/rec request */
1055 return fs_sendrec(fs_e
, &m
);
1059 /*===========================================================================*
1061 *===========================================================================*/
1062 int req_utime(fs_e
, inode_nr
, actime
, modtime
)
1070 /* Fill in request message */
1071 m
.m_type
= REQ_UTIME
;
1072 m
.REQ_INODE_NR
= inode_nr
;
1073 m
.REQ_ACTIME
= actime
;
1074 m
.REQ_MODTIME
= modtime
;
1076 /* Send/rec request */
1077 return fs_sendrec(fs_e
, &m
);