intermezzo_fs.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:28k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  *  This program is free software; you can redistribute it and/or
  4.  *  modify it under the terms of the GNU General Public License as
  5.  *  published by the Free Software Foundation; either version 2 of the
  6.  *  License, or (at your option) any later version.
  7.  *
  8.  *  Copyright (C) 2000 Stelias Computing, Inc.
  9.  *  Copyright (C) 2000 Red Hat, Inc.
  10.  *  Copyright (C) 2000 TurboLinux, Inc.
  11.  *  Copyright (C) 2000 Los Alamos National Laboratory.
  12.  *  Copyright (C) 2001 Tacitus Systems, Inc.
  13.  *  Copyright (C) 2001 Cluster File Systems, Inc. 
  14.  */
  15. #ifndef __INTERMEZZO_FS_H_
  16. #define __INTERMEZZO_FS_H_ 1
  17. #ifdef __KERNEL__
  18. #include <linux/smp.h>
  19. #include <linux/fsfilter.h>
  20. /* fixups for fs.h */
  21. #ifndef fs_down
  22. #define fs_down(sem) down(sem)
  23. #endif
  24. #ifndef fs_up
  25. #define fs_up(sem) up(sem)
  26. #endif
  27. /* We will be more tolerant than the default ea patch with attr name sizes and
  28.  * the size of value. If these come via VFS from the default ea patches, the
  29.  * corresponding character strings will be truncated anyway. During journalling- * we journal length for both name and value. See journal_set_ext_attr.
  30.  */
  31. #define PRESTO_EXT_ATTR_NAME_MAX 128
  32. #define PRESTO_EXT_ATTR_VALUE_MAX 8192
  33. #define KML_IDLE                        0
  34. #define KML_DECODE                      1
  35. #define KML_OPTIMIZE                    2
  36. #define KML_REINT                       3
  37. #define KML_OPEN_REINT                  0x0100
  38. #define KML_REINT_BEGIN                 0x0200
  39. #define KML_BACKFETCH                   0x0400
  40. #define KML_REINT_END                   0x0800
  41. #define KML_CLOSE_REINT                 0x1000
  42. #define FSET_GET_KMLDATA(fset)          fset->fset_kmldata
  43. #define KML_REINT_MAXBUF               (64 * 1024)
  44. struct  kml_fsdata
  45. {
  46.         int                kml_state;
  47.         /* kml optimize support */
  48.         struct list_head   kml_kop_cache;
  49.         /* kml reint support */
  50.         int                kml_reint_state;
  51.         struct list_head   kml_reint_cache;
  52.         struct list_head  *kml_reint_current;
  53.         int                kml_maxsize;  /* max buffer */
  54.         int                kml_len;
  55.         char *             kml_buf;
  56.         loff_t             kml_reintpos;
  57.         int                kml_count;
  58. };
  59. /* super.c */
  60. struct presto_cache *presto_find_cache(kdev_t dev) ;
  61. extern struct file_system_type presto_fs_type;
  62. extern int init_intermezzo_fs(void);
  63. #define CACHE_TYPE_LENGTH       16
  64. int presto_ispresto(struct inode *);
  65. #define CACHE_CLIENT_RO       0x4
  66. #define CACHE_LENTO_RO        0x8
  67. #define CACHE_FSETROOT_SET     0x10
  68. struct presto_cache {
  69.         spinlock_t         cache_lock; 
  70. loff_t             cache_reserved;
  71.         struct list_head cache_chain; /* for the dev/cache hash */
  72.         int   cache_flags;
  73.         char *cache_root_fileset;  /* fileset mounted on cache "/"  */
  74.         kdev_t cache_dev;            /* underlying block device */
  75. struct super_block *cache_sb;
  76.         struct dentry *cache_mtde;  /* unix mtpt of cache XXX NOT VALID XXX */
  77.         char *cache_mtpt;           /*  again */
  78.         char *cache_type;            /* filesystem type of cache */
  79.         struct filter_fs *cache_filter;
  80.         struct upc_comm *cache_psdev;  /* points to /dev/intermezzo? we use */
  81.         struct list_head cache_psdev_chain; 
  82.         struct list_head cache_fset_list; /* filesets mounted in cache */
  83. };
  84. /* file sets */
  85. #define CHUNK_BITS  16
  86. struct presto_log_fd {
  87.         rwlock_t         fd_lock; 
  88.         loff_t           fd_offset;  /* offset where next record should go */ 
  89.         struct file    *fd_file;
  90.         int             fd_truncating;
  91.         unsigned int   fd_recno;   /* last recno written */ 
  92.         struct list_head  fd_reservations;
  93. };
  94. struct presto_file_set {
  95.         struct list_head fset_list;
  96.         struct presto_log_fd fset_kml;
  97.         struct presto_log_fd fset_lml;
  98.         struct file *fset_last_rcvd;
  99.         struct dentry *fset_mtpt;
  100.         struct nameidata fset_nd; 
  101.         struct presto_cache *fset_cache;
  102.         unsigned int fset_lento_recno;  /* last recno mentioned to lento */
  103.         loff_t fset_lento_off;    /* last offset mentioned to lento */
  104.         char * fset_name;
  105.         int fset_flags;
  106.         int fset_permit_count;
  107.         int fset_permit_cookie;
  108.         int fset_chunkbits; 
  109.         int fset_data; /* replaces the dentry d_data field for fsetroots */
  110. struct  kml_fsdata *fset_kmldata;
  111. loff_t  fset_file_maxio;  /* writing more than this causes a close */ 
  112. };
  113. /* This is the default number of bytes written before a close is recorded*/
  114. #define FSET_DEFAULT_MAX_FILEIO (1024<<10)
  115. struct journal_ops {
  116.         loff_t (*tr_avail)(struct presto_cache *fset, struct super_block *);
  117.         void *(*tr_start)(struct presto_file_set *, struct inode *, int op);
  118.         void (*tr_commit)(struct presto_file_set *, void *handle);
  119.         void (*tr_journal_data)(struct inode *);
  120. };
  121. extern struct journal_ops presto_ext2_journal_ops;
  122. extern struct journal_ops presto_ext3_journal_ops;
  123. extern struct journal_ops presto_xfs_journal_ops;
  124. extern struct journal_ops presto_reiserfs_journal_ops;
  125. extern struct journal_ops presto_obdfs_journal_ops;
  126. struct lento_vfs_context {
  127.         __u32 slot_offset;
  128.         __u32 recno;
  129.         __u64 kml_offset;
  130.         __u32 flags;
  131.         __u32 updated_time;
  132. };
  133. #define LENTO_FL_KML            0x0001
  134. #define LENTO_FL_EXPECT         0x0002
  135. #define LENTO_FL_VFSCHECK       0x0004
  136. #define LENTO_FL_JUSTLOG        0x0008
  137. #define LENTO_FL_WRITE_KML      0x0010
  138. #define LENTO_FL_CANCEL_LML     0x0020
  139. #define LENTO_FL_WRITE_EXPECT   0x0040
  140. #define LENTO_FL_IGNORE_TIME    0x0080
  141. struct presto_cache *presto_get_cache(struct inode *inode) ;
  142. int presto_sprint_mounts(char *buf, int buflen, int minor);
  143. struct presto_file_set *presto_fset(struct dentry *de);
  144. int presto_journal(struct dentry *dentry, char *buf, size_t size);
  145. int presto_fwrite(struct file *file, const char *str, int len, loff_t *off);
  146. /* psdev.c */
  147. int presto_psdev_init(void);
  148. extern void presto_psdev_cleanup(void);
  149. inline int presto_lento_up(int minor);
  150. /* inode.c */
  151. extern struct super_operations presto_super_ops;
  152. extern int presto_excluded_gid; 
  153. #define PRESTO_EXCL_GID 4711
  154. void presto_set_ops(struct inode *inode, struct  filter_fs *filter);
  155. void presto_read_inode(struct inode *inode);
  156. void presto_put_super(struct super_block *);
  157. /* journal.c */
  158. void presto_trans_commit(struct presto_file_set *fset, void *handle);
  159. void *presto_trans_start(struct presto_file_set *fset, struct inode *inode,
  160.                            int op);
  161. /* dcache.c */
  162. void presto_frob_dop(struct dentry *de) ;
  163. char * presto_path(struct dentry *dentry, struct dentry *root,
  164.                    char *buffer, int buflen);
  165. extern struct dentry_operations presto_dentry_ops;
  166. /* dir.c */
  167. extern struct inode_operations presto_dir_iops;
  168. extern struct inode_operations presto_file_iops;
  169. extern struct inode_operations presto_sym_iops;
  170. extern struct file_operations presto_dir_fops;
  171. extern struct file_operations presto_file_fops;
  172. extern struct file_operations presto_sym_fops;
  173. int presto_setattr(struct dentry *de, struct iattr *iattr);
  174. extern int presto_ilookup_uid; 
  175. #define PRESTO_ILOOKUP_MAGIC "...ino:"
  176. #define PRESTO_ILOOKUP_SEP ':'
  177. struct dentry *presto_lookup(struct inode * dir, struct dentry *dentry);
  178. /* file.c */
  179. struct presto_reservation_data {
  180.         unsigned int ri_recno; 
  181.         loff_t ri_offset;
  182.         loff_t ri_size;
  183.         struct list_head ri_list;
  184. };
  185. struct presto_file_data { 
  186.         int fd_do_lml;
  187.         loff_t fd_lml_offset;
  188.         uid_t fd_fsuid;
  189.         gid_t fd_fsgid;
  190.         uid_t fd_uid;
  191.         gid_t fd_gid;
  192.         mode_t fd_mode;
  193.         int fd_ngroups;
  194.         size_t fd_bytes_written; /* Number of bytes written so far on this fd*/
  195.         gid_t fd_groups[NGROUPS_MAX];
  196. };
  197. /* presto.c and Lento::Downcall */
  198. struct presto_version {
  199.         __u64 pv_mtime;
  200.         __u64 pv_ctime;
  201.         __u64 pv_size;
  202. };
  203. int presto_walk(const char *name, struct nameidata *nd);
  204. int presto_clear_fsetroot(char *path);
  205. int presto_clear_all_fsetroots(char *path);
  206. int  presto_get_kmlsize(char *path, size_t *size);
  207. int  presto_get_lastrecno(char *path, off_t *size);
  208. int presto_set_fsetroot(char *path, char *fsetname, unsigned int fsetid,
  209.                        unsigned int flags);
  210. int presto_has_all_data(struct inode *inode);
  211. inline int presto_is_read_only(struct presto_file_set *);
  212. int presto_truncate_lml(struct presto_file_set *fset);
  213. int lento_write_lml(char *path,
  214.                      __u64 remote_ino, 
  215.                      __u32 remote_generation,
  216.                      __u32 remote_version,
  217.                     struct presto_version *remote_file_version);
  218. int lento_reset_fset(char *path, __u64 offset, __u32 recno);
  219. int lento_complete_closes(char *path);
  220. int lento_cancel_lml(char *path,
  221.                      __u64 lml_offset, 
  222.                      __u64 remote_ino, 
  223.                      __u32 remote_generation,
  224.                      __u32 remote_version, 
  225.                      struct lento_vfs_context *info);
  226. inline int presto_f2m(struct presto_file_set *fset);
  227. /* cache.c */
  228. #define PRESTO_REQLOW  (3 * 4096)
  229. #define PRESTO_REQHIGH (6 * 4096)
  230. void presto_release_space(struct presto_cache *cache, loff_t req);
  231. int presto_reserve_space(struct presto_cache *cache, loff_t req);
  232. /* NOTE: PRESTO_FSETROOT MUST be 0x1:
  233.    - if this bit is set dentry->d_fsdata points to a file_set
  234.    - the address of the file_set if d_fsdata - 1
  235. */
  236. #define PRESTO_FSETROOT         0x00000001 /* dentry is fileset root */
  237. #define PRESTO_DATA             0x00000002 /* cached data is valid */
  238. #define PRESTO_ATTR             0x00000004 /* attributes cached */
  239. #define EISFSETROOT             0x2001
  240. struct presto_file_set *presto_path2fileset(const char *name);
  241. int presto_permit_downcall(const char *path, int *cookie);
  242. int presto_chk(struct dentry *dentry, int flag);
  243. void presto_set(struct dentry *dentry, int flag);
  244. int presto_get_permit(struct inode *inode);
  245. int presto_put_permit(struct inode *inode);
  246. int presto_mark_dentry(const char *path, int and, int or, int *res);
  247. int presto_mark_cache(const char *path, int and_bits, int or_bits, int *);
  248. int presto_mark_fset(const char *path, int and_bits, int or_bits, int *);
  249. void presto_getversion(struct presto_version *pv, struct inode *inode);
  250. int presto_i2m(struct inode *inode);
  251. int presto_c2m(struct presto_cache *cache);
  252. /* journal.c */
  253. struct rec_info {
  254.         loff_t offset;
  255.         int size;
  256.         int recno;
  257.         int is_kml;
  258. };
  259. void presto_trans_commit(struct presto_file_set *fset, void *handle);
  260. void *presto_trans_start(struct presto_file_set *fset, struct inode *inode,
  261.                            int op);
  262. int presto_clear_lml_close(struct presto_file_set *fset, 
  263.                            loff_t  lml_offset);
  264. int presto_write_lml_close(struct rec_info *rec,
  265.                            struct presto_file_set *fset, 
  266.                            struct file *file,
  267.                            __u64 remote_ino,
  268.                            __u32 remote_generation,
  269.                            __u32 remote_version,
  270.                            struct presto_version *new_file_ver);
  271. int presto_complete_lml(struct presto_file_set *fset); 
  272. /* vfs.c */
  273. int presto_do_setattr(struct presto_file_set *fset, struct dentry *dentry,
  274.                       struct iattr *iattr, struct lento_vfs_context *info);
  275. int presto_do_create(struct presto_file_set *fset, struct dentry *dir,
  276.                      struct dentry *dentry, int mode,
  277.                      struct lento_vfs_context *info);
  278. int presto_do_link(struct presto_file_set *fset, struct dentry *dir,
  279.                    struct dentry *old_dentry, struct dentry *new_dentry,
  280.                    struct lento_vfs_context *info);
  281. int presto_do_unlink(struct presto_file_set *fset, struct dentry *dir,
  282.                      struct dentry *dentry, struct lento_vfs_context *info);
  283. int presto_do_symlink(struct presto_file_set *fset, struct dentry *dir,
  284.                       struct dentry *dentry, const char *name,
  285.                       struct lento_vfs_context *info);
  286. int presto_do_mkdir(struct presto_file_set *fset, struct dentry *dir,
  287.                     struct dentry *dentry, int mode,
  288.                     struct lento_vfs_context *info);
  289. int presto_do_rmdir(struct presto_file_set *fset, struct dentry *dir,
  290.                     struct dentry *dentry, struct lento_vfs_context *info);
  291. int presto_do_mknod(struct presto_file_set *fset, struct dentry *dir,
  292.                     struct dentry *dentry, int mode, dev_t dev,
  293.                     struct lento_vfs_context *info);
  294. int presto_do_rename(struct presto_file_set *fset, struct dentry *old_dir,
  295.                      struct dentry *old_dentry, struct dentry *new_dir,
  296.                      struct dentry *new_dentry, struct lento_vfs_context *info);
  297. int lento_setattr(const char *name, struct iattr *iattr,
  298.                   struct lento_vfs_context *info);
  299. int lento_create(const char *name, int mode, struct lento_vfs_context *info);
  300. int lento_link(const char *oldname, const char *newname,
  301.                struct lento_vfs_context *info);
  302. int lento_unlink(const char *name, struct lento_vfs_context *info);
  303. int lento_symlink(const char *oldname,const char *newname,
  304.                   struct lento_vfs_context *info);
  305. int lento_mkdir(const char *name, int mode, struct lento_vfs_context *info);
  306. int lento_rmdir(const char *name, struct lento_vfs_context *info);
  307. int lento_mknod(const char *name, int mode, dev_t dev,
  308.                 struct lento_vfs_context *info);
  309. int lento_rename(const char *oldname, const char *newname,
  310.                  struct lento_vfs_context *info);
  311. int lento_iopen(const char *name, ino_t ino, unsigned int generation,int flags);
  312. int lento_close(unsigned int fd, struct lento_vfs_context *info);
  313. /* journal.c */
  314. #define JOURNAL_PAGE_SZ  PAGE_SIZE
  315. __inline__ int presto_no_journal(struct presto_file_set *fset);
  316. int journal_fetch(int minor);
  317. int presto_journal_write(struct rec_info *rec, struct presto_file_set *fset,
  318.                          struct file *file);
  319. int presto_journal_setattr(struct rec_info *rec, struct presto_file_set *fset,
  320.                            struct dentry *dentry,
  321.                            struct presto_version *old_ver,
  322.                            struct iattr *iattr);
  323. int presto_journal_create(struct rec_info *rec, struct presto_file_set *fset,
  324.                           struct dentry *dentry,
  325.                           struct presto_version *tgt_dir_ver,
  326.                           struct presto_version *new_file_ver, int mode);
  327. int presto_journal_link(struct rec_info *rec, struct presto_file_set *fset,
  328.                         struct dentry *src, struct dentry *tgt,
  329.                         struct presto_version *tgt_dir_ver,
  330.                         struct presto_version *new_link_ver);
  331. int presto_journal_unlink(struct rec_info *rec, struct presto_file_set *fset,
  332.                           struct dentry *dentry,
  333.                           struct presto_version *tgt_dir_ver,
  334.                           struct presto_version *old_file_ver, int len,
  335.                           const char *name);
  336. int presto_journal_symlink(struct rec_info *rec, struct presto_file_set *fset,
  337.                            struct dentry *dentry, const char *target,
  338.                            struct presto_version *tgt_dir_ver,
  339.                            struct presto_version *new_link_ver);
  340. int presto_journal_mkdir(struct rec_info *rec, struct presto_file_set *fset,
  341.                          struct dentry *dentry,
  342.                          struct presto_version *tgt_dir_ver,
  343.                          struct presto_version *new_dir_ver, int mode);
  344. int presto_journal_rmdir(struct rec_info *rec, struct presto_file_set *fset,
  345.                          struct dentry *dentry,
  346.                          struct presto_version *tgt_dir_ver,
  347.                          struct presto_version *old_dir_ver, int len,
  348.                          const char *name);
  349. int presto_journal_mknod(struct rec_info *rec, struct presto_file_set *fset,
  350.                          struct dentry *dentry,
  351.                          struct presto_version *tgt_dir_ver,
  352.                          struct presto_version *new_node_ver, int mode,
  353.                          int dmajor, int dminor);
  354. int presto_journal_rename(struct rec_info *rec, struct presto_file_set *fset,
  355.                           struct dentry *src, struct dentry *tgt,
  356.                           struct presto_version *src_dir_ver,
  357.                           struct presto_version *tgt_dir_ver);
  358. int presto_journal_open(struct rec_info *rec, struct presto_file_set *fset,
  359.                         struct dentry *dentry, struct presto_version *old_ver);
  360. int presto_journal_close(struct rec_info *rec, struct presto_file_set *fset,
  361.                          struct file *file, 
  362.  struct dentry *dentry, 
  363.  struct presto_version *new_ver);
  364. int presto_close_journal_file(struct presto_file_set *fset);
  365. void presto_log_op(void *data, int len);
  366. int presto_write_last_rcvd(struct rec_info *recinfo,
  367.                            struct presto_file_set *fset,
  368.                            struct lento_vfs_context *info);
  369. /* journal_ext3.c */
  370. struct ext3_journal_data {
  371.         struct file *jd_file;
  372. };
  373. extern struct ext3_journal_data e3jd;
  374. /* sysctl.c */
  375. int init_intermezzo_sysctl(void);
  376. void cleanup_intermezzo_sysctl(void);
  377. /* ext_attr.c */
  378. #ifdef CONFIG_FS_EXT_ATTR
  379. /* XXX: Borrowed from vfs.c. Once the ea patch is into CVS 
  380.  * move this prototype -SHP
  381.  */
  382. int presto_do_set_ext_attr(struct presto_file_set *fset,
  383.                            struct dentry *dentry,
  384.                            const char *name, void *buffer,
  385.                            size_t buffer_len, int flags, mode_t *mode,
  386.                            struct lento_vfs_context *info);
  387. int presto_set_ext_attr(struct inode *inode,
  388.                         const char *name, void *buffer,
  389.                         size_t buffer_len, int flags);
  390. int lento_set_ext_attr(const char *path, const char *name,
  391.                        void *buffer, size_t buffer_len, int flags,
  392.                        mode_t mode, struct lento_vfs_context *info);
  393. /* XXX: Borrowed from journal.c. Once the ea patch is into CVS 
  394.  * move this prototype -SHP
  395.  */
  396. int presto_journal_set_ext_attr (struct rec_info *rec,
  397.                                  struct presto_file_set *fset,
  398.                                  struct dentry *dentry,
  399.                                  struct presto_version *ver, const char *name,
  400.                                  const char *buffer, int buffer_len,
  401.                                  int flags);
  402. #endif
  403. /* global variables */
  404. extern int presto_debug;
  405. extern int presto_print_entry;
  406. #define PRESTO_DEBUG
  407. #ifdef PRESTO_DEBUG
  408. /* debugging masks */
  409. #define D_SUPER     1   /* print results returned by Venus */
  410. #define D_INODE     2   /* print entry and exit into procedure */
  411. #define D_FILE      4
  412. #define D_CACHE     8   /* cache debugging */
  413. #define D_MALLOC    16  /* print malloc, de-alloc information */
  414. #define D_JOURNAL   32
  415. #define D_UPCALL    64  /* up and downcall debugging */
  416. #define D_PSDEV    128
  417. #define D_PIOCTL   256
  418. #define D_SPECIAL  512
  419. #define D_TIMING  1024
  420. #define D_DOWNCALL 2048
  421. #define D_KML      4096
  422. #define CDEBUG(mask, format, a...)                                      
  423.         do {                                                            
  424.                 if (presto_debug & mask) {                              
  425.                         printk("(%s:%s,l. %d %d): ", __FILE__, __FUNCTION__, __LINE__, current->pid);   
  426.                         printk(format, ##a); }                          
  427.         } while (0)
  428. #define ENTRY                                                           
  429.         if(presto_print_entry)                                          
  430.                 printk("Process %d entered %sn", current->pid, __FUNCTION__)
  431. #define EXIT                                                            
  432.         if(presto_print_entry)                                          
  433.                 printk("Process %d leaving %s at %dn", current->pid,   
  434.                        __FUNCTION__,__LINE__)
  435. extern long presto_kmemory;
  436. extern long presto_vmemory;
  437. #define presto_kmem_inc(ptr, size) presto_kmemory += (size)
  438. #define presto_kmem_dec(ptr, size) presto_kmemory -= (size)
  439. #define presto_vmem_inc(ptr, size) presto_vmemory += (size)
  440. #define presto_vmem_dec(ptr, size) presto_vmemory -= (size)
  441. #else /* !PRESTO_DEBUG */
  442. #define CDEBUG(mask, format, a...) do {} while (0)
  443. #define ENTRY do {} while (0)
  444. #define EXIT do {} while (0)
  445. #define presto_kmem_inc(ptr, size) do {} while (0)
  446. #define presto_kmem_dec(ptr, size) do {} while (0)
  447. #define presto_vmem_inc(ptr, size) do {} while (0)
  448. #define presto_vmem_dec(ptr, size) do {} while (0)
  449. #endif /* PRESTO_DEBUG */
  450. #define PRESTO_ALLOC(ptr, cast, size)                                   
  451. do {                                                                    
  452.     if (size <= 4096) {                                                 
  453.         ptr = (cast)kmalloc((unsigned long) size, GFP_KERNEL);          
  454.         CDEBUG(D_MALLOC, "kmalloced: %ld at %p.n", (long)size, ptr);   
  455.         presto_kmem_inc(ptr, size);                                     
  456.     } else {                                                            
  457.         ptr = (cast)vmalloc((unsigned long) size);                      
  458.         CDEBUG(D_MALLOC, "vmalloced: %ld at %p.n", (long)size, ptr);   
  459.         presto_vmem_inc(ptr, size);                                     
  460.     }                                                                   
  461.     if ((ptr) == 0)                                                     
  462.         printk("PRESTO: out of memory at %s:%dn", __FILE__, __LINE__); 
  463.     else                                                                
  464.         memset( ptr, 0, size );                                         
  465. } while (0)
  466. #define PRESTO_FREE(ptr,size)                                           
  467. do {                                                                    
  468.     if (!ptr) {                                                         
  469.         printk("PRESTO: free NULL pointer (%ld bytes) at %s:%dn",      
  470.                (long)size, __FILE__, __LINE__);                         
  471.         break;                                                          
  472.     }                                                                   
  473.     if (size <= 4096) {                                                 
  474.         CDEBUG(D_MALLOC, "kfreed: %ld at %p.n", (long)size, ptr);      
  475.         presto_kmem_dec(ptr, size);                                     
  476.         kfree((ptr));                                         
  477.     } else {                                                            
  478.         CDEBUG(D_MALLOC, "vfreed: %ld at %p.n", (long)size, ptr);      
  479.         presto_vmem_dec(ptr, size);                                     
  480.         vfree((ptr));                                                   
  481.     }                                                                   
  482. } while (0)
  483. #define MYPATHLEN(buffer,path) (buffer + PAGE_SIZE - path - 1)
  484. #else /* __KERNEL__ */
  485. #include <asm/types.h>
  486. #include <sys/ioctl.h>
  487. struct lento_vfs_context {
  488.         __u32 slot_offset;
  489.         __u32 recno;
  490.         __u64 kml_offset;
  491.         __u32 flags;
  492.         __u32 updated_time;
  493. };
  494. #endif /* __KERNEL__*/
  495. /* marking flags for fsets */
  496. #define FSET_CLIENT_RO 0x00000001
  497. #define FSET_LENTO_RO  0x00000002
  498. #define FSET_HASPERMIT  0x00000004 /* we have a permit to WB */
  499. #define FSET_INSYNC     0x00000008 /* this fileset is in sync */
  500. #define FSET_PERMIT_WAITING 0x00000010 /* Lento is waiting for permit */
  501. #define FSET_STEAL_PERMIT 0x00000020 /* take permit if Lento is dead */
  502. #define FSET_JCLOSE_ON_WRITE 0x00000040 /* Journal closes on writes */
  503. /* what to mark indicator (ioctl parameter) */ 
  504. #define MARK_DENTRY   101
  505. #define MARK_FSET     102
  506. #define MARK_CACHE    103
  507. #define MARK_GETFL    104
  508. struct readmount {
  509.         int io_len;  /* this is IN & OUT: true length of str is returned */
  510.         char *io_string;
  511. };
  512. /* modeled after setsockopt */
  513. /* so if you have no /proc, oh well. */
  514. /* for now it's all ints. We may grow this later for non-ints. */
  515. struct psdev_opt {
  516.         int optname;
  517.         int optval;
  518. };
  519. struct lento_input {
  520.         char *name;
  521.         struct lento_vfs_context info;
  522. };
  523. struct lento_input_attr {
  524.         char *name;
  525. #if BITS_PER_LONG < 64
  526.         __u32 dummy;    /* XXX on 64-bit platforms, this is not needed */
  527. #endif
  528.         __u32 valid;
  529.         __u32 mode;
  530.         __u32 uid;
  531.         __u32 gid;
  532.         __u64 size;
  533.         __s64 atime;
  534.         __s64 mtime;
  535.         __s64 ctime;
  536.         __u32 attr_flags;
  537.         struct lento_vfs_context info;
  538. };
  539. struct lento_input_mode {
  540.         char *name;
  541.         __u32 mode;
  542.         struct lento_vfs_context info;
  543. };
  544. struct lento_input_old_new {
  545.         char *oldname;
  546.         char *newname;
  547.         struct lento_vfs_context info;
  548. };
  549. struct lento_input_dev {
  550.         char *name;
  551.         __u32 mode;
  552.         __u32 major;
  553.         __u32 minor;
  554.         struct lento_vfs_context info;
  555. };
  556. struct lento_input_iopen {
  557.         char *name;
  558. #if BITS_PER_LONG < 64
  559.         __u32 dummy;    /* XXX on 64-bit platforms, this is not needed */
  560. #endif
  561.         __u64 ino;
  562.         __u32 generation;
  563.         __u32 flags;
  564.         __s32 fd;
  565. };
  566. struct lento_input_close {
  567.         __u32 fd;
  568.         struct lento_vfs_context info;
  569. };
  570. /* XXX: check for alignment */
  571. struct lento_input_ext_attr {
  572.         char  *path;
  573.         char  *name;
  574.         __u32 name_len;
  575.         char  *buffer;
  576.         __u32 buffer_len;
  577.         __u32 flags;
  578.         __u32 mode;
  579.         struct lento_vfs_context info;
  580. };
  581. /* XXX should PRESTO_GET_* actually be of type _IOR, since we are reading? */
  582. #define PRESTO_GETMOUNT         _IOW ('p',0x03, struct readmount *)
  583. #define PRESTO_SETPID           _IOW ('p',0x04, struct readmount *)
  584. #define PRESTO_CLOSE_JOURNALF   _IOW ('p',0x06, struct readmount *)
  585. #define PRESTO_SET_FSETROOT     _IOW ('p',0x07, struct readmount *)
  586. #define PRESTO_CLEAR_FSETROOT   _IOW ('p',0x08, struct readmount *)
  587. #define PRESTO_SETOPT           _IOW ('p',0x09, struct psdev_opt *)
  588. #define PRESTO_GETOPT           _IOW ('p',0x0a, struct psdev_opt *)
  589. #define PRESTO_GET_KMLSIZE      _IOW ('p',0x0b, struct psdev_opt *)
  590. #define PRESTO_GET_RECNO        _IOW ('p',0x0c, struct psdev_opt *)
  591. #define PRESTO_VFS_SETATTR      _IOW ('p',0x10, struct lento_input_attr *)
  592. #define PRESTO_VFS_CREATE       _IOW ('p',0x11, struct lento_input_mode *)
  593. #define PRESTO_VFS_LINK         _IOW ('p',0x12, struct lento_input_old_new *)
  594. #define PRESTO_VFS_UNLINK       _IOW ('p',0x13, struct lento_input *)
  595. #define PRESTO_VFS_SYMLINK      _IOW ('p',0x14, struct lento_input_old_new *)
  596. #define PRESTO_VFS_MKDIR        _IOW ('p',0x15, struct lento_input_mode *)
  597. #define PRESTO_VFS_RMDIR        _IOW ('p',0x16, struct lento_input *)
  598. #define PRESTO_VFS_MKNOD        _IOW ('p',0x17, struct lento_input_dev *)
  599. #define PRESTO_VFS_RENAME       _IOW ('p',0x18, struct lento_input_old_new *)
  600. #define PRESTO_VFS_CLOSE        _IOW ('p',0x1a, struct lento_input_close *)
  601. #define PRESTO_VFS_IOPEN        _IOW ('p',0x1b, struct lento_input_iopen *)
  602. #define PRESTO_VFS_SETEXTATTR   _IOW ('p',0x1c, struct lento_input_ext_attr *)
  603. #define PRESTO_VFS_DELEXTATTR   _IOW ('p',0x1d, struct lento_input_ext_attr *)
  604. #define PRESTO_MARK             _IOW ('p',0x20, struct lento_input_open *)
  605. #define PRESTO_RELEASE_PERMIT   _IOW ('p',0x21, struct lento_input_open *)
  606. #define PRESTO_CLEAR_ALL_FSETROOTS  _IOW ('p',0x22, struct readmount *)
  607. #define PRESTO_BACKFETCH_LML    _IOW ('p',0x23, struct readmount *)
  608. #define PRESTO_REINT            _IOW ('p',0x24, struct readmount *)
  609. #define PRESTO_CANCEL_LML       _IOW ('p',0x25, struct readmount *)
  610. #define PRESTO_RESET_FSET       _IOW ('p',0x26, struct readmount *)
  611. #define PRESTO_COMPLETE_CLOSES  _IOW ('p',0x27, struct readmount *)
  612. #define PRESTO_REINT_BEGIN      _IOW ('p',0x30, struct readmount *)
  613. #define PRESTO_DO_REINT         _IOW ('p',0x31, struct readmount *)
  614. #define PRESTO_REINT_END        _IOW ('p',0x32, struct readmount *)
  615. #endif