~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/fs/nfsd/nfs3proc.c

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * linux/fs/nfsd/nfs3proc.c
  3  *
  4  * Process version 3 NFS requests.
  5  *
  6  * Copyright (C) 1996, 1997, 1998 Olaf Kirch <okir@monad.swb.de>
  7  */
  8 
  9 #include <linux/linkage.h>
 10 #include <linux/sched.h>
 11 #include <linux/errno.h>
 12 #include <linux/locks.h>
 13 #include <linux/fs.h>
 14 #include <linux/ext2_fs.h>
 15 #include <linux/stat.h>
 16 #include <linux/fcntl.h>
 17 #include <linux/net.h>
 18 #include <linux/in.h>
 19 #include <linux/version.h>
 20 #include <linux/unistd.h>
 21 #include <linux/malloc.h>
 22 #include <linux/major.h>
 23 
 24 #include <linux/sunrpc/svc.h>
 25 #include <linux/nfsd/nfsd.h>
 26 #include <linux/nfsd/cache.h>
 27 #include <linux/nfsd/xdr3.h>
 28 #include <linux/nfs3.h>
 29 
 30 #define NFSDDBG_FACILITY                NFSDDBG_PROC
 31 
 32 #define RETURN_STATUS(st)       { resp->status = (st); return (st); }
 33 
 34 static int      nfs3_ftypes[] = {
 35         0,                      /* NF3NON */
 36         S_IFREG,                /* NF3REG */
 37         S_IFDIR,                /* NF3DIR */
 38         S_IFBLK,                /* NF3BLK */
 39         S_IFCHR,                /* NF3CHR */
 40         S_IFLNK,                /* NF3LNK */
 41         S_IFSOCK,               /* NF3SOCK */
 42         S_IFIFO,                /* NF3FIFO */
 43 };
 44 
 45 /*
 46  * Reserve room in the send buffer
 47  */
 48 static void
 49 svcbuf_reserve(struct svc_buf *buf, u32 **ptr, int *len, int nr)
 50 {
 51         *ptr = buf->buf + nr;
 52         *len = buf->buflen - buf->len - nr;
 53 }
 54 
 55 /*
 56  * NULL call.
 57  */
 58 static int
 59 nfsd3_proc_null(struct svc_rqst *rqstp, void *argp, void *resp)
 60 {
 61         return nfs_ok;
 62 }
 63 
 64 /*
 65  * Get a file's attributes
 66  */
 67 static int
 68 nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,
 69                                            struct nfsd3_attrstat *resp)
 70 {
 71         int     nfserr;
 72 
 73         dprintk("nfsd: GETATTR(3)  %s\n",
 74                                 SVCFH_fmt(&argp->fh));
 75 
 76         fh_copy(&resp->fh, &argp->fh);
 77         nfserr = fh_verify(rqstp, &resp->fh, 0, MAY_NOP);
 78         RETURN_STATUS(nfserr);
 79 }
 80 
 81 /*
 82  * Set a file's attributes
 83  */
 84 static int
 85 nfsd3_proc_setattr(struct svc_rqst *rqstp, struct nfsd3_sattrargs *argp,
 86                                            struct nfsd3_attrstat  *resp)
 87 {
 88         int     nfserr;
 89 
 90         dprintk("nfsd: SETATTR(3)  %s\n",
 91                                 SVCFH_fmt(&argp->fh));
 92 
 93         fh_copy(&resp->fh, &argp->fh);
 94         nfserr = nfsd_setattr(rqstp, &resp->fh, &argp->attrs);
 95         RETURN_STATUS(nfserr);
 96 }
 97 
 98 /*
 99  * Look up a path name component
100  */
101 static int
102 nfsd3_proc_lookup(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
103                                           struct nfsd3_diropres  *resp)
104 {
105         int     nfserr;
106 
107         dprintk("nfsd: LOOKUP(3)   %s %s\n",
108                                 SVCFH_fmt(&argp->fh),
109                                 argp->name);
110 
111         fh_copy(&resp->dirfh, &argp->fh);
112         fh_init(&resp->fh, NFS3_FHSIZE);
113 
114         nfserr = nfsd_lookup(rqstp, &resp->dirfh,
115                                     argp->name,
116                                     argp->len,
117                                     &resp->fh);
118         RETURN_STATUS(nfserr);
119 }
120 
121 /*
122  * Check file access
123  */
124 static int
125 nfsd3_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessargs *argp,
126                                           struct nfsd3_accessres *resp)
127 {
128         int     nfserr;
129 
130         dprintk("nfsd: ACCESS(3)   %s 0x%x\n",
131                                 SVCFH_fmt(&argp->fh),
132                                 argp->access);
133 
134         fh_copy(&resp->fh, &argp->fh);
135         resp->access = argp->access;
136         nfserr = nfsd_access(rqstp, &resp->fh, &resp->access);
137         RETURN_STATUS(nfserr);
138 }
139 
140 /*
141  * Read a symlink.
142  */
143 static int
144 nfsd3_proc_readlink(struct svc_rqst *rqstp, struct nfsd_fhandle     *argp,
145                                            struct nfsd3_readlinkres *resp)
146 {
147         u32             *path;
148         int             dummy, nfserr;
149 
150         dprintk("nfsd: READLINK(3) %s\n", SVCFH_fmt(&argp->fh));
151 
152         /* Reserve room for status, post_op_attr, and path length */
153         svcbuf_reserve(&rqstp->rq_resbuf, &path, &dummy,
154                                 1 + NFS3_POST_OP_ATTR_WORDS + 1);
155 
156         /* Read the symlink. */
157         fh_copy(&resp->fh, &argp->fh);
158         resp->len = NFS3_MAXPATHLEN;
159         nfserr = nfsd_readlink(rqstp, &resp->fh, (char *) path, &resp->len);
160         RETURN_STATUS(nfserr);
161 }
162 
163 /*
164  * Read a portion of a file.
165  */
166 static int
167 nfsd3_proc_read(struct svc_rqst *rqstp, struct nfsd3_readargs *argp,
168                                         struct nfsd3_readres  *resp)
169 {
170         u32 *   buffer;
171         int     nfserr, avail;
172 
173         dprintk("nfsd: READ(3) %s %lu bytes at %lu\n",
174                                 SVCFH_fmt(&argp->fh),
175                                 (unsigned long) argp->count,
176                                 (unsigned long) argp->offset);
177 
178         /* Obtain buffer pointer for payload.
179          * 1 (status) + 22 (post_op_attr) + 1 (count) + 1 (eof)
180          * + 1 (xdr opaque byte count) = 26
181          */
182         svcbuf_reserve(&rqstp->rq_resbuf, &buffer, &avail,
183                         1 + NFS3_POST_OP_ATTR_WORDS + 3);
184 
185         resp->count = argp->count;
186         if ((avail << 2) < resp->count)
187                 resp->count = avail << 2;
188 
189         fh_copy(&resp->fh, &argp->fh);
190         nfserr = nfsd_read(rqstp, &resp->fh,
191                                   argp->offset,
192                                   (char *) buffer,
193                                   &resp->count);
194         if (nfserr == 0) {
195                 struct inode    *inode = resp->fh.fh_dentry->d_inode;
196 
197                 resp->eof = (argp->offset + resp->count) >= inode->i_size;
198         }
199 
200         RETURN_STATUS(nfserr);
201 }
202 
203 /*
204  * Write data to a file
205  */
206 static int
207 nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
208                                          struct nfsd3_writeres  *resp)
209 {
210         int     nfserr;
211 
212         dprintk("nfsd: WRITE(3)    %s %d bytes at %ld%s\n",
213                                 SVCFH_fmt(&argp->fh),
214                                 argp->len,
215                                 (unsigned long) argp->offset,
216                                 argp->stable? " stable" : "");
217 
218         fh_copy(&resp->fh, &argp->fh);
219         resp->committed = argp->stable;
220         nfserr = nfsd_write(rqstp, &resp->fh,
221                                    argp->offset,
222                                    argp->data,
223                                    argp->len,
224                                    &resp->committed);
225         resp->count = argp->count;
226         RETURN_STATUS(nfserr);
227 }
228 
229 /*
230  * With NFSv3, CREATE processing is a lot easier than with NFSv2.
231  * At least in theory; we'll see how it fares in practice when the
232  * first reports about SunOS compatibility problems start to pour in...
233  */
234 static int
235 nfsd3_proc_create(struct svc_rqst *rqstp, struct nfsd3_createargs *argp,
236                                           struct nfsd3_diropres   *resp)
237 {
238         svc_fh          *dirfhp, *newfhp = NULL;
239         struct iattr    *attr;
240         u32             nfserr;
241 
242         dprintk("nfsd: CREATE(3)   %s %s\n",
243                                 SVCFH_fmt(&argp->fh),
244                                 argp->name);
245 
246         dirfhp = fh_copy(&resp->dirfh, &argp->fh);
247         newfhp = fh_init(&resp->fh, NFS3_FHSIZE);
248         attr   = &argp->attrs;
249 
250         /* Get the directory inode */
251         nfserr = fh_verify(rqstp, dirfhp, S_IFDIR, MAY_CREATE);
252         if (nfserr)
253                 RETURN_STATUS(nfserr);
254 
255         /* Unfudge the mode bits */
256         attr->ia_mode &= ~S_IFMT;
257         if (!(attr->ia_valid & ATTR_MODE)) { 
258                 attr->ia_valid |= ATTR_MODE;
259                 attr->ia_mode = S_IFREG;
260         } else {
261                 attr->ia_mode = (attr->ia_mode & ~S_IFMT) | S_IFREG;
262         }
263 
264         /* Now create the file and set attributes */
265         nfserr = nfsd_create_v3(rqstp, dirfhp, argp->name, argp->len,
266                                 attr, newfhp,
267                                 argp->createmode, argp->verf);
268 
269         RETURN_STATUS(nfserr);
270 }
271 
272 /*
273  * Make directory. This operation is not idempotent.
274  */
275 static int
276 nfsd3_proc_mkdir(struct svc_rqst *rqstp, struct nfsd3_createargs *argp,
277                                          struct nfsd3_diropres   *resp)
278 {
279         int     nfserr;
280 
281         dprintk("nfsd: MKDIR(3)    %s %s\n",
282                                 SVCFH_fmt(&argp->fh),
283                                 argp->name);
284 
285         argp->attrs.ia_valid &= ~ATTR_SIZE;
286         fh_copy(&resp->dirfh, &argp->fh);
287         fh_init(&resp->fh, NFS3_FHSIZE);
288         nfserr = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len,
289                                     &argp->attrs, S_IFDIR, 0, &resp->fh);
290 
291         RETURN_STATUS(nfserr);
292 }
293 
294 static int
295 nfsd3_proc_symlink(struct svc_rqst *rqstp, struct nfsd3_symlinkargs *argp,
296                                            struct nfsd3_diropres    *resp)
297 {
298         int     nfserr;
299 
300         dprintk("nfsd: SYMLINK(3)  %s %s -> %s\n",
301                                 SVCFH_fmt(&argp->ffh),
302                                 argp->fname, argp->tname);
303 
304         fh_copy(&resp->dirfh, &argp->ffh);
305         fh_init(&resp->fh, NFS3_FHSIZE);
306         nfserr = nfsd_symlink(rqstp, &resp->dirfh, argp->fname, argp->flen,
307                                                    argp->tname, argp->tlen,
308                                                    &resp->fh, &argp->attrs);
309         RETURN_STATUS(nfserr);
310 }
311 
312 /*
313  * Make socket/fifo/device.
314  */
315 static int
316 nfsd3_proc_mknod(struct svc_rqst *rqstp, struct nfsd3_mknodargs *argp,
317                                          struct nfsd3_diropres  *resp)
318 {
319         int     nfserr, type;
320         dev_t   rdev = 0;
321 
322         dprintk("nfsd: MKNOD(3)    %s %s\n",
323                                 SVCFH_fmt(&argp->fh),
324                                 argp->name);
325 
326         fh_copy(&resp->dirfh, &argp->fh);
327         fh_init(&resp->fh, NFS3_FHSIZE);
328 
329         if (argp->ftype == 0 || argp->ftype >= NF3BAD)
330                 RETURN_STATUS(nfserr_inval);
331         if (argp->ftype == NF3CHR || argp->ftype == NF3BLK) {
332                 if ((argp->ftype == NF3CHR && argp->major >= MAX_CHRDEV)
333                     || (argp->ftype == NF3BLK && argp->major >= MAX_BLKDEV)
334                     || argp->minor > 0xFF)
335                         RETURN_STATUS(nfserr_inval);
336                 rdev = ((argp->major) << 8) | (argp->minor);
337         } else
338                 if (argp->ftype != NF3SOCK && argp->ftype != NF3FIFO)
339                         RETURN_STATUS(nfserr_inval);
340 
341         type = nfs3_ftypes[argp->ftype];
342         nfserr = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len,
343                                     &argp->attrs, type, rdev, &resp->fh);
344 
345         RETURN_STATUS(nfserr);
346 }
347 
348 /*
349  * Remove file/fifo/socket etc.
350  */
351 static int
352 nfsd3_proc_remove(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
353                                           struct nfsd3_attrstat  *resp)
354 {
355         int     nfserr;
356 
357         dprintk("nfsd: REMOVE(3)   %s %s\n",
358                                 SVCFH_fmt(&argp->fh),
359                                 argp->name);
360 
361         /* Unlink. -S_IFDIR means file must not be a directory */
362         fh_copy(&resp->fh, &argp->fh);
363         nfserr = nfsd_unlink(rqstp, &resp->fh, -S_IFDIR, argp->name, argp->len);
364         RETURN_STATUS(nfserr);
365 }
366 
367 /*
368  * Remove a directory
369  */
370 static int
371 nfsd3_proc_rmdir(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,
372                                          struct nfsd3_attrstat  *resp)
373 {
374         int     nfserr;
375 
376         dprintk("nfsd: RMDIR(3)    %s %s\n",
377                                 SVCFH_fmt(&argp->fh),
378                                 argp->name);
379 
380         fh_copy(&resp->fh, &argp->fh);
381         nfserr = nfsd_unlink(rqstp, &resp->fh, S_IFDIR, argp->name, argp->len);
382         RETURN_STATUS(nfserr);
383 }
384 
385 static int
386 nfsd3_proc_rename(struct svc_rqst *rqstp, struct nfsd3_renameargs *argp,
387                                           struct nfsd3_renameres  *resp)
388 {
389         int     nfserr;
390 
391         dprintk("nfsd: RENAME(3)   %s %s ->\n",
392                                 SVCFH_fmt(&argp->ffh),
393                                 argp->fname);
394         dprintk("nfsd: -> %s %s\n",
395                                 SVCFH_fmt(&argp->tfh),
396                                 argp->tname);
397 
398         fh_copy(&resp->ffh, &argp->ffh);
399         fh_copy(&resp->tfh, &argp->tfh);
400         nfserr = nfsd_rename(rqstp, &resp->ffh, argp->fname, argp->flen,
401                                     &resp->tfh, argp->tname, argp->tlen);
402         RETURN_STATUS(nfserr);
403 }
404 
405 static int
406 nfsd3_proc_link(struct svc_rqst *rqstp, struct nfsd3_linkargs *argp,
407                                         struct nfsd3_linkres  *resp)
408 {
409         int     nfserr;
410 
411         dprintk("nfsd: LINK(3)     %s ->\n",
412                                 SVCFH_fmt(&argp->ffh));
413         dprintk("nfsd:   -> %s %s\n",
414                                 SVCFH_fmt(&argp->tfh),
415                                 argp->tname);
416 
417         fh_copy(&resp->fh,  &argp->ffh);
418         fh_copy(&resp->tfh, &argp->tfh);
419         nfserr = nfsd_link(rqstp, &resp->tfh, argp->tname, argp->tlen,
420                                   &resp->fh);
421         RETURN_STATUS(nfserr);
422 }
423 
424 /*
425  * Read a portion of a directory.
426  */
427 static int
428 nfsd3_proc_readdir(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,
429                                            struct nfsd3_readdirres  *resp)
430 {
431         u32 *           buffer;
432         int             nfserr, count;
433         unsigned int    want;
434 
435         dprintk("nfsd: READDIR(3)  %s %d bytes at %d\n",
436                                 SVCFH_fmt(&argp->fh),
437                                 argp->count, (u32) argp->cookie);
438 
439         /* Reserve buffer space for status, attributes and verifier */
440         svcbuf_reserve(&rqstp->rq_resbuf, &buffer, &count,
441                                 1 + NFS3_POST_OP_ATTR_WORDS + 2);
442 
443         /* Make sure we've room for the NULL ptr & eof flag, and shrink to
444          * client read size */
445         if ((count -= 2) > (want = (argp->count >> 2) - 2))
446                 count = want;
447 
448         /* Read directory and encode entries on the fly */
449         fh_copy(&resp->fh, &argp->fh);
450         nfserr = nfsd_readdir(rqstp, &resp->fh, (loff_t) argp->cookie, 
451                                         nfs3svc_encode_entry,
452                                         buffer, &count, argp->verf);
453         memcpy(resp->verf, argp->verf, 8);
454         resp->count = count;
455 
456         RETURN_STATUS(nfserr);
457 }
458 
459 /*
460  * Read a portion of a directory, including file handles and attrs.
461  * For now, we choose to ignore the dircount parameter.
462  */
463 static int
464 nfsd3_proc_readdirplus(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,
465                                                struct nfsd3_readdirres  *resp)
466 {
467         u32 *   buffer;
468         int     nfserr, count, want;
469 
470         dprintk("nfsd: READDIR+(3) %s %d bytes at %d\n",
471                                 SVCFH_fmt(&argp->fh),
472                                 argp->count, (u32) argp->cookie);
473 
474         /* Reserve buffer space for status, attributes and verifier */
475         svcbuf_reserve(&rqstp->rq_resbuf, &buffer, &count,
476                                 1 + NFS3_POST_OP_ATTR_WORDS + 2);
477 
478         /* Make sure we've room for the NULL ptr & eof flag, and shrink to
479          * client read size */
480         if ((count -= 2) > (want = argp->count >> 2))
481                 count = want;
482 
483         /* Read directory and encode entries on the fly */
484         fh_copy(&resp->fh, &argp->fh);
485         nfserr = nfsd_readdir(rqstp, &resp->fh, (loff_t) argp->cookie, 
486                                         nfs3svc_encode_entry_plus,
487                                         buffer, &count, argp->verf);
488         memcpy(resp->verf, argp->verf, 8);
489         resp->count = count;
490 
491         RETURN_STATUS(nfserr);
492 }
493 
494 /*
495  * Get file system stats
496  */
497 static int
498 nfsd3_proc_fsstat(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,
499                                            struct nfsd3_fsstatres *resp)
500 {
501         int     nfserr;
502 
503         dprintk("nfsd: FSSTAT(3)   %s\n",
504                                 SVCFH_fmt(&argp->fh));
505 
506         nfserr = nfsd_statfs(rqstp, &argp->fh, &resp->stats);
507         fh_put(&argp->fh);
508         RETURN_STATUS(nfserr);
509 }
510 
511 /*
512  * Get file system info
513  */
514 static int
515 nfsd3_proc_fsinfo(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,
516                                            struct nfsd3_fsinfores *resp)
517 {
518         int     nfserr;
519 
520         dprintk("nfsd: FSINFO(3)   %s\n",
521                                 SVCFH_fmt(&argp->fh));
522 
523         resp->f_rtmax  = NFSSVC_MAXBLKSIZE;
524         resp->f_rtpref = NFSSVC_MAXBLKSIZE;
525         resp->f_rtmult = PAGE_SIZE;
526         resp->f_wtmax  = NFSSVC_MAXBLKSIZE;
527         resp->f_wtpref = NFSSVC_MAXBLKSIZE;
528         resp->f_wtmult = PAGE_SIZE;
529         resp->f_dtpref = PAGE_SIZE;
530         resp->f_maxfilesize = ~(u32) 0;
531         resp->f_properties = NFS3_FSF_DEFAULT;
532 
533         nfserr = fh_verify(rqstp, &argp->fh, 0, MAY_NOP);
534 
535         /* Check special features of the file system. May request
536          * different read/write sizes for file systems known to have
537          * problems with large blocks */
538         if (nfserr == 0) {
539                 struct super_block *sb = argp->fh.fh_dentry->d_inode->i_sb;
540 
541                 /* Note that we don't care for remote fs's here */
542                 if (sb->s_magic == 0x4d44 /* MSDOS_SUPER_MAGIC */) {
543                         resp->f_properties = NFS3_FSF_BILLYBOY;
544                 }
545         }
546 
547         fh_put(&argp->fh);
548         RETURN_STATUS(nfserr);
549 }
550 
551 /*
552  * Get pathconf info for the specified file
553  */
554 static int
555 nfsd3_proc_pathconf(struct svc_rqst * rqstp, struct nfsd_fhandle      *argp,
556                                              struct nfsd3_pathconfres *resp)
557 {
558         int     nfserr;
559 
560         dprintk("nfsd: PATHCONF(3) %s\n",
561                                 SVCFH_fmt(&argp->fh));
562 
563         /* Set default pathconf */
564         resp->p_link_max = 255;         /* at least */
565         resp->p_name_max = 255;         /* at least */
566         resp->p_no_trunc = 0;
567         resp->p_chown_restricted = 1;
568         resp->p_case_insensitive = 0;
569         resp->p_case_preserving = 1;
570 
571         nfserr = fh_verify(rqstp, &argp->fh, 0, MAY_NOP);
572 
573         if (nfserr == 0) {
574                 struct super_block *sb = argp->fh.fh_dentry->d_inode->i_sb;
575 
576                 /* Note that we don't care for remote fs's here */
577                 switch (sb->s_magic) {
578                 case EXT2_SUPER_MAGIC:
579                         resp->p_link_max = EXT2_LINK_MAX;
580                         resp->p_name_max = EXT2_NAME_LEN;
581                         break;
582                 case 0x4d44:    /* MSDOS_SUPER_MAGIC */
583                         resp->p_case_insensitive = 1;
584                         resp->p_case_preserving  = 0;
585                         break;
586                 }
587         }
588 
589         fh_put(&argp->fh);
590         RETURN_STATUS(nfserr);
591 }
592 
593 
594 /*
595  * Commit a file (range) to stable storage.
596  */
597 static int
598 nfsd3_proc_commit(struct svc_rqst * rqstp, struct nfsd3_commitargs *argp,
599                                            struct nfsd3_commitres  *resp)
600 {
601         int     nfserr;
602 
603         dprintk("nfsd: COMMIT(3)   %s %d@%ld\n",
604                                 SVCFH_fmt(&argp->fh),
605                                 argp->count,
606                                 (unsigned long) argp->offset);
607 
608         if (argp->offset > NFS_OFFSET_MAX)
609                 RETURN_STATUS(nfserr_inval);
610 
611         fh_copy(&resp->fh, &argp->fh);
612         nfserr = nfsd_commit(rqstp, &resp->fh, argp->offset, argp->count);
613 
614         RETURN_STATUS(nfserr);
615 }
616 
617 
618 /*
619  * NFSv3 Server procedures.
620  * Only the results of non-idempotent operations are cached.
621  */
622 #define nfs3svc_decode_voidargs         NULL
623 #define nfs3svc_release_void            NULL
624 #define nfs3svc_decode_fhandleargs      nfs3svc_decode_fhandle
625 #define nfs3svc_encode_attrstatres      nfs3svc_encode_attrstat
626 #define nfs3svc_encode_wccstatres       nfs3svc_encode_wccstat
627 #define nfsd3_mkdirargs                 nfsd3_createargs
628 #define nfsd3_readdirplusargs           nfsd3_readdirargs
629 #define nfsd3_fhandleargs               nfsd_fhandle
630 #define nfsd3_fhandleres                nfsd3_attrstat
631 #define nfsd3_attrstatres               nfsd3_attrstat
632 #define nfsd3_wccstatres                nfsd3_attrstat
633 #define nfsd3_createres                 nfsd3_diropres
634 #define nfsd3_voidres                   nfsd3_voidargs
635 struct nfsd3_voidargs { int dummy; };
636 
637 #define PROC(name, argt, rest, relt, cache)     \
638  { (svc_procfunc) nfsd3_proc_##name,            \
639    (kxdrproc_t) nfs3svc_decode_##argt##args,    \
640    (kxdrproc_t) nfs3svc_encode_##rest##res,     \
641    (kxdrproc_t) nfs3svc_release_##relt,         \
642    sizeof(struct nfsd3_##argt##args),           \
643    sizeof(struct nfsd3_##rest##res),            \
644    0,                                           \
645    cache                                        \
646  }
647 struct svc_procedure            nfsd_procedures3[22] = {
648   PROC(null,     void,          void,           void,    RC_NOCACHE),
649   PROC(getattr,  fhandle,       attrstat,       fhandle, RC_NOCACHE),
650   PROC(setattr,  sattr,         wccstat,        fhandle,  RC_REPLBUFF),
651   PROC(lookup,   dirop,         dirop,          fhandle2, RC_NOCACHE),
652   PROC(access,   access,        access,         fhandle,  RC_NOCACHE),
653   PROC(readlink, fhandle,       readlink,       fhandle,  RC_NOCACHE),
654   PROC(read,     read,          read,           fhandle, RC_NOCACHE),
655   PROC(write,    write,         write,          fhandle,  RC_REPLBUFF),
656   PROC(create,   create,        create,         fhandle2, RC_REPLBUFF),
657   PROC(mkdir,    mkdir,         create,         fhandle2, RC_REPLBUFF),
658   PROC(symlink,  symlink,       create,         fhandle2, RC_REPLBUFF),
659   PROC(mknod,    mknod,         create,         fhandle2, RC_REPLBUFF),
660   PROC(remove,   dirop,         wccstat,        fhandle,  RC_REPLBUFF),
661   PROC(rmdir,    dirop,         wccstat,        fhandle,  RC_REPLBUFF),
662   PROC(rename,   rename,        rename,         fhandle2, RC_REPLBUFF),
663   PROC(link,     link,          link,           fhandle2, RC_REPLBUFF),
664   PROC(readdir,  readdir,       readdir,        fhandle,  RC_NOCACHE),
665   PROC(readdirplus,readdirplus, readdir,        fhandle,  RC_NOCACHE),
666   PROC(fsstat,   fhandle,       fsstat,         void,     RC_NOCACHE),
667   PROC(fsinfo,   fhandle,       fsinfo,         void,     RC_NOCACHE),
668   PROC(pathconf, fhandle,       pathconf,       void,     RC_NOCACHE),
669   PROC(commit,   commit,        commit,         fhandle,  RC_NOCACHE)
670 };
671 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.