Whamcloud - gitweb
LU-1757 brw: add short io osc/ost transfer.
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index 63161f8..6071d49 100644 (file)
 #endif
 #include <linux/security.h>
 
-#include <lustre_ioctl.h>
+#include <uapi/linux/lustre/lustre_ioctl.h>
 #include <lustre_ha.h>
 #include <lustre_dlm.h>
 #include <lprocfs_status.h>
 #include <lustre_disk.h>
-#include <lustre_param.h>
+#include <uapi/linux/lustre/lustre_param.h>
 #include <lustre_log.h>
 #include <cl_object.h>
 #include <obd_cksum.h>
@@ -99,8 +99,7 @@ static struct ll_sb_info *ll_init_sbi(void)
        sbi->ll_ra_info.ra_max_pages_per_file = min(pages / 32,
                                           SBI_DEFAULT_READAHEAD_MAX);
        sbi->ll_ra_info.ra_max_pages = sbi->ll_ra_info.ra_max_pages_per_file;
-       sbi->ll_ra_info.ra_max_read_ahead_whole_pages =
-                                          SBI_DEFAULT_READAHEAD_WHOLE_MAX;
+       sbi->ll_ra_info.ra_max_read_ahead_whole_pages = -1;
 
         ll_generate_random_uuid(uuid);
         class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
@@ -196,7 +195,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                 RETURN(-ENOMEM);
         }
 
-        /* indicate the features supported by this client */
+       /* indicate MDT features supported by this client */
         data->ocd_connect_flags = OBD_CONNECT_IBITS    | OBD_CONNECT_NODEVOH  |
                                   OBD_CONNECT_ATTRFID  |
                                   OBD_CONNECT_VERSION  | OBD_CONNECT_BRW_SIZE |
@@ -215,7 +214,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                                  OBD_CONNECT_DIR_STRIPE |
                                  OBD_CONNECT_BULK_MBITS |
                                  OBD_CONNECT_SUBTREE |
-                                 OBD_CONNECT_FLAGS2;
+                                 OBD_CONNECT_FLAGS2 | OBD_CONNECT_MULTIMODRPCS;
 
        data->ocd_connect_flags2 = 0;
 
@@ -224,7 +223,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                 data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE;
 #endif
 #ifdef CONFIG_FS_POSIX_ACL
-        data->ocd_connect_flags |= OBD_CONNECT_ACL | OBD_CONNECT_UMASK;
+       data->ocd_connect_flags |= OBD_CONNECT_ACL | OBD_CONNECT_UMASK |
+                                  OBD_CONNECT_LARGE_ACL;
 #endif
 
        if (OBD_FAIL_CHECK(OBD_FAIL_MDC_LIGHTWEIGHT))
@@ -240,6 +240,13 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         if (sbi->ll_flags & LL_SBI_USER_XATTR)
                 data->ocd_connect_flags |= OBD_CONNECT_XATTR;
 
+#ifdef MS_NOSEC
+       /* Setting this indicates we correctly support S_NOSEC (See kernel
+        * commit 9e1f1de02c2275d7172e18dc4e7c2065777611bf)
+        */
+       sb->s_flags |= MS_NOSEC;
+#endif
+
         if (sbi->ll_flags & LL_SBI_FLOCK)
                 sbi->ll_fop = &ll_file_operations_flock;
         else if (sbi->ll_flags & LL_SBI_LOCALFLOCK)
@@ -251,7 +258,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
        if (sbi->ll_flags & LL_SBI_ALWAYS_PING)
                data->ocd_connect_flags &= ~OBD_CONNECT_PINGLESS;
 
-#ifdef HAVE_SECURITY_DENTRY_INIT_SECURITY
+#if defined(HAVE_SECURITY_DENTRY_INIT_SECURITY) && defined(CONFIG_SECURITY)
        data->ocd_connect_flags2 |= OBD_CONNECT2_FILE_SECCTX;
 #endif /* HAVE_SECURITY_DENTRY_INIT_SECURITY */
 
