Whamcloud - gitweb
LU-10681: Disable tiny writes for append
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index ee4b1a2..3534e6d 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2016, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -130,6 +130,7 @@ static struct ll_sb_info *ll_init_sbi(void)
        atomic_set(&sbi->ll_agl_total, 0);
        sbi->ll_flags |= LL_SBI_AGL_ENABLED;
        sbi->ll_flags |= LL_SBI_FAST_READ;
+       sbi->ll_flags |= LL_SBI_TINY_WRITE;
 
        /* root squash */
        sbi->ll_squash.rsi_uid = 0;
@@ -223,7 +224,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                                  OBD_CONNECT_GRANT_PARAM |
                                  OBD_CONNECT_SHORTIO | OBD_CONNECT_FLAGS2;
 
-       data->ocd_connect_flags2 = 0;
+       data->ocd_connect_flags2 = OBD_CONNECT2_FLR;
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
         if (sbi->ll_flags & LL_SBI_LRU_RESIZE)
@@ -299,7 +300,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         * can make sure the client can be mounted as long as MDT0 is
         * avaible */
        err = obd_statfs(NULL, sbi->ll_md_exp, osfs,
-                       cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
+                       ktime_get_seconds() -OBD_STATFS_CACHE_SECONDS,
                        OBD_STATFS_FOR_MDT0);
        if (err)
                GOTO(out_md_fid, err);
@@ -997,7 +998,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
 {
        struct  lustre_profile *lprof = NULL;
        struct  lustre_sb_info *lsi = s2lsi(sb);
-       struct  ll_sb_info *sbi;
+       struct  ll_sb_info *sbi = NULL;
        char    *dt = NULL, *md = NULL;
        char    *profilenm = get_profile_name(sb);
        struct config_llog_instance *cfg;
@@ -1010,19 +1011,16 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
 
        CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
 
+       try_module_get(THIS_MODULE);
+
        OBD_ALLOC_PTR(cfg);
        if (cfg == NULL)
-               RETURN(-ENOMEM);
-
-       try_module_get(THIS_MODULE);
+               GOTO(out_free, err = -ENOMEM);
 
        /* client additional sb info */
        lsi->lsi_llsbi = sbi = ll_init_sbi();
-       if (!sbi) {
-               module_put(THIS_MODULE);
-               OBD_FREE_PTR(cfg);
-               RETURN(-ENOMEM);
-       }
+       if (!sbi)
+               GOTO(out_free, err = -ENOMEM);
 
        err = ll_options(lsi->lsi_lmd->lmd_opts, &sbi->ll_flags);
        if (err)
@@ -1100,12 +1098,12 @@ out_free:
                OBD_FREE(dt, dt_len);
        if (lprof != NULL)
                class_put_profile(lprof);
+       if (cfg)
+               OBD_FREE_PTR(cfg);
        if (err)
                ll_put_super(sb);
        else if (sbi->ll_flags & LL_SBI_VERBOSE)
                LCONSOLE_WARN("Mounted %s\n", profilenm);
-
-       OBD_FREE_PTR(cfg);
        RETURN(err);
 } /* ll_fill_super */
 
@@ -1120,6 +1118,9 @@ void ll_put_super(struct super_block *sb)
        int next, force = 1, rc = 0;
         ENTRY;
 
+       if (!sbi)
+               GOTO(out_no_sbi, 0);
+
         CDEBUG(D_VFSTRACE, "VFS Op: sb %p - %s\n", sb, profilenm);
 
         cfg.cfg_instance = sb;
@@ -1182,7 +1183,7 @@ void ll_put_super(struct super_block *sb)
 
         ll_free_sbi(sb);
         lsi->lsi_llsbi = NULL;
-
+out_no_sbi:
        lustre_common_put_super(sb);
 
        cl_env_cache_purge(~0);
@@ -1773,12 +1774,15 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
 }
 
 int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs,
-                       __u64 max_age, __u32 flags)
+                      u32 flags)
 {
-        struct ll_sb_info *sbi = ll_s2sbi(sb);
-        struct obd_statfs obd_osfs;
-        int rc;
-        ENTRY;
+       struct ll_sb_info *sbi = ll_s2sbi(sb);
+       struct obd_statfs obd_osfs;
+       time64_t max_age;
+       int rc;
+
+       ENTRY;
+       max_age = ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS;
 
         rc = obd_statfs(NULL, sbi->ll_md_exp, osfs, max_age, flags);
         if (rc) {
@@ -1831,12 +1835,10 @@ int ll_statfs(struct dentry *de, struct kstatfs *sfs)
        CDEBUG(D_VFSTRACE, "VFS Op: at %llu jiffies\n", get_jiffies_64());
         ll_stats_ops_tally(ll_s2sbi(sb), LPROC_LL_STAFS, 1);
 
-        /* Some amount of caching on the client is allowed */
-        rc = ll_statfs_internal(sb, &osfs,
-                                cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
-                                0);
-        if (rc)
-                return rc;
+       /* Some amount of caching on the client is allowed */
+       rc = ll_statfs_internal(sb, &osfs, 0);
+       if (rc)
+               return rc;
 
         statfs_unpack(sfs, &osfs);
 
@@ -2522,11 +2524,10 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data,
        op_data->op_fsuid = from_kuid(&init_user_ns, current_fsuid());
        op_data->op_fsgid = from_kgid(&init_user_ns, current_fsgid());
        op_data->op_cap = cfs_curproc_cap_pack();
+       op_data->op_mds = 0;
        if ((opc == LUSTRE_OPC_CREATE) && (name != NULL) &&
             filename_is_volatile(name, namelen, &op_data->op_mds)) {
                op_data->op_bias |= MDS_CREATE_VOLATILE;
-       } else {
-               op_data->op_mds = 0;
        }
        op_data->op_data = data;