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 / nfs_fs.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  15.5 KB  |  577 lines

  1. /*
  2.  *  linux/include/linux/nfs_fs.h
  3.  *
  4.  *  Copyright (C) 1992  Rick Sladkey
  5.  *
  6.  *  OS-specific nfs filesystem definitions and declarations
  7.  */
  8.  
  9. #ifndef _LINUX_NFS_FS_H
  10. #define _LINUX_NFS_FS_H
  11.  
  12.  
  13. /*
  14.  * Enable debugging support for nfs client.
  15.  * Requires RPC_DEBUG.
  16.  */
  17. #ifdef RPC_DEBUG
  18. # define NFS_DEBUG
  19. #endif
  20.  
  21. /* Default timeout values */
  22. #define NFS_MAX_UDP_TIMEOUT    (60*HZ)
  23. #define NFS_MAX_TCP_TIMEOUT    (600*HZ)
  24.  
  25. /*
  26.  * superblock magic number for NFS
  27.  */
  28. #define NFS_SUPER_MAGIC            0x6969
  29.  
  30. /*
  31.  * These are the default flags for swap requests
  32.  */
  33. #define NFS_RPC_SWAPFLAGS        (RPC_TASK_SWAPPER|RPC_TASK_ROOTCREDS)
  34.  
  35. /*
  36.  * When flushing a cluster of dirty pages, there can be different
  37.  * strategies:
  38.  */
  39. #define FLUSH_SYNC        1    /* file being synced, or contention */
  40. #define FLUSH_STABLE        4    /* commit to stable storage */
  41. #define FLUSH_LOWPRI        8    /* low priority background flush */
  42. #define FLUSH_HIGHPRI        16    /* high priority memory reclaim flush */
  43. #define FLUSH_NOCOMMIT        32    /* Don't send the NFSv3/v4 COMMIT */
  44.  
  45. #ifdef __KERNEL__
  46. #include <linux/in.h>
  47. #include <linux/mm.h>
  48. #include <linux/pagemap.h>
  49. #include <linux/rwsem.h>
  50. #include <linux/wait.h>
  51.  
  52. #include <linux/nfs_fs_sb.h>
  53.  
  54. #include <linux/sunrpc/debug.h>
  55. #include <linux/sunrpc/auth.h>
  56. #include <linux/sunrpc/clnt.h>
  57.  
  58. #include <linux/nfs.h>
  59. #include <linux/nfs2.h>
  60. #include <linux/nfs3.h>
  61. #include <linux/nfs4.h>
  62. #include <linux/nfs_xdr.h>
  63. #include <linux/rwsem.h>
  64. #include <linux/mempool.h>
  65.  
  66. /*
  67.  * NFSv3/v4 Access mode cache entry
  68.  */
  69. struct nfs_access_entry {
  70.     unsigned long        jiffies;
  71.     struct rpc_cred *    cred;
  72.     int            mask;
  73. };
  74.  
  75. struct nfs4_state;
  76. struct nfs_open_context {
  77.     atomic_t count;
  78.     struct vfsmount *vfsmnt;
  79.     struct dentry *dentry;
  80.     struct rpc_cred *cred;
  81.     struct nfs4_state *state;
  82.     fl_owner_t lockowner;
  83.     int mode;
  84.     int error;
  85.  
  86.     struct list_head list;
  87.  
  88.     __u64 dir_cookie;
  89. };
  90.  
  91. /*
  92.  * NFSv4 delegation
  93.  */
  94. struct nfs_delegation;
  95.  
  96. struct posix_acl;
  97.  
  98. /*
  99.  * nfs fs inode data in memory
  100.  */
  101. struct nfs_inode {
  102.     /*
  103.      * The 64bit 'inode number'
  104.      */
  105.     __u64 fileid;
  106.  
  107.     /*
  108.      * NFS file handle
  109.      */
  110.     struct nfs_fh        fh;
  111.  
  112.     /*
  113.      * Various flags
  114.      */
  115.     unsigned long        flags;            /* atomic bit ops */
  116.     unsigned long        cache_validity;        /* bit mask */
  117.  
  118.     /*
  119.      * read_cache_jiffies is when we started read-caching this inode.
  120.      * attrtimeo is for how long the cached information is assumed
  121.      * to be valid. A successful attribute revalidation doubles
  122.      * attrtimeo (up to acregmax/acdirmax), a failure resets it to
  123.      * acregmin/acdirmin.
  124.      *
  125.      * We need to revalidate the cached attrs for this inode if
  126.      *
  127.      *    jiffies - read_cache_jiffies > attrtimeo
  128.      */
  129.     unsigned long        read_cache_jiffies;
  130.     unsigned long        attrtimeo;
  131.     unsigned long        attrtimeo_timestamp;
  132.     __u64            change_attr;        /* v4 only */
  133.  
  134.     unsigned long        last_updated;
  135.     /* "Generation counter" for the attribute cache. This is
  136.      * bumped whenever we update the metadata on the
  137.      * server.
  138.      */
  139.     unsigned long        cache_change_attribute;
  140.     /*
  141.      * Counter indicating the number of outstanding requests that
  142.      * will cause a file data update.
  143.      */
  144.     atomic_t        data_updates;
  145.  
  146.     struct nfs_access_entry    cache_access;
  147. #ifdef CONFIG_NFS_V3_ACL
  148.     struct posix_acl    *acl_access;
  149.     struct posix_acl    *acl_default;
  150. #endif
  151.  
  152.     /*
  153.      * This is the cookie verifier used for NFSv3 readdir
  154.      * operations
  155.      */
  156.     __u32            cookieverf[2];
  157.  
  158.     /*
  159.      * This is the list of dirty unwritten pages.
  160.      */
  161.     spinlock_t        req_lock;
  162.     struct list_head    dirty;
  163.     struct list_head    commit;
  164.     struct radix_tree_root    nfs_page_tree;
  165.  
  166.     unsigned int        ndirty,
  167.                 ncommit,
  168.                 npages;
  169.  
  170.     /* Open contexts for shared mmap writes */
  171.     struct list_head    open_files;
  172.  
  173. #ifdef CONFIG_NFS_V4
  174.     struct nfs4_cached_acl    *nfs4_acl;
  175.         /* NFSv4 state */
  176.     struct list_head    open_states;
  177.     struct nfs_delegation    *delegation;
  178.     int             delegation_state;
  179.     struct rw_semaphore    rwsem;
  180. #endif /* CONFIG_NFS_V4*/
  181.     struct inode        vfs_inode;
  182. };
  183.  
  184. /*
  185.  * Cache validity bit flags
  186.  */
  187. #define NFS_INO_INVALID_ATTR    0x0001        /* cached attrs are invalid */
  188. #define NFS_INO_INVALID_DATA    0x0002        /* cached data is invalid */
  189. #define NFS_INO_INVALID_ATIME    0x0004        /* cached atime is invalid */
  190. #define NFS_INO_INVALID_ACCESS    0x0008        /* cached access cred invalid */
  191. #define NFS_INO_INVALID_ACL    0x0010        /* cached acls are invalid */
  192. #define NFS_INO_REVAL_PAGECACHE    0x0020        /* must revalidate pagecache */
  193.  
  194. /*
  195.  * Bit offsets in flags field
  196.  */
  197. #define NFS_INO_REVALIDATING    (0)        /* revalidating attrs */
  198. #define NFS_INO_ADVISE_RDPLUS    (1)        /* advise readdirplus */
  199. #define NFS_INO_STALE        (2)        /* possible stale inode */
  200.  
  201. static inline struct nfs_inode *NFS_I(struct inode *inode)
  202. {
  203.     return container_of(inode, struct nfs_inode, vfs_inode);
  204. }
  205. #define NFS_SB(s)        ((struct nfs_server *)(s->s_fs_info))
  206.  
  207. #define NFS_FH(inode)            (&NFS_I(inode)->fh)
  208. #define NFS_SERVER(inode)        (NFS_SB(inode->i_sb))
  209. #define NFS_CLIENT(inode)        (NFS_SERVER(inode)->client)
  210. #define NFS_PROTO(inode)        (NFS_SERVER(inode)->rpc_ops)
  211. #define NFS_ADDR(inode)            (RPC_PEERADDR(NFS_CLIENT(inode)))
  212. #define NFS_COOKIEVERF(inode)        (NFS_I(inode)->cookieverf)
  213. #define NFS_READTIME(inode)        (NFS_I(inode)->read_cache_jiffies)
  214. #define NFS_CHANGE_ATTR(inode)        (NFS_I(inode)->change_attr)
  215. #define NFS_ATTRTIMEO(inode)        (NFS_I(inode)->attrtimeo)
  216. #define NFS_MINATTRTIMEO(inode) \
  217.     (S_ISDIR(inode->i_mode)? NFS_SERVER(inode)->acdirmin \
  218.                    : NFS_SERVER(inode)->acregmin)
  219. #define NFS_MAXATTRTIMEO(inode) \
  220.     (S_ISDIR(inode->i_mode)? NFS_SERVER(inode)->acdirmax \
  221.                    : NFS_SERVER(inode)->acregmax)
  222. #define NFS_ATTRTIMEO_UPDATE(inode)    (NFS_I(inode)->attrtimeo_timestamp)
  223.  
  224. #define NFS_FLAGS(inode)        (NFS_I(inode)->flags)
  225. #define NFS_STALE(inode)        (test_bit(NFS_INO_STALE, &NFS_FLAGS(inode)))
  226.  
  227. #define NFS_FILEID(inode)        (NFS_I(inode)->fileid)
  228.  
  229. static inline int nfs_caches_unstable(struct inode *inode)
  230. {
  231.     return atomic_read(&NFS_I(inode)->data_updates) != 0;
  232. }
  233.  
  234. static inline void nfs_mark_for_revalidate(struct inode *inode)
  235. {
  236.     spin_lock(&inode->i_lock);
  237.     NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS;
  238.     spin_unlock(&inode->i_lock);
  239. }
  240.  
  241. static inline void NFS_CACHEINV(struct inode *inode)
  242. {
  243.     if (!nfs_caches_unstable(inode))
  244.         nfs_mark_for_revalidate(inode);
  245. }
  246.  
  247. static inline int nfs_server_capable(struct inode *inode, int cap)
  248. {
  249.     return NFS_SERVER(inode)->caps & cap;
  250. }
  251.  
  252. static inline int NFS_USE_READDIRPLUS(struct inode *inode)
  253. {
  254.     return test_bit(NFS_INO_ADVISE_RDPLUS, &NFS_FLAGS(inode));
  255. }
  256.  
  257. /**
  258.  * nfs_save_change_attribute - Returns the inode attribute change cookie
  259.  * @inode - pointer to inode
  260.  * The "change attribute" is updated every time we finish an operation
  261.  * that will result in a metadata change on the server.
  262.  */
  263. static inline long nfs_save_change_attribute(struct inode *inode)
  264. {
  265.     return NFS_I(inode)->cache_change_attribute;
  266. }
  267.  
  268. /**
  269.  * nfs_verify_change_attribute - Detects NFS inode cache updates
  270.  * @inode - pointer to inode
  271.  * @chattr - previously saved change attribute
  272.  * Return "false" if metadata has been updated (or is in the process of
  273.  * being updated) since the change attribute was saved.
  274.  */
  275. static inline int nfs_verify_change_attribute(struct inode *inode, unsigned long chattr)
  276. {
  277.     return !nfs_caches_unstable(inode)
  278.         && time_after_eq(chattr, NFS_I(inode)->cache_change_attribute);
  279. }
  280.  
  281. /*
  282.  * linux/fs/nfs/inode.c
  283.  */
  284. extern int nfs_sync_mapping(struct address_space *mapping);
  285. extern void nfs_zap_caches(struct inode *);
  286. extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
  287.                 struct nfs_fattr *);
  288. extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
  289. extern int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr);
  290. extern int nfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
  291. extern int nfs_permission(struct inode *, int, struct nameidata *);
  292. extern int nfs_access_get_cached(struct inode *, struct rpc_cred *, struct nfs_access_entry *);
  293. extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *);
  294. extern int nfs_open(struct inode *, struct file *);
  295. extern int nfs_release(struct inode *, struct file *);
  296. extern int nfs_attribute_timeout(struct inode *inode);
  297. extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);
  298. extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
  299. extern void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
  300. extern int nfs_setattr(struct dentry *, struct iattr *);
  301. extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);
  302. extern void nfs_begin_attr_update(struct inode *);
  303. extern void nfs_end_attr_update(struct inode *);
  304. extern void nfs_begin_data_update(struct inode *);
  305. extern void nfs_end_data_update(struct inode *);
  306. extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
  307. extern void put_nfs_open_context(struct nfs_open_context *ctx);
  308. extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode);
  309.  
  310. /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
  311. extern u32 root_nfs_parse_addr(char *name); /*__init*/
  312.  
  313. static inline void nfs_fattr_init(struct nfs_fattr *fattr)
  314. {
  315.     fattr->valid = 0;
  316.     fattr->time_start = jiffies;
  317. }
  318.  
  319. /*
  320.  * linux/fs/nfs/file.c
  321.  */
  322. extern struct inode_operations nfs_file_inode_operations;
  323. #ifdef CONFIG_NFS_V3
  324. extern struct inode_operations nfs3_file_inode_operations;
  325. #endif /* CONFIG_NFS_V3 */
  326. extern const struct file_operations nfs_file_operations;
  327. extern struct address_space_operations nfs_file_aops;
  328.  
  329. static inline struct rpc_cred *nfs_file_cred(struct file *file)
  330. {
  331.     if (file != NULL) {
  332.         struct nfs_open_context *ctx;
  333.  
  334.         ctx = (struct nfs_open_context*)file->private_data;
  335.         return ctx->cred;
  336.     }
  337.     return NULL;
  338. }
  339.  
  340. /*
  341.  * linux/fs/nfs/xattr.c
  342.  */
  343. #ifdef CONFIG_NFS_V3_ACL
  344. extern ssize_t nfs3_listxattr(struct dentry *, char *, size_t);
  345. extern ssize_t nfs3_getxattr(struct dentry *, const char *, void *, size_t);
  346. extern int nfs3_setxattr(struct dentry *, const char *,
  347.             const void *, size_t, int);
  348. extern int nfs3_removexattr (struct dentry *, const char *name);
  349. #else
  350. # define nfs3_listxattr NULL
  351. # define nfs3_getxattr NULL
  352. # define nfs3_setxattr NULL
  353. # define nfs3_removexattr NULL
  354. #endif
  355.  
  356. /*
  357.  * linux/fs/nfs/direct.c
  358.  */
  359. extern ssize_t nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t,
  360.             unsigned long);
  361. extern ssize_t nfs_file_direct_read(struct kiocb *iocb, char __user *buf,
  362.             size_t count, loff_t pos);
  363. extern ssize_t nfs_file_direct_write(struct kiocb *iocb, const char __user *buf,
  364.             size_t count, loff_t pos);
  365.  
  366. /*
  367.  * linux/fs/nfs/dir.c
  368.  */
  369. extern struct inode_operations nfs_dir_inode_operations;
  370. #ifdef CONFIG_NFS_V3
  371. extern struct inode_operations nfs3_dir_inode_operations;
  372. #endif /* CONFIG_NFS_V3 */
  373. extern const struct file_operations nfs_dir_operations;
  374. extern struct dentry_operations nfs_dentry_operations;
  375.  
  376. extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr);
  377.  
  378. /*
  379.  * linux/fs/nfs/symlink.c
  380.  */
  381. extern struct inode_operations nfs_symlink_inode_operations;
  382.  
  383. /*
  384.  * linux/fs/nfs/sysctl.c
  385.  */
  386. #ifdef CONFIG_SYSCTL
  387. extern int nfs_register_sysctl(void);
  388. extern void nfs_unregister_sysctl(void);
  389. #else
  390. #define nfs_register_sysctl() 0
  391. #define nfs_unregister_sysctl() do { } while(0)
  392. #endif
  393.  
  394. /*
  395.  * linux/fs/nfs/unlink.c
  396.  */
  397. extern int  nfs_async_unlink(struct dentry *);
  398. extern void nfs_complete_unlink(struct dentry *);
  399.  
  400. /*
  401.  * linux/fs/nfs/write.c
  402.  */
  403. extern int  nfs_writepage(struct page *page, struct writeback_control *wbc);
  404. extern int  nfs_writepages(struct address_space *, struct writeback_control *);
  405. extern int  nfs_flush_incompatible(struct file *file, struct page *page);
  406. extern int  nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
  407. extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
  408. extern void nfs_writedata_release(void *);
  409.  
  410. #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
  411. struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount);
  412. void nfs_commit_free(struct nfs_write_data *p);
  413. #endif
  414.  
  415. /*
  416.  * Try to write back everything synchronously (but check the
  417.  * return value!)
  418.  */
  419. extern int  nfs_sync_inode_wait(struct inode *, unsigned long, unsigned int, int);
  420. #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
  421. extern int  nfs_commit_inode(struct inode *, int);
  422. extern void nfs_commit_release(void *wdata);
  423. #else
  424. static inline int
  425. nfs_commit_inode(struct inode *inode, int how)
  426. {
  427.     return 0;
  428. }
  429. #endif
  430.  
  431. static inline int
  432. nfs_have_writebacks(struct inode *inode)
  433. {
  434.     return NFS_I(inode)->npages != 0;
  435. }
  436.  
  437. static inline int
  438. nfs_wb_all(struct inode *inode)
  439. {
  440.     int error = nfs_sync_inode_wait(inode, 0, 0, 0);
  441.     return (error < 0) ? error : 0;
  442. }
  443.  
  444. /*
  445.  * Write back all requests on one page - we do this before reading it.
  446.  */
  447. static inline int nfs_wb_page_priority(struct inode *inode, struct page* page, int how)
  448. {
  449.     int error = nfs_sync_inode_wait(inode, page->index, 1,
  450.             how | FLUSH_STABLE);
  451.     return (error < 0) ? error : 0;
  452. }
  453.  
  454. static inline int nfs_wb_page(struct inode *inode, struct page* page)
  455. {
  456.     return nfs_wb_page_priority(inode, page, 0);
  457. }
  458.  
  459. /*
  460.  * Allocate and free nfs_write_data structures
  461.  */
  462. extern struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount);
  463. extern void nfs_writedata_free(struct nfs_write_data *p);
  464.  
  465. /*
  466.  * linux/fs/nfs/read.c
  467.  */
  468. extern int  nfs_readpage(struct file *, struct page *);
  469. extern int  nfs_readpages(struct file *, struct address_space *,
  470.         struct list_head *, unsigned);
  471. extern int  nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
  472. extern void nfs_readdata_release(void *data);
  473.  
  474. /*
  475.  * Allocate and free nfs_read_data structures
  476.  */
  477. extern struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount);
  478. extern void nfs_readdata_free(struct nfs_read_data *p);
  479.  
  480. /*
  481.  * linux/fs/nfs3proc.c
  482.  */
  483. #ifdef CONFIG_NFS_V3_ACL
  484. extern struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type);
  485. extern int nfs3_proc_setacl(struct inode *inode, int type,
  486.                 struct posix_acl *acl);
  487. extern int nfs3_proc_set_default_acl(struct inode *dir, struct inode *inode,
  488.         mode_t mode);
  489. extern void nfs3_forget_cached_acls(struct inode *inode);
  490. #else
  491. static inline int nfs3_proc_set_default_acl(struct inode *dir,
  492.                         struct inode *inode,
  493.                         mode_t mode)
  494. {
  495.     return 0;
  496. }
  497.  
  498. static inline void nfs3_forget_cached_acls(struct inode *inode)
  499. {
  500. }
  501. #endif /* CONFIG_NFS_V3_ACL */
  502.  
  503. /*
  504.  * linux/fs/mount_clnt.c
  505.  * (Used only by nfsroot module)
  506.  */
  507. extern int  nfsroot_mount(struct sockaddr_in *, char *, struct nfs_fh *,
  508.         int, int);
  509.  
  510. /*
  511.  * inline functions
  512.  */
  513.  
  514. static inline loff_t
  515. nfs_size_to_loff_t(__u64 size)
  516. {
  517.     loff_t maxsz = (((loff_t) ULONG_MAX) << PAGE_CACHE_SHIFT) + PAGE_CACHE_SIZE - 1;
  518.     if (size > maxsz)
  519.         return maxsz;
  520.     return (loff_t) size;
  521. }
  522.  
  523. static inline ino_t
  524. nfs_fileid_to_ino_t(u64 fileid)
  525. {
  526.     ino_t ino = (ino_t) fileid;
  527.     if (sizeof(ino_t) < sizeof(u64))
  528.         ino ^= fileid >> (sizeof(u64)-sizeof(ino_t)) * 8;
  529.     return ino;
  530. }
  531.  
  532. /* NFS root */
  533.  
  534. extern void * nfs_root_data(void);
  535.  
  536. #define nfs_wait_event(clnt, wq, condition)                \
  537. ({                                    \
  538.     int __retval = 0;                        \
  539.     if (clnt->cl_intr) {                        \
  540.         sigset_t oldmask;                    \
  541.         rpc_clnt_sigmask(clnt, &oldmask);            \
  542.         __retval = wait_event_interruptible(wq, condition);    \
  543.         rpc_clnt_sigunmask(clnt, &oldmask);            \
  544.     } else                                \
  545.         wait_event(wq, condition);                \
  546.     __retval;                            \
  547. })
  548.  
  549. #define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
  550.  
  551. #endif /* __KERNEL__ */
  552.  
  553. /*
  554.  * NFS debug flags
  555.  */
  556. #define NFSDBG_VFS        0x0001
  557. #define NFSDBG_DIRCACHE        0x0002
  558. #define NFSDBG_LOOKUPCACHE    0x0004
  559. #define NFSDBG_PAGECACHE    0x0008
  560. #define NFSDBG_PROC        0x0010
  561. #define NFSDBG_XDR        0x0020
  562. #define NFSDBG_FILE        0x0040
  563. #define NFSDBG_ROOT        0x0080
  564. #define NFSDBG_CALLBACK        0x0100
  565. #define NFSDBG_ALL        0xFFFF
  566.  
  567. #ifdef __KERNEL__
  568. # undef ifdebug
  569. # ifdef NFS_DEBUG
  570. #  define ifdebug(fac)        if (unlikely(nfs_debug & NFSDBG_##fac))
  571. # else
  572. #  define ifdebug(fac)        if (0)
  573. # endif
  574. #endif /* __KERNEL */
  575.  
  576. #endif
  577.