@@ -352,11 +359,6 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         if (data->ocd_connect_flags & OBD_CONNECT_64BITHASH)
                 sbi->ll_flags |= LL_SBI_64BIT_HASH;
 
-       if (data->ocd_connect_flags & OBD_CONNECT_BRW_SIZE)
-               sbi->ll_md_brw_pages = data->ocd_brw_size >> PAGE_SHIFT;
-       else
-               sbi->ll_md_brw_pages = 1;
-
        if (data->ocd_connect_flags & OBD_CONNECT_LAYOUTLOCK)
                sbi->ll_flags |= LL_SBI_LAYOUT_LOCK;
 
@@ -367,7 +369,9 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                if (!(data->ocd_connect_flags & OBD_CONNECT_MAX_EASIZE)) {
                        LCONSOLE_INFO("%s: disabling xattr cache due to "
                                      "unknown maximum xattr size.\n", dt);
-               } else {
+               } else if (!sbi->ll_xattr_cache_set) {
+                       /* If xattr_cache is already set (no matter 0 or 1)
+                        * during processing llog, it won't be enabled here. */
                        sbi->ll_flags |= LL_SBI_XATTR_CACHE;
                        sbi->ll_xattr_cache_enabled = 1;
                }
@@ -383,6 +387,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         * back its backend blocksize for grant calculation purpose */
        data->ocd_grant_blkbits = PAGE_SHIFT;
 
+       /* indicate OST features supported by this client */
        data->ocd_connect_flags = OBD_CONNECT_GRANT | OBD_CONNECT_VERSION |
                                  OBD_CONNECT_REQPORTAL | OBD_CONNECT_BRW_SIZE |
                                  OBD_CONNECT_CANCELSET | OBD_CONNECT_FID |
@@ -394,25 +399,40 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                                  OBD_CONNECT_JOBSTATS | OBD_CONNECT_LVB_TYPE |
                                  OBD_CONNECT_LAYOUTLOCK |
                                  OBD_CONNECT_PINGLESS | OBD_CONNECT_LFSCK |
-                                 OBD_CONNECT_BULK_MBITS;
+                                 OBD_CONNECT_BULK_MBITS | OBD_CONNECT_SHORTIO |
+                                 OBD_CONNECT_FLAGS2;
 
-       data->ocd_connect_flags2 = 0;
+/* The client currently advertises support for OBD_CONNECT_LOCKAHEAD_OLD so it
+ * can interoperate with an older version of lockahead which was released prior
+ * to landing in master. This support will be dropped when 2.13 development
+ * starts.  At the point, we should not just drop the connect flag (below), we
+ * should also remove the support in the code.
+ *
+ * Removing it means a few things:
+ * 1. Remove this section here
+ * 2. Remove CEF_NONBLOCK in ll_file_lockahead()
+ * 3. Remove function exp_connect_lockahead_old
+ * 4. Remove LDLM_FL_LOCKAHEAD_OLD_RESERVED in lustre_dlm_flags.h
+ * */
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 12, 50, 0)
+       data->ocd_connect_flags |= OBD_CONNECT_LOCKAHEAD_OLD;
+#endif
+
+       data->ocd_connect_flags2 = OBD_CONNECT2_LOCKAHEAD;
 
        if (!OBD_FAIL_CHECK(OBD_FAIL_OSC_CONNECT_GRANT_PARAM))
                data->ocd_connect_flags |= OBD_CONNECT_GRANT_PARAM;
 
