Whamcloud - gitweb
LU-11872 quota: add get/set project support for non-dir/file
[fs/lustre-release.git] / lustre / llite / llite_internal.h
index 480d55e..0c60ef2 100644 (file)
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  */
 
 #ifndef LLITE_INTERNAL_H
 #define LLITE_INTERNAL_H
 #include <obd.h>
 #include <lustre_disk.h>  /* for s2sbi */
-#include <lustre_eacl.h>
 #include <lustre_linkea.h>
 
 /* for struct cl_lock_descr and struct cl_io */
@@ -135,6 +133,12 @@ struct ll_inode_info {
        __u64                           lli_open_fd_read_count;
        __u64                           lli_open_fd_write_count;
        __u64                           lli_open_fd_exec_count;
+
+       /* Number of times this inode was opened */
+       u64                             lli_open_fd_count;
+       /* When last close was performed on this inode */
+       ktime_t                         lli_close_fd_time;
+
        /* Protects access to och pointers and their usage counters */
        struct mutex                    lli_och_mutex;
 
@@ -406,33 +410,11 @@ enum ll_file_flags {
        LLIF_UPDATE_ATIME       = 4,
        /* foreign file/dir can be unlinked unconditionnaly */
        LLIF_FOREIGN_REMOVABLE  = 5,
+       /* setting encryption context in progress */
+       LLIF_SET_ENC_CTX        = 6,
 
 };
 
-static inline void ll_file_set_flag(struct ll_inode_info *lli,
-                                   enum ll_file_flags flag)
-{
-       set_bit(flag, &lli->lli_flags);
-}
-
-static inline void ll_file_clear_flag(struct ll_inode_info *lli,
-                                     enum ll_file_flags flag)
-{
-       clear_bit(flag, &lli->lli_flags);
-}
-
-static inline bool ll_file_test_flag(struct ll_inode_info *lli,
-                                    enum ll_file_flags flag)
-{
-       return test_bit(flag, &lli->lli_flags);
-}
-
-static inline bool ll_file_test_and_clear_flag(struct ll_inode_info *lli,
-                                              enum ll_file_flags flag)
-{
-       return test_and_clear_bit(flag, &lli->lli_flags);
-}
-
 int ll_xattr_cache_destroy(struct inode *inode);
 
 int ll_xattr_cache_get(struct inode *inode,
@@ -657,6 +639,8 @@ enum stats_track_type {
 #define LL_SBI_FOREIGN_SYMLINK     0x20000000 /* foreign fake-symlink support */
 /* foreign fake-symlink upcall registered */
 #define LL_SBI_FOREIGN_SYMLINK_UPCALL      0x40000000
+#define LL_SBI_PARALLEL_DIO    0x80000000 /* parallel (async) submission of
+                                             RPCs for DIO */
 #define LL_SBI_FLAGS {         \
        "nolck",        \
        "checksum",     \
@@ -689,6 +673,7 @@ enum stats_track_type {
        "noencrypt",    \
        "foreign_symlink",      \
        "foreign_symlink_upcall",       \
+       "parallel_dio", \
 }
 
 /* This is embedded into llite super-blocks to keep track of connect
@@ -784,6 +769,17 @@ struct ll_sb_info {
        unsigned int              ll_heat_decay_weight;
        unsigned int              ll_heat_period_second;
 
+       /* Opens of the same inode before we start requesting open lock */
+       u32                       ll_oc_thrsh_count;
+
+       /* Time in ms between last inode close and next open to be considered
+        * instant back to back and would trigger an open lock request
+        */
+       u32                       ll_oc_thrsh_ms;
+
+       /* Time in ms after last file close that we no longer count prior opens*/
+       u32                       ll_oc_max_ms;
+
        /* filesystem fsname */
        char                      ll_fsname[LUSTRE_MAXFSNAME + 1];
 
@@ -806,6 +802,11 @@ struct ll_sb_info {
 
 #define SBI_DEFAULT_HEAT_DECAY_WEIGHT  ((80 * 256 + 50) / 100)
 #define SBI_DEFAULT_HEAT_PERIOD_SECOND (60)
+
+#define SBI_DEFAULT_OPENCACHE_THRESHOLD_COUNT  (5)
+#define SBI_DEFAULT_OPENCACHE_THRESHOLD_MS     (100) /* 0.1 second */
+#define SBI_DEFAULT_OPENCACHE_THRESHOLD_MAX_MS (60000) /* 1 minute */
+
 /*
  * per file-descriptor read-ahead data.
  */
@@ -991,6 +992,11 @@ static inline bool ll_sbi_has_foreign_symlink(struct ll_sb_info *sbi)
        return !!(sbi->ll_flags & LL_SBI_FOREIGN_SYMLINK);
 }
 
+static inline bool ll_sbi_has_parallel_dio(struct ll_sb_info *sbi)
+{
+       return !!(sbi->ll_flags & LL_SBI_PARALLEL_DIO);
+}
+
 void ll_ras_enter(struct file *f, loff_t pos, size_t count);
 
 /* llite/lcommon_misc.c */
@@ -1039,6 +1045,8 @@ enum {
        LPROC_LL_REMOVEXATTR,
        LPROC_LL_INODE_PERM,
        LPROC_LL_FALLOCATE,
+       LPROC_LL_INODE_OCOUNT,
+       LPROC_LL_INODE_OPCLTM,
        LPROC_LL_FILE_OPCODES
 };
 
@@ -1047,17 +1055,6 @@ enum get_default_layout_type {
        GET_DEFAULT_LAYOUT_ROOT = 1,
 };
 
-struct ll_dir_chain {
-};
-
-static inline void ll_dir_chain_init(struct ll_dir_chain *chain)
-{
-}
-
-static inline void ll_dir_chain_fini(struct ll_dir_chain *chain)
-{
-}
-
 extern const struct file_operations ll_dir_operations;
 extern const struct inode_operations ll_dir_inode_operations;
 #ifdef HAVE_DIR_CONTEXT
@@ -1070,7 +1067,7 @@ int ll_dir_read(struct inode *inode, __u64 *pos, struct md_op_data *op_data,
 int ll_get_mdt_idx(struct inode *inode);
 int ll_get_mdt_idx_by_fid(struct ll_sb_info *sbi, const struct lu_fid *fid);
 struct page *ll_get_dir_page(struct inode *dir, struct md_op_data *op_data,
-                            __u64 offset, struct ll_dir_chain *chain);
+                            __u64 offset);
 void ll_release_page(struct inode *inode, struct page *page, bool remove);
 int quotactl_ioctl(struct ll_sb_info *sbi, struct if_quotactl *qctl);
 
@@ -1104,10 +1101,8 @@ struct ll_cl_context *ll_cl_find(struct file *file);
 extern const struct address_space_operations ll_aops;
 
 /* llite/file.c */
-extern const struct file_operations ll_file_operations;
-extern const struct file_operations ll_file_operations_flock;
-extern const struct file_operations ll_file_operations_noflock;
 extern const struct inode_operations ll_file_inode_operations;
+const struct file_operations *ll_select_file_operations(struct ll_sb_info *sbi);
 extern int ll_have_md_lock(struct inode *inode, __u64 *bits,
                           enum ldlm_mode l_req_mode);
 extern enum ldlm_mode ll_take_md_lock(struct inode *inode, __u64 bits,
@@ -1118,6 +1113,7 @@ int ll_file_open(struct inode *inode, struct file *file);
 int ll_file_release(struct inode *inode, struct file *file);
 int ll_release_openhandle(struct dentry *, struct lookup_intent *);
 int ll_md_real_close(struct inode *inode, fmode_t fmode);
+void ll_track_file_opens(struct inode *inode);
 extern void ll_rw_stats_tally(struct ll_sb_info *sbi, pid_t pid,
                               struct ll_file_data *file, loff_t pos,
                               size_t count, int rw);
@@ -1129,16 +1125,14 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat);
 #endif
 int ll_getattr_dentry(struct dentry *de, struct kstat *stat, u32 request_mask,
                      unsigned int flags, bool foreign);
-struct posix_acl *ll_get_acl(struct inode *inode, int type);
-#ifdef HAVE_IOP_SET_ACL
 #ifdef CONFIG_LUSTRE_FS_POSIX_ACL
+struct posix_acl *ll_get_acl(struct inode *inode, int type);
 int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 #else  /* !CONFIG_LUSTRE_FS_POSIX_ACL */
+#define ll_get_acl NULL
 #define ll_set_acl NULL
 #endif /* CONFIG_LUSTRE_FS_POSIX_ACL */
 
-#endif
-
 static inline int ll_xflags_to_inode_flags(int xflags)
 {
        return ((xflags & FS_XFLAG_SYNC)      ? S_SYNC      : 0) |
@@ -1147,12 +1141,12 @@ static inline int ll_xflags_to_inode_flags(int xflags)
               ((xflags & FS_XFLAG_IMMUTABLE) ? S_IMMUTABLE : 0);
 }
 
-static inline int ll_inode_flags_to_xflags(int flags)
+static inline int ll_inode_flags_to_xflags(int inode_flags)
 {
-       return ((flags & S_SYNC)      ? FS_XFLAG_SYNC      : 0) |
-              ((flags & S_NOATIME)   ? FS_XFLAG_NOATIME   : 0) |
-              ((flags & S_APPEND)    ? FS_XFLAG_APPEND    : 0) |
-              ((flags & S_IMMUTABLE) ? FS_XFLAG_IMMUTABLE : 0);
+       return ((inode_flags & S_SYNC)      ? FS_XFLAG_SYNC      : 0) |
+              ((inode_flags & S_NOATIME)   ? FS_XFLAG_NOATIME   : 0) |
+              ((inode_flags & S_APPEND)    ? FS_XFLAG_APPEND    : 0) |
+              ((inode_flags & S_IMMUTABLE) ? FS_XFLAG_IMMUTABLE : 0);
 }
 
 int ll_migrate(struct inode *parent, struct file *file,
@@ -1160,11 +1154,13 @@ int ll_migrate(struct inode *parent, struct file *file,
 int ll_get_fid_by_name(struct inode *parent, const char *name,
                       int namelen, struct lu_fid *fid, struct inode **inode);
 int ll_inode_permission(struct inode *inode, int mask);
-int ll_ioctl_check_project(struct inode *inode, struct fsxattr *fa);
+int ll_ioctl_check_project(struct inode *inode, __u32 xflags, __u32 projid);
 int ll_ioctl_fsgetxattr(struct inode *inode, unsigned int cmd,
                        unsigned long arg);
 int ll_ioctl_fssetxattr(struct inode *inode, unsigned int cmd,
                        unsigned long arg);
+int ll_ioctl_project(struct file *file, unsigned int cmd,
+                    unsigned long arg);
 
 int ll_lov_setstripe_ea_info(struct inode *inode, struct dentry *dentry,
                             __u64 flags, struct lov_user_md *lum,
@@ -1215,8 +1211,9 @@ int ll_statfs(struct dentry *de, struct kstatfs *sfs);
 int ll_statfs_internal(struct ll_sb_info *sbi, struct obd_statfs *osfs,
                       u32 flags);
 int ll_update_inode(struct inode *inode, struct lustre_md *md);
-void ll_update_inode_flags(struct inode *inode, int ext_flags);
+void ll_update_inode_flags(struct inode *inode, unsigned int ext_flags);
 int ll_read_inode2(struct inode *inode, void *opaque);
+void ll_truncate_inode_pages_final(struct inode *inode);
 void ll_delete_inode(struct inode *inode);
 int ll_iocontrol(struct inode *inode, struct file *file,
                  unsigned int cmd, unsigned long arg);
@@ -1225,8 +1222,8 @@ void ll_umount_begin(struct super_block *sb);
 int ll_remount_fs(struct super_block *sb, int *flags, char *data);
 int ll_show_options(struct seq_file *seq, struct dentry *dentry);
 void ll_dirty_page_discard_warn(struct page *page, int ioret);
-int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req,
-                 struct super_block *, struct lookup_intent *);
+int ll_prep_inode(struct inode **inode, struct req_capsule *pill,
+                 struct super_block *sb, struct lookup_intent *it);
 int ll_obd_statfs(struct inode *inode, void __user *arg);
 int ll_get_max_mdsize(struct ll_sb_info *sbi, int *max_mdsize);
 int ll_get_default_mdsize(struct ll_sb_info *sbi, int *default_mdsize);
@@ -1243,7 +1240,7 @@ int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg);
 void ll_compute_rootsquash_state(struct ll_sb_info *sbi);
 ssize_t ll_copy_user_md(const struct lov_user_md __user *md,
                        struct lov_user_md **kbuf);
-void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req);
+void ll_open_cleanup(struct super_block *sb, struct req_capsule *pill);
 
 void ll_dom_finish_open(struct inode *inode, struct ptlrpc_request *req);
 
@@ -1478,15 +1475,11 @@ struct ll_statahead_info {
                                                 * is not a hidden one */
        unsigned int            sai_skip_hidden;/* skipped hidden dentry count
                                                 */
-       unsigned int            sai_ls_all:1,   /* "ls -al", do stat-ahead for
+       unsigned int            sai_ls_all:1;   /* "ls -al", do stat-ahead for
                                                 * hidden entries */
-                               sai_in_readpage:1;/* statahead is in readdir()*/
        wait_queue_head_t       sai_waitq;      /* stat-ahead wait queue */
        struct task_struct      *sai_task;      /* stat-ahead thread */
        struct task_struct      *sai_agl_task;  /* AGL thread */
-       struct list_head        sai_interim_entries; /* entries which got async
-                                                     * stat reply, but not
-                                                     * instantiated */
        struct list_head        sai_entries;    /* completed entries */
        struct list_head        sai_agls;       /* AGLs to be sent */
        struct list_head        sai_cache[LL_SA_CACHE_SIZE];