The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/fs/coda/coda_venus.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  *             Coda: an Experimental Distributed File System
    3  *                              Release 3.1
    4  * 
    5  *           Copyright (c) 1987-1998 Carnegie Mellon University
    6  *                          All Rights Reserved
    7  * 
    8  * Permission  to  use, copy, modify and distribute this software and its
    9  * documentation is hereby granted,  provided  that  both  the  copyright
   10  * notice  and  this  permission  notice  appear  in  all  copies  of the
   11  * software, derivative works or  modified  versions,  and  any  portions
   12  * thereof, and that both notices appear in supporting documentation, and
   13  * that credit is given to Carnegie Mellon University  in  all  documents
   14  * and publicity pertaining to direct or indirect use of this code or its
   15  * derivatives.
   16  * 
   17  * CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS  KNOWN  TO  HAVE  BUGS,
   18  * SOME  OF  WHICH MAY HAVE SERIOUS CONSEQUENCES.  CARNEGIE MELLON ALLOWS
   19  * FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.   CARNEGIE  MELLON
   20  * DISCLAIMS  ANY  LIABILITY  OF  ANY  KIND  FOR  ANY  DAMAGES WHATSOEVER
   21  * RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE  OR  OF
   22  * ANY DERIVATIVE WORK.
   23  * 
   24  * Carnegie  Mellon  encourages  users  of  this  software  to return any
   25  * improvements or extensions that  they  make,  and  to  grant  Carnegie
   26  * Mellon the rights to redistribute these changes without encumbrance.
   27  * 
   28  *      @(#) src/sys/cfs/coda_venus.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
   29  */
   30 
   31 #include <sys/cdefs.h>
   32 __FBSDID("$FreeBSD$");
   33 
   34 #include <sys/param.h>
   35 #include <sys/systm.h>
   36 #include <sys/fcntl.h>
   37 #include <sys/ioccom.h>
   38 #include <sys/lock.h>
   39 #include <sys/malloc.h>
   40 #include <sys/mutex.h>
   41 #include <sys/proc.h>
   42 #include <sys/sx.h>
   43 
   44 #include <fs/coda/coda.h>
   45 #include <fs/coda/cnode.h>
   46 #include <fs/coda/coda_venus.h>
   47 #include <fs/coda/coda_pioctl.h>
   48 
   49 #define DECL_NO_IN(name)                                \
   50     struct coda_in_hdr *inp;                            \
   51     struct name ## _out *outp;                          \
   52     int name ## _size = sizeof (struct coda_in_hdr);    \
   53     int Isize = sizeof (struct coda_in_hdr);            \
   54     int Osize = sizeof (struct name ## _out);           \
   55     int error
   56 
   57 #define DECL(name)                                      \
   58     struct name ## _in *inp;                            \
   59     struct name ## _out *outp;                          \
   60     int name ## _size = sizeof (struct name ## _in);    \
   61     int Isize = sizeof (struct name ## _in);            \
   62     int Osize = sizeof (struct name ## _out);           \
   63     int error
   64 
   65 #define DECL_NO_OUT(name)                               \
   66     struct name ## _in *inp;                            \
   67     struct coda_out_hdr *outp;                          \
   68     int name ## _size = sizeof (struct name ## _in);    \
   69     int Isize = sizeof (struct name ## _in);            \
   70     int Osize = sizeof (struct coda_out_hdr);           \
   71     int error
   72 
   73 #define ALLOC_NO_IN(name)                               \
   74     if (Osize > name ## _size)                          \
   75         name ## _size = Osize;                          \
   76     CODA_ALLOC(inp, struct coda_in_hdr *, name ## _size);\
   77     outp = (struct name ## _out *) inp
   78 
   79 #define ALLOC(name)                                     \
   80     if (Osize > name ## _size)                          \
   81         name ## _size = Osize;                          \
   82     CODA_ALLOC(inp, struct name ## _in *, name ## _size);\
   83     outp = (struct name ## _out *) inp
   84 
   85 #define ALLOC_NO_OUT(name)                              \
   86     if (Osize > name ## _size)                          \
   87         name ## _size = Osize;                          \
   88     CODA_ALLOC(inp, struct name ## _in *, name ## _size);\
   89     outp = (struct coda_out_hdr *) inp
   90 
   91 #define STRCPY(struc, name, len) \
   92     bcopy(name, (char *)inp + (int)inp->struc, len); \
   93     ((char*)inp + (int)inp->struc)[len++] = 0; \
   94     Isize += len
   95 
   96 #ifdef CODA_COMPAT_5
   97 #define INIT_IN(in, op, ident, p) \
   98           (in)->opcode = (op); \
   99           sx_slock(&proctree_lock); \
  100           (in)->pid = p ? p->p_pid : -1; \
  101           (in)->pgid = p ? p->p_pgid : -1; \
  102           (in)->sid = (p && p->p_session && p->p_session->s_leader) ? (p->p_session->s_leader->p_pid) : -1; \
  103           sx_sunlock(&proctree_lock); \
  104           if (ident != NOCRED) {                              \
  105               (in)->cred.cr_uid = ident->cr_uid;              \
  106               (in)->cred.cr_groupid = ident->cr_gid;          \
  107           } else {                                            \
  108               bzero(&((in)->cred),sizeof(struct coda_cred));  \
  109               (in)->cred.cr_uid = -1;                         \
  110               (in)->cred.cr_groupid = -1;                     \
  111           }
  112 #else
  113 #define INIT_IN(in, op, ident, p)                       \
  114           (in)->opcode = (op);                          \
  115           (in)->pid = p ? p->p_pid : -1;                \
  116           (in)->pgid = p ? p->p_pgid : -1;              \
  117           if (ident != NOCRED) {                        \
  118               (in)->uid = ident->cr_uid;                \
  119           } else {                                      \
  120               (in)->uid = -1;                           \
  121           }     
  122 #endif
  123 #define CNV_OFLAG(to, from)                             \
  124     do {                                                \
  125           to = 0;                                       \
  126           if (from & FREAD)   to |= C_O_READ;           \
  127           if (from & FWRITE)  to |= C_O_WRITE;          \
  128           if (from & O_TRUNC) to |= C_O_TRUNC;          \
  129           if (from & O_EXCL)  to |= C_O_EXCL;           \
  130           if (from & O_CREAT) to |= C_O_CREAT;          \
  131     } while (0)
  132 
  133 #define CNV_VV2V_ATTR(top, fromp) \
  134         do { \
  135                 (top)->va_type = (fromp)->va_type; \
  136                 (top)->va_mode = (fromp)->va_mode; \
  137                 (top)->va_nlink = (fromp)->va_nlink; \
  138                 (top)->va_uid = (fromp)->va_uid; \
  139                 (top)->va_gid = (fromp)->va_gid; \
  140                 (top)->va_fsid = VNOVAL; \
  141                 (top)->va_fileid = (fromp)->va_fileid; \
  142                 (top)->va_size = (fromp)->va_size; \
  143                 (top)->va_blocksize = (fromp)->va_blocksize; \
  144                 (top)->va_atime = (fromp)->va_atime; \
  145                 (top)->va_mtime = (fromp)->va_mtime; \
  146                 (top)->va_ctime = (fromp)->va_ctime; \
  147                 (top)->va_gen = (fromp)->va_gen; \
  148                 (top)->va_flags = (fromp)->va_flags; \
  149                 (top)->va_rdev = (fromp)->va_rdev; \
  150                 (top)->va_bytes = (fromp)->va_bytes; \
  151                 (top)->va_filerev = (fromp)->va_filerev; \
  152                 (top)->va_vaflags = VNOVAL; \
  153                 (top)->va_spare = VNOVAL; \
  154         } while (0)
  155 
  156 #define CNV_V2VV_ATTR(top, fromp) \
  157         do { \
  158                 (top)->va_type = (fromp)->va_type; \
  159                 (top)->va_mode = (fromp)->va_mode; \
  160                 (top)->va_nlink = (fromp)->va_nlink; \
  161                 (top)->va_uid = (fromp)->va_uid; \
  162                 (top)->va_gid = (fromp)->va_gid; \
  163                 (top)->va_fileid = (fromp)->va_fileid; \
  164                 (top)->va_size = (fromp)->va_size; \
  165                 (top)->va_blocksize = (fromp)->va_blocksize; \
  166                 (top)->va_atime = (fromp)->va_atime; \
  167                 (top)->va_mtime = (fromp)->va_mtime; \
  168                 (top)->va_ctime = (fromp)->va_ctime; \
  169                 (top)->va_gen = (fromp)->va_gen; \
  170                 (top)->va_flags = (fromp)->va_flags; \
  171                 (top)->va_rdev = (fromp)->va_rdev; \
  172                 (top)->va_bytes = (fromp)->va_bytes; \
  173                 (top)->va_filerev = (fromp)->va_filerev; \
  174         } while (0)
  175 
  176 
  177 int coda_kernel_version = CODA_KERNEL_VERSION;
  178 
  179 int
  180 venus_root(void *mdp,
  181         struct ucred *cred, struct proc *p,
  182 /*out*/ CodaFid *VFid)
  183 {
  184     DECL_NO_IN(coda_root);              /* sets Isize & Osize */
  185     ALLOC_NO_IN(coda_root);             /* sets inp & outp */
  186 
  187     /* send the open to venus. */
  188     INIT_IN(inp, CODA_ROOT, cred, p);  
  189 
  190     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  191     if (!error)
  192         *VFid = outp->Fid;
  193 
  194     CODA_FREE(inp, coda_root_size);
  195     return error;
  196 }
  197 
  198 int
  199 venus_open(void *mdp, CodaFid *fid, int flag,
  200         struct ucred *cred, struct proc *p,
  201 /*out*/ struct vnode **vp)
  202 {
  203     int cflag;
  204     DECL(coda_open_by_fd);                      /* sets Isize & Osize */
  205     ALLOC(coda_open_by_fd);                     /* sets inp & outp */
  206 
  207     /* send the open to venus. */
  208     INIT_IN(&inp->ih, CODA_OPEN_BY_FD, cred, p);
  209     inp->Fid = *fid;
  210     CNV_OFLAG(cflag, flag);
  211     inp->flags = cflag;
  212 
  213     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  214     *vp = error ? NULL : outp->vp;
  215 
  216     CODA_FREE(inp, coda_open_by_fd_size);
  217     return error;
  218 }
  219 
  220 int
  221 venus_close(void *mdp, CodaFid *fid, int flag,
  222         struct ucred *cred, struct proc *p)
  223 {
  224     int cflag;
  225     DECL_NO_OUT(coda_close);            /* sets Isize & Osize */
  226     ALLOC_NO_OUT(coda_close);           /* sets inp & outp */
  227 
  228     INIT_IN(&inp->ih, CODA_CLOSE, cred, p);
  229     inp->Fid = *fid;
  230     CNV_OFLAG(cflag, flag);
  231     inp->flags = cflag;
  232 
  233     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  234 
  235     CODA_FREE(inp, coda_close_size);
  236     return error;
  237 }
  238 
  239 /*
  240  * these two calls will not exist!!!  the container file is read/written
  241  * directly.
  242  */
  243 void
  244 venus_read(void)
  245 {
  246 }
  247 
  248 void
  249 venus_write(void)
  250 {
  251 }
  252 
  253 /*
  254  * this is a bit sad too.  the ioctl's are for the control file, not for
  255  * normal files.
  256  */
  257 int
  258 venus_ioctl(void *mdp, CodaFid *fid,
  259         int com, int flag, caddr_t data,
  260         struct ucred *cred, struct proc *p)
  261 {
  262     DECL(coda_ioctl);                   /* sets Isize & Osize */
  263     struct PioctlData *iap = (struct PioctlData *)data;
  264     int tmp;
  265 
  266     coda_ioctl_size = VC_MAXMSGSIZE;
  267     ALLOC(coda_ioctl);                  /* sets inp & outp */
  268 
  269     INIT_IN(&inp->ih, CODA_IOCTL, cred, p);
  270     inp->Fid = *fid;
  271 
  272     /* command was mutated by increasing its size field to reflect the  
  273      * path and follow args. we need to subtract that out before sending
  274      * the command to venus.
  275      */
  276     inp->cmd = (com & ~(IOCPARM_MASK << 16));
  277     tmp = ((com >> 16) & IOCPARM_MASK) - sizeof (char *) - sizeof (int);
  278     inp->cmd |= (tmp & IOCPARM_MASK) << 16;
  279 
  280     inp->rwflag = flag;
  281     inp->len = iap->vi.in_size;
  282     inp->data = (char *)(sizeof (struct coda_ioctl_in));
  283 
  284     error = copyin(iap->vi.in, (char*)inp + (long)inp->data, 
  285                    iap->vi.in_size);
  286     if (error) {
  287         CODA_FREE(inp, coda_ioctl_size);
  288         return(error);
  289     }
  290 
  291     Osize = VC_MAXMSGSIZE;
  292     error = coda_call(mdp, Isize + iap->vi.in_size, &Osize, (char *)inp);
  293 
  294         /* copy out the out buffer. */
  295     if (!error) {
  296         if (outp->len > iap->vi.out_size) {
  297             error = EINVAL;
  298         } else {
  299             error = copyout((char *)outp + (long)outp->data, 
  300                             iap->vi.out, iap->vi.out_size);
  301         }
  302     }
  303 
  304     CODA_FREE(inp, coda_ioctl_size);
  305     return error;
  306 }
  307 
  308 int
  309 venus_getattr(void *mdp, CodaFid *fid,
  310         struct ucred *cred, struct proc *p,
  311 /*out*/ struct vattr *vap)
  312 {
  313     DECL(coda_getattr);                 /* sets Isize & Osize */
  314     ALLOC(coda_getattr);                        /* sets inp & outp */
  315 
  316     /* send the open to venus. */
  317     INIT_IN(&inp->ih, CODA_GETATTR, cred, p);
  318     inp->Fid = *fid;
  319 
  320     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  321     if (!error) {
  322         CNV_VV2V_ATTR(vap, &outp->attr);
  323     }
  324 
  325     CODA_FREE(inp, coda_getattr_size);
  326     return error;
  327 }
  328 
  329 int
  330 venus_setattr(void *mdp, CodaFid *fid, struct vattr *vap,
  331         struct ucred *cred, struct proc *p)
  332 {
  333     DECL_NO_OUT(coda_setattr);          /* sets Isize & Osize */
  334     ALLOC_NO_OUT(coda_setattr);         /* sets inp & outp */
  335 
  336     /* send the open to venus. */
  337     INIT_IN(&inp->ih, CODA_SETATTR, cred, p);
  338     inp->Fid = *fid;
  339     CNV_V2VV_ATTR(&inp->attr, vap);
  340 
  341     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  342 
  343     CODA_FREE(inp, coda_setattr_size);
  344     return error;
  345 }
  346 
  347 int
  348 venus_access(void *mdp, CodaFid *fid, int mode,
  349         struct ucred *cred, struct proc *p)
  350 {
  351     DECL_NO_OUT(coda_access);           /* sets Isize & Osize */
  352     ALLOC_NO_OUT(coda_access);          /* sets inp & outp */
  353 
  354     /* send the open to venus. */
  355     INIT_IN(&inp->ih, CODA_ACCESS, cred, p);
  356     inp->Fid = *fid;
  357     /* NOTE:
  358      * NetBSD and Venus internals use the "data" in the low 3 bits.
  359      * Hence, the conversion.
  360      */
  361     inp->flags = mode>>6;
  362 
  363     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  364 
  365     CODA_FREE(inp, coda_access_size);
  366     return error;
  367 }
  368 
  369 int
  370 venus_readlink(void *mdp, CodaFid *fid,
  371         struct ucred *cred, struct proc *p,
  372 /*out*/ char **str, int *len)
  373 {
  374     DECL(coda_readlink);                        /* sets Isize & Osize */
  375     coda_readlink_size += CODA_MAXPATHLEN;
  376     ALLOC(coda_readlink);               /* sets inp & outp */
  377 
  378     /* send the open to venus. */
  379     INIT_IN(&inp->ih, CODA_READLINK, cred, p);
  380     inp->Fid = *fid;
  381 
  382     Osize += CODA_MAXPATHLEN;
  383     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  384     if (!error) {
  385             CODA_ALLOC(*str, char *, outp->count);
  386             *len = outp->count;
  387             bcopy((char *)outp + (long)outp->data, *str, *len);
  388     }
  389 
  390     CODA_FREE(inp, coda_readlink_size);
  391     return error;
  392 }
  393 
  394 int
  395 venus_fsync(void *mdp, CodaFid *fid, struct proc *p)
  396 {
  397     DECL_NO_OUT(coda_fsync);            /* sets Isize & Osize */
  398     ALLOC_NO_OUT(coda_fsync);           /* sets inp & outp */
  399 
  400     /* send the open to venus. */
  401     INIT_IN(&inp->ih, CODA_FSYNC, NOCRED, p);   /* XXX: should be cached mount cred */
  402     inp->Fid = *fid;
  403 
  404     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  405 
  406     CODA_FREE(inp, coda_fsync_size);
  407     return error;
  408 }
  409 
  410 int
  411 venus_lookup(void *mdp, CodaFid *fid,
  412         const char *nm, int len,
  413         struct ucred *cred, struct proc *p,
  414 /*out*/ CodaFid *VFid, int *vtype)
  415 {
  416     DECL(coda_lookup);                  /* sets Isize & Osize */
  417     coda_lookup_size += len + 1;
  418     ALLOC(coda_lookup);                 /* sets inp & outp */
  419 
  420     /* send the open to venus. */
  421     INIT_IN(&inp->ih, CODA_LOOKUP, cred, p);
  422     inp->Fid = *fid;
  423 
  424     /* NOTE:
  425      * Between version 1 and version 2 we have added an extra flag field
  426      * to this structure.  But because the string was at the end and because
  427      * of the wierd way we represent strings by having the slot point to
  428      * where the string characters are in the "heap", we can just slip the
  429      * flag parameter in after the string slot pointer and veni that don't
  430      * know better won't see this new flag field ...
  431      * Otherwise we'd need two different venus_lookup functions.
  432      */
  433     inp->name = Isize;
  434     inp->flags = CLU_CASE_SENSITIVE;    /* doesn't really matter for BSD */
  435     STRCPY(name, nm, len);              /* increments Isize */
  436 
  437     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  438     if (!error) {
  439         *VFid = outp->Fid;
  440         *vtype = outp->vtype;
  441     }
  442 
  443     CODA_FREE(inp, coda_lookup_size);
  444     return error;
  445 }
  446 
  447 int
  448 venus_create(void *mdp, CodaFid *fid,
  449         const char *nm, int len, int exclusive, int mode, struct vattr *va,
  450         struct ucred *cred, struct proc *p,
  451 /*out*/ CodaFid *VFid, struct vattr *attr)
  452 {
  453     DECL(coda_create);                  /* sets Isize & Osize */
  454     coda_create_size += len + 1;
  455     ALLOC(coda_create);                 /* sets inp & outp */
  456 
  457     /* send the open to venus. */
  458     INIT_IN(&inp->ih, CODA_CREATE, cred, p);
  459     inp->Fid = *fid;
  460     inp->excl = exclusive ? C_O_EXCL : 0;
  461     inp->mode = mode;
  462     CNV_V2VV_ATTR(&inp->attr, va);
  463 
  464     inp->name = Isize;
  465     STRCPY(name, nm, len);              /* increments Isize */
  466 
  467     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  468     if (!error) {
  469         *VFid = outp->Fid;
  470         CNV_VV2V_ATTR(attr, &outp->attr);
  471     }
  472 
  473     CODA_FREE(inp, coda_create_size);
  474     return error;
  475 }
  476 
  477 int
  478 venus_remove(void *mdp, CodaFid *fid,
  479         const char *nm, int len,
  480         struct ucred *cred, struct proc *p)
  481 {
  482     DECL_NO_OUT(coda_remove);           /* sets Isize & Osize */
  483     coda_remove_size += len + 1;
  484     ALLOC_NO_OUT(coda_remove);          /* sets inp & outp */
  485 
  486     /* send the open to venus. */
  487     INIT_IN(&inp->ih, CODA_REMOVE, cred, p);
  488     inp->Fid = *fid;
  489 
  490     inp->name = Isize;
  491     STRCPY(name, nm, len);              /* increments Isize */
  492 
  493     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  494 
  495     CODA_FREE(inp, coda_remove_size);
  496     return error;
  497 }
  498 
  499 int
  500 venus_link(void *mdp, CodaFid *fid, CodaFid *tfid,
  501         const char *nm, int len,
  502         struct ucred *cred, struct proc *p)
  503 {
  504     DECL_NO_OUT(coda_link);             /* sets Isize & Osize */
  505     coda_link_size += len + 1;
  506     ALLOC_NO_OUT(coda_link);            /* sets inp & outp */
  507 
  508     /* send the open to venus. */
  509     INIT_IN(&inp->ih, CODA_LINK, cred, p);
  510     inp->sourceFid = *fid;
  511     inp->destFid = *tfid;
  512 
  513     inp->tname = Isize;
  514     STRCPY(tname, nm, len);             /* increments Isize */
  515 
  516     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  517 
  518     CODA_FREE(inp, coda_link_size);
  519     return error;
  520 }
  521 
  522 int
  523 venus_rename(void *mdp, CodaFid *fid, CodaFid *tfid,
  524         const char *nm, int len, const char *tnm, int tlen,
  525         struct ucred *cred, struct proc *p)
  526 {
  527     DECL_NO_OUT(coda_rename);           /* sets Isize & Osize */
  528     coda_rename_size += len + 1 + tlen + 1;
  529     ALLOC_NO_OUT(coda_rename);          /* sets inp & outp */
  530 
  531     /* send the open to venus. */
  532     INIT_IN(&inp->ih, CODA_RENAME, cred, p);
  533     inp->sourceFid = *fid;
  534     inp->destFid = *tfid;
  535 
  536     inp->srcname = Isize;
  537     STRCPY(srcname, nm, len);           /* increments Isize */
  538 
  539     inp->destname = Isize;
  540     STRCPY(destname, tnm, tlen);        /* increments Isize */
  541 
  542     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  543 
  544     CODA_FREE(inp, coda_rename_size);
  545     return error;
  546 }
  547 
  548 int
  549 venus_mkdir(void *mdp, CodaFid *fid,
  550         const char *nm, int len, struct vattr *va,
  551         struct ucred *cred, struct proc *p,
  552 /*out*/ CodaFid *VFid, struct vattr *ova)
  553 {
  554     DECL(coda_mkdir);                   /* sets Isize & Osize */
  555     coda_mkdir_size += len + 1;
  556     ALLOC(coda_mkdir);                  /* sets inp & outp */
  557 
  558     /* send the open to venus. */
  559     INIT_IN(&inp->ih, CODA_MKDIR, cred, p);
  560     inp->Fid = *fid;
  561     CNV_V2VV_ATTR(&inp->attr, va);
  562 
  563     inp->name = Isize;
  564     STRCPY(name, nm, len);              /* increments Isize */
  565 
  566     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  567     if (!error) {
  568         *VFid = outp->Fid;
  569         CNV_VV2V_ATTR(ova, &outp->attr);
  570     }
  571 
  572     CODA_FREE(inp, coda_mkdir_size);
  573     return error;
  574 }
  575 
  576 int
  577 venus_rmdir(void *mdp, CodaFid *fid,
  578         const char *nm, int len,
  579         struct ucred *cred, struct proc *p)
  580 {
  581     DECL_NO_OUT(coda_rmdir);            /* sets Isize & Osize */
  582     coda_rmdir_size += len + 1;
  583     ALLOC_NO_OUT(coda_rmdir);           /* sets inp & outp */
  584 
  585     /* send the open to venus. */
  586     INIT_IN(&inp->ih, CODA_RMDIR, cred, p);
  587     inp->Fid = *fid;
  588 
  589     inp->name = Isize;
  590     STRCPY(name, nm, len);              /* increments Isize */
  591 
  592     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  593 
  594     CODA_FREE(inp, coda_rmdir_size);
  595     return error;
  596 }
  597 
  598 int
  599 venus_symlink(void *mdp, CodaFid *fid,
  600         const char *lnm, int llen, const char *nm, int len, struct vattr *va,
  601         struct ucred *cred, struct proc *p)
  602 {
  603     DECL_NO_OUT(coda_symlink);          /* sets Isize & Osize */
  604     coda_symlink_size += llen + 1 + len + 1;
  605     ALLOC_NO_OUT(coda_symlink);         /* sets inp & outp */
  606 
  607     /* send the open to venus. */
  608     INIT_IN(&inp->ih, CODA_SYMLINK, cred, p);
  609     inp->Fid = *fid;
  610     CNV_V2VV_ATTR(&inp->attr, va);
  611 
  612     inp->srcname = Isize;
  613     STRCPY(srcname, lnm, llen);         /* increments Isize */
  614 
  615     inp->tname = Isize;
  616     STRCPY(tname, nm, len);             /* increments Isize */
  617 
  618     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  619 
  620     CODA_FREE(inp, coda_symlink_size);
  621     return error;
  622 }
  623 
  624 int
  625 venus_readdir(void *mdp, CodaFid *fid,
  626         int count, int offset,
  627         struct ucred *cred, struct proc *p,
  628 /*out*/ char *buffer, int *len)
  629 {
  630     DECL(coda_readdir);                 /* sets Isize & Osize */
  631     coda_readdir_size = VC_MAXMSGSIZE;
  632     ALLOC(coda_readdir);                        /* sets inp & outp */
  633 
  634     /* send the open to venus. */
  635     INIT_IN(&inp->ih, CODA_READDIR, cred, p);
  636     inp->Fid = *fid;
  637     inp->count = count;
  638     inp->offset = offset;
  639 
  640     Osize = VC_MAXMSGSIZE;
  641     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  642     if (!error) {
  643         bcopy((char *)outp + (long)outp->data, buffer, outp->size);
  644         *len = outp->size;
  645     }
  646 
  647     CODA_FREE(inp, coda_readdir_size);
  648     return error;
  649 }
  650 
  651 int
  652 venus_fhtovp(void *mdp, CodaFid *fid,
  653         struct ucred *cred, struct proc *p,
  654 /*out*/ CodaFid *VFid, int *vtype)
  655 {
  656     DECL(coda_vget);                    /* sets Isize & Osize */
  657     ALLOC(coda_vget);                   /* sets inp & outp */
  658 
  659     /* Send the open to Venus. */
  660     INIT_IN(&inp->ih, CODA_VGET, cred, p);
  661     inp->Fid = *fid;
  662 
  663     error = coda_call(mdp, Isize, &Osize, (char *)inp);
  664     if (!error) {
  665         *VFid = outp->Fid;
  666         *vtype = outp->vtype;
  667     }
  668 
  669     CODA_FREE(inp, coda_vget_size);
  670     return error;
  671 }

Cache object: c2890229d9b3094fbb24810c4fc811f4


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.