-       if (!OBD_FAIL_CHECK(OBD_FAIL_OSC_CONNECT_CKSUM)) {
-               /* OBD_CONNECT_CKSUM should always be set, even if checksums are
-                * disabled by default, because it can still be enabled on the
-                * fly via /proc. As a consequence, we still need to come to an
-                * agreement on the supported algorithms at connect time */
-               data->ocd_connect_flags |= OBD_CONNECT_CKSUM;
+       /* OBD_CONNECT_CKSUM should always be set, even if checksums are
+        * disabled by default, because it can still be enabled on the
+        * fly via /proc. As a consequence, we still need to come to an
+        * agreement on the supported algorithms at connect time */
+       data->ocd_connect_flags |= OBD_CONNECT_CKSUM;
 
-               if (OBD_FAIL_CHECK(OBD_FAIL_OSC_CKSUM_ADLER_ONLY))
-                       data->ocd_cksum_types = OBD_CKSUM_ADLER;
-               else
-                       data->ocd_cksum_types = cksum_types_supported_client();
-       }
+       if (OBD_FAIL_CHECK(OBD_FAIL_OSC_CKSUM_ADLER_ONLY))
+               data->ocd_cksum_types = OBD_CKSUM_ADLER;
+       else
+               data->ocd_cksum_types = cksum_types_supported_client();
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
        data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE;
@@ -446,6 +466,12 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
 
        sbi->ll_dt_exp->exp_connect_data = *data;
 
+       /* Don't change value if it was specified in the config log */
+       if (sbi->ll_ra_info.ra_max_read_ahead_whole_pages == -1)
+               sbi->ll_ra_info.ra_max_read_ahead_whole_pages =
+                       max_t(unsigned long, SBI_DEFAULT_READAHEAD_WHOLE_MAX,
+                             (data->ocd_brw_size >> PAGE_SHIFT));
+
        err = obd_fid_init(sbi->ll_dt_exp->exp_obd, sbi->ll_dt_exp,
                           LUSTRE_SEQ_METADATA);
        if (err) {
@@ -476,6 +502,9 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
        CDEBUG(D_SUPER, "rootfid "DFID"\n", PFID(&sbi->ll_root_fid));
 
        sb->s_op = &lustre_super_operations;
+#ifdef HAVE_XATTR_HANDLER_FLAGS
+       sb->s_xattr = ll_xattr_handlers;
+#endif
 #if THREAD_SIZE >= 8192 /*b=17630*/
        sb->s_export_op = &lustre_export_operations;
 #endif
@@ -576,12 +605,18 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                OBD_FREE_PTR(data);
        if (osfs != NULL)
                OBD_FREE_PTR(osfs);
-       if (proc_lustre_fs_root != NULL) {
-               err = lprocfs_register_mountpoint(proc_lustre_fs_root, sb,
-                                                 dt, md);
+
+       if (sbi->ll_proc_root != NULL) {
+               err = lprocfs_ll_register_obd(sb, dt);
                if (err < 0) {
-                       CERROR("%s: could not register mount in lprocfs: "
-                              "rc = %d\n", ll_get_fsname(sb, NULL, 0), err);
+                       CERROR("%s: could not register %s in llite: rc = %d\n",
+                              dt, ll_get_fsname(sb, NULL, 0), err);
+                       err = 0;
+               }
+               err = lprocfs_ll_register_obd(sb, md);
+               if (err < 0) {
+                       CERROR("%s: could not register %s in llite: rc = %d\n",
+                              md, ll_get_fsname(sb, NULL, 0), err);
                        err = 0;
                }
        }
@@ -680,69 +715,24 @@ int ll_set_default_mdsize(struct ll_sb_info *sbi, int lmmsize)
        RETURN(rc);
 }
 
-static void ll_dump_inode(struct inode *inode)
-{
-       struct ll_d_hlist_node *tmp;
-       int dentry_count = 0;
-
-       LASSERT(inode != NULL);
-
-       ll_d_hlist_for_each(tmp, &inode->i_dentry)
-               dentry_count++;
-
-       CERROR("%s: inode %p dump: dev=%s fid="DFID
-              " mode=%o count=%u, %d dentries\n",
-              ll_get_fsname(inode->i_sb, NULL, 0), inode,
-              ll_i2mdexp(inode)->exp_obd->obd_name, PFID(ll_inode2fid(inode)),
-              inode->i_mode, atomic_read(&inode->i_count), dentry_count);
-}
-
-void lustre_dump_dentry(struct dentry *dentry, int recur)
-{
-        struct list_head *tmp;
-        int subdirs = 0;
-
-        LASSERT(dentry != NULL);
-
-        list_for_each(tmp, &dentry->d_subdirs)
-                subdirs++;
-
-        CERROR("dentry %p dump: name=%.*s parent=%.*s (%p), inode=%p, count=%u,"
-               " flags=0x%x, fsdata=%p, %d subdirs\n", dentry,
-               dentry->d_name.len, dentry->d_name.name,
-               dentry->d_parent->d_name.len, dentry->d_parent->d_name.name,
-              dentry->d_parent, dentry->d_inode, ll_d_count(dentry),
-               dentry->d_flags, dentry->d_fsdata, subdirs);
-        if (dentry->d_inode != NULL)
-                ll_dump_inode(dentry->d_inode);
-
-        if (recur == 0)
-                return;
-
-       list_for_each(tmp, &dentry->d_subdirs) {
-               struct dentry *d = list_entry(tmp, struct dentry, d_child);
-               lustre_dump_dentry(d, recur - 1);
-       }
-}
-
 static void client_common_put_super(struct super_block *sb)
 {
-        struct ll_sb_info *sbi = ll_s2sbi(sb);
-        ENTRY;
+       struct ll_sb_info *sbi = ll_s2sbi(sb);
+       ENTRY;
 
-        cl_sb_fini(sb);
+       cl_sb_fini(sb);
 
        obd_fid_fini(sbi->ll_dt_exp->exp_obd);
-        obd_disconnect(sbi->ll_dt_exp);
-        sbi->ll_dt_exp = NULL;
+       obd_disconnect(sbi->ll_dt_exp);
+       sbi->ll_dt_exp = NULL;
 
-        lprocfs_unregister_mountpoint(sbi);
+       lprocfs_ll_unregister_mountpoint(sbi);
 
        obd_fid_fini(sbi->ll_md_exp->exp_obd);
-        obd_disconnect(sbi->ll_md_exp);
-        sbi->ll_md_exp = NULL;
+       obd_disconnect(sbi->ll_md_exp);
+       sbi->ll_md_exp = NULL;
 
-        EXIT;
+       EXIT;
 }
 
 void ll_kill_super(struct super_block *sb)
@@ -955,35 +945,65 @@ void ll_lli_init(struct ll_inode_info *lli)
                lli->lli_async_rc = 0;
        }
        mutex_init(&lli->lli_layout_mutex);
