Whamcloud - gitweb
LU-241 Support crc32c with hardware accelerated instruction as one of lustre checksums
[fs/lustre-release.git] / lustre / obdfilter / filter.c
index d651a0c..ba5cca5 100644 (file)
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
  * This file is part of Lustre, http://www.lustre.org/
  * Lustre is a trademark of Sun Microsystems, Inc.
  *
@@ -152,14 +155,25 @@ int filter_finish_transno(struct obd_export *exp, struct inode *inode,
         if (oti->oti_transno == 0) {
                 last_rcvd = le64_to_cpu(lsd->lsd_last_transno) + 1;
                 lsd->lsd_last_transno = cpu_to_le64(last_rcvd);
+                LASSERT(last_rcvd >= le64_to_cpu(lcd->lcd_last_transno));
         } else {
                 last_rcvd = oti->oti_transno;
                 if (last_rcvd > le64_to_cpu(lsd->lsd_last_transno))
                         lsd->lsd_last_transno = cpu_to_le64(last_rcvd);
+                if (unlikely(last_rcvd < le64_to_cpu(lcd->lcd_last_transno))) {
+                        CERROR("Trying to overwrite bigger transno, on-disk: "
+                               LPU64", new: "LPU64"\n",
+                               le64_to_cpu(lcd->lcd_last_transno), last_rcvd);
+                        cfs_spin_lock(&exp->exp_lock);
+                        exp->exp_vbr_failed = 1;
+                        cfs_spin_unlock(&exp->exp_lock);
+                        cfs_spin_unlock(&obt->obt_lut->lut_translock);
+                        cfs_mutex_up(&ted->ted_lcd_lock);
+                        RETURN(-EOVERFLOW);
+                }
         }
         oti->oti_transno = last_rcvd;
 
-        LASSERT(last_rcvd >= le64_to_cpu(lcd->lcd_last_transno));
         lcd->lcd_last_transno = cpu_to_le64(last_rcvd);
         lcd->lcd_pre_versions[0] = cpu_to_le64(oti->oti_pre_version);
         lcd->lcd_last_xid = cpu_to_le64(oti->oti_xid);
@@ -289,7 +303,6 @@ static int filter_export_stats_init(struct obd_device *obd,
 
         RETURN(0);
  clean:
-        lprocfs_exp_cleanup(exp);
         return rc;
 }
 
@@ -521,7 +534,7 @@ void filter_fmd_expire(struct obd_export *exp)
  * caller must hold fed_lock and take fmd reference itself */
 static struct filter_mod_data *filter_fmd_find_nolock(struct filter_obd *filter,
                                                 struct filter_export_data *fed,
-                                                obd_id objid, obd_gr group)
+                                                obd_id objid, obd_seq group)
 {
         struct filter_mod_data *found = NULL, *fmd;
 
@@ -544,7 +557,7 @@ static struct filter_mod_data *filter_fmd_find_nolock(struct filter_obd *filter,
 
 /* Find fmd based on objid and group, or return NULL if not found. */
 struct filter_mod_data *filter_fmd_find(struct obd_export *exp,
-                                        obd_id objid, obd_gr group)
+                                        obd_id objid, obd_seq group)
 {
         struct filter_mod_data *fmd;
 
@@ -564,7 +577,7 @@ struct filter_mod_data *filter_fmd_find(struct obd_export *exp,
  * Currently this is not fatal because any fmd state is transient and
  * may also be freed when it gets sufficiently old. */
 struct filter_mod_data *filter_fmd_get(struct obd_export *exp,
-                                       obd_id objid, obd_gr group)
+                                       obd_id objid, obd_seq group)
 {
         struct filter_export_data *fed = &exp->exp_filter_data;
         struct filter_mod_data *found = NULL, *fmd_new = NULL;
@@ -602,7 +615,7 @@ struct filter_mod_data *filter_fmd_get(struct obd_export *exp,
  * This isn't so critical because it would in fact only affect the one client
  * that is doing the unlink and at worst we have an stale entry referencing
  * an object that should never be used again. */
-static void filter_fmd_drop(struct obd_export *exp, obd_id objid, obd_gr group)
+static void filter_fmd_drop(struct obd_export *exp, obd_id objid, obd_seq group)
 {
         struct filter_mod_data *found = NULL;
 
@@ -677,7 +690,7 @@ int filter_update_server_data(struct obd_device *obd)
         RETURN(rc);
 }
 
-int filter_update_last_objid(struct obd_device *obd, obd_gr group,
+int filter_update_last_objid(struct obd_device *obd, obd_seq group,
                              int force_sync)
 {
         struct filter_obd *filter = &obd->u.filter;
@@ -687,19 +700,19 @@ int filter_update_last_objid(struct obd_device *obd, obd_gr group,
         ENTRY;
 
         if (filter->fo_last_objid_files[group] == NULL) {
-                CERROR("Object group "LPU64" not fully setup; not updating "
+                CERROR("Object seq "LPU64" not fully setup; not updating "
                        "last_objid\n", group);
                 RETURN(-EINVAL);
         }
 
-        CDEBUG(D_INODE, "%s: server last_objid for group "LPU64": "LPU64"\n",
-               obd->obd_name, group, filter->fo_last_objids[group]);
+        CDEBUG(D_INODE, "%s: server last_objid for "POSTID"\n",
+               obd->obd_name, filter->fo_last_objids[group], group);
 
         tmp = cpu_to_le64(filter->fo_last_objids[group]);
         rc = fsfilt_write_record(obd, filter->fo_last_objid_files[group],
                                  &tmp, sizeof(tmp), &off, force_sync);
         if (rc)
-                CERROR("error writing group "LPU64" last objid: rc = %d\n",
+                CERROR("error writing seq "LPU64" last objid: rc = %d\n",
                        group, rc);
         RETURN(rc);
 }
@@ -880,9 +893,7 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
                 exp->exp_connecting = 0;
                 exp->exp_in_recovery = 0;
                 cfs_spin_unlock(&exp->exp_lock);
-                cfs_spin_lock_bh(&obd->obd_processing_task_lock);
                 obd->obd_max_recoverable_clients++;
-                cfs_spin_unlock_bh(&obd->obd_processing_task_lock);
                 class_export_put(exp);
 
                 if (last_rcvd > le64_to_cpu(lsd->lsd_last_transno))
@@ -892,8 +903,8 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
 
         obd->obd_last_committed = le64_to_cpu(lsd->lsd_last_transno);
 out:
-        lut->lut_mount_count = mount_count + 1;
-        lsd->lsd_mount_count = cpu_to_le64(lut->lut_mount_count);
+        obd->u.obt.obt_mount_count = mount_count + 1;
+        lsd->lsd_mount_count = cpu_to_le64(obd->u.obt.obt_mount_count);
 
         /* save it, so mount count and last_transno is current */
         rc = filter_update_server_data(obd);
@@ -1062,7 +1073,7 @@ static int filter_read_group_internal(struct obd_device *obd, int group,
                 GOTO(cleanup, rc);
         }
 
-        if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+        if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
                 OBD_ALLOC(tmp_subdirs, sizeof(*tmp_subdirs));
                 if (tmp_subdirs == NULL)
                         GOTO(cleanup, rc = -ENOMEM);
@@ -1126,7 +1137,7 @@ static int filter_read_group_internal(struct obd_device *obd, int group,
 
         filter->fo_dentry_O_groups[group] = dentry;
         filter->fo_last_objid_files[group] = filp;
-        if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+        if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
                 filter->fo_dentry_O_sub[group] = *tmp_subdirs;
                 OBD_FREE(tmp_subdirs, sizeof(*tmp_subdirs));
         }
@@ -1155,7 +1166,7 @@ static int filter_read_group_internal(struct obd_device *obd, int group,
                 if (new_files != NULL)
                         OBD_FREE(new_files, len * sizeof(*new_files));
         case 3:
-                if (filter->fo_subdir_count && filter_group_is_mds(group)) {
+                if (filter->fo_subdir_count && fid_seq_is_mdt(group)) {
                         for (i = 0; i < filter->fo_subdir_count; i++) {
                                 if (tmp_subdirs->dentry[i] != NULL)
                                         dput(tmp_subdirs->dentry[i]);
@@ -1197,7 +1208,7 @@ static int filter_prep_groups(struct obd_device *obd)
         loff_t off = 0;
         ENTRY;
 
-        O_dentry = simple_mkdir(current->fs->pwd, obd->u.obt.obt_vfsmnt,
+        O_dentry = simple_mkdir(cfs_fs_pwd(current->fs), obd->u.obt.obt_vfsmnt,
                                 "O", 0700, 1);
         CDEBUG(D_INODE, "got/created O: %p\n", O_dentry);
         if (IS_ERR(O_dentry)) {
@@ -1224,10 +1235,10 @@ static int filter_prep_groups(struct obd_device *obd)
         }
 
         if (off == 0)
-                last_group = FILTER_GROUP_MDS0;
+                last_group = FID_SEQ_OST_MDT0;
 
-        CWARN("%s: initialize groups [%d,%d]\n", obd->obd_name,
-              FILTER_GROUP_MDS0, last_group);
+        CWARN("%s: initialize groups [%u,%u]\n", obd->obd_name,
+              FID_SEQ_OST_MDT0, last_group);
         filter->fo_committed_group = last_group;
         rc = filter_read_groups(obd, last_group, 1);
         if (rc)
@@ -1375,7 +1386,7 @@ static void filter_post(struct obd_device *obd)
 }
 
 static void filter_set_last_id(struct filter_obd *filter,
-                               obd_id id, obd_gr group)
+                               obd_id id, obd_seq group)
 {
         LASSERT(group <= filter->fo_group_count);
 
@@ -1384,7 +1395,7 @@ static void filter_set_last_id(struct filter_obd *filter,
         cfs_spin_unlock(&filter->fo_objidlock);
 }
 
-obd_id filter_last_id(struct filter_obd *filter, obd_gr group)
+obd_id filter_last_id(struct filter_obd *filter, obd_seq group)
 {
         obd_id id;
         LASSERT(group <= filter->fo_group_count);
@@ -1404,13 +1415,15 @@ static int filter_lock_dentry(struct obd_device *obd, struct dentry *dparent)
 }
 
 /* We never dget the object parent, so DON'T dput it either */
-struct dentry *filter_parent(struct obd_device *obd, obd_gr group, obd_id objid)
+struct dentry *filter_parent(struct obd_device *obd, obd_seq group, obd_id objid)
 {
         struct filter_obd *filter = &obd->u.filter;
         struct filter_subdirs *subdirs;
-        LASSERT(group < filter->fo_group_count); /* FIXME: object groups */
 
-        if (!filter_group_is_mds(group) || filter->fo_subdir_count == 0)
+        if (group >= filter->fo_group_count) /* FIXME: object groups */
+               return ERR_PTR(-EBADF);
+
+        if (!fid_seq_is_mdt(group) || filter->fo_subdir_count == 0)
                 return filter->fo_dentry_O_groups[group];
 
         subdirs = &filter->fo_dentry_O_sub[group];
@@ -1418,7 +1431,7 @@ struct dentry *filter_parent(struct obd_device *obd, obd_gr group, obd_id objid)
 }
 
 /* We never dget the object parent, so DON'T dput it either */
-struct dentry *filter_parent_lock(struct obd_device *obd, obd_gr group,
+struct dentry *filter_parent_lock(struct obd_device *obd, obd_seq group,
                                   obd_id objid)
 {
         unsigned long now = jiffies;
@@ -1450,7 +1463,7 @@ static void filter_parent_unlock(struct dentry *dparent)
  * internal to the filesystem code. */
 struct dentry *filter_fid2dentry(struct obd_device *obd,
                                  struct dentry *dir_dentry,
-                                 obd_gr group, obd_id id)
+                                 obd_seq group, obd_id id)
 {
         struct dentry *dparent = dir_dentry;
         struct dentry *dchild;
@@ -1462,7 +1475,7 @@ struct dentry *filter_fid2dentry(struct obd_device *obd,
             obd->u.filter.fo_destroys_in_progress == 0) {
                 /* don't fail lookups for orphan recovery, it causes
                  * later LBUGs when objects still exist during precreate */
-                CDEBUG(D_INFO, "*** obd_fail_loc=%x ***\n",OBD_FAIL_OST_ENOENT);
+                CDEBUG(D_INFO, "*** cfs_fail_loc=%x ***\n",OBD_FAIL_OST_ENOENT);
                 RETURN(ERR_PTR(-ENOENT));
         }
         if (id == 0) {
@@ -1474,7 +1487,7 @@ struct dentry *filter_fid2dentry(struct obd_device *obd,
         if (dir_dentry == NULL) {
                 dparent = filter_parent_lock(obd, group, id);
                 if (IS_ERR(dparent)) {
-                        CERROR("%s: error getting object "LPU64":"LPU64
+                        CERROR("%s: error getting object "POSTID
                                " parent: rc %ld\n", obd->obd_name,
                                id, group, PTR_ERR(dparent));
                         RETURN(dparent);
@@ -1482,12 +1495,13 @@ struct dentry *filter_fid2dentry(struct obd_device *obd,
         }
         CDEBUG(D_INODE, "looking up object O/%.*s/%s\n",
                dparent->d_name.len, dparent->d_name.name, name);
-        dchild = /*ll_*/lookup_one_len(name, dparent, len);
+        /* dparent is already locked here, so we cannot use ll_lookup_one_len() */
+        dchild = lookup_one_len(name, dparent, len);
         if (dir_dentry == NULL)
                 filter_parent_unlock(dparent);
         if (IS_ERR(dchild)) {
-                CERROR("%s: child lookup error %ld\n", obd->obd_name,
-                       PTR_ERR(dchild));
+                CERROR("%s: object "LPU64":"LPU64" lookup error: rc %ld\n",
+                       obd->obd_name, id, group, PTR_ERR(dchild));
                 RETURN(dchild);
         }
 
@@ -1563,7 +1577,7 @@ int filter_vfs_unlink(struct inode *dir, struct dentry *dentry,
                 GOTO(out, rc = -EPERM);
 
         /* check_sticky() */
-        if ((dentry->d_inode->i_uid != current->fsuid &&
+        if ((dentry->d_inode->i_uid != cfs_curproc_fsuid() &&
              !cfs_capable(CFS_CAP_FOWNER)) || IS_APPEND(dentry->d_inode) ||
             IS_IMMUTABLE(dentry->d_inode))
                 GOTO(out, rc = -EPERM);
@@ -1571,7 +1585,7 @@ int filter_vfs_unlink(struct inode *dir, struct dentry *dentry,
         /* NOTE: This might need to go outside i_mutex, though it isn't clear if
          *       that was done because of journal_start (which is already done
          *       here) or some other ordering issue. */
-        DQUOT_INIT(dir);
+        ll_vfs_dq_init(dir);
 
         rc = ll_security_inode_unlink(dir, dentry, mnt);
         if (rc)
@@ -1591,13 +1605,16 @@ out:
  * Caller must hold child i_mutex, we drop it always.
  * Caller is also required to ensure that dchild->d_inode exists. */
 static int filter_destroy_internal(struct obd_device *obd, obd_id objid,
-                                   obd_gr group, struct dentry *dparent,
+                                   obd_seq group, struct dentry *dparent,
                                    struct dentry *dchild)
 {
         struct inode *inode = dchild->d_inode;
         int rc;
 
-        if (inode->i_nlink != 1 || atomic_read(&inode->i_count) != 1) {
+        /* There should be 2 references to the inode:
+         *  1) taken by filter_prepare_destroy
+         *  2) taken by filter_destroy */
+        if (inode->i_nlink != 1 || atomic_read(&inode->i_count) != 2) {
                 CERROR("destroying objid %.*s ino %lu nlink %lu count %d\n",
                        dchild->d_name.len, dchild->d_name.name, inode->i_ino,
                        (unsigned long)inode->i_nlink,
@@ -1701,7 +1718,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
          * lock, and should not be granted if the lock will be blocked.
          */
 
-        LASSERT(ns == res->lr_namespace);
+        LASSERT(ns == ldlm_res_to_ns(res));
         lock_res(res);
         rc = policy(lock, &tmpflags, 0, &err, &rpc_list);
         check_res_locked(res);
@@ -1723,7 +1740,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         if (rc == LDLM_ITER_CONTINUE) {
                 /* do not grant locks to the liblustre clients: they cannot
                  * handle ASTs robustly.  We need to do this while still
-                 * holding ns_lock to avoid the lock remaining on the res_link
+                 * holding lr_lock to avoid the lock remaining on the res_link
                  * list (and potentially being added to l_pending_list by an
                  * AST) when we are going to drop this lock ASAP. */
                 if (lock->l_export->exp_libclient ||
@@ -1746,7 +1763,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         *reply_lvb = *res_lvb;
 
         /*
-         * ->ns_lock guarantees that no new locks are granted, and,
+         * lr_lock guarantees that no new locks are granted, and,
          * therefore, that res->lr_lvb_data cannot increase beyond the
          * end of already granted lock. As a result, it is safe to
          * check against "stale" reply_lvb->lvb_size value without
@@ -1799,13 +1816,6 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
 
         LASSERTF(l->l_glimpse_ast != NULL, "l == %p", l);
         rc = l->l_glimpse_ast(l, NULL); /* this will update the LVB */
-        /* Update the LVB from disk if the AST failed (this is a legal race) */
-        /*
-         * XXX nikita: situation when ldlm_server_glimpse_ast() failed before
-         * sending ast is not handled. This can result in lost client writes.
-         */
-        if (rc != 0)
-                ldlm_res_lvbo_update(res, NULL, 1);
 
         lock_res(res);
         *reply_lvb = *res_lvb;
@@ -1954,7 +1964,7 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg,
         __u8 *uuid_ptr;
         char *str, *label;
         char ns_name[48];
-        request_queue_t *q;
+        struct request_queue *q;
         int rc, i;
         ENTRY;
 
@@ -2019,6 +2029,7 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg,
 
         obd->u.obt.obt_vfsmnt = mnt;
         obd->u.obt.obt_sb = mnt->mnt_sb;
+        obd->u.obt.obt_magic = OBT_MAGIC;
         filter->fo_fstype = mnt->mnt_sb->s_type->name;
         CDEBUG(D_SUPER, "%s: mnt = %p\n", filter->fo_fstype, mnt);
 
@@ -2040,11 +2051,14 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg,
         CFS_INIT_LIST_HEAD(&filter->fo_export_list);
         cfs_sema_init(&filter->fo_alloc_lock, 1);
         init_brw_stats(&filter->fo_filter_stats);
+        cfs_spin_lock_init(&filter->fo_flags_lock);
         filter->fo_read_cache = 1; /* enable read-only cache by default */
         filter->fo_writethrough_cache = 1; /* enable writethrough cache */
         filter->fo_readcache_max_filesize = FILTER_MAX_CACHE_SIZE;
         filter->fo_fmd_max_num = FILTER_FMD_MAX_NUM_DEFAULT;
         filter->fo_fmd_max_age = FILTER_FMD_MAX_AGE_DEFAULT;
+        filter->fo_syncjournal = 0; /* Don't sync journals on i/o by default */
+        filter_slc_set(filter); /* initialize sync on lock cancel */
 
         rc = filter_prep(obd);
         if (rc)
@@ -2061,8 +2075,10 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg,
                 GOTO(err_post, rc = -ENOMEM);
 
         sprintf(ns_name, "filter-%s", obd->obd_uuid.uuid);
-        obd->obd_namespace = ldlm_namespace_new(obd, ns_name, LDLM_NAMESPACE_SERVER,
-                                                LDLM_NAMESPACE_GREEDY);
+        obd->obd_namespace = ldlm_namespace_new(obd, ns_name,
+                                                LDLM_NAMESPACE_SERVER,
+                                                LDLM_NAMESPACE_GREEDY,
+                                                LDLM_NS_TYPE_OST);
         if (obd->obd_namespace == NULL)
                 GOTO(err_post, rc = -ENOMEM);
         obd->obd_namespace->ns_lvbp = obd;
@@ -2088,13 +2104,13 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg,
                 GOTO(err_post, rc);
 
         q = bdev_get_queue(mnt->mnt_sb->s_bdev);
-        if (q->max_sectors < q->max_hw_sectors &&
-            q->max_sectors < PTLRPC_MAX_BRW_SIZE >> 9)
+        if (queue_max_sectors(q) < queue_max_hw_sectors(q) &&
+            queue_max_sectors(q) < PTLRPC_MAX_BRW_SIZE >> 9)
                 LCONSOLE_INFO("%s: underlying device %s should be tuned "
                               "for larger I/O requests: max_sectors = %u "
                               "could be up to max_hw_sectors=%u\n",
                               obd->obd_name, mnt->mnt_sb->s_id,
-                              q->max_sectors, q->max_hw_sectors);
+                              queue_max_sectors(q), queue_max_hw_sectors(q));
 
         uuid_ptr = fsfilt_uuid(obd, obd->u.obt.obt_sb);
         if (uuid_ptr != NULL) {
@@ -2137,9 +2153,11 @@ err_mntput:
 static int filter_setup(struct obd_device *obd, struct lustre_cfg* lcfg)
 {
         struct lprocfs_static_vars lvars;
+        cfs_proc_dir_entry_t *entry;
         unsigned long addr;
         struct page *page;
         int rc;
+        ENTRY;
 
         CLASSERT(offsetof(struct obd_device, u.obt) ==
                  offsetof(struct obd_device, u.filter.fo_obt));
@@ -2147,69 +2165,89 @@ static int filter_setup(struct obd_device *obd, struct lustre_cfg* lcfg)
         if (!LUSTRE_CFG_BUFLEN(lcfg, 1) || !LUSTRE_CFG_BUFLEN(lcfg, 2))
                 RETURN(-EINVAL);
 
-        /* 2.6.9 selinux wants a full option page for do_kern_mount (bug6471) */
-        OBD_PAGE_ALLOC(page, CFS_ALLOC_STD);
-        if (!page)
-                RETURN(-ENOMEM);
-        addr = (unsigned long)cfs_page_address(page);
-        clear_page((void *)addr);
-
         /* lprocfs must be setup before the filter so state can be safely added
          * to /proc incrementally as the filter is setup */
         lprocfs_filter_init_vars(&lvars);
-        if (lprocfs_obd_setup(obd, lvars.obd_vars) == 0 &&
-            lprocfs_alloc_obd_stats(obd, LPROC_FILTER_LAST) == 0) {
-                /* Init obdfilter private stats here */
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_READ_BYTES,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "read_bytes", "bytes");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_WRITE_BYTES,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "write_bytes", "bytes");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_GET_PAGE,
-                                     LPROCFS_CNTR_AVGMINMAX|LPROCFS_CNTR_STDDEV,
-                                     "get_page", "usec");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_NO_PAGE,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "get_page_failures", "num");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_ACCESS,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "cache_access", "pages");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_HIT,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "cache_hit", "pages");
-                lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_MISS,
-                                     LPROCFS_CNTR_AVGMINMAX,
-                                     "cache_miss", "pages");
-
-                lproc_filter_attach_seqstat(obd);
-                obd->obd_proc_exports_entry = lprocfs_register("exports",
-                                                        obd->obd_proc_entry,
-                                                        NULL, NULL);
-                if (IS_ERR(obd->obd_proc_exports_entry)) {
-                        rc = PTR_ERR(obd->obd_proc_exports_entry);
-                        CERROR("error %d setting up lprocfs for %s\n",
-                               rc, "exports");
-                        obd->obd_proc_exports_entry = NULL;
-                }
+        rc = lprocfs_obd_setup(obd, lvars.obd_vars);
+        if (rc) {
+                CERROR("%s: lprocfs_obd_setup failed: %d.\n",
+                       obd->obd_name, rc);
+                RETURN(rc);
         }
-        if (obd->obd_proc_exports_entry)
-                lprocfs_add_simple(obd->obd_proc_exports_entry, "clear",
+
+        rc = lprocfs_alloc_obd_stats(obd, LPROC_FILTER_LAST);
+        if (rc) {
+                CERROR("%s: lprocfs_alloc_obd_stats failed: %d.\n",
+                       obd->obd_name, rc);
+                GOTO(obd_cleanup, rc);
+        }
+
+        /* Init obdfilter private stats here */
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_READ_BYTES,
+                             LPROCFS_CNTR_AVGMINMAX, "read_bytes", "bytes");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_WRITE_BYTES,
+                             LPROCFS_CNTR_AVGMINMAX, "write_bytes", "bytes");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_GET_PAGE,
+                             LPROCFS_CNTR_AVGMINMAX|LPROCFS_CNTR_STDDEV,
+                             "get_page", "usec");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_NO_PAGE,
+                             LPROCFS_CNTR_AVGMINMAX, "get_page_failures", "num");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_ACCESS,
+                             LPROCFS_CNTR_AVGMINMAX, "cache_access", "pages");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_HIT,
+                             LPROCFS_CNTR_AVGMINMAX, "cache_hit", "pages");
+        lprocfs_counter_init(obd->obd_stats, LPROC_FILTER_CACHE_MISS,
+                             LPROCFS_CNTR_AVGMINMAX, "cache_miss", "pages");
+
+        rc = lproc_filter_attach_seqstat(obd);
+        if (rc) {
+                CERROR("%s: create seqstat failed: %d.\n", obd->obd_name, rc);
+                GOTO(free_obd_stats, rc);
+        }
+
+        entry = lprocfs_register("exports", obd->obd_proc_entry, NULL, NULL);
+        if (IS_ERR(entry)) {
+                rc = PTR_ERR(entry);
+                CERROR("%s: error %d setting up lprocfs for %s\n",
+                       obd->obd_name, rc, "exports");
+                GOTO(free_obd_stats, rc);
+        }
+        obd->obd_proc_exports_entry = entry;
+
+        entry = lprocfs_add_simple(obd->obd_proc_exports_entry, "clear",
                                    lprocfs_nid_stats_clear_read,
                                    lprocfs_nid_stats_clear_write, obd, NULL);
+        if (IS_ERR(entry)) {
+                rc = PTR_ERR(entry);
+                CERROR("%s: add proc entry 'clear' failed: %d.\n",
+                       obd->obd_name, rc);
+                GOTO(free_obd_stats, rc);
+        }
 
+        /* 2.6.9 selinux wants a full option page for do_kern_mount (bug6471) */
+        OBD_PAGE_ALLOC(page, CFS_ALLOC_STD);
+        if (!page)
+                GOTO(remove_entry_clear, rc = -ENOMEM);
+        addr = (unsigned long)cfs_page_address(page);
+        clear_page((void *)addr);
         memcpy((void *)addr, lustre_cfg_buf(lcfg, 4),
                LUSTRE_CFG_BUFLEN(lcfg, 4));
         rc = filter_common_setup(obd, lcfg, (void *)addr);
         OBD_PAGE_FREE(page);
-
         if (rc) {
-                lprocfs_remove_proc_entry("clear", obd->obd_proc_exports_entry);
-                lprocfs_free_per_client_stats(obd);
-                lprocfs_free_obd_stats(obd);
-                lprocfs_obd_cleanup(obd);
+                CERROR("%s: filter_common_setup failed: %d.\n",
+                       obd->obd_name, rc);
+                GOTO(remove_entry_clear, rc);
         }
 
+        RETURN(0);
+
+remove_entry_clear:
+        lprocfs_remove_proc_entry("clear", obd->obd_proc_exports_entry);
+free_obd_stats:
+        lprocfs_free_obd_stats(obd);
+obd_cleanup:
+        lprocfs_obd_cleanup(obd);
         return rc;
 }
 
@@ -2398,7 +2436,7 @@ filter_find_olg_internal(struct filter_obd *filter, int group)
 
         LASSERT_SPIN_LOCKED(&filter->fo_llog_list_lock);
         cfs_list_for_each_entry(olg, &filter->fo_llog_list, olg_list) {
-                if (olg->olg_group == group)
+                if (olg->olg_seq == group)
                         RETURN(olg);
         }
         RETURN(NULL);
@@ -2414,7 +2452,7 @@ struct obd_llog_group *filter_find_olg(struct obd_device *obd, int group)
 
         filter = &obd->u.filter;
 
-        if (group == FILTER_GROUP_LLOG)
+        if (group == FID_SEQ_LLOG)
                 RETURN(&obd->obd_olg);
 
         cfs_spin_lock(&filter->fo_llog_list_lock);
@@ -2430,15 +2468,19 @@ struct obd_llog_group *filter_find_olg(struct obd_device *obd, int group)
  */
 struct obd_llog_group *filter_find_create_olg(struct obd_device *obd, int group)
 {
-        struct obd_llog_group *olg = NULL;
+        struct obd_llog_group *olg = NULL, *olg_new = NULL;
         struct filter_obd *filter;
         int rc;
 
         filter = &obd->u.filter;
 
-        if (group == FILTER_GROUP_LLOG)
+        if (group == FID_SEQ_LLOG)
                 RETURN(&obd->obd_olg);
 
+        OBD_ALLOC_PTR(olg_new);
+        if (olg_new == NULL)
+               RETURN(ERR_PTR(-ENOMEM));
+
         cfs_spin_lock(&filter->fo_llog_list_lock);
         olg = filter_find_olg_internal(filter, group);
         if (olg) {
@@ -2447,10 +2489,11 @@ struct obd_llog_group *filter_find_create_olg(struct obd_device *obd, int group)
                 } else {
                         GOTO(out_unlock, olg);
                 }
+        } else {
+                /* set as the newly allocated one */
+                olg = olg_new;
+                olg_new = NULL;
         }
-        OBD_ALLOC_PTR(olg);
-        if (olg == NULL)
-               GOTO(out_unlock, olg = ERR_PTR(-ENOMEM));
 
         llog_group_init(olg, group);
         cfs_list_add(&olg->olg_list, &filter->fo_llog_list);
@@ -2475,7 +2518,9 @@ out:
 
 out_unlock:
         cfs_spin_unlock(&filter->fo_llog_list_lock);
-        GOTO(out, olg);
+        if (olg_new)
+               OBD_FREE_PTR(olg_new);
+        goto out;
 }
 
 static int filter_llog_connect(struct obd_export *exp,
@@ -2489,12 +2534,12 @@ static int filter_llog_connect(struct obd_export *exp,
 
         CDEBUG(D_OTHER, "%s: LLog connect for: "LPX64"/"LPX64":%x\n",
                obd->obd_name, body->lgdc_logid.lgl_oid,
-               body->lgdc_logid.lgl_ogr, body->lgdc_logid.lgl_ogen);
+               body->lgdc_logid.lgl_oseq, body->lgdc_logid.lgl_ogen);
 
-        olg = filter_find_olg(obd, body->lgdc_logid.lgl_ogr);
+        olg = filter_find_olg(obd, body->lgdc_logid.lgl_oseq);
         if (!olg) {
                 CERROR(" %s: can not find olg of group %d\n",
-                       obd->obd_name, (int)body->lgdc_logid.lgl_ogr);
+                       obd->obd_name, (int)body->lgdc_logid.lgl_oseq);
                 RETURN(-ENOENT);
         }
         llog_group_set_export(olg, exp);
@@ -2505,11 +2550,11 @@ static int filter_llog_connect(struct obd_export *exp,
 
         CWARN("%s: Recovery from log "LPX64"/"LPX64":%x\n",
               obd->obd_name, body->lgdc_logid.lgl_oid,
-              body->lgdc_logid.lgl_ogr, body->lgdc_logid.lgl_ogen);
+              body->lgdc_logid.lgl_oseq, body->lgdc_logid.lgl_ogen);
 
-        cfs_spin_lock_bh(&obd->obd_processing_task_lock);
+        cfs_spin_lock(&obd->u.filter.fo_flags_lock);
         obd->u.filter.fo_mds_ost_sync = 1;
-        cfs_spin_unlock_bh(&obd->obd_processing_task_lock);
+        cfs_spin_unlock(&obd->u.filter.fo_flags_lock);
         rc = llog_connect(ctxt, &body->lgdc_logid,
                           &body->lgdc_gen, NULL);
         llog_ctxt_put(ctxt);
@@ -2549,7 +2594,7 @@ static int filter_llog_preclean(struct obd_device *obd)
                 rc = filter_olg_fini(olg);
                 if (rc)
                         CERROR("failed to cleanup llogging subsystem for %u\n",
-                               olg->olg_group);
+                               olg->olg_seq);
                 OBD_FREE_PTR(olg);
         }
 
@@ -2602,7 +2647,7 @@ static int filter_cleanup(struct obd_device *obd)
 
         filter_post(obd);
 
-        LL_DQUOT_OFF(obd->u.obt.obt_sb);
+        ll_vfs_dq_off(obd->u.obt.obt_sb, 0);
         shrink_dcache_sb(obd->u.obt.obt_sb);
 
         server_put_mount(obd->obd_name, obd->u.obt.obt_vfsmnt);
@@ -2636,7 +2681,7 @@ static int filter_connect_internal(struct obd_export *exp,
                 CWARN("!!! This export (nid %s) used object group %d "
                        "earlier; now it's trying to use group %d!  This could "
                        "be a bug in the MDS. Please report to "
-                       "http://bugzilla.lustre.org/\n",
+                       "http://bugs.whamcloud.com/\n",
                        obd_export_nid2str(exp), fed->fed_group,data->ocd_group);
                 RETURN(-EPROTO);
         }
@@ -2647,8 +2692,10 @@ static int filter_connect_internal(struct obd_export *exp,
         data->ocd_version = LUSTRE_VERSION_CODE;
 
         /* Kindly make sure the SKIP_ORPHAN flag is from MDS. */
-        if (!ergo(data->ocd_connect_flags & OBD_CONNECT_SKIP_ORPHAN,
-                  data->ocd_connect_flags & OBD_CONNECT_MDS))
+        if (data->ocd_connect_flags & OBD_CONNECT_MDS)
+                CWARN("%s: Received MDS connection for group %u\n",
+                      exp->exp_obd->obd_name, data->ocd_group);
+        else if (data->ocd_connect_flags & OBD_CONNECT_SKIP_ORPHAN)
                 RETURN(-EPROTO);
 
         if (exp->exp_connect_flags & OBD_CONNECT_GRANT) {
@@ -2702,7 +2749,18 @@ static int filter_connect_internal(struct obd_export *exp,
         } else if (data->ocd_connect_flags & OBD_CONNECT_BRW_SIZE) {
                 data->ocd_brw_size = min(data->ocd_brw_size,
                                (__u32)(PTLRPC_MAX_BRW_PAGES << CFS_PAGE_SHIFT));
-                LASSERT(data->ocd_brw_size);
+                if (data->ocd_brw_size == 0) {
+                        CERROR("%s: cli %s/%p ocd_connect_flags: "LPX64
+                               " ocd_version: %x ocd_grant: %d ocd_index: %u "
+                               "ocd_brw_size is unexpectedly zero, "
+                               "network data corruption?"
+                               "Refusing connection of this client\n",
+                                exp->exp_obd->obd_name,
+                                exp->exp_client_uuid.uuid,
+                                exp, data->ocd_connect_flags, data->ocd_version,
+                                data->ocd_grant, data->ocd_index);
+                        RETURN(-EPROTO);
+                }
         }
 
         if (data->ocd_connect_flags & OBD_CONNECT_CKSUM) {
@@ -2711,9 +2769,10 @@ static int filter_connect_internal(struct obd_export *exp,
                 /* The client set in ocd_cksum_types the checksum types it
                  * supports. We have to mask off the algorithms that we don't
                  * support */
-                if (cksum_types & OBD_CKSUM_ALL)
-                        data->ocd_cksum_types &= OBD_CKSUM_ALL;
-                else
+                data->ocd_cksum_types &= cksum_types_supported();
+
+                /* 1.6.4- only support CRC32 and didn't set ocd_cksum_types */
+                if (unlikely(data->ocd_cksum_types == 0))
                         data->ocd_cksum_types = OBD_CKSUM_CRC32;
 
                 CDEBUG(D_RPCTRACE, "%s: cli %s supports cksum type %x, return "
@@ -2729,6 +2788,9 @@ static int filter_connect_internal(struct obd_export *exp,
                                    obd_export_nid2str(exp));
         }
 
+        if (data->ocd_connect_flags & OBD_CONNECT_MAXBYTES)
+                data->ocd_maxbytes = exp->exp_obd->u.obt.obt_sb->s_maxbytes;
+
         RETURN(0);
 }
 
@@ -2751,7 +2813,6 @@ static int filter_reconnect(const struct lu_env *env,
         RETURN(rc);
 }
 
-/* nearly identical to mds_connect */
 static int filter_connect(const struct lu_env *env,
                           struct obd_export **exp, struct obd_device *obd,
                           struct obd_uuid *cluuid,
@@ -2760,7 +2821,6 @@ static int filter_connect(const struct lu_env *env,
         struct lvfs_run_ctxt saved;
         struct lustre_handle conn = { 0 };
         struct obd_export *lexp;
-        __u32 group;
         int rc;
         ENTRY;
 
@@ -2787,16 +2847,11 @@ static int filter_connect(const struct lu_env *env,
                         GOTO(cleanup, rc);
         }
 
-        group = data->ocd_group;
-
-        CWARN("%s: Received MDS connection ("LPX64"); group %d\n",
-              obd->obd_name, lexp->exp_handle.h_cookie, group);
-
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-        rc = filter_read_groups(obd, group, 1);
+        rc = filter_read_groups(obd, data->ocd_group, 1);
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         if (rc != 0) {
-                CERROR("can't read group %u\n", group);
+                CERROR("can't read group %u\n", data->ocd_group);
                 GOTO(cleanup, rc);
         }
 
@@ -2805,7 +2860,6 @@ static int filter_connect(const struct lu_env *env,
 cleanup:
         if (rc) {
                 class_disconnect(lexp);
-                lprocfs_exp_cleanup(lexp);
                 *exp = NULL;
         } else {
                 *exp = lexp;
@@ -2954,7 +3008,7 @@ static int filter_destroy_export(struct obd_export *exp)
         }
 
         if (!(exp->exp_flags & OBD_OPT_FORCE))
-                filter_grant_sanity_check(exp->exp_obd, __FUNCTION__);
+                filter_grant_sanity_check(exp->exp_obd, __func__);
 
         RETURN(0);
 }
@@ -2978,24 +3032,24 @@ static void filter_sync_llogs(struct obd_device *obd, struct obd_export *dexp)
                 group = 1 << 30;
                 cfs_spin_lock(&filter->fo_llog_list_lock);
                 cfs_list_for_each_entry(olg, &filter->fo_llog_list, olg_list) {
-                        if (olg->olg_group <= worked) {
+                        if (olg->olg_seq <= worked) {
                                 /* this group is already synced */
                                 continue;
                         }
-                        if (group < olg->olg_group) {
+                        if (group < olg->olg_seq) {
                                 /* we have group with smaller number to sync */
                                 continue;
                         }
                         /* store current minimal group */
                         olg_min = olg;
-                        group = olg->olg_group;
+                        group = olg->olg_seq;
                 }
                 cfs_spin_unlock(&filter->fo_llog_list_lock);
 
                 if (olg_min == NULL)
                         break;
 
-                worked = olg_min->olg_group;
+                worked = olg_min->olg_seq;
                 if (olg_min->olg_exp &&
                     (dexp == olg_min->olg_exp || dexp == NULL)) {
                         int err;
@@ -3024,7 +3078,7 @@ static int filter_disconnect(struct obd_export *exp)
         class_export_get(exp);
 
         if (!(exp->exp_flags & OBD_OPT_FORCE))
-                filter_grant_sanity_check(obd, __FUNCTION__);
+                filter_grant_sanity_check(obd, __func__);
         filter_grant_discard(exp);
 
         /* Flush any remaining cancel messages out to the target */
@@ -3064,27 +3118,23 @@ static int filter_ping(struct obd_export *exp)
         return 0;
 }
 
-struct dentry *__filter_oa2dentry(struct obd_device *obd, struct obdo *oa,
+struct dentry *__filter_oa2dentry(struct obd_device *obd, struct ost_id *ostid,
                                   const char *what, int quiet)
 {
         struct dentry *dchild = NULL;
-        obd_gr group = 0;
-
-        if (oa->o_valid & OBD_MD_FLGROUP)
-                group = oa->o_gr;
 
-        dchild = filter_fid2dentry(obd, NULL, group, oa->o_id);
+        dchild = filter_fid2dentry(obd, NULL,  ostid->oi_seq, ostid->oi_id);
 
         if (IS_ERR(dchild)) {
-                CERROR("%s error looking up object: "LPU64":"LPU64"\n",
-                       what, group, oa->o_id);
+                CERROR("%s error looking up object: "POSTID"\n",
+                       what, ostid->oi_id, ostid->oi_seq);
                 RETURN(dchild);
         }
 
         if (dchild->d_inode == NULL) {
                 if (!quiet)
-                        CERROR("%s: %s on non-existent object: "LPU64"\n",
-                               obd->obd_name, what, oa->o_id);
+                        CERROR("%s: %s on non-existent object: "POSTID" \n",
+                               obd->obd_name, what, ostid->oi_id,ostid->oi_seq);
                 f_dput(dchild);
                 RETURN(ERR_PTR(-ENOENT));
         }
@@ -3099,8 +3149,7 @@ static int filter_getattr(struct obd_export *exp, struct obd_info *oinfo)
         int rc = 0;
         ENTRY;
 
-        LASSERT(oinfo->oi_oa->o_valid & OBD_MD_FLGROUP);
-        rc = filter_auth_capa(exp, NULL, oinfo->oi_oa->o_gr,
+        rc = filter_auth_capa(exp, NULL, oinfo->oi_oa->o_seq,
                               oinfo_capa(oinfo), CAPA_OPC_META_READ);
         if (rc)
                 RETURN(rc);
@@ -3111,13 +3160,13 @@ static int filter_getattr(struct obd_export *exp, struct obd_info *oinfo)
                 RETURN(-EINVAL);
         }
 
-        dentry = filter_oa2dentry(obd, oinfo->oi_oa);
+        dentry = filter_oa2dentry(obd, &oinfo->oi_oa->o_oi);
         if (IS_ERR(dentry))
                 RETURN(PTR_ERR(dentry));
 
         /* Limit the valid bits in the return data to what we actually use */
         oinfo->oi_oa->o_valid = OBD_MD_FLID;
-        obdo_from_inode(oinfo->oi_oa, dentry->d_inode, FILTER_VALID_FLAGS);
+        obdo_from_inode(oinfo->oi_oa, dentry->d_inode, NULL, FILTER_VALID_FLAGS);
 
         f_dput(dentry);
         RETURN(rc);
@@ -3136,19 +3185,21 @@ int filter_update_fidea(struct obd_export *exp, struct inode *inode,
                 struct filter_fid ff;
 
                 if (!(oa->o_valid & OBD_MD_FLGROUP))
-                        oa->o_gr = 0;
+                        oa->o_seq = 0;
                 /* packing fid and converting it to LE for storing into EA.
                  * Here ->o_stripe_idx should be filled by LOV and rest of
                  * fields - by client. */
-                ff.ff_fid.id = cpu_to_le64(oa->o_fid);
-                ff.ff_fid.f_type = cpu_to_le32(oa->o_stripe_idx);
-                ff.ff_fid.generation = cpu_to_le32(oa->o_generation);
+                ff.ff_parent.f_seq = cpu_to_le64(oa->o_parent_seq);
+                ff.ff_parent.f_oid = cpu_to_le32(oa->o_parent_oid);
+                /* XXX: we are ignoring o_parent_ver here, since this should
+                 *      be the same for all objects in this fileset. */
+                ff.ff_parent.f_ver = cpu_to_le32(oa->o_stripe_idx);
                 ff.ff_objid = cpu_to_le64(oa->o_id);
-                ff.ff_group = cpu_to_le64(oa->o_gr);
+                ff.ff_seq = cpu_to_le64(oa->o_seq);
 
-                CDEBUG(D_INODE, "storing filter fid EA ("LPU64"/%u/%u"
-                       LPU64"/"LPU64")\n", oa->o_fid, oa->o_stripe_idx,
-                       oa->o_generation, oa->o_id, oa->o_gr);
+                CDEBUG(D_INODE, "storing filter fid EA (parent "DFID" "
+                       LPU64"/"LPU64")\n", PFID(&ff.ff_parent), oa->o_id,
+                       oa->o_seq);
 
                 rc = fsfilt_set_md(obd, inode, handle, &ff, sizeof(ff), "fid");
                 if (rc)
@@ -3192,13 +3243,15 @@ int filter_setattr_internal(struct obd_export *exp, struct dentry *dentry,
                         *fcc = oa->o_lcookie;
         }
         if (ia_valid & (ATTR_SIZE | ATTR_UID | ATTR_GID)) {
-                DQUOT_INIT(inode);
+                unsigned long now = jiffies;
+                ll_vfs_dq_init(inode);
                 /* Filter truncates and writes are serialized by
                  * i_alloc_sem, see the comment in
                  * filter_preprw_write.*/
                 if (ia_valid & ATTR_SIZE)
                         down_write(&inode->i_alloc_sem);
                 LOCK_INODE_MUTEX(inode);
+                fsfilt_check_slow(exp->exp_obd, now, "i_alloc_sem and i_mutex");
                 old_size = i_size_read(inode);
         }
 
@@ -3276,11 +3329,14 @@ int filter_setattr_internal(struct obd_export *exp, struct dentry *dentry,
         if (OBD_FAIL_CHECK(OBD_FAIL_OST_SETATTR_CREDITS))
                 fsfilt_extend(exp->exp_obd, inode, 0, handle);
 
-        /* The truncate might have used up our transaction credits.  Make
-         * sure we have one left for the last_rcvd update. */
-        err = fsfilt_extend(exp->exp_obd, inode, 1, handle);
+       /* The truncate might have used up our transaction credits.  Make sure
+        * we have two left for the last_rcvd and VBR inode version updates. */
+        err = fsfilt_extend(exp->exp_obd, inode, 2, handle);
+
+        /* Update inode version only if data has changed => size has changed */
+        rc = filter_finish_transno(exp, ia_valid & ATTR_SIZE ? inode : NULL,
+                                   oti, rc, sync);
 
-        rc = filter_finish_transno(exp, inode, oti, rc, sync);
         if (sync) {
                 filter_cancel_cookies_cb(exp->exp_obd, 0, fcc, rc);
                 fcc = NULL;
@@ -3349,18 +3405,17 @@ int filter_setattr(struct obd_export *exp, struct obd_info *oinfo,
         if (oa->o_valid & OBD_FL_TRUNC)
                 opc |= CAPA_OPC_OSS_TRUNC;
 
-        LASSERT(oa->o_valid & OBD_MD_FLGROUP);
-        rc = filter_auth_capa(exp, NULL, oa->o_gr, capa, opc);
+        rc = filter_auth_capa(exp, NULL, oa->o_seq, capa, opc);
         if (rc)
                 RETURN(rc);
 
         if (oa->o_valid & (OBD_MD_FLUID | OBD_MD_FLGID)) {
-                rc = filter_capa_fixoa(exp, oa, oa->o_gr, capa);
+                rc = filter_capa_fixoa(exp, oa, oa->o_seq, capa);
                 if (rc)
                         RETURN(rc);
         }
 
-        osc_build_res_name(oa->o_id, oa->o_gr, &res_id);
+        osc_build_res_name(oa->o_id, oa->o_seq, &res_id);
         /* This would be very bad - accidentally truncating a file when
          * changing the time or similar - bug 12203. */
         if (oa->o_valid & OBD_MD_FLSIZE &&
@@ -3368,20 +3423,19 @@ int filter_setattr(struct obd_export *exp, struct obd_info *oinfo,
                 static char mdsinum[48];
 
                 if (oa->o_valid & OBD_MD_FLFID)
-                        snprintf(mdsinum, sizeof(mdsinum) - 1,
-                                 " of inode "LPU64"/%u", oa->o_fid,
-                                 oa->o_generation);
+                        snprintf(mdsinum, sizeof(mdsinum) - 1, " of inode "DFID,
+                                 oa->o_parent_seq, oa->o_parent_oid,
+                                 oa->o_parent_ver);
                 else
                         mdsinum[0] = '\0';
 
-                CERROR("%s: setattr from %s trying to truncate objid "LPU64
-                       " %s\n",
-                       exp->exp_obd->obd_name, obd_export_nid2str(exp),
-                       oa->o_id, mdsinum);
+                CERROR("%s: setattr from %s trying to truncate objid "POSTID
+                       "%s\n", exp->exp_obd->obd_name, obd_export_nid2str(exp),
+                       oa->o_id, oa->o_seq, mdsinum);
                 RETURN(-EPERM);
         }
 
-        dentry = __filter_oa2dentry(exp->exp_obd, oa, __FUNCTION__, 1);
+        dentry = __filter_oa2dentry(exp->exp_obd, &oinfo->oi_oa->o_oi, __func__, 1);
         if (IS_ERR(dentry))
                 RETURN(PTR_ERR(dentry));
 
@@ -3397,8 +3451,10 @@ int filter_setattr(struct obd_export *exp, struct obd_info *oinfo,
          */
         if (oa->o_valid &
             (OBD_MD_FLMTIME | OBD_MD_FLATIME | OBD_MD_FLCTIME)) {
+                unsigned long now = jiffies;
                 down_write(&dentry->d_inode->i_alloc_sem);
-                fmd = filter_fmd_get(exp, oa->o_id, oa->o_gr);
+                fsfilt_check_slow(exp->exp_obd, now, "i_alloc_sem");
+                fmd = filter_fmd_get(exp, oa->o_id, oa->o_seq);
                 if (fmd && fmd->fmd_mactime_xid < oti->oti_xid)
                         fmd->fmd_mactime_xid = oti->oti_xid;
                 filter_fmd_put(exp, fmd);
@@ -3423,7 +3479,7 @@ int filter_setattr(struct obd_export *exp, struct obd_info *oinfo,
         oa->o_valid = OBD_MD_FLID;
 
         /* Quota release need uid/gid info */
-        obdo_from_inode(oa, dentry->d_inode,
+        obdo_from_inode(oa, dentry->d_inode, NULL,
                         FILTER_VALID_FLAGS | OBD_MD_FLUID | OBD_MD_FLGID);
 
         EXIT;
@@ -3484,12 +3540,12 @@ static int filter_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsmp,
                 LASSERT((*lsmp)->lsm_object_id);
         }
 
-        (*lsmp)->lsm_maxbytes = LUSTRE_STRIPE_MAXBYTES;
+        (*lsmp)->lsm_maxbytes = exp->exp_obd->u.obt.obt_sb->s_maxbytes;
 
         RETURN(lsm_size);
 }
 
-/* caller must hold fo_create_locks[oa->o_gr] */
+/* caller must hold fo_create_locks[oa->o_seq] */
 static int filter_destroy_precreated(struct obd_export *exp, struct obdo *oa,
                                      struct filter_obd *filter)
 {
@@ -3499,24 +3555,21 @@ static int filter_destroy_precreated(struct obd_export *exp, struct obdo *oa,
         int skip_orphan;
         ENTRY;
 
-        LASSERT(oa);
-        LASSERT_MDS_GROUP(oa->o_gr);
-        LASSERT(oa->o_valid & OBD_MD_FLGROUP);
-        LASSERT(down_trylock(&filter->fo_create_locks[oa->o_gr]) != 0);
+        LASSERT(down_trylock(&filter->fo_create_locks[oa->o_seq]) != 0);
 
         memset(&doa, 0, sizeof(doa));
 
         doa.o_valid |= OBD_MD_FLGROUP;
-        doa.o_gr = oa->o_gr;
+        doa.o_seq = oa->o_seq;
         doa.o_mode = S_IFREG;
 
-        if (!cfs_test_bit(doa.o_gr, &filter->fo_destroys_in_progress)) {
+        if (!cfs_test_bit(doa.o_seq, &filter->fo_destroys_in_progress)) {
                 CERROR("%s:["LPU64"] destroys_in_progress already cleared\n",
-                       exp->exp_obd->obd_name, doa.o_gr);
+                       exp->exp_obd->obd_name, doa.o_seq);
                 RETURN(0);
         }
 
-        last = filter_last_id(filter, doa.o_gr);
+        last = filter_last_id(filter, doa.o_seq);
 
         skip_orphan = !!(exp->exp_connect_flags & OBD_CONNECT_SKIP_ORPHAN);
 
@@ -3534,32 +3587,39 @@ static int filter_destroy_precreated(struct obd_export *exp, struct obdo *oa,
                 /* update last_id on disk periodically so that if we restart
                  * we don't need to re-scan all of the just-deleted objects. */
                 if ((id & 511) == 0 && !skip_orphan) {
-                        filter_set_last_id(filter, id - 1, doa.o_gr);
-                        filter_update_last_objid(exp->exp_obd, doa.o_gr, 0);
+                        filter_set_last_id(filter, id - 1, doa.o_seq);
+                        filter_update_last_objid(exp->exp_obd, doa.o_seq, 0);
                 }
         }
 
         CDEBUG(D_HA, "%s: after destroy: set last_objids["LPU64"] = "LPU64"\n",
-               exp->exp_obd->obd_name, doa.o_gr, oa->o_id);
+               exp->exp_obd->obd_name, doa.o_seq, oa->o_id);
 
         if (!skip_orphan) {
-                filter_set_last_id(filter, id, doa.o_gr);
-                rc = filter_update_last_objid(exp->exp_obd, doa.o_gr, 1);
+                filter_set_last_id(filter, id, doa.o_seq);
+                rc = filter_update_last_objid(exp->exp_obd, doa.o_seq, 1);
         } else {
-                /* don't reuse orphan object, return last used objid */
+                /*
+                 * We have destroyed orphan objects, but don't want to reuse
+                 * them. Therefore we don't reset last_id to the last created
+                 * objects. Instead, we report back to the MDS the object id
+                 * of the last orphan, so that the MDS can restart allocating
+                 * objects from this id + 1 and thus skip the whole orphan
+                 * object id range
+                 */
                 oa->o_id = last;
                 rc = 0;
         }
-        cfs_clear_bit(doa.o_gr, &filter->fo_destroys_in_progress);
+        cfs_clear_bit(doa.o_seq, &filter->fo_destroys_in_progress);
 
         RETURN(rc);
 }
 
 static int filter_precreate(struct obd_device *obd, struct obdo *oa,
-                            obd_gr group, int *num);
+                            obd_seq group, int *num);
 /* returns a negative error or a nonnegative number of files to create */
 static int filter_handle_precreate(struct obd_export *exp, struct obdo *oa,
-                                   obd_gr group, struct obd_trans_info *oti)
+                                   obd_seq group, struct obd_trans_info *oti)
 {
         struct obd_device *obd = exp->exp_obd;
         struct filter_obd *filter = &obd->u.filter;
@@ -3613,7 +3673,7 @@ static int filter_handle_precreate(struct obd_export *exp, struct obdo *oa,
                         GOTO(out, rc = 0);
                 }
                 /* only precreate if group == 0 and o_id is specfied */
-                if (!filter_group_is_mds(group) || oa->o_id == 0)
+                if (!fid_seq_is_mdt(group) || oa->o_id == 0)
                         diff = 1;
                 else
                         diff = oa->o_id - filter_last_id(filter, group);
@@ -3628,7 +3688,7 @@ static int filter_handle_precreate(struct obd_export *exp, struct obdo *oa,
                 oa->o_id = filter_last_id(&obd->u.filter, group);
                 rc = filter_precreate(obd, oa, group, &diff);
                 oa->o_id = filter_last_id(&obd->u.filter, group);
-                oa->o_gr = group;
+                oa->o_seq = group;
                 oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP;
                 GOTO(out, rc);
         }
@@ -3661,7 +3721,7 @@ static int filter_statfs(struct obd_device *obd, struct obd_statfs *osfs,
                filter->fo_tot_pending,
                osfs->os_bfree << blockbits, osfs->os_bavail << blockbits);
 
-        filter_grant_sanity_check(obd, __FUNCTION__);
+        filter_grant_sanity_check(obd, __func__);
 
         osfs->os_bavail -= min(osfs->os_bavail, GRANT_FOR_LLOG(obd) +
                                ((filter->fo_tot_dirty + filter->fo_tot_pending +
@@ -3671,11 +3731,10 @@ static int filter_statfs(struct obd_device *obd, struct obd_statfs *osfs,
                 struct lr_server_data *lsd = class_server_data(obd);
                 int index = le32_to_cpu(lsd->lsd_ost_index);
 
-                if (obd_fail_val == -1 ||
-                    index == obd_fail_val)
+                if (cfs_fail_val == -1 || index == cfs_fail_val)
                         osfs->os_bfree = osfs->os_bavail = 2;
-                else if (obd_fail_loc & OBD_FAIL_ONCE)
-                        obd_fail_loc &= ~OBD_FAILED; /* reset flag */
+                else if (cfs_fail_loc & OBD_FAIL_ONCE)
+                        cfs_fail_loc &= ~OBD_FAILED; /* reset flag */
         }
 
         /* set EROFS to state field if FS is mounted as RDONLY. The goal is to
@@ -3741,11 +3800,12 @@ static __u64 filter_calc_free_inodes(struct obd_device *obd)
  * Caller must hold fo_create_locks[group]
  */
 static int filter_precreate(struct obd_device *obd, struct obdo *oa,
-                            obd_gr group, int *num)
+                            obd_seq group, int *num)
 {
         struct dentry *dchild = NULL, *dparent = NULL;
         struct filter_obd *filter;
         struct obd_statfs *osfs;
+        struct iattr iattr;
         int err = 0, rc = 0, recreate_obj = 0, i;
         cfs_time_t enough_time = cfs_time_shift(DISK_TIMEOUT/2);
         __u64 os_ffree;
@@ -3766,13 +3826,21 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                 OBD_ALLOC(osfs, sizeof(*osfs));
                 if (osfs == NULL)
                         RETURN(-ENOMEM);
-                rc = filter_statfs(obd, osfs, cfs_time_current_64() - CFS_HZ,
+                rc = filter_statfs(obd, osfs,
+                                   cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
                                    0);
                 if (rc == 0 && osfs->os_bavail < (osfs->os_blocks >> 10)) {
                         CDEBUG(D_RPCTRACE,"%s: not enough space for create "
                                LPU64"\n", obd->obd_name, osfs->os_bavail <<
                                obd->u.obt.obt_vfsmnt->mnt_sb->s_blocksize_bits);
                         *num = 0;
+                        if (oa->o_valid & OBD_MD_FLFLAGS)
+                                oa->o_flags |= OBD_FL_NOSPC_BLK;
+                        else {
+                                oa->o_valid |= OBD_MD_FLFLAGS;
+                                oa->o_flags = OBD_FL_NOSPC_BLK;
+                        }
+
                         rc = -ENOSPC;
                 }
                 OBD_FREE(osfs, sizeof(*osfs));
@@ -3806,6 +3874,19 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                 } else
                         next_id = filter_last_id(filter, group) + 1;
 
+                /* Don't create objects beyond the valid range for this SEQ */
+                if (unlikely(fid_seq_is_mdt0(group) &&
+                            next_id >= IDIF_MAX_OID)) {
+                        CERROR("%s:"POSTID" hit the IDIF_MAX_OID (1<<48)!\n",
+                                obd->obd_name, next_id, group);
+                        GOTO(cleanup, rc = -ENOSPC);
+               } else if (unlikely(!fid_seq_is_mdt0(group) &&
+                                   next_id >= OBIF_MAX_OID)) {
+                        CERROR("%s:"POSTID" hit the OBIF_MAX_OID (1<<32)!\n",
+                                obd->obd_name, next_id, group);
+                        GOTO(cleanup, rc = -ENOSPC);
+                }
+
                 dparent = filter_parent_lock(obd, group, next_id);
                 if (IS_ERR(dparent))
                         GOTO(cleanup, rc = PTR_ERR(dparent));
@@ -3851,7 +3932,7 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                         GOTO(cleanup, rc = PTR_ERR(handle));
                 cleanup_phase = 3;
 
-                CDEBUG(D_INODE, "%s: filter_precreate(od->o_gr="LPU64
+                CDEBUG(D_INODE, "%s: filter_precreate(od->o_seq="LPU64
                        ",od->o_id="LPU64")\n", obd->obd_name, group,
                        next_id);
 
@@ -3864,9 +3945,21 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                         CERROR("create failed rc = %d\n", rc);
                         if (rc == -ENOSPC) {
                                 os_ffree = filter_calc_free_inodes(obd);
-                                if (os_ffree != -1)
+                                if (os_ffree == -1) 
+                                        GOTO(cleanup, rc);
+
+                                if (obd->obd_osfs.os_bavail <
+                                    (obd->obd_osfs.os_blocks >> 10)) {
+                                        if (oa->o_valid & OBD_MD_FLFLAGS)
+                                                oa->o_flags |= OBD_FL_NOSPC_BLK;
+                                        else {
+                                                oa->o_valid |= OBD_MD_FLFLAGS;
+                                                oa->o_flags = OBD_FL_NOSPC_BLK;
+                                        }
+
                                         CERROR("%s: free inode "LPU64"\n",
                                                obd->obd_name, os_ffree);
+                                }
                         }
                         GOTO(cleanup, rc);
                 }
@@ -3876,6 +3969,19 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                                        dchild->d_inode->i_ino);
 
 set_last_id:
+                /* Set a/c/m time to a insane large negative value at creation
+                 * time so that any timestamp arriving from the client will
+                 * always be newer and update the inode.
+                 * See LU-221 for details */
+                iattr.ia_valid = ATTR_ATIME | ATTR_MTIME | ATTR_CTIME;
+                LTIME_S(iattr.ia_atime) = INT_MIN + 24 * 3600;
+                LTIME_S(iattr.ia_mtime) = INT_MIN + 24 * 3600;
+                LTIME_S(iattr.ia_ctime) = INT_MIN + 24 * 3600;
+                err = fsfilt_setattr(obd, dchild, handle, &iattr, 0);
+                if (err)
+                        CERROR("unable to initialize a/c/m time of newly"
+                               "created inode\n");
+
                 if (!recreate_obj) {
                         filter_set_last_id(filter, next_id, group);
                         err = filter_update_last_objid(obd, group, 0);
@@ -3904,6 +4010,7 @@ set_last_id:
                 if (rc)
                         break;
                 if (cfs_time_after(jiffies, enough_time)) {
+                        i++;
                         CDEBUG(D_RPCTRACE,
                                "%s: precreate slow - want %d got %d \n",
                                obd->obd_name, *num, i);
@@ -3913,41 +4020,45 @@ set_last_id:
         *num = i;
 
         CDEBUG(D_RPCTRACE,
-               "%s: created %d objects for group "LPU64": "LPU64" rc %d\n",
-               obd->obd_name, i, group, filter->fo_last_objids[group], rc);
+               "%s: created %d objects for group "POSTID" rc %d\n",
+               obd->obd_name, i, filter->fo_last_objids[group], group, rc);
 
         RETURN(rc);
 }
 
-static int filter_create(struct obd_export *exp, struct obdo *oa,
-                         struct lov_stripe_md **ea, struct obd_trans_info *oti)
+int filter_create(struct obd_export *exp, struct obdo *oa,
+                  struct lov_stripe_md **ea, struct obd_trans_info *oti)
 {
         struct obd_device *obd = exp->exp_obd;
         struct filter_export_data *fed;
         struct filter_obd *filter;
         struct lvfs_run_ctxt saved;
         struct lov_stripe_md *lsm = NULL;
-        int rc = 0, diff, group = oa->o_gr;
+        int rc = 0, diff;
         ENTRY;
 
-        CDEBUG(D_INODE, "%s: filter_create(od->o_gr="LPU64",od->o_id="
-               LPU64")\n", obd->obd_name, oa->o_gr, oa->o_id);
-
-        if (!(oa->o_valid & OBD_MD_FLGROUP)) {
-                CERROR("!!! nid %s sent invalid object group %d\n",
-                        obd_export_nid2str(exp), group);
-                RETURN(-EINVAL);
-        }
+        CDEBUG(D_INODE, "%s: filter_create(group="LPU64",id="
+               LPU64")\n", obd->obd_name, oa->o_seq, oa->o_id);
 
         fed = &exp->exp_filter_data;
         filter = &obd->u.filter;
 
-        if (fed->fed_group != group) {
-                CERROR("!!! this export (nid %s) used object group %d "
-                        "earlier; now it's trying to use group %d!  This could "
-                        "be a bug in the MDS. Please report to "
-                        "http://bugzilla.lustre.org/\n",
-                        obd_export_nid2str(exp), fed->fed_group, group);
+        /* 1.8 client doesn't carry the ocd_group with connect request,
+         * so the fed_group will always be zero for 1.8 client. */
+        if (!(exp->exp_connect_flags & OBD_CONNECT_FULL20)) {
+                if (oa->o_seq != FID_SEQ_OST_MDT0 &&
+                    oa->o_seq != FID_SEQ_LLOG &&
+                    oa->o_seq != FID_SEQ_ECHO) {
+                        CERROR("The request from older client has invalid"
+                               " group "LPU64"!\n", oa->o_seq);
+                        RETURN(-EINVAL);
+                }
+        } else if (fed->fed_group != oa->o_seq) {
+                CERROR("%s: this export (nid %s) used object group %d "
+                        "earlier; now it's trying to use group "LPU64"!"
+                        " This could be a bug in the MDS. Please report to "
+                        "http://bugzilla.lustre.org/\n", obd->obd_name,
+                        obd_export_nid2str(exp), fed->fed_group, oa->o_seq);
                 RETURN(-ENOTUNIQ);
         }
 
@@ -3965,19 +4076,19 @@ static int filter_create(struct obd_export *exp, struct obdo *oa,
 
         if ((oa->o_valid & OBD_MD_FLFLAGS) &&
             (oa->o_flags & OBD_FL_RECREATE_OBJS)) {
-                if (oa->o_id > filter_last_id(filter, oa->o_gr)) {
+                if (!obd->obd_recovering ||
+                    oa->o_id > filter_last_id(filter, oa->o_seq)) {
                         CERROR("recreate objid "LPU64" > last id "LPU64"\n",
-                               oa->o_id, filter_last_id(filter,
-                                                        oa->o_gr));
+                               oa->o_id, filter_last_id(filter, oa->o_seq));
                         rc = -EINVAL;
                 } else {
                         diff = 1;
-                        cfs_down(&filter->fo_create_locks[oa->o_gr]);
-                        rc = filter_precreate(obd, oa, oa->o_gr, &diff);
-                        cfs_up(&filter->fo_create_locks[oa->o_gr]);
+                        cfs_down(&filter->fo_create_locks[oa->o_seq]);
+                        rc = filter_precreate(obd, oa, oa->o_seq, &diff);
+                        cfs_up(&filter->fo_create_locks[oa->o_seq]);
                 }
         } else {
-                rc = filter_handle_precreate(exp, oa, oa->o_gr, oti);
+                rc = filter_handle_precreate(exp, oa, oa->o_seq, oti);
         }
 
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
@@ -4009,10 +4120,10 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
         struct llog_cookie *fcc = NULL;
         int rc, rc2, cleanup_phase = 0, sync = 0;
         struct iattr iattr;
+        unsigned long now;
         ENTRY;
 
-        LASSERT(oa->o_valid & OBD_MD_FLGROUP);
-        rc = filter_auth_capa(exp, NULL, oa->o_gr,
+        rc = filter_auth_capa(exp, NULL, oa->o_seq,
                               (struct lustre_capa *)capa, CAPA_OPC_OSS_DESTROY);
         if (rc)
                 RETURN(rc);
@@ -4023,26 +4134,26 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         cleanup_phase = 1;
 
-        CDEBUG(D_INODE, "%s: filter_destroy(od->o_gr="LPU64",od->o_id="
-               LPU64")\n", obd->obd_name, oa->o_gr, oa->o_id);
+        CDEBUG(D_INODE, "%s: filter_destroy(group="LPU64",oid="
+               LPU64")\n", obd->obd_name, oa->o_seq, oa->o_id);
 
-        dchild = filter_fid2dentry(obd, NULL, oa->o_gr, oa->o_id);
+        dchild = filter_fid2dentry(obd, NULL, oa->o_seq, oa->o_id);
         if (IS_ERR(dchild))
                 GOTO(cleanup, rc = PTR_ERR(dchild));
         cleanup_phase = 2;
 
         if (dchild->d_inode == NULL) {
-                CDEBUG(D_INODE, "destroying non-existent object "LPU64"\n",
-                       oa->o_id);
+                CDEBUG(D_INODE, "destroying non-existent object "POSTID"\n",
+                       oa->o_id, oa->o_seq);
                 /* If object already gone, cancel cookie right now */
                 if (oa->o_valid & OBD_MD_FLCOOKIE) {
                         struct llog_ctxt *ctxt;
                         struct obd_llog_group *olg;
 
-                        olg = filter_find_olg(obd, oa->o_gr);
+                        olg = filter_find_olg(obd, oa->o_seq);
                         if (!olg) {
                                CERROR(" %s: can not find olg of group %d\n",
-                                      obd->obd_name, (int)oa->o_gr);
+                                      obd->obd_name, (int)oa->o_seq);
                                GOTO(cleanup, rc = PTR_ERR(olg));
                         }
                         fcc = &oa->o_lcookie;
@@ -4054,7 +4165,7 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
                 GOTO(cleanup, rc = -ENOENT);
         }
 
-        rc = filter_prepare_destroy(obd, oa->o_id, oa->o_gr, &lockh);
+        rc = filter_prepare_destroy(obd, oa->o_id, oa->o_seq, &lockh);
         if (rc)
                 GOTO(cleanup, rc);
 
@@ -4064,7 +4175,7 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
                 if (fcc != NULL)
                         *fcc = oa->o_lcookie;
         }
-        DQUOT_INIT(dchild->d_inode);
+        ll_vfs_dq_init(dchild->d_inode);
 
         /* we're gonna truncate it first in order to avoid possible deadlock:
          *      P1                      P2
@@ -4078,8 +4189,10 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
          * between page lock, i_mutex & starting new journal handle.
          * (see bug 20321) -johann
          */
+        now = jiffies;
         down_write(&dchild->d_inode->i_alloc_sem);
         LOCK_INODE_MUTEX(dchild->d_inode);
+        fsfilt_check_slow(exp->exp_obd, now, "i_alloc_sem and i_mutex");
 
         /* VBR: version recovery check */
         rc = filter_version_get_check(exp, oti, dchild->d_inode);
@@ -4112,7 +4225,7 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
          * here, and not while truncating above.  That avoids holding the
          * parent lock for a long time during truncate, which can block other
          * threads from doing anything to objects in that directory. bug 7171 */
-        dparent = filter_parent_lock(obd, oa->o_gr, oa->o_id);
+        dparent = filter_parent_lock(obd, oa->o_seq, oa->o_id);
         if (IS_ERR(dparent))
                 GOTO(cleanup, rc = PTR_ERR(dparent));
         cleanup_phase = 3; /* filter_parent_unlock */
@@ -4126,12 +4239,12 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa,
         cleanup_phase = 4; /* fsfilt_commit */
 
         /* Quota release need uid/gid of inode */
-        obdo_from_inode(oa, dchild->d_inode, OBD_MD_FLUID|OBD_MD_FLGID);
+        obdo_from_inode(oa, dchild->d_inode, NULL, OBD_MD_FLUID|OBD_MD_FLGID);
 
-        filter_fmd_drop(exp, oa->o_id, oa->o_gr);
+        filter_fmd_drop(exp, oa->o_id, oa->o_seq);
 
         /* this drops dchild->d_inode->i_mutex unconditionally */
-        rc = filter_destroy_internal(obd, oa->o_id, oa->o_gr, dparent, dchild);
+        rc = filter_destroy_internal(obd, oa->o_id, oa->o_seq, dparent, dchild);
 
         EXIT;
 cleanup:
@@ -4201,8 +4314,8 @@ static int filter_truncate(struct obd_export *exp, struct obd_info *oinfo,
         }
 
         CDEBUG(D_INODE, "calling truncate for object "LPU64", valid = "LPX64
-               ", o_size = "LPD64"\n", oinfo->oi_oa->o_id,
-               oinfo->oi_oa->o_valid, oinfo->oi_policy.l_extent.start);
+               ", o_size = "LPD64"\n", oinfo->oi_oa->o_id,oinfo->oi_oa->o_valid,
+                oinfo->oi_policy.l_extent.start);
 
         oinfo->oi_oa->o_size = oinfo->oi_policy.l_extent.start;
         oinfo->oi_oa->o_valid |= OBD_FL_TRUNC;
@@ -4211,9 +4324,9 @@ static int filter_truncate(struct obd_export *exp, struct obd_info *oinfo,
         RETURN(rc);
 }
 
-static int filter_sync(struct obd_export *exp, struct obdo *oa,
-                       struct lov_stripe_md *lsm, obd_off start, obd_off end,
-                       void *capa)
+static int filter_sync(struct obd_export *exp, struct obd_info *oinfo,
+                       obd_off start, obd_off end,
+                       struct ptlrpc_request_set *set)
 {
         struct lvfs_run_ctxt saved;
         struct obd_device_target *obt;
@@ -4221,23 +4334,23 @@ static int filter_sync(struct obd_export *exp, struct obdo *oa,
         int rc, rc2;
         ENTRY;
 
-        LASSERT(oa->o_valid & OBD_MD_FLGROUP);
-        rc = filter_auth_capa(exp, NULL, oa->o_gr,
-                              (struct lustre_capa *)capa, CAPA_OPC_OSS_WRITE);
+        rc = filter_auth_capa(exp, NULL, oinfo->oi_oa->o_seq,
+                              (struct lustre_capa *)oinfo->oi_capa,
+                              CAPA_OPC_OSS_WRITE);
         if (rc)
                 RETURN(rc);
 
         obt = &exp->exp_obd->u.obt;
 
         /* An objid of zero is taken to mean "sync whole filesystem" */
-        if (!oa || !(oa->o_valid & OBD_MD_FLID)) {
+        if (!oinfo->oi_oa || !(oinfo->oi_oa->o_valid & OBD_MD_FLID)) {
                 rc = fsfilt_sync(exp->exp_obd, obt->obt_sb);
                 /* Flush any remaining cancel messages out to the target */
                 filter_sync_llogs(exp->exp_obd, exp);
                 RETURN(rc);
         }
 
-        dentry = filter_oa2dentry(exp->exp_obd, oa);
+        dentry = filter_oa2dentry(exp->exp_obd, &oinfo->oi_oa->o_oi);
         if (IS_ERR(dentry))
                 RETURN(PTR_ERR(dentry));
 
@@ -4259,8 +4372,9 @@ static int filter_sync(struct obd_export *exp, struct obdo *oa,
         }
         UNLOCK_INODE_MUTEX(dentry->d_inode);
 
-        oa->o_valid = OBD_MD_FLID;
-        obdo_from_inode(oa, dentry->d_inode, FILTER_VALID_FLAGS);
+        oinfo->oi_oa->o_valid = OBD_MD_FLID;
+        obdo_from_inode(oinfo->oi_oa, dentry->d_inode, NULL,
+                        FILTER_VALID_FLAGS);
 
         pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
 
@@ -4329,8 +4443,8 @@ static int filter_get_info(struct obd_export *exp, __u32 keylen,
                         RETURN(0);
                 }
 
-                dentry = __filter_oa2dentry(exp->exp_obd, &fm_key->oa,
-                                            __FUNCTION__, 1);
+                dentry = __filter_oa2dentry(exp->exp_obd, &fm_key->oa.o_oi,
+                                            __func__, 1);
                 if (IS_ERR(dentry))
                         RETURN(PTR_ERR(dentry));
 
@@ -4344,6 +4458,12 @@ static int filter_get_info(struct obd_export *exp, __u32 keylen,
                 RETURN(rc);
         }
 
+        if (KEY_IS(KEY_SYNC_LOCK_CANCEL)) {
+                *((__u32 *) val) = obd->u.filter.fo_sync_lock_cancel;
+                *vallen = sizeof(__u32);
+                RETURN(0);
+        }
+
         CDEBUG(D_IOCTL, "invalid key\n");
         RETURN(-EINVAL);
 }
@@ -4404,14 +4524,14 @@ static int filter_set_mds_conn(struct obd_export *exp, void *val)
         else
                 group = 0; /* default value */
 
-        LASSERT_MDS_GROUP(group);
+        LASSERT_SEQ_IS_MDT(group);
         rc = filter_setup_llog_group(exp, obd, group);
         if (rc)
                 goto out;
 
-        if (group == FILTER_GROUP_MDS0) {
+        if (group == FID_SEQ_OST_MDT0) {
                 /* setup llog group 1 for interop */
-                filter_setup_llog_group(exp, obd, FILTER_GROUP_LLOG);
+                filter_setup_llog_group(exp, obd, FID_SEQ_LLOG);
         }
 
         lquota_setinfo(filter_quota_interface_ref, obd, exp);
@@ -4621,8 +4741,8 @@ static int __init obdfilter_init(void)
         int rc, i;
 
         /** sanity check for group<->mdsno conversion */
-        for (i = 0; i < 32; i++)
-                 LASSERT(objgrp_to_mdsno(mdt_to_obd_objgrp(i)) == i);
+        for (i = 0; i < MAX_MDT_COUNT; i++)
+                 LASSERT(objseq_to_mdsno(mdt_to_obd_objseq(i)) == i);
 
         lprocfs_filter_init_vars(&lvars);