lockd.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/nfsd/lockd.c
  3.  *
  4.  * This file contains all the stubs needed when communicating with lockd.
  5.  * This level of indirection is necessary so we can run nfsd+lockd without
  6.  * requiring the nfs client to be compiled in/loaded, and vice versa.
  7.  *
  8.  * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
  9.  */
  10. #include <linux/types.h>
  11. #include <linux/sunrpc/clnt.h>
  12. #include <linux/sunrpc/svc.h>
  13. #include <linux/nfsd/nfsd.h>
  14. #include <linux/lockd/bind.h>
  15. #define NFSDDBG_FACILITY NFSDDBG_LOCKD
  16. /*
  17.  * Note: we hold the dentry use count while the file is open.
  18.  */
  19. static u32
  20. nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file *filp)
  21. {
  22. u32 nfserr;
  23. struct svc_fh fh;
  24. /* must initialize before using! but maxsize doesn't matter */
  25. fh_init(&fh,0);
  26. fh.fh_handle.fh_size = f->size;
  27. memcpy((char*)&fh.fh_handle.fh_base, f->data, f->size);
  28. fh.fh_export = NULL;
  29. nfserr = nfsd_open(rqstp, &fh, S_IFREG, MAY_LOCK, filp);
  30. if (!nfserr) {
  31. dget(filp->f_dentry);
  32. mntget(filp->f_vfsmnt);
  33. }
  34. fh_put(&fh);
  35.   /* nlm and nfsd don't share error codes.
  36.  * we invent: 0 = no error
  37.  *            1 = stale file handle
  38.  *       2 = other error
  39.  */
  40. switch (nfserr) {
  41. case nfs_ok:
  42. return 0;
  43. case nfserr_stale:
  44. return 1;
  45. default:
  46. return 2;
  47. }
  48. }
  49. static void
  50. nlm_fclose(struct file *filp)
  51. {
  52. nfsd_close(filp);
  53. dput(filp->f_dentry);
  54. mntput(filp->f_vfsmnt);
  55. }
  56. struct nlmsvc_binding nfsd_nlm_ops = {
  57. exp_readlock, /* lock export table for reading */
  58. exp_unlock, /* unlock export table */
  59. exp_getclient, /* look up NFS client */
  60. nlm_fopen, /* open file for locking */
  61. nlm_fclose, /* close file */
  62. exp_nlmdetach, /* lockd shutdown notification */
  63. };
  64. /*
  65.  * When removing an NFS client entry, notify lockd that it is gone.
  66.  * FIXME: We should do the same when unexporting an NFS volume.
  67.  */
  68. void
  69. nfsd_lockd_unexport(struct svc_client *clnt)
  70. {
  71. nlmsvc_invalidate_client(clnt);
  72. }
  73. void
  74. nfsd_lockd_init(void)
  75. {
  76. dprintk("nfsd: initializing lockdn");
  77. nlmsvc_ops = &nfsd_nlm_ops;
  78. }
  79. void
  80. nfsd_lockd_shutdown(void)
  81. {
  82. nlmsvc_ops = NULL;
  83. }