+       memset(lli->lli_jobid, 0, LUSTRE_JOBID_SIZE);
 }
 
-static inline int ll_bdi_register(struct backing_dev_info *bdi)
+#ifndef HAVE_SUPER_SETUP_BDI_NAME
+
+#define LSI_BDI_INITIALIZED    0x00400000
+
+#ifndef HAVE_BDI_CAP_MAP_COPY
+# define BDI_CAP_MAP_COPY      0
+#endif
+
+#define MAX_STRING_SIZE 128
+
+static int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
 {
-       static atomic_t ll_bdi_num = ATOMIC_INIT(0);
+       struct  lustre_sb_info *lsi = s2lsi(sb);
+       char buf[MAX_STRING_SIZE];
+       va_list args;
+       int err;
 
-       bdi->name = "lustre";
-       return bdi_register(bdi, NULL, "lustre-%d",
-                           atomic_inc_return(&ll_bdi_num));
+       err = bdi_init(&lsi->lsi_bdi);
+       if (err)
+               return err;
+
+       lsi->lsi_flags |= LSI_BDI_INITIALIZED;
+       lsi->lsi_bdi.capabilities = BDI_CAP_MAP_COPY;
+       lsi->lsi_bdi.name = "lustre";
+       va_start(args, fmt);
+       vsnprintf(buf, MAX_STRING_SIZE, fmt, args);
+       va_end(args);
+       err = bdi_register(&lsi->lsi_bdi, NULL, "%s", buf);
+       va_end(args);
+       if (!err)
+               sb->s_bdi = &lsi->lsi_bdi;
+
+       return err;
 }
