smb_fs.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  smb_fs.h
  3.  *
  4.  *  Copyright (C) 1995 by Paal-Kr. Engstad and Volker Lendecke
  5.  *  Copyright (C) 1997 by Volker Lendecke
  6.  *
  7.  */
  8. #ifndef _LINUX_SMB_FS_H
  9. #define _LINUX_SMB_FS_H
  10. #include <linux/smb.h>
  11. #include <linux/smb_fs_i.h>
  12. #include <linux/smb_fs_sb.h>
  13. /*
  14.  * ioctl commands
  15.  */
  16. #define SMB_IOC_GETMOUNTUID _IOR('u', 1, __kernel_old_uid_t)
  17. #define SMB_IOC_NEWCONN                 _IOW('u', 2, struct smb_conn_opt)
  18. /* __kernel_uid_t can never change, so we have to use __kernel_uid32_t */
  19. #define SMB_IOC_GETMOUNTUID32 _IOR('u', 3, __kernel_uid32_t)
  20. #ifdef __KERNEL__
  21. #include <linux/fs.h>
  22. #include <linux/pagemap.h>
  23. #include <linux/vmalloc.h>
  24. #include <linux/smb_mount.h>
  25. #include <asm/unaligned.h>
  26. static inline struct smb_sb_info *SMB_SB(struct super_block *sb)
  27. {
  28. return sb->s_fs_info;
  29. }
  30. static inline struct smb_inode_info *SMB_I(struct inode *inode)
  31. {
  32. return container_of(inode, struct smb_inode_info, vfs_inode);
  33. }
  34. /* macro names are short for word, double-word, long value (?) */
  35. #define WVAL(buf,pos) 
  36. (le16_to_cpu(get_unaligned((u16 *)((u8 *)(buf) + (pos)))))
  37. #define DVAL(buf,pos) 
  38. (le32_to_cpu(get_unaligned((u32 *)((u8 *)(buf) + (pos)))))
  39. #define LVAL(buf,pos) 
  40. (le64_to_cpu(get_unaligned((u64 *)((u8 *)(buf) + (pos)))))
  41. #define WSET(buf,pos,val) 
  42. put_unaligned(cpu_to_le16((u16)(val)), (u16 *)((u8 *)(buf) + (pos)))
  43. #define DSET(buf,pos,val) 
  44. put_unaligned(cpu_to_le32((u32)(val)), (u32 *)((u8 *)(buf) + (pos)))
  45. #define LSET(buf,pos,val) 
  46. put_unaligned(cpu_to_le64((u64)(val)), (u64 *)((u8 *)(buf) + (pos)))
  47. /* where to find the base of the SMB packet proper */
  48. #define smb_base(buf) ((u8 *)(((u8 *)(buf))+4))
  49. #ifdef DEBUG_SMB_MALLOC
  50. #include <linux/slab.h>
  51. extern int smb_malloced;
  52. extern int smb_current_vmalloced;
  53. extern int smb_current_kmalloced;
  54. static inline void *
  55. smb_vmalloc(unsigned int size)
  56. {
  57.         smb_malloced += 1;
  58.         smb_current_vmalloced += 1;
  59.         return vmalloc(size);
  60. }
  61. static inline void
  62. smb_vfree(void *obj)
  63. {
  64.         smb_current_vmalloced -= 1;
  65.         vfree(obj);
  66. }
  67. static inline void *
  68. smb_kmalloc(size_t size, int flags)
  69. {
  70. smb_malloced += 1;
  71. smb_current_kmalloced += 1;
  72. return kmalloc(size, flags);
  73. }
  74. static inline void
  75. smb_kfree(void *obj)
  76. {
  77. smb_current_kmalloced -= 1;
  78. kfree(obj);
  79. }
  80. #else /* DEBUG_SMB_MALLOC */
  81. #define smb_kmalloc(s,p) kmalloc(s,p)
  82. #define smb_kfree(o) kfree(o)
  83. #define smb_vmalloc(s) vmalloc(s)
  84. #define smb_vfree(o) vfree(o)
  85. #endif /* DEBUG_SMB_MALLOC */
  86. /*
  87.  * Flags for the in-memory inode
  88.  */
  89. #define SMB_F_LOCALWRITE 0x02 /* file modified locally */
  90. /* NT1 protocol capability bits */
  91. #define SMB_CAP_RAW_MODE         0x00000001
  92. #define SMB_CAP_MPX_MODE         0x00000002
  93. #define SMB_CAP_UNICODE          0x00000004
  94. #define SMB_CAP_LARGE_FILES      0x00000008
  95. #define SMB_CAP_NT_SMBS          0x00000010
  96. #define SMB_CAP_RPC_REMOTE_APIS  0x00000020
  97. #define SMB_CAP_STATUS32         0x00000040
  98. #define SMB_CAP_LEVEL_II_OPLOCKS 0x00000080
  99. #define SMB_CAP_LOCK_AND_READ    0x00000100
  100. #define SMB_CAP_NT_FIND          0x00000200
  101. #define SMB_CAP_DFS              0x00001000
  102. #define SMB_CAP_LARGE_READX      0x00004000
  103. #define SMB_CAP_LARGE_WRITEX     0x00008000
  104. #define SMB_CAP_UNIX             0x00800000 /* unofficial ... */
  105. /*
  106.  * This is the time we allow an inode, dentry or dir cache to live. It is bad
  107.  * for performance to have shorter ttl on an inode than on the cache. It can
  108.  * cause refresh on each inode for a dir listing ... one-by-one
  109.  */
  110. #define SMB_MAX_AGE(server) (((server)->mnt->ttl * HZ) / 1000)
  111. static inline void
  112. smb_age_dentry(struct smb_sb_info *server, struct dentry *dentry)
  113. {
  114. dentry->d_time = jiffies - SMB_MAX_AGE(server);
  115. }
  116. struct smb_cache_head {
  117. time_t mtime; /* unused */
  118. unsigned long time; /* cache age */
  119. unsigned long end; /* last valid fpos in cache */
  120. int eof;
  121. };
  122. #define SMB_DIRCACHE_SIZE ((int)(PAGE_CACHE_SIZE/sizeof(struct dentry *)))
  123. union smb_dir_cache {
  124. struct smb_cache_head   head;
  125. struct dentry           *dentry[SMB_DIRCACHE_SIZE];
  126. };
  127. #define SMB_FIRSTCACHE_SIZE ((int)((SMB_DIRCACHE_SIZE * 
  128. sizeof(struct dentry *) - sizeof(struct smb_cache_head)) / 
  129. sizeof(struct dentry *)))
  130. #define SMB_DIRCACHE_START      (SMB_DIRCACHE_SIZE - SMB_FIRSTCACHE_SIZE)
  131. struct smb_cache_control {
  132. struct  smb_cache_head head;
  133. struct  page *page;
  134. union   smb_dir_cache *cache;
  135. unsigned long fpos, ofs;
  136. int filled, valid, idx;
  137. };
  138. #define SMB_OPS_NUM_STATIC 5
  139. struct smb_ops {
  140. int (*read)(struct inode *inode, loff_t offset, int count,
  141.     char *data);
  142. int (*write)(struct inode *inode, loff_t offset, int count, const
  143.      char *data);
  144. int (*readdir)(struct file *filp, void *dirent, filldir_t filldir,
  145.        struct smb_cache_control *ctl);
  146. int (*getattr)(struct smb_sb_info *server, struct dentry *dir,
  147.        struct smb_fattr *fattr);
  148. /* int (*setattr)(...); */      /* setattr is really icky! */
  149. int (*truncate)(struct inode *inode, loff_t length);
  150. /* --- --- --- end of "static" entries --- --- --- */
  151. int (*convert)(unsigned char *output, int olen,
  152.        const unsigned char *input, int ilen,
  153.        struct nls_table *nls_from,
  154.        struct nls_table *nls_to);
  155. };
  156. static inline int
  157. smb_is_open(struct inode *i)
  158. {
  159. return (SMB_I(i)->open == server_from_inode(i)->generation);
  160. }
  161. extern void smb_install_null_ops(struct smb_ops *);
  162. #endif /* __KERNEL__ */
  163. #endif /* _LINUX_SMB_FS_H */