Whamcloud - gitweb
b=3119
[fs/lustre-release.git] / lustre / llite / llite_internal.h
index 538bbfb..5f8d86c 100644 (file)
 #ifndef LLITE_INTERNAL_H
 #define LLITE_INTERNAL_H
 
+/* default to about 40meg of readahead on a given system.  That much tied
+ * up in 512k readahead requests serviced at 40ms each is about 1GB/s. */
+#define SBI_DEFAULT_RA_MAX ((40 << 20) >> PAGE_CACHE_SHIFT)
+
 struct ll_sb_info {
+        /* this protects pglist and max_r_a_pages.  It isn't safe to
+         * grab from interrupt contexts */
+        spinlock_t                ll_lock;
         struct obd_uuid           ll_sb_uuid;
-//        struct lustre_handle      ll_mdc_conn;
         struct obd_export        *ll_mdc_exp;
         struct obd_export        *ll_osc_exp;
         struct proc_dir_entry*    ll_proc_root;
         obd_id                    ll_rootino; /* number of root inode */
 
-        struct obd_uuid           ll_mds_uuid;
-        struct obd_uuid           ll_mds_peer_uuid;
         struct lustre_mount_data *ll_lmd;
-        char                     *ll_instance; 
+        char                     *ll_instance;
 
         int                       ll_flags;
-        wait_queue_head_t         ll_commitcbd_waitq;
-        wait_queue_head_t         ll_commitcbd_ctl_waitq;
-        int                       ll_commitcbd_flags;
-        struct task_struct       *ll_commitcbd_thread;
-        time_t                    ll_commitcbd_waketime;
-        time_t                    ll_commitcbd_timeout;
-        spinlock_t                ll_commitcbd_lock;
         struct list_head          ll_conn_chain; /* per-conn chain of SBs */
 
         struct hlist_head         ll_orphan_dentry_list; /*please don't ask -p*/
         struct ll_close_queue    *ll_lcq;
 
         struct lprocfs_stats     *ll_stats; /* lprocfs stats counter */
+
+        unsigned long             ll_pglist_gen;
+        struct list_head          ll_pglist;
+
+        unsigned long             ll_read_ahead_pages;
+        unsigned long             ll_max_read_ahead_pages;
+
 };
 
+struct ll_readahead_state {
+        spinlock_t      ras_lock;
+        unsigned long   ras_last_readpage, ras_consecutive;
+        unsigned long   ras_window_start, ras_window_len;
+        unsigned long   ras_next_readahead;
+
+};
+
+extern kmem_cache_t *ll_file_data_slab;
 struct lustre_handle;
+struct ll_file_data {
+        struct obd_client_handle fd_mds_och;
+        struct ll_readahead_state fd_ras;
+        __u32 fd_flags;
+        struct lustre_handle fd_cwlockh;
+        unsigned long fd_gid;
+};
+
 struct lov_stripe_md;
 
 extern spinlock_t inode_lock;
@@ -49,7 +70,7 @@ extern struct proc_dir_entry *proc_lustre_fs_root;
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
 # define hlist_del_init list_del_init
-#endif 
+#endif
 
 static inline struct inode *ll_info2i(struct ll_inode_info *lli)
 {
@@ -76,14 +97,14 @@ static inline void ll_i2uctxt(struct ll_uctxt *ctxt, struct inode *i1,
                         ctxt->gid2 = i2->i_gid;
                 else
                         ctxt->gid2 = -1;
-        } else 
+        } else
                 ctxt->gid2 = 0;
 }
 
 struct it_cb_data {
-       struct inode *icbd_parent;
-       struct dentry **icbd_childp;
-       obd_id hash;
+        struct inode *icbd_parent;
+        struct dentry **icbd_childp;
+        obd_id hash;
 };
 
 #define LLAP_MAGIC 98764321