+#endif /* !HAVE_SUPER_SETUP_BDI_NAME */
 
 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;
-        char  *dt = NULL, *md = NULL;
-        char  *profilenm = get_profile_name(sb);
-        struct config_llog_instance *cfg;
-        /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
-        const int instlen = sizeof(cfg->cfg_instance) * 2 + 2;
-        int    err;
-        ENTRY;
+       struct  lustre_profile *lprof = NULL;
+       struct  lustre_sb_info *lsi = s2lsi(sb);
+       struct  ll_sb_info *sbi;
+       char    *dt = NULL, *md = NULL;
+       char    *profilenm = get_profile_name(sb);
+       struct config_llog_instance *cfg;
+       /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
+       const int instlen = sizeof(cfg->cfg_instance) * 2 + 2;
+       int     md_len = 0;
+       int     dt_len = 0;
+       int     err;
+       ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
+       CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb);
 
-        OBD_ALLOC_PTR(cfg);
-        if (cfg == NULL)
-                RETURN(-ENOMEM);
+       OBD_ALLOC_PTR(cfg);
+       if (cfg == NULL)
+               RETURN(-ENOMEM);
 
        try_module_get(THIS_MODULE);
 
@@ -995,73 +1015,80 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
                RETURN(-ENOMEM);
        }
 
-        err = ll_options(lsi->lsi_lmd->lmd_opts, &sbi->ll_flags);
-        if (err)
-                GOTO(out_free, err);
-
-       err = bdi_init(&lsi->lsi_bdi);
+       err = ll_options(lsi->lsi_lmd->lmd_opts, &sbi->ll_flags);
        if (err)
                GOTO(out_free, err);
-       lsi->lsi_flags |= LSI_BDI_INITIALIZED;
-#ifdef HAVE_BDI_CAP_MAP_COPY
-       lsi->lsi_bdi.capabilities = BDI_CAP_MAP_COPY;
-#else
-       lsi->lsi_bdi.capabilities = 0;
-#endif
-       err = ll_bdi_register(&lsi->lsi_bdi);
+
+       err = super_setup_bdi_name(sb, "lustre-%p", sb);
        if (err)
                GOTO(out_free, err);
 
-        sb->s_bdi = &lsi->lsi_bdi;
 #ifndef HAVE_DCACHE_LOCK
        /* kernel >= 2.6.38 store dentry operations in sb->s_d_op. */
        sb->s_d_op = &ll_d_ops;
 #endif
 
-        /* Generate a string unique to this super, in case some joker tries
-           to mount the same fs at two mount points.
-           Use the address of the super itself.*/
-        cfg->cfg_instance = sb;
-        cfg->cfg_uuid = lsi->lsi_llsbi->ll_sb_uuid;
+       /* Call lprocfs_ll_register_mountpoint() before lustre_process_log()
+        * so that "llite.*.*" params can be processed correctly. */
+       if (proc_lustre_fs_root != NULL) {
+               err = lprocfs_ll_register_mountpoint(proc_lustre_fs_root, sb);
+               if (err < 0) {
+                       CERROR("%s: could not register mountpoint in llite: "
+                              "rc = %d\n", ll_get_fsname(sb, NULL, 0), err);
+                       err = 0;
+               }
+       }
+
+       /* Generate a string unique to this super, in case some joker tries
+          to mount the same fs at two mount points.
+          Use the address of the super itself.*/
+       cfg->cfg_instance = sb;
+       cfg->cfg_uuid = lsi->lsi_llsbi->ll_sb_uuid;
        cfg->cfg_callback = class_config_llog_handler;
-        /* set up client obds */
-        err = lustre_process_log(sb, profilenm, cfg);
+       cfg->cfg_sub_clds = CONFIG_SUB_CLIENT;
+       /* set up client obds */
+       err = lustre_process_log(sb, profilenm, cfg);
        if (err < 0)
