Whamcloud - gitweb
LU-1030 clio: reimplement ll_fsync in clio way
[fs/lustre-release.git] / lustre / llite / llite_internal.h
index 45990cb..b03ce4b 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -28,9 +26,8 @@
 /*
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
- */
-/*
- * Copyright (c) 2011 Whamcloud, Inc.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -135,7 +132,7 @@ struct ll_inode_info {
         struct posix_acl               *lli_posix_acl;
 
         cfs_hlist_head_t               *lli_remote_perms;
-        cfs_semaphore_t                 lli_rmtperm_sem;
+        cfs_mutex_t                     lli_rmtperm_mutex;
 
         /* identifying fields for both metadata and data stacks. */
         struct lu_fid                   lli_fid;
@@ -166,7 +163,7 @@ struct ll_inode_info {
         __u64                           lli_open_fd_exec_count;
         /* Protects access to och pointers and their usage counters, also
          * atomicity of check-update of lli_smd */
-        cfs_semaphore_t                 lli_och_sem;
+        cfs_mutex_t                     lli_och_mutex;
 
         struct inode                    lli_vfs_inode;
 
@@ -180,7 +177,7 @@ struct ll_inode_info {
                 /* for directory */
                 struct {
                         /* serialize normal readdir and statahead-readdir. */
-                        cfs_semaphore_t                 d_readdir_sem;
+                        cfs_mutex_t                     d_readdir_mutex;
 
                         /* metadata statahead */
                         /* since parent-child threads can share the same @file
@@ -198,7 +195,7 @@ struct ll_inode_info {
                         pid_t                           d_opendir_pid;
                 } d;
 
-#define lli_readdir_sem         u.d.d_readdir_sem
+#define lli_readdir_mutex       u.d.d_readdir_mutex
 #define lli_opendir_key         u.d.d_opendir_key
 #define lli_sai                 u.d.d_sai
 #define lli_sa_pos              u.d.d_sa_pos
@@ -220,7 +217,7 @@ struct ll_inode_info {
                          * }
                          */
                         cfs_rw_semaphore_t              f_trunc_sem;
-                        cfs_semaphore_t                 f_write_sem;
+                        cfs_mutex_t                     f_write_mutex;
 
                         /* for writepage() only to communicate to fsync */
                         int                             f_async_rc;
@@ -230,6 +227,15 @@ struct ll_inode_info {
                         cfs_time_t                      f_glimpse_time;
                         cfs_list_t                      f_agl_list;
                         __u64                           f_agl_index;
+                       /*
+                        * whenever a process try to read/write the file, the
+                        * jobid of the process will be saved here, and it'll
+                        * be packed into the write PRC when flush later.
+                        *
+                        * so the read/write statistics for jobid will not be
+                        * accurate if the file is shared by different jobs.
+                        */
+                       char                     f_jobid[JOBSTATS_JOBID_SIZE];
                 } f;
 
 #define lli_size_sem            u.f.f_size_sem
@@ -237,13 +243,14 @@ struct ll_inode_info {
 #define lli_symlink_name        u.f.f_symlink_name
 #define lli_maxbytes            u.f.f_maxbytes
 #define lli_trunc_sem           u.f.f_trunc_sem
-#define lli_write_sem           u.f.f_write_sem
+#define lli_write_mutex         u.f.f_write_mutex
 #define lli_async_rc            u.f.f_async_rc
 #define lli_write_rc            u.f.f_write_rc
 #define lli_glimpse_sem         u.f.f_glimpse_sem
 #define lli_glimpse_time        u.f.f_glimpse_time
 #define lli_agl_list            u.f.f_agl_list
 #define lli_agl_index           u.f.f_agl_index
+#define lli_jobid               u.f.f_jobid
 
         } u;
 
@@ -380,6 +387,7 @@ enum stats_track_type {
 #define LL_SBI_32BIT_API       0x2000 /* generate 32 bit inodes. */
 #define LL_SBI_64BIT_HASH      0x4000 /* support 64-bits dir hash/offset */
 #define LL_SBI_AGL_ENABLED     0x8000 /* enable agl */
+#define LL_SBI_VERBOSE        0x10000 /* verbose mount/umount */
 
 /* default value for ll_sb_info->contention_time */
 #define SBI_DEFAULT_CONTENTION_SECONDS     60
@@ -715,7 +723,7 @@ void ll_done_writing_attr(struct inode *inode, struct md_op_data *op_data);
 int ll_som_update(struct inode *inode, struct md_op_data *op_data);
 int ll_inode_getattr(struct inode *inode, struct obdo *obdo,
                      __u64 ioepoch, int sync);
-int ll_md_setattr(struct inode *inode, struct md_op_data *op_data,
+int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data,
                   struct md_open_data **mod);
 void ll_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
                           struct lustre_handle *fh);
@@ -745,10 +753,12 @@ int ll_dir_setstripe(struct inode *inode, struct lov_user_md *lump,
                      int set_default);
 int ll_dir_getstripe(struct inode *inode, struct lov_mds_md **lmm,
                      int *lmm_size, struct ptlrpc_request **request);
-#ifndef HAVE_FILE_FSYNC_2ARGS
-int ll_fsync(struct file *file, struct dentry *dentry, int data);
-#else
+#ifdef HAVE_FILE_FSYNC_4ARGS
+int ll_fsync(struct file *file, loff_t start, loff_t end, int data);
+#elif defined(HAVE_FILE_FSYNC_2ARGS)
 int ll_fsync(struct file *file, int data);
+#else
+int ll_fsync(struct file *file, struct dentry *dentry, int data);
 #endif
 int ll_do_fiemap(struct inode *inode, struct ll_user_fiemap *fiemap,
               int num_bytes);
@@ -781,7 +791,7 @@ void ll_put_super(struct super_block *sb);
 void ll_kill_super(struct super_block *sb);
 struct inode *ll_inode_from_lock(struct ldlm_lock *lock);
 void ll_clear_inode(struct inode *inode);
-int ll_setattr_raw(struct inode *inode, struct iattr *attr);
+int ll_setattr_raw(struct dentry *dentry, struct iattr *attr);
 int ll_setattr(struct dentry *de, struct iattr *attr);
 #ifndef HAVE_STATFS_DENTRY_PARAM
 int ll_statfs(struct super_block *sb, struct kstatfs *sfs);
@@ -815,6 +825,7 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data,
                                       const char *name, int namelen,
                                       int mode, __u32 opc, void *data);
 void ll_finish_md_op_data(struct md_op_data *op_data);
+int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg);
 
 /* llite/llite_nfs.c */
 extern struct export_operations lustre_export_operations;
@@ -1028,7 +1039,8 @@ struct ll_lock_tree_node * ll_node_from_inode(struct inode *inode, __u64 start,
                                               __u64 end, ldlm_mode_t mode);
 void policy_from_vma(ldlm_policy_data_t *policy,
                 struct vm_area_struct *vma, unsigned long addr, size_t count);
-struct vm_area_struct *our_vma(unsigned long addr, size_t count);
+struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr,
+                               size_t count);
 
 static inline void ll_invalidate_page(struct page *vmpage)
 {
@@ -1264,7 +1276,7 @@ ll_statahead_enter(struct inode *dir, struct dentry **dentryp, int only_unplug)
         struct ll_dentry_data *ldd;
 
         if (ll_i2sbi(dir)->ll_sa_max == 0)
-                return -ENOTSUPP;
+                return -EAGAIN;
 
         lli = ll_i2info(dir);
         /* not the same process, don't statahead */
@@ -1347,6 +1359,13 @@ void ll_iocontrol_unregister(void *magic);
 #define cl_inode_mode(inode) ((inode)->i_mode)
 #define cl_i2sbi ll_i2sbi
 
+static inline struct ll_file_data *cl_iattr2fd(struct inode *inode,
+                                               const struct iattr *attr)
+{
+        LASSERT(attr->ia_valid & ATTR_FILE);
+        return LUSTRE_FPRIVATE(attr->ia_file);
+}
+
 static inline void cl_isize_lock(struct inode *inode, int lsmlock)
 {
         ll_inode_size_lock(inode, lsmlock);
@@ -1383,6 +1402,8 @@ static inline int cl_merge_lvb(struct inode *inode)
 
 struct obd_capa *cl_capa_lookup(struct inode *inode, enum cl_req_type crt);
 
+int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end);
+
 /** direct write pages */
 struct ll_dio_pages {
         /** page array to be written. we don't support