home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / nfsd / nfsd.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  13.6 KB  |  333 lines

  1. /*
  2.  * linux/include/linux/nfsd/nfsd.h
  3.  *
  4.  * Hodge-podge collection of knfsd-related stuff.
  5.  * I will sort this out later.
  6.  *
  7.  * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
  8.  */
  9.  
  10. #ifndef LINUX_NFSD_NFSD_H
  11. #define LINUX_NFSD_NFSD_H
  12.  
  13. #include <linux/types.h>
  14. #include <linux/unistd.h>
  15. #include <linux/dirent.h>
  16. #include <linux/fs.h>
  17. #include <linux/posix_acl.h>
  18. #include <linux/mount.h>
  19.  
  20. #include <linux/nfsd/debug.h>
  21. #include <linux/nfsd/nfsfh.h>
  22. #include <linux/nfsd/export.h>
  23. #include <linux/nfsd/auth.h>
  24. #include <linux/nfsd/stats.h>
  25. #include <linux/nfsd/interface.h>
  26. /*
  27.  * nfsd version
  28.  */
  29. #define NFSD_VERSION        "0.5"
  30. #define NFSD_SUPPORTED_MINOR_VERSION    0
  31.  
  32. #ifdef __KERNEL__
  33. /*
  34.  * Special flags for nfsd_permission. These must be different from MAY_READ,
  35.  * MAY_WRITE, and MAY_EXEC.
  36.  */
  37. #define MAY_NOP            0
  38. #define MAY_SATTR        8
  39. #define MAY_TRUNC        16
  40. #define MAY_LOCK        32
  41. #define MAY_OWNER_OVERRIDE    64
  42. #define    MAY_LOCAL_ACCESS    128 /* IRIX doing local access check on device special file*/
  43. #if (MAY_SATTR | MAY_TRUNC | MAY_LOCK | MAY_OWNER_OVERRIDE | MAY_LOCAL_ACCESS) & (MAY_READ | MAY_WRITE | MAY_EXEC)
  44. # error "please use a different value for MAY_SATTR or MAY_TRUNC or MAY_LOCK or MAY_LOCAL_ACCESS or MAY_OWNER_OVERRIDE."
  45. #endif
  46. #define MAY_CREATE        (MAY_EXEC|MAY_WRITE)
  47. #define MAY_REMOVE        (MAY_EXEC|MAY_WRITE|MAY_TRUNC)
  48.  
  49. /*
  50.  * Callback function for readdir
  51.  */
  52. struct readdir_cd {
  53.     int            err;    /* 0, nfserr, or nfserr_eof */
  54. };
  55. typedef int        (*encode_dent_fn)(struct readdir_cd *, const char *,
  56.                         int, loff_t, ino_t, unsigned int);
  57. typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
  58.  
  59. extern struct svc_program    nfsd_program;
  60. extern struct svc_version    nfsd_version2, nfsd_version3,
  61.                 nfsd_version4;
  62. extern struct svc_serv        *nfsd_serv;
  63. /*
  64.  * Function prototypes.
  65.  */
  66. int        nfsd_svc(unsigned short port, int nrservs);
  67. int        nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp);
  68.  
  69. /* nfsd/vfs.c */
  70. int        fh_lock_parent(struct svc_fh *, struct dentry *);
  71. int        nfsd_racache_init(int);
  72. void        nfsd_racache_shutdown(void);
  73. int        nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp,
  74.                         struct svc_export **expp);
  75. int        nfsd_lookup(struct svc_rqst *, struct svc_fh *,
  76.                 const char *, int, struct svc_fh *);
  77. int        nfsd_setattr(struct svc_rqst *, struct svc_fh *,
  78.                 struct iattr *, int, time_t);
  79. #ifdef CONFIG_NFSD_V4
  80. int             nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
  81.                     struct nfs4_acl *);
  82. int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **);
  83. #endif /* CONFIG_NFSD_V4 */
  84. int        nfsd_create(struct svc_rqst *, struct svc_fh *,
  85.                 char *name, int len, struct iattr *attrs,
  86.                 int type, dev_t rdev, struct svc_fh *res);
  87. #ifdef CONFIG_NFSD_V3
  88. int        nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
  89. int        nfsd_create_v3(struct svc_rqst *, struct svc_fh *,
  90.                 char *name, int len, struct iattr *attrs,
  91.                 struct svc_fh *res, int createmode,
  92.                 u32 *verifier, int *truncp);
  93. int        nfsd_commit(struct svc_rqst *, struct svc_fh *,
  94.                 loff_t, unsigned long);
  95. #endif /* CONFIG_NFSD_V3 */
  96. int        nfsd_open(struct svc_rqst *, struct svc_fh *, int,
  97.                 int, struct file **);
  98. void        nfsd_close(struct file *);
  99. int         nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
  100.                 loff_t, struct kvec *, int, unsigned long *);
  101. int         nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
  102.                 loff_t, struct kvec *,int, unsigned long, int *);
  103. int        nfsd_readlink(struct svc_rqst *, struct svc_fh *,
  104.                 char *, int *);
  105. int        nfsd_symlink(struct svc_rqst *, struct svc_fh *,
  106.                 char *name, int len, char *path, int plen,
  107.                 struct svc_fh *res, struct iattr *);
  108. int        nfsd_link(struct svc_rqst *, struct svc_fh *,
  109.                 char *, int, struct svc_fh *);
  110. int        nfsd_rename(struct svc_rqst *,
  111.                 struct svc_fh *, char *, int,
  112.                 struct svc_fh *, char *, int);
  113. int        nfsd_remove(struct svc_rqst *,
  114.                 struct svc_fh *, char *, int);
  115. int        nfsd_unlink(struct svc_rqst *, struct svc_fh *, int type,
  116.                 char *name, int len);
  117. int        nfsd_truncate(struct svc_rqst *, struct svc_fh *,
  118.                 unsigned long size);
  119. int        nfsd_readdir(struct svc_rqst *, struct svc_fh *,
  120.                  loff_t *, struct readdir_cd *, encode_dent_fn);
  121. int        nfsd_statfs(struct svc_rqst *, struct svc_fh *,
  122.                 struct kstatfs *);
  123.  
  124. int        nfsd_notify_change(struct inode *, struct iattr *);
  125. int        nfsd_permission(struct svc_export *, struct dentry *, int);
  126. int        nfsd_sync_dir(struct dentry *dp);
  127.  
  128. #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
  129. #ifdef CONFIG_NFSD_V2_ACL
  130. extern struct svc_version nfsd_acl_version2;
  131. #else
  132. #define nfsd_acl_version2 NULL
  133. #endif
  134. #ifdef CONFIG_NFSD_V3_ACL
  135. extern struct svc_version nfsd_acl_version3;
  136. #else
  137. #define nfsd_acl_version3 NULL
  138. #endif
  139. struct posix_acl *nfsd_get_posix_acl(struct svc_fh *, int);
  140. int nfsd_set_posix_acl(struct svc_fh *, int, struct posix_acl *);
  141. #endif
  142.  
  143.  
  144. /* 
  145.  * NFSv4 State
  146.  */
  147. #ifdef CONFIG_NFSD_V4
  148. void nfs4_state_init(void);
  149. int nfs4_state_start(void);
  150. void nfs4_state_shutdown(void);
  151. time_t nfs4_lease_time(void);
  152. void nfs4_reset_lease(time_t leasetime);
  153. int nfs4_reset_recoverydir(char *recdir);
  154. #else
  155. static inline void nfs4_state_init(void){};
  156. static inline int nfs4_state_start(void){return 0;}
  157. static inline void nfs4_state_shutdown(void){}
  158. static inline time_t nfs4_lease_time(void){return 0;}
  159. static inline void nfs4_reset_lease(time_t leasetime){}
  160. static inline int nfs4_reset_recoverydir(char *recdir) {return 0;}
  161. #endif
  162.  
  163. /*
  164.  * lockd binding
  165.  */
  166. void        nfsd_lockd_init(void);
  167. void        nfsd_lockd_shutdown(void);
  168.  
  169.  
  170. /*
  171.  * These macros provide pre-xdr'ed values for faster operation.
  172.  */
  173. #define    nfs_ok            __constant_htonl(NFS_OK)
  174. #define    nfserr_perm        __constant_htonl(NFSERR_PERM)
  175. #define    nfserr_noent        __constant_htonl(NFSERR_NOENT)
  176. #define    nfserr_io        __constant_htonl(NFSERR_IO)
  177. #define    nfserr_nxio        __constant_htonl(NFSERR_NXIO)
  178. #define    nfserr_eagain        __constant_htonl(NFSERR_EAGAIN)
  179. #define    nfserr_acces        __constant_htonl(NFSERR_ACCES)
  180. #define    nfserr_exist        __constant_htonl(NFSERR_EXIST)
  181. #define    nfserr_xdev        __constant_htonl(NFSERR_XDEV)
  182. #define    nfserr_nodev        __constant_htonl(NFSERR_NODEV)
  183. #define    nfserr_notdir        __constant_htonl(NFSERR_NOTDIR)
  184. #define    nfserr_isdir        __constant_htonl(NFSERR_ISDIR)
  185. #define    nfserr_inval        __constant_htonl(NFSERR_INVAL)
  186. #define    nfserr_fbig        __constant_htonl(NFSERR_FBIG)
  187. #define    nfserr_nospc        __constant_htonl(NFSERR_NOSPC)
  188. #define    nfserr_rofs        __constant_htonl(NFSERR_ROFS)
  189. #define    nfserr_mlink        __constant_htonl(NFSERR_MLINK)
  190. #define    nfserr_opnotsupp    __constant_htonl(NFSERR_OPNOTSUPP)
  191. #define    nfserr_nametoolong    __constant_htonl(NFSERR_NAMETOOLONG)
  192. #define    nfserr_notempty        __constant_htonl(NFSERR_NOTEMPTY)
  193. #define    nfserr_dquot        __constant_htonl(NFSERR_DQUOT)
  194. #define    nfserr_stale        __constant_htonl(NFSERR_STALE)
  195. #define    nfserr_remote        __constant_htonl(NFSERR_REMOTE)
  196. #define    nfserr_wflush        __constant_htonl(NFSERR_WFLUSH)
  197. #define    nfserr_badhandle    __constant_htonl(NFSERR_BADHANDLE)
  198. #define    nfserr_notsync        __constant_htonl(NFSERR_NOT_SYNC)
  199. #define    nfserr_badcookie    __constant_htonl(NFSERR_BAD_COOKIE)
  200. #define    nfserr_notsupp        __constant_htonl(NFSERR_NOTSUPP)
  201. #define    nfserr_toosmall        __constant_htonl(NFSERR_TOOSMALL)
  202. #define    nfserr_serverfault    __constant_htonl(NFSERR_SERVERFAULT)
  203. #define    nfserr_badtype        __constant_htonl(NFSERR_BADTYPE)
  204. #define    nfserr_jukebox        __constant_htonl(NFSERR_JUKEBOX)
  205. #define    nfserr_denied        __constant_htonl(NFSERR_DENIED)
  206. #define    nfserr_deadlock        __constant_htonl(NFSERR_DEADLOCK)
  207. #define nfserr_expired          __constant_htonl(NFSERR_EXPIRED)
  208. #define    nfserr_bad_cookie    __constant_htonl(NFSERR_BAD_COOKIE)
  209. #define    nfserr_same        __constant_htonl(NFSERR_SAME)
  210. #define    nfserr_clid_inuse    __constant_htonl(NFSERR_CLID_INUSE)
  211. #define    nfserr_stale_clientid    __constant_htonl(NFSERR_STALE_CLIENTID)
  212. #define    nfserr_resource        __constant_htonl(NFSERR_RESOURCE)
  213. #define    nfserr_nofilehandle    __constant_htonl(NFSERR_NOFILEHANDLE)
  214. #define    nfserr_minor_vers_mismatch    __constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
  215. #define nfserr_share_denied    __constant_htonl(NFSERR_SHARE_DENIED)
  216. #define nfserr_stale_stateid    __constant_htonl(NFSERR_STALE_STATEID)
  217. #define nfserr_old_stateid    __constant_htonl(NFSERR_OLD_STATEID)
  218. #define nfserr_bad_stateid    __constant_htonl(NFSERR_BAD_STATEID)
  219. #define nfserr_bad_seqid    __constant_htonl(NFSERR_BAD_SEQID)
  220. #define    nfserr_symlink        __constant_htonl(NFSERR_SYMLINK)
  221. #define    nfserr_not_same        __constant_htonl(NFSERR_NOT_SAME)
  222. #define    nfserr_restorefh    __constant_htonl(NFSERR_RESTOREFH)
  223. #define    nfserr_attrnotsupp    __constant_htonl(NFSERR_ATTRNOTSUPP)
  224. #define    nfserr_bad_xdr        __constant_htonl(NFSERR_BAD_XDR)
  225. #define    nfserr_openmode        __constant_htonl(NFSERR_OPENMODE)
  226. #define    nfserr_locks_held    __constant_htonl(NFSERR_LOCKS_HELD)
  227. #define    nfserr_op_illegal    __constant_htonl(NFSERR_OP_ILLEGAL)
  228. #define    nfserr_grace        __constant_htonl(NFSERR_GRACE)
  229. #define    nfserr_no_grace        __constant_htonl(NFSERR_NO_GRACE)
  230. #define    nfserr_reclaim_bad    __constant_htonl(NFSERR_RECLAIM_BAD)
  231. #define    nfserr_badname        __constant_htonl(NFSERR_BADNAME)
  232. #define    nfserr_cb_path_down    __constant_htonl(NFSERR_CB_PATH_DOWN)
  233. #define    nfserr_locked        __constant_htonl(NFSERR_LOCKED)
  234.  
  235. /* error codes for internal use */
  236. /* if a request fails due to kmalloc failure, it gets dropped.
  237.  *  Client should resend eventually
  238.  */
  239. #define    nfserr_dropit        __constant_htonl(30000)
  240. /* end-of-file indicator in readdir */
  241. #define    nfserr_eof        __constant_htonl(30001)
  242.  
  243. /* Check for dir entries '.' and '..' */
  244. #define isdotent(n, l)    (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
  245.  
  246. /*
  247.  * Time of server startup
  248.  */
  249. extern struct timeval    nfssvc_boot;
  250.  
  251. static inline int is_fsid(struct svc_fh *fh, struct knfsd_fh *reffh)
  252. {
  253.     if (fh->fh_export->ex_flags & NFSEXP_FSID) {
  254.         struct vfsmount *mnt = fh->fh_export->ex_mnt;
  255.         if (!old_valid_dev(mnt->mnt_sb->s_dev) ||
  256.             (reffh->fh_version == 1 && reffh->fh_fsid_type == 1))
  257.             return 1;
  258.     }
  259.     return 0;
  260. }
  261.  
  262.  
  263. #ifdef CONFIG_NFSD_V4
  264.  
  265. /* before processing a COMPOUND operation, we have to check that there
  266.  * is enough space in the buffer for XDR encode to succeed.  otherwise,
  267.  * we might process an operation with side effects, and be unable to
  268.  * tell the client that the operation succeeded.
  269.  *
  270.  * COMPOUND_SLACK_SPACE - this is the minimum amount of buffer space
  271.  * needed to encode an "ordinary" _successful_ operation.  (GETATTR,
  272.  * READ, READDIR, and READLINK have their own buffer checks.)  if we
  273.  * fall below this level, we fail the next operation with NFS4ERR_RESOURCE.
  274.  *
  275.  * COMPOUND_ERR_SLACK_SPACE - this is the minimum amount of buffer space
  276.  * needed to encode an operation which has failed with NFS4ERR_RESOURCE.
  277.  * care is taken to ensure that we never fall below this level for any
  278.  * reason.
  279.  */
  280. #define    COMPOUND_SLACK_SPACE        140    /* OP_GETFH */
  281. #define COMPOUND_ERR_SLACK_SPACE    12     /* OP_SETATTR */
  282.  
  283. #define NFSD_LEASE_TIME                 (nfs4_lease_time())
  284. #define NFSD_LAUNDROMAT_MINTIMEOUT      10   /* seconds */
  285.  
  286. /*
  287.  * The following attributes are currently not supported by the NFSv4 server:
  288.  *    ARCHIVE       (deprecated anyway)
  289.  *    FS_LOCATIONS  (will be supported eventually)
  290.  *    HIDDEN        (unlikely to be supported any time soon)
  291.  *    MIMETYPE      (unlikely to be supported any time soon)
  292.  *    QUOTA_*       (will be supported in a forthcoming patch)
  293.  *    SYSTEM        (unlikely to be supported any time soon)
  294.  *    TIME_BACKUP   (unlikely to be supported any time soon)
  295.  *    TIME_CREATE   (unlikely to be supported any time soon)
  296.  */
  297. #define NFSD_SUPPORTED_ATTRS_WORD0                                                          \
  298. (FATTR4_WORD0_SUPPORTED_ATTRS   | FATTR4_WORD0_TYPE         | FATTR4_WORD0_FH_EXPIRE_TYPE   \
  299.  | FATTR4_WORD0_CHANGE          | FATTR4_WORD0_SIZE         | FATTR4_WORD0_LINK_SUPPORT     \
  300.  | FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR   | FATTR4_WORD0_FSID             \
  301.  | FATTR4_WORD0_UNIQUE_HANDLES  | FATTR4_WORD0_LEASE_TIME   | FATTR4_WORD0_RDATTR_ERROR     \
  302.  | FATTR4_WORD0_ACLSUPPORT      | FATTR4_WORD0_CANSETTIME   | FATTR4_WORD0_CASE_INSENSITIVE \
  303.  | FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_CHOWN_RESTRICTED                             \
  304.  | FATTR4_WORD0_FILEHANDLE      | FATTR4_WORD0_FILEID       | FATTR4_WORD0_FILES_AVAIL      \
  305.  | FATTR4_WORD0_FILES_FREE      | FATTR4_WORD0_FILES_TOTAL  | FATTR4_WORD0_HOMOGENEOUS      \
  306.  | FATTR4_WORD0_MAXFILESIZE     | FATTR4_WORD0_MAXLINK      | FATTR4_WORD0_MAXNAME          \
  307.  | FATTR4_WORD0_MAXREAD         | FATTR4_WORD0_MAXWRITE     | FATTR4_WORD0_ACL)
  308.  
  309. #define NFSD_SUPPORTED_ATTRS_WORD1                                                          \
  310. (FATTR4_WORD1_MODE              | FATTR4_WORD1_NO_TRUNC     | FATTR4_WORD1_NUMLINKS         \
  311.  | FATTR4_WORD1_OWNER            | FATTR4_WORD1_OWNER_GROUP  | FATTR4_WORD1_RAWDEV           \
  312.  | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
  313.  | FATTR4_WORD1_SPACE_USED      | FATTR4_WORD1_TIME_ACCESS  | FATTR4_WORD1_TIME_ACCESS_SET  \
  314.  | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
  315.  | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
  316.  
  317. /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
  318. #define NFSD_WRITEONLY_ATTRS_WORD1                                \
  319. (FATTR4_WORD1_TIME_ACCESS_SET   | FATTR4_WORD1_TIME_MODIFY_SET)
  320.  
  321. /* These are the only attrs allowed in CREATE/OPEN/SETATTR. */
  322. #define NFSD_WRITEABLE_ATTRS_WORD0                                                          \
  323. (FATTR4_WORD0_SIZE              | FATTR4_WORD0_ACL                                         )
  324. #define NFSD_WRITEABLE_ATTRS_WORD1                                                          \
  325. (FATTR4_WORD1_MODE              | FATTR4_WORD1_OWNER         | FATTR4_WORD1_OWNER_GROUP     \
  326.  | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_MODIFY_SET)
  327.  
  328. #endif /* CONFIG_NFSD_V4 */
  329.  
  330. #endif /* __KERNEL__ */
  331.  
  332. #endif /* LINUX_NFSD_NFSD_H */
  333.