-               GOTO(out_free, err);
-
-        /* Profile set with LCFG_MOUNTOPT so we can find our mdc and osc obds */
-        lprof = class_get_profile(profilenm);
-        if (lprof == NULL) {
-                LCONSOLE_ERROR_MSG(0x156, "The client profile '%s' could not be"
-                                   " read from the MGS.  Does that filesystem "
-                                   "exist?\n", profilenm);
-                GOTO(out_free, err = -EINVAL);
-        }
-        CDEBUG(D_CONFIG, "Found profile %s: mdc=%s osc=%s\n", profilenm,
-               lprof->lp_md, lprof->lp_dt);
-
-        OBD_ALLOC(dt, strlen(lprof->lp_dt) + instlen + 2);
-        if (!dt)
-                GOTO(out_free, err = -ENOMEM);
-        sprintf(dt, "%s-%p", lprof->lp_dt, cfg->cfg_instance);
-
-        OBD_ALLOC(md, strlen(lprof->lp_md) + instlen + 2);
-        if (!md)
-                GOTO(out_free, err = -ENOMEM);
-        sprintf(md, "%s-%p", lprof->lp_md, cfg->cfg_instance);
-
-        /* connections, registrations, sb setup */
-        err = client_common_fill_super(sb, md, dt, mnt);
+               GOTO(out_proc, err);
+
+       /* Profile set with LCFG_MOUNTOPT so we can find our mdc and osc obds */
+       lprof = class_get_profile(profilenm);
+       if (lprof == NULL) {
+               LCONSOLE_ERROR_MSG(0x156, "The client profile '%s' could not be"
+                                  " read from the MGS.  Does that filesystem "
+                                  "exist?\n", profilenm);
+               GOTO(out_proc, err = -EINVAL);
+       }
+       CDEBUG(D_CONFIG, "Found profile %s: mdc=%s osc=%s\n", profilenm,
+              lprof->lp_md, lprof->lp_dt);
+
+       dt_len = strlen(lprof->lp_dt) + instlen + 2;
+       OBD_ALLOC(dt, dt_len);
+       if (!dt)
+               GOTO(out_proc, err = -ENOMEM);
+       snprintf(dt, dt_len - 1, "%s-%p", lprof->lp_dt, cfg->cfg_instance);
+
+       md_len = strlen(lprof->lp_md) + instlen + 2;
+       OBD_ALLOC(md, md_len);
+       if (!md)
+               GOTO(out_proc, err = -ENOMEM);
+       snprintf(md, md_len - 1, "%s-%p", lprof->lp_md, cfg->cfg_instance);
+
+       /* connections, registrations, sb setup */
+       err = client_common_fill_super(sb, md, dt, mnt);
        if (err < 0)
-               GOTO(out_free, err);
+               GOTO(out_proc, err);
 
        sbi->ll_client_common_fill_super_succeeded = 1;
 
+out_proc:
+       if (err < 0)
+               lprocfs_ll_unregister_mountpoint(sbi);
 out_free:
        if (md)
-               OBD_FREE(md, strlen(lprof->lp_md) + instlen + 2);
+               OBD_FREE(md, md_len);
        if (dt)
-               OBD_FREE(dt, strlen(lprof->lp_dt) + instlen + 2);
+               OBD_FREE(dt, dt_len);
        if (lprof != NULL)
                class_put_profile(lprof);
        if (err)
@@ -1137,10 +1164,12 @@ void ll_put_super(struct super_block *sb)
         if (profilenm)
                 class_del_profile(profilenm);
 
+#ifndef HAVE_SUPER_SETUP_BDI_NAME
        if (lsi->lsi_flags & LSI_BDI_INITIALIZED) {
                bdi_destroy(&lsi->lsi_bdi);
                lsi->lsi_flags &= ~LSI_BDI_INITIALIZED;
        }
+#endif
 
         ll_free_sbi(sb);
         lsi->lsi_llsbi = NULL;
@@ -1445,6 +1474,7 @@ void ll_clear_inode(struct inode *inode)
        ll_xattr_cache_destroy(inode);
 
 #ifdef CONFIG_FS_POSIX_ACL
