include/linux/smb_fs.h
changeset 0 aa628870c1d3
equal deleted inserted replaced
-1:000000000000 0:aa628870c1d3
       
     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 */