@@ -91,14 +112,17 @@ struct it_cb_data {
 struct ll_async_page {
         int             llap_magic;
         void            *llap_cookie;
-        int             llap_queued;
         struct page     *llap_page;
         struct list_head llap_pending_write;
+         /* only trust these if the page lock is providing exclusion */
+        int              llap_write_queued:1,
+                         llap_defer_uptodate:1;
+        struct list_head llap_proc_item;
 };
 
-#define LL_CDEBUG_PAGE(page, STR)                                       \
-        CDEBUG(D_PAGE, "page %p map %p ind %lu priv %0lx: " STR,        \
-               page, page->mapping, page->index, page->private)
+#define LL_CDEBUG_PAGE(mask, page, fmt, arg...)                         \
+        CDEBUG(mask, "page %p map %p ind %lu priv %0lx: " fmt,          \
+               page, page->mapping, page->index, page->private, ## arg)
 
 /* llite/lproc_llite.c */
 int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
@@ -126,40 +150,32 @@ void ll_prepare_mdc_op_data(struct mdc_op_data *,
 int ll_prepare_write(struct file *, struct page *, unsigned from, unsigned to);
 int ll_commit_write(struct file *, struct page *, unsigned from, unsigned to);
 void ll_inode_fill_obdo(struct inode *inode, int cmd, struct obdo *oa);
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-#define ll_ap_completion ll_ap_completion_24
-void ll_ap_completion_24(void *data, int cmd, int rc);
-#else 
-#define ll_ap_completion ll_ap_completion_26
-void ll_ap_completion_26(void *data, int cmd, int rc);
-#endif
-int ll_ocp_update_obdo(struct obd_client_page *ocp, int cmd, struct obdo *oa);
-int ll_ocp_set_io_ready(struct obd_client_page *ocp, int cmd);
-int ll_ocp_update_io_args(struct obd_client_page *ocp, int cmd);
+void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc);
 void ll_removepage(struct page *page);
 int ll_readpage(struct file *file, struct page *page);
 struct ll_async_page *llap_from_cookie(void *cookie);
 struct ll_async_page *llap_from_page(struct page *page);
+struct ll_async_page *llap_cast_private(struct page *page);
+void ll_readahead_init(struct inode *inode, struct ll_readahead_state *ras);
 
 void ll_truncate(struct inode *inode);
 
 /* llite/file.c */
 extern struct file_operations ll_file_operations;
 extern struct inode_operations ll_file_inode_operations;
-extern struct inode_operations ll_special_inode_operations;
 extern int ll_inode_revalidate_it(struct dentry *, struct lookup_intent *);
 int ll_extent_lock(struct ll_file_data *, struct inode *,
-                   struct lov_stripe_md *, int mode, struct ldlm_extent *,
-                   struct lustre_handle *);
+                   struct lov_stripe_md *, int mode, ldlm_policy_data_t *,
+                   struct lustre_handle *, int ast_flags);
 int ll_extent_unlock(struct ll_file_data *, struct inode *,
                      struct lov_stripe_md *, int mode, struct lustre_handle *);
 int ll_file_open(struct inode *inode, struct file *file);
 int ll_file_release(struct inode *inode, struct file *file);
 int ll_lsm_getattr(struct obd_export *, struct lov_stripe_md *, struct obdo *);
-int ll_extent_lock_no_validate(struct ll_file_data *, struct inode *,
-                               struct lov_stripe_md *, int mode,
-                               struct ldlm_extent *, struct lustre_handle *,
-                               int ast_flags);
+int ll_glimpse_size(struct inode *inode, struct ost_lvb *lvb);
+int ll_local_open(struct file *file, struct lookup_intent *it);
+int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
+                 struct file *file);
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
 int ll_getattr(struct vfsmount *mnt, struct dentry *de,
                struct lookup_intent *it, struct kstat *stat);
@@ -175,7 +191,6 @@ void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry);
 
 /* llite/llite_lib.c */
 
-extern struct super_operations ll_super_operations;
 extern struct super_operations lustre_super_operations;
 
 char *ll_read_opt(const char *opt, char *data);
@@ -185,7 +200,6 @@ void ll_lli_init(struct ll_inode_info *lli);
 int ll_fill_super(struct super_block *sb, void *data, int silent);
 int lustre_fill_super(struct super_block *sb, void *data, int silent);
 void lustre_put_super(struct super_block *sb);
-void ll_put_super(struct super_block *sb);
 struct inode *ll_inode_from_lock(struct ldlm_lock *lock);
 void ll_clear_inode(struct inode *inode);
 int ll_attr2inode(struct inode *inode, struct iattr *attr, int trunc);
@@ -202,12 +216,22 @@ void ll_read_inode2(struct inode *inode, void *opaque);
 int ll_iocontrol(struct inode *inode, struct file *file,
                  unsigned int cmd, unsigned long arg);
 void ll_umount_begin(struct super_block *sb);
-int ll_prep_inode(struct obd_export *exp, struct inode **inode, 
+int ll_prep_inode(struct obd_export *exp, struct inode **inode,
                   struct ptlrpc_request *req, int offset, struct super_block *);
 __u32 get_uuid2int(const char *name, int len);
 struct dentry *ll_fh_to_dentry(struct super_block *sb, __u32 *data, int len,
                                int fhtype, int parent);
 int ll_dentry_to_fh(struct dentry *, __u32 *datap, int *lenp, int need_parent);
+
+/* llite/special.c */
+extern struct inode_operations ll_special_inode_operations;
+extern struct file_operations ll_special_chr_inode_fops;
+extern struct file_operations ll_special_chr_file_fops;
+extern struct file_operations ll_special_blk_inode_fops;
+extern struct file_operations ll_special_fifo_inode_fops;
+extern struct file_operations ll_special_fifo_file_fops;
+extern struct file_operations ll_special_sock_inode_fops;
+
 /* llite/symlink.c */
 extern struct inode_operations ll_fast_symlink_inode_operations;
 
@@ -234,6 +258,8 @@ int ll_close_thread_start(struct ll_close_queue **lcq_ret);
 #define LL_SBI_NOLCK            0x1
 #define LL_SBI_READAHEAD        0x2
 
+#define LL_MAX_BLKSIZE          (4UL * 1024 * 1024)
+
 #if  (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
 #define    ll_s2sbi(sb)     ((struct ll_sb_info *)((sb)->s_fs_info))
 void __d_rehash(struct dentry * entry, int lock);
@@ -248,7 +274,7 @@ static inline __u64 ll_ts2u64(time_t *time)
 {
         return *time;
 }
-#endif 
+#endif
 
 /* don't need an addref as the sb_info should be holding one */
 static inline struct obd_export *ll_s2obdexp(struct super_block *sb)