+       forget_all_cached_acls(inode);
        if (lli->lli_posix_acl) {
                LASSERT(atomic_read(&lli->lli_posix_acl->a_refcount) == 1);
                posix_acl_release(lli->lli_posix_acl);
@@ -1583,24 +1613,24 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
         /* We mark all of the fields "set" so MDS/OST does not re-set them */
        if (!(attr->ia_valid & ATTR_CTIME_SET) &&
            (attr->ia_valid & ATTR_CTIME)) {
-               attr->ia_ctime = CURRENT_TIME;
+               attr->ia_ctime = current_time(inode);
                 attr->ia_valid |= ATTR_CTIME_SET;
         }
        if (!(attr->ia_valid & ATTR_ATIME_SET) &&
            (attr->ia_valid & ATTR_ATIME)) {
-               attr->ia_atime = CURRENT_TIME;
+               attr->ia_atime = current_time(inode);
                 attr->ia_valid |= ATTR_ATIME_SET;
         }
        if (!(attr->ia_valid & ATTR_MTIME_SET) &&
            (attr->ia_valid & ATTR_MTIME)) {
-               attr->ia_mtime = CURRENT_TIME;
+               attr->ia_mtime = current_time(inode);
                 attr->ia_valid |= ATTR_MTIME_SET;
         }
 
         if (attr->ia_valid & (ATTR_MTIME | ATTR_CTIME))
-                CDEBUG(D_INODE, "setting mtime %lu, ctime %lu, now = %lu\n",
+               CDEBUG(D_INODE, "setting mtime %lu, ctime %lu, now = %llu\n",
                        LTIME_S(attr->ia_mtime), LTIME_S(attr->ia_ctime),
-                       cfs_time_current_sec());
+                      (s64)ktime_get_real_seconds());
 
        if (S_ISREG(inode->i_mode)) {
                if (attr->ia_valid & ATTR_SIZE)
@@ -1685,6 +1715,12 @@ out:
                inode_lock(inode);
                if ((attr->ia_valid & ATTR_SIZE) && !hsm_import)
                        inode_dio_wait(inode);
+               /* Once we've got the i_mutex, it's safe to set the S_NOSEC
+                * flag.  ll_update_inode (called from ll_md_setattr), clears
+                * inode flags, so there is a gap where S_NOSEC is not set.
+                * This can cause a writer to take the i_mutex unnecessarily,
+                * but this is safe to do and should be rare. */
+               inode_has_no_xattr(inode);
        }
 
        ll_stats_ops_tally(ll_i2sbi(inode), (attr->ia_valid & ATTR_SIZE) ?
@@ -1720,6 +1756,10 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
            !(attr->ia_valid & ATTR_KILL_SGID))
                attr->ia_valid |= ATTR_KILL_SGID;
 
+       /* avoid polluted from ATTR_TIMES_SET,
+        * projid is not expected to be set here */
+       attr->ia_valid &= ~MDS_ATTR_PROJID;
+
        return ll_setattr_raw(de, attr, false);
 }
 
@@ -1836,13 +1876,15 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md)
        struct ll_inode_info *lli = ll_i2info(inode);
        struct mdt_body *body = md->body;
        struct ll_sb_info *sbi = ll_i2sbi(inode);
+       int rc = 0;
 
-       if (body->mbo_valid & OBD_MD_FLEASIZE)
-               cl_file_inode_init(inode, md);
+       if (body->mbo_valid & OBD_MD_FLEASIZE) {
+               rc = cl_file_inode_init(inode, md);
+               if (rc)
+                       return rc;
+       }
 
        if (S_ISDIR(inode->i_mode)) {
-               int     rc;
-
                rc = ll_update_lsm_md(inode, md);
                if (rc != 0)
                        return rc;
@@ -1883,6 +1925,9 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md)
                lli->lli_ctime = body->mbo_ctime;
        }
 
+       /* Clear i_flags to remove S_NOSEC before permissions are updated */
+       if (body->mbo_valid & OBD_MD_FLFLAGS)
+               inode->i_flags = ll_ext_to_inode_flags(body->mbo_flags);
        if (body->mbo_valid & OBD_MD_FLMODE)
                inode->i_mode = (inode->i_mode & S_IFMT) |
                                (body->mbo_mode & ~S_IFMT);
@@ -1902,8 +1947,8 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md)
                inode->i_uid = make_kuid(&init_user_ns, body->mbo_uid);
        if (body->mbo_valid & OBD_MD_FLGID)
                inode->i_gid = make_kgid(&init_user_ns, body->mbo_gid);
-       if (body->mbo_valid & OBD_MD_FLFLAGS)
-               inode->i_flags = ll_ext_to_inode_flags(body->mbo_flags);
+       if (body->mbo_valid & OBD_MD_FLPROJID)
+               lli->lli_projid = body->mbo_projid;
        if (body->mbo_valid & OBD_MD_FLNLINK)
                set_nlink(inode, body->mbo_nlink);
        if (body->mbo_valid & OBD_MD_FLRDEV)
@@ -2244,7 +2289,7 @@ void ll_open_cleanup(struct super_block *sb, struct ptlrpc_request *open_req)
 
        op_data->op_fid1 = body->mbo_fid1;
        op_data->op_handle = body->mbo_handle;
-       op_data->op_mod_time = cfs_time_current_sec();
+       op_data->op_mod_time = ktime_get_real_seconds();
        md_close(exp, op_data, NULL, &close_req);
        ptlrpc_req_finished(close_req);
        ll_finish_md_op_data(op_data);
@@ -2381,9 +2426,8 @@ int ll_obd_statfs(struct inode *inode, void __user *arg)
         if (rc)
                 GOTO(out_statfs, rc);
 out_statfs:
-        if (buf)
-                obd_ioctl_freedata(buf, len);
-        return rc;
+       OBD_FREE_LARGE(buf, len);
+       return rc;
 }
 
 int ll_process_config(struct lustre_cfg *lcfg)
@@ -2663,7 +2707,7 @@ void ll_compute_rootsquash_state(struct ll_sb_info *sbi)
        struct root_squash_info *squash = &sbi->ll_squash;
        int i;
        bool matched;
-       lnet_process_id_t id;
+       struct lnet_process_id id;
 
        /* Update norootsquash flag */
        down_write(&squash->rsi_sem);
@@ -2708,7 +2752,7 @@ static int ll_linkea_decode(struct linkea_data *ldata, unsigned int linkno,
        int             rc;
        ENTRY;
 
-       rc = linkea_init(ldata);
+       rc = linkea_init_with_rec(ldata);
        if (rc < 0)
                RETURN(rc);
 
@@ -2747,7 +2791,6 @@ static int ll_linkea_decode(struct linkea_data *ldata, unsigned int linkno,
  */
 int ll_getparent(struct file *file, struct getparent __user *arg)
 {
-       struct dentry           *dentry = file_dentry(file);
        struct inode            *inode = file_inode(file);
        struct linkea_data      *ldata;
        struct lu_buf            buf = LU_BUF_NULL;
@@ -2780,7 +2823,13 @@ int ll_getparent(struct file *file, struct getparent __user *arg)
        if (rc < 0)
                GOTO(ldata_free, rc);
 
-       rc = ll_getxattr(dentry, XATTR_NAME_LINK, buf.lb_buf, buf.lb_len);
+#ifdef HAVE_XATTR_HANDLER_FLAGS
+       rc = ll_xattr_list(inode, XATTR_NAME_LINK, XATTR_TRUSTED_T, buf.lb_buf,
+                          buf.lb_len, OBD_MD_FLXATTR);
+#else
+       rc = ll_getxattr(file_dentry(file), XATTR_NAME_LINK, buf.lb_buf,
+                        buf.lb_len);
+#endif /* HAVE_XATTR_HANDLER_FLAGS */
        if (rc < 0)
                GOTO(lb_free, rc);