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