Whamcloud - gitweb
LU-2675 llog: remove obd_llog_init() and obd_llod_finish()
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index aca1807..032f88f 100644 (file)
 
 #define DEBUG_SUBSYSTEM S_MDC
 
-#ifdef __KERNEL__
-# include <linux/module.h>
-# include <linux/pagemap.h>
-# include <linux/miscdevice.h>
-# include <linux/init.h>
-# include <linux/utsname.h>
-#else
-# include <liblustre.h>
-#endif
+#include <linux/module.h>
+#include <linux/pagemap.h>
+#include <linux/miscdevice.h>
+#include <linux/init.h>
+#include <linux/utsname.h>
 
 #include <lustre_acl.h>
 #include <lustre_ioctl.h>
@@ -138,17 +134,15 @@ static int send_getstatus(struct obd_import *imp, struct lu_fid *rootfid,
         if (body == NULL)
                 GOTO(out, rc = -EPROTO);
 
-        if (body->valid & OBD_MD_FLMDSCAPA) {
-                rc = mdc_unpack_capa(NULL, req, &RMF_CAPA1, pc);
-                if (rc)
-                        GOTO(out, rc);
-        }
+       if (body->mbo_valid & OBD_MD_FLMDSCAPA) {
+               rc = mdc_unpack_capa(NULL, req, &RMF_CAPA1, pc);
+               if (rc)
+                       GOTO(out, rc);
+       }
 
-        *rootfid = body->fid1;
-        CDEBUG(D_NET,
-               "root fid="DFID", last_committed="LPU64"\n",
-               PFID(rootfid),
-               lustre_msg_get_last_committed(req->rq_repmsg));
+       *rootfid = body->mbo_fid1;
+       CDEBUG(D_NET, "root fid="DFID", last_committed="LPU64"\n",
+              PFID(rootfid), lustre_msg_get_last_committed(req->rq_repmsg));
         EXIT;
 out:
         ptlrpc_req_finished(req);
@@ -192,17 +186,17 @@ static int mdc_getattr_common(struct obd_export *exp,
         if (body == NULL)
                 RETURN(-EPROTO);
 
-        CDEBUG(D_NET, "mode: %o\n", body->mode);
+       CDEBUG(D_NET, "mode: %o\n", body->mbo_mode);
 
        mdc_update_max_ea_from_body(exp, body);
-       if (body->eadatasize != 0) {
+       if (body->mbo_eadatasize != 0) {
                eadata = req_capsule_server_sized_get(pill, &RMF_MDT_MD,
-                                                     body->eadatasize);
+                                                     body->mbo_eadatasize);
                if (eadata == NULL)
                        RETURN(-EPROTO);
        }
 
-        if (body->valid & OBD_MD_FLRMTPERM) {
+       if (body->mbo_valid & OBD_MD_FLRMTPERM) {
                 struct mdt_remote_perm *perm;
 
                 LASSERT(client_is_remote(exp));
@@ -212,7 +206,7 @@ static int mdc_getattr_common(struct obd_export *exp,
                         RETURN(-EPROTO);
         }
 
-        if (body->valid & OBD_MD_FLMDSCAPA) {
+       if (body->mbo_valid & OBD_MD_FLMDSCAPA) {
                 struct lustre_capa *capa;
                 capa = req_capsule_server_get(pill, &RMF_CAPA1);
                 if (capa == NULL)
@@ -313,34 +307,6 @@ int mdc_getattr_name(struct obd_export *exp, struct md_op_data *op_data,
         RETURN(rc);
 }
 
-static int mdc_is_subdir(struct obd_export *exp,
-                         const struct lu_fid *pfid,
-                         const struct lu_fid *cfid,
-                         struct ptlrpc_request **request)
-{
-        struct ptlrpc_request  *req;
-        int                     rc;
-
-        ENTRY;
-
-        *request = NULL;
-        req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp),
-                                        &RQF_MDS_IS_SUBDIR, LUSTRE_MDS_VERSION,
-                                        MDS_IS_SUBDIR);
-        if (req == NULL)
-                RETURN(-ENOMEM);
-
-        mdc_is_subdir_pack(req, pfid, cfid, 0);
-        ptlrpc_request_set_replen(req);
-
-        rc = ptlrpc_queue_wait(req);
-        if (rc && rc != -EREMOTE)
-                ptlrpc_req_finished(req);
-        else
-                *request = req;
-        RETURN(rc);
-}
-
 static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt,
                             const struct lu_fid *fid,
                             struct obd_capa *oc, int opcode, obd_valid valid,
@@ -484,15 +450,17 @@ static int mdc_unpack_acl(struct ptlrpc_request *req, struct lustre_md *md)
         int                     rc;
         ENTRY;
 
-        if (!body->aclsize)
-                RETURN(0);
+       if (!body->mbo_aclsize)
+               RETURN(0);
 
-        buf = req_capsule_server_sized_get(pill, &RMF_ACL, body->aclsize);
+       buf = req_capsule_server_sized_get(pill, &RMF_ACL, body->mbo_aclsize);
 
-        if (!buf)
-                RETURN(-EPROTO);
+       if (!buf)
+               RETURN(-EPROTO);
 
-        acl = posix_acl_from_xattr(&init_user_ns, buf, body->aclsize);
+       acl = posix_acl_from_xattr(&init_user_ns, buf, body->mbo_aclsize);
+       if (acl == NULL)
+               RETURN(0);
         if (IS_ERR(acl)) {
                 rc = PTR_ERR(acl);
                 CERROR("convert xattr to acl: %d\n", rc);
@@ -527,22 +495,23 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
         md->body = req_capsule_server_get(pill, &RMF_MDT_BODY);
         LASSERT(md->body != NULL);
 
-        if (md->body->valid & OBD_MD_FLEASIZE) {
-                int lmmsize;
-                struct lov_mds_md *lmm;
+       if (md->body->mbo_valid & OBD_MD_FLEASIZE) {
+               int lmmsize;
+               struct lov_mds_md *lmm;
 
-                if (!S_ISREG(md->body->mode)) {
-                        CDEBUG(D_INFO, "OBD_MD_FLEASIZE set, should be a "
-                               "regular file, but is not\n");
-                        GOTO(out, rc = -EPROTO);
-                }
+               if (!S_ISREG(md->body->mbo_mode)) {
+                       CDEBUG(D_INFO, "OBD_MD_FLEASIZE set, should be a "
+                              "regular file, but is not\n");
+                       GOTO(out, rc = -EPROTO);
+               }
 
-                if (md->body->eadatasize == 0) {
-                        CDEBUG(D_INFO, "OBD_MD_FLEASIZE set, "
-                               "but eadatasize 0\n");
-                        GOTO(out, rc = -EPROTO);
-                }
-                lmmsize = md->body->eadatasize;
+               if (md->body->mbo_eadatasize == 0) {
+                       CDEBUG(D_INFO, "OBD_MD_FLEASIZE set, "
+                              "but eadatasize 0\n");
+                       GOTO(out, rc = -EPROTO);
+               }
+
+               lmmsize = md->body->mbo_eadatasize;
                 lmm = req_capsule_server_sized_get(pill, &RMF_MDT_MD, lmmsize);
                 if (!lmm)
                         GOTO(out, rc = -EPROTO);
@@ -558,23 +527,24 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
                         GOTO(out, rc = -EPROTO);
                 }
 
-        } else if (md->body->valid & OBD_MD_FLDIREA) {
-                int lmvsize;
-                struct lov_mds_md *lmv;
+       } else if (md->body->mbo_valid & OBD_MD_FLDIREA) {
+               int lmvsize;
+               struct lov_mds_md *lmv;
 
-                if(!S_ISDIR(md->body->mode)) {
-                        CDEBUG(D_INFO, "OBD_MD_FLDIREA set, should be a "
-                               "directory, but is not\n");
-                        GOTO(out, rc = -EPROTO);
-                }
+               if (!S_ISDIR(md->body->mbo_mode)) {
+                       CDEBUG(D_INFO, "OBD_MD_FLDIREA set, should be a "
+                              "directory, but is not\n");
+                       GOTO(out, rc = -EPROTO);
+               }
 
-                if (md->body->eadatasize == 0) {
-                        CDEBUG(D_INFO, "OBD_MD_FLDIREA is set, "
-                               "but eadatasize 0\n");
-                        RETURN(-EPROTO);
-                }
-               if (md->body->valid & OBD_MD_MEA) {
-                       lmvsize = md->body->eadatasize;
+               if (md->body->mbo_eadatasize == 0) {
+                       CDEBUG(D_INFO, "OBD_MD_FLDIREA is set, "
+                              "but eadatasize 0\n");
+                       RETURN(-EPROTO);
+               }
+
+               if (md->body->mbo_valid & OBD_MD_MEA) {
+                       lmvsize = md->body->mbo_eadatasize;
                        lmv = req_capsule_server_sized_get(pill, &RMF_MDT_MD,
                                                           lmvsize);
                        if (!lmv)
@@ -595,20 +565,19 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
         }
         rc = 0;
 
-        if (md->body->valid & OBD_MD_FLRMTPERM) {
-                /* remote permission */
-                LASSERT(client_is_remote(exp));
-                md->remote_perm = req_capsule_server_swab_get(pill, &RMF_ACL,
-                                                lustre_swab_mdt_remote_perm);
-                if (!md->remote_perm)
-                        GOTO(out, rc = -EPROTO);
-        }
-        else if (md->body->valid & OBD_MD_FLACL) {
-                /* for ACL, it's possible that FLACL is set but aclsize is zero.
-                 * only when aclsize != 0 there's an actual segment for ACL
-                 * in reply buffer.
-                 */
-                if (md->body->aclsize) {
+       if (md->body->mbo_valid & OBD_MD_FLRMTPERM) {
+               /* remote permission */
+               LASSERT(client_is_remote(exp));
+               md->remote_perm = req_capsule_server_swab_get(pill, &RMF_ACL,
+                                               lustre_swab_mdt_remote_perm);
+               if (!md->remote_perm)
+                       GOTO(out, rc = -EPROTO);
+       } else if (md->body->mbo_valid & OBD_MD_FLACL) {
+               /* for ACL, it's possible that FLACL is set but aclsize is zero.
+                * only when aclsize != 0 there's an actual segment for ACL
+                * in reply buffer.
+                */
+               if (md->body->mbo_aclsize) {
                         rc = mdc_unpack_acl(req, md);
                         if (rc)
                                 GOTO(out, rc);
@@ -618,7 +587,7 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
 #endif
                 }
         }
-        if (md->body->valid & OBD_MD_FLMDSCAPA) {
+       if (md->body->mbo_valid & OBD_MD_FLMDSCAPA) {
                 struct obd_capa *oc = NULL;
 
                 rc = mdc_unpack_capa(NULL, req, &RMF_CAPA1, &oc);
@@ -627,7 +596,7 @@ int mdc_get_lustre_md(struct obd_export *exp, struct ptlrpc_request *req,
                 md->mds_capa = oc;
         }
 
-        if (md->body->valid & OBD_MD_FLOSSCAPA) {
+       if (md->body->mbo_valid & OBD_MD_FLOSSCAPA) {
                 struct obd_capa *oc = NULL;
 
                 rc = mdc_unpack_capa(NULL, req, &RMF_CAPA2, &oc);
@@ -692,10 +661,10 @@ void mdc_replay_open(struct ptlrpc_request *req)
                 LASSERT(och->och_magic == OBD_CLIENT_HANDLE_MAGIC);
 
                 file_fh = &och->och_fh;
-                CDEBUG(D_HA, "updating handle from "LPX64" to "LPX64"\n",
-                       file_fh->cookie, body->handle.cookie);
-                old = *file_fh;
-                *file_fh = body->handle;
+               CDEBUG(D_HA, "updating handle from "LPX64" to "LPX64"\n",
+                      file_fh->cookie, body->mbo_handle.cookie);
+               old = *file_fh;
+               *file_fh = body->mbo_handle;
         }
         close_req = mod->mod_close_req;
         if (close_req != NULL) {
@@ -710,7 +679,7 @@ void mdc_replay_open(struct ptlrpc_request *req)
                 if (och != NULL)
                         LASSERT(!memcmp(&old, &epoch->handle, sizeof(old)));
                 DEBUG_REQ(D_HA, close_req, "updating close body with new fh");
-                epoch->handle = body->handle;
+               epoch->handle = body->mbo_handle;
         }
         EXIT;
 }
@@ -793,11 +762,11 @@ int mdc_set_open_replay_data(struct obd_export *exp,
                spin_unlock(&open_req->rq_lock);
         }
 
-        rec->cr_fid2 = body->fid1;
-        rec->cr_ioepoch = body->ioepoch;
-        rec->cr_old_handle.cookie = body->handle.cookie;
-        open_req->rq_replay_cb = mdc_replay_open;
-        if (!fid_is_sane(&body->fid1)) {
+       rec->cr_fid2 = body->mbo_fid1;
+       rec->cr_ioepoch = body->mbo_ioepoch;
+       rec->cr_old_handle.cookie = body->mbo_handle.cookie;
+       open_req->rq_replay_cb = mdc_replay_open;
+       if (!fid_is_sane(&body->mbo_fid1)) {
                 DEBUG_REQ(D_ERROR, open_req, "Saving replay request with "
                           "insane fid");
                 LBUG();
@@ -859,7 +828,7 @@ static void mdc_close_handle_reply(struct ptlrpc_request *req,
                 epoch = req_capsule_client_get(&req->rq_pill, &RMF_MDT_EPOCH);
 
                 epoch->flags |= MF_SOM_AU;
-                if (repbody->valid & OBD_MD_FLGETATTRLOCK)
+               if (repbody->mbo_valid & OBD_MD_FLGETATTRLOCK)
                         op_data->op_flags |= MF_GETATTR_LOCK;
         }
 }
@@ -1183,7 +1152,6 @@ restart_bulk:
        RETURN(0);
 }
 
-#ifdef __KERNEL__
 static void mdc_release_page(struct page *page, int remove)
 {
        if (remove) {
@@ -1210,7 +1178,7 @@ static struct page *mdc_page_locate(struct address_space *mapping, __u64 *hash,
        spin_lock_irq(&mapping->tree_lock);
        found = radix_tree_gang_lookup(&mapping->page_tree,
                                       (void **)&page, offset, 1);
-       if (found > 0) {
+       if (found > 0 && !radix_tree_exceptional_entry(page)) {
                struct lu_dirpage *dp;
 
                page_cache_get(page);
@@ -1250,8 +1218,8 @@ static struct page *mdc_page_locate(struct address_space *mapping, __u64 *hash,
                                /*
                                 * upon hash collision, remove this page,
                                 * otherwise put page reference, and
-                                * ll_get_dir_page() will issue RPC to fetch
-                                * the page we want.
+                                * mdc_read_page_remote() will issue RPC to
+                                * fetch the page we want.
                                 */
                                kunmap(page);
                                mdc_release_page(page,
@@ -1366,7 +1334,7 @@ static void mdc_adjust_dirpages(struct page **pages, int cfs_pgs, int lu_pgs)
 
                kunmap(pages[i]);
        }
-       LASSERTF(lu_pgs == 0, "left = %d", lu_pgs);
+       LASSERTF(lu_pgs == 0, "left = %d\n", lu_pgs);
 }
 #else
 #define mdc_adjust_dirpages(pages, cfs_pgs, lu_pgs) do {} while (0)
@@ -1409,15 +1377,8 @@ static int mdc_read_page_remote(void *data, struct page *page0)
        ENTRY;
 
        LASSERT(max_pages > 0 && max_pages <= PTLRPC_MAX_BRW_PAGES);
-       if (op_data->op_mea1 != NULL) {
-               __u32 index = op_data->op_stripe_offset;
-
-               inode = op_data->op_mea1->lsm_md_oinfo[index].lmo_root;
-               fid = &op_data->op_mea1->lsm_md_oinfo[index].lmo_fid;
-       } else {
-               inode = op_data->op_data;
-               fid = &op_data->op_fid1;
-       }
+       inode = op_data->op_data;
+       fid = &op_data->op_fid1;
        LASSERT(inode != NULL);
 
        OBD_ALLOC(page_pool, sizeof(page_pool[0]) * max_pages);
@@ -1497,9 +1458,21 @@ static int mdc_read_page_remote(void *data, struct page *page0)
 /**
  * Read dir page from cache first, if it can not find it, read it from
  * server and add into the cache.
+ *
+ * \param[in] exp      MDC export
+ * \param[in] op_data  client MD stack parameters, transfering parameters
+ *                      between different layers on client MD stack.
+ * \param[in] cb_op    callback required for ldlm lock enqueue during
+ *                      read page
+ * \param[in] hash_offset the hash offset of the page to be read
+ * \param[in] ppage    the page to be read
+ *
+ * retval              = 0 get the page successfully
+ *                      errno(<0) get the page failed
  */
 static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data,
-                        struct md_callback *cb_op, struct page **ppage)
+                        struct md_callback *cb_op, __u64 hash_offset,
+                        struct page **ppage)
 {
        struct lookup_intent    it = { .it_op = IT_READDIR };
        struct page             *page;
@@ -1534,7 +1507,7 @@ static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data,
        rc = 0;
        mdc_set_lock_data(exp, &it.d.lustre.it_lock_handle, dir, NULL);
 
-       rp_param.rp_off = op_data->op_hash_offset;
+       rp_param.rp_off = hash_offset;
        rp_param.rp_hash64 = op_data->op_cli_flags & CLI_HASH64;
        page = mdc_page_locate(mapping, &rp_param.rp_off, &start, &end,
                               rp_param.rp_hash64);
@@ -1596,11 +1569,11 @@ hash_collision:
        if (BITS_PER_LONG == 32 && rp_param.rp_hash64) {
                start = le64_to_cpu(dp->ldp_hash_start) >> 32;
                end   = le64_to_cpu(dp->ldp_hash_end) >> 32;
-               rp_param.rp_off = op_data->op_hash_offset >> 32;
+               rp_param.rp_off = hash_offset >> 32;
        } else {
                start = le64_to_cpu(dp->ldp_hash_start);
                end   = le64_to_cpu(dp->ldp_hash_end);
-               rp_param.rp_off = op_data->op_hash_offset;
+               rp_param.rp_off = hash_offset;
        }
        if (end == start) {
                LASSERT(start == rp_param.rp_off);
@@ -1608,7 +1581,7 @@ hash_collision:
 #if BITS_PER_LONG == 32
                CWARN("Real page-wide hash collision at ["LPU64" "LPU64"] with "
                      "hash "LPU64"\n", le64_to_cpu(dp->ldp_hash_start),
-                     le64_to_cpu(dp->ldp_hash_end), op_data->op_hash_offset);
+                     le64_to_cpu(dp->ldp_hash_end), hash_offset);
 #endif
 
                /*
@@ -1631,178 +1604,6 @@ fail:
        goto out_unlock;
 }
 
-/**
- * Read one directory entry from the cache.
- */
-int mdc_read_entry(struct obd_export *exp, struct md_op_data *op_data,
-                  struct md_callback *cb_op, struct lu_dirent **entp,
-                  struct page **ppage)
-{
-       struct page             *page = NULL;
-       struct lu_dirpage       *dp;
-       struct lu_dirent        *ent;
-       int                     rc = 0;
-       __u32                   same_hash_count;
-       __u64                   hash_offset = op_data->op_hash_offset;
-       ENTRY;
-
-       CDEBUG(D_INFO, DFID " offset = "LPU64", flags %#x\n",
-              PFID(&op_data->op_fid1), op_data->op_hash_offset,
-              op_data->op_cli_flags);
-
-       *ppage = NULL;
-       *entp = NULL;
-
-       if (op_data->op_hash_offset == MDS_DIR_END_OFF)
-               RETURN(0);
-
-       rc = mdc_read_page(exp, op_data, cb_op, &page);
-       if (rc != 0)
-               RETURN(rc);
-
-       /* same_hash_count means how many entries with this
-        * hash value has been read */
-       same_hash_count = op_data->op_same_hash_offset + 1;
-       dp = page_address(page);
-       for (ent = lu_dirent_start(dp); ent != NULL;
-            ent = lu_dirent_next(ent)) {
-               /* Skip dummy entry */
-               if (le16_to_cpu(ent->lde_namelen) == 0)
-                       continue;
-
-               if (le64_to_cpu(ent->lde_hash) <
-                               op_data->op_hash_offset)
-                       continue;
-
-               if (unlikely(le64_to_cpu(ent->lde_hash) ==
-                               op_data->op_hash_offset)) {
-                       /* If it is not for next entry, which usually from
-                        * ll_dir_entry_start, return this entry. */
-                       if (!(op_data->op_cli_flags & CLI_NEXT_ENTRY))
-                               break;
-
-                       /* Keep reading until all of entries being read are
-                        * skipped. */
-                       if (same_hash_count > 0) {
-                               same_hash_count--;
-                               continue;
-                       }
-               }
-               break;
-       }
-
-       /* If it can not find entry in current page, try next page. */
-       if (ent == NULL) {
-               if (le64_to_cpu(dp->ldp_hash_end) == MDS_DIR_END_OFF) {
-                       op_data->op_same_hash_offset = 0;
-                       mdc_release_page(page,
-                                le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE);
-                       RETURN(0);
-               }
-
-               op_data->op_hash_offset = le64_to_cpu(dp->ldp_hash_end);
-               mdc_release_page(page,
-                                le32_to_cpu(dp->ldp_flags) & LDF_COLLIDE);
-               rc = mdc_read_page(exp, op_data, cb_op, &page);
-               if (rc != 0)
-                       RETURN(rc);
-
-               if (page != NULL) {
-                       dp = page_address(page);
-                       ent = lu_dirent_start(dp);
-               }
-       }
-
-       /* If the next hash is the same as the current hash, increase
-        * the op_same_hash_offset to resolve the same hash conflict */
-       if (ent != NULL && op_data->op_cli_flags & CLI_NEXT_ENTRY) {
-               if (unlikely(le64_to_cpu(ent->lde_hash) == hash_offset))
-                       op_data->op_same_hash_offset++;
-               else
-                       op_data->op_same_hash_offset = 0;
-       }
-
-       *ppage = page;
-       *entp = ent;
-       RETURN(rc);
-}
-
-#else /* __KERNEL__ */
-
-static struct page
-*mdc_read_page_remote(struct obd_export *exp, const struct lmv_oinfo *lmo,
-                     const __u64 hash, struct obd_capa *oc)
-{
-       struct ptlrpc_request *req = NULL;
-       struct page *page;
-       int rc;
-
-       OBD_PAGE_ALLOC(page, 0);
-       if (page == NULL)
-               return ERR_PTR(-ENOMEM);
-
-       rc = mdc_getpage(exp, &lmo->lmo_fid, hash, oc, &page, 1, &req);
-       if (req != NULL)
-               ptlrpc_req_finished(req);
-
-       if (unlikely(rc)) {
-               OBD_PAGE_FREE(page);
-               return ERR_PTR(rc);
-       }
-       return page;
-}
-
-
-static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data,
-                       struct md_callback *cb_op,
-                       struct page **ppage)
-{
-       struct page *page;
-       struct lmv_oinfo *lmo;
-       int rc = 0;
-
-       /* No local cache for liblustre, always read entry remotely */
-       lmo = &op_data->op_mea1->lsm_md_oinfo[op_data->op_stripe_offset];
-       page = mdc_read_page_remote(exp, lmo, op_data->op_hash_offset,
-                                   op_data->op_capa1);
-       if (IS_ERR(page))
-               return PTR_ERR(page);
-
-       *ppage = page;
-
-       return rc;
-}
-
-int mdc_read_entry(struct obd_export *exp, struct md_op_data *op_data,
-                  struct md_callback *cb_op, struct lu_dirent **entp,
-                  struct page **ppage)
-{
-       struct page             *page = NULL;
-       struct lu_dirpage       *dp;
-       struct lu_dirent        *ent;
-       int                     rc;
-       ENTRY;
-
-       rc = mdc_read_page(exp, op_data, cb_op, &page);
-       if (rc != 0)
-               RETURN(rc);
-
-       dp = page_address(page);
-       if (le64_to_cpu(dp->ldp_hash_end) < op_data->op_hash_offset)
-               GOTO(out, *entp = NULL);
-
-       for (ent = lu_dirent_start(dp); ent != NULL;
-            ent = lu_dirent_next(ent))
-               if (le64_to_cpu(ent->lde_hash) >= op_data->op_hash_offset)
-                       break;
-       *entp = ent;
-out:
-
-       OBD_PAGE_FREE(page);
-       RETURN(rc);
-}
-
-#endif
 
 static int mdc_statfs(const struct lu_env *env,
                       struct obd_export *exp, struct obd_statfs *osfs,
@@ -2194,8 +1995,6 @@ static struct kuc_hdr *changelog_kuc_hdr(char *buf, int len, int flags)
        return lh;
 }
 
-#define D_CHANGELOG 0
-
 struct changelog_show {
        __u64           cs_startrec;
        __u32           cs_flags;
@@ -2223,17 +2022,17 @@ static int changelog_kkuc_cb(const struct lu_env *env, struct llog_handle *llh,
 
        if (rec->cr.cr_index < cs->cs_startrec) {
                /* Skip entries earlier than what we are interested in */
-               CDEBUG(D_CHANGELOG, "rec="LPU64" start="LPU64"\n",
+               CDEBUG(D_HSM, "rec="LPU64" start="LPU64"\n",
                       rec->cr.cr_index, cs->cs_startrec);
                RETURN(0);
        }
 
-       CDEBUG(D_CHANGELOG, LPU64" %02d%-5s "LPU64" 0x%x t="DFID" p="DFID
-               " %.*s\n", rec->cr.cr_index, rec->cr.cr_type,
-               changelog_type2str(rec->cr.cr_type), rec->cr.cr_time,
-               rec->cr.cr_flags & CLF_FLAGMASK,
-               PFID(&rec->cr.cr_tfid), PFID(&rec->cr.cr_pfid),
-               rec->cr.cr_namelen, changelog_rec_name(&rec->cr));
+       CDEBUG(D_HSM, LPU64" %02d%-5s "LPU64" 0x%x t="DFID" p="DFID" %.*s\n",
+              rec->cr.cr_index, rec->cr.cr_type,
+              changelog_type2str(rec->cr.cr_type), rec->cr.cr_time,
+              rec->cr.cr_flags & CLF_FLAGMASK,
+              PFID(&rec->cr.cr_tfid), PFID(&rec->cr.cr_pfid),
+              rec->cr.cr_namelen, changelog_rec_name(&rec->cr));
 
        len = sizeof(*lh) + changelog_rec_size(&rec->cr) + rec->cr.cr_namelen;
 
@@ -2242,7 +2041,7 @@ static int changelog_kkuc_cb(const struct lu_env *env, struct llog_handle *llh,
         memcpy(lh + 1, &rec->cr, len - sizeof(*lh));
 
         rc = libcfs_kkuc_msg_put(cs->cs_fp, lh);
-        CDEBUG(D_CHANGELOG, "kucmsg fp %p len %d rc %d\n", cs->cs_fp, len,rc);
+       CDEBUG(D_HSM, "kucmsg fp %p len %d rc %d\n", cs->cs_fp, len, rc);
 
         RETURN(rc);
 }
@@ -2255,7 +2054,7 @@ static int mdc_changelog_send_thread(void *csdata)
        struct kuc_hdr *kuch;
        int rc;
 
-       CDEBUG(D_CHANGELOG, "changelog to fp=%p start "LPU64"\n",
+       CDEBUG(D_HSM, "changelog to fp=%p start "LPU64"\n",
               cs->cs_fp, cs->cs_startrec);
 
        OBD_ALLOC(cs->cs_buf, KUC_CHANGELOG_MSG_MAXSIZE);
@@ -2331,8 +2130,7 @@ static int mdc_ioc_changelog_send(struct obd_device *obd,
                OBD_FREE_PTR(cs);
        } else {
                rc = 0;
-               CDEBUG(D_CHANGELOG, "%s: started changelog thread\n",
-                      obd->obd_name);
+               CDEBUG(D_HSM, "%s: started changelog thread\n", obd->obd_name);
        }
 
        return rc;
@@ -2485,7 +2283,7 @@ out:
 }
 
 static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
-                         void *karg, void *uarg)
+                        void *karg, void __user *uarg)
 {
         struct obd_device *obd = exp->exp_obd;
         struct obd_ioctl_data *data = karg;
@@ -2494,7 +2292,8 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         ENTRY;
 
        if (!try_module_get(THIS_MODULE)) {
-               CERROR("Can't get module. Is it alive?");
+               CERROR("%s: cannot get module '%s'\n", obd->obd_name,
+                      module_name(THIS_MODULE));
                return -EINVAL;
        }
         switch (cmd) {
@@ -2916,93 +2715,6 @@ int mdc_get_info(const struct lu_env *env, struct obd_export *exp,
         RETURN(rc);
 }
 
-static int mdc_pin(struct obd_export *exp, const struct lu_fid *fid,
-                   struct obd_capa *oc, struct obd_client_handle *handle,
-                   int flags)
-{
-        struct ptlrpc_request *req;
-        struct mdt_body       *body;
-        int                    rc;
-        ENTRY;
-
-        req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_PIN);
-        if (req == NULL)
-                RETURN(-ENOMEM);
-
-        mdc_set_capa_size(req, &RMF_CAPA1, oc);
-
-        rc = ptlrpc_request_pack(req, LUSTRE_MDS_VERSION, MDS_PIN);
-        if (rc) {
-                ptlrpc_request_free(req);
-                RETURN(rc);
-        }
-
-        mdc_pack_body(req, fid, oc, 0, 0, -1, flags);
-
-        ptlrpc_request_set_replen(req);
-
-        mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
-        rc = ptlrpc_queue_wait(req);
-        mdc_put_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
-        if (rc) {
-                CERROR("Pin failed: %d\n", rc);
-                GOTO(err_out, rc);
-        }
-
-        body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
-        if (body == NULL)
-                GOTO(err_out, rc = -EPROTO);
-
-        handle->och_fh = body->handle;
-        handle->och_magic = OBD_CLIENT_HANDLE_MAGIC;
-
-        handle->och_mod = obd_mod_alloc();
-        if (handle->och_mod == NULL) {
-                DEBUG_REQ(D_ERROR, req, "can't allocate md_open_data");
-                GOTO(err_out, rc = -ENOMEM);
-        }
-        handle->och_mod->mod_open_req = req; /* will be dropped by unpin */
-
-        RETURN(0);
-
-err_out:
-        ptlrpc_req_finished(req);
-        RETURN(rc);
-}
-
-static int mdc_unpin(struct obd_export *exp, struct obd_client_handle *handle,
-                     int flag)
-{
-        struct ptlrpc_request *req;
-        struct mdt_body       *body;
-        int                    rc;
-        ENTRY;
-
-        req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_MDS_UNPIN,
-                                        LUSTRE_MDS_VERSION, MDS_UNPIN);
-        if (req == NULL)
-                RETURN(-ENOMEM);
-
-        body = req_capsule_client_get(&req->rq_pill, &RMF_MDT_BODY);
-        body->handle = handle->och_fh;
-        body->flags = flag;
-
-        ptlrpc_request_set_replen(req);
-
-        mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
-        rc = ptlrpc_queue_wait(req);
-        mdc_put_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
-
-        if (rc != 0)
-                CERROR("Unpin failed: %d\n", rc);
-
-        ptlrpc_req_finished(req);
-        ptlrpc_req_finished(handle->och_mod->mod_open_req);
-
-        obd_mod_put(handle->och_mod);
-        RETURN(rc);
-}
-
 int mdc_fsync(struct obd_export *exp, const struct lu_fid *fid,
              struct obd_capa *oc, struct ptlrpc_request **request)
 {
@@ -3133,6 +2845,39 @@ struct ldlm_valblock_ops inode_lvbo = {
        .lvbo_free = mdc_resource_inode_free
 };
 
+static int mdc_llog_init(struct obd_device *obd)
+{
+       struct obd_llog_group   *olg = &obd->obd_olg;
+       struct llog_ctxt        *ctxt;
+       int                      rc;
+
+       ENTRY;
+
+       rc = llog_setup(NULL, obd, olg, LLOG_CHANGELOG_REPL_CTXT, obd,
+                       &llog_client_ops);
+       if (rc < 0)
+               RETURN(rc);
+
+       ctxt = llog_group_get_ctxt(olg, LLOG_CHANGELOG_REPL_CTXT);
+       llog_initiator_connect(ctxt);
+       llog_ctxt_put(ctxt);
+
+       RETURN(0);
+}
+
+static void mdc_llog_finish(struct obd_device *obd)
+{
+       struct llog_ctxt *ctxt;
+
+       ENTRY;
+
+       ctxt = llog_get_context(obd, LLOG_CHANGELOG_REPL_CTXT);
+       if (ctxt != NULL)
+               llog_cleanup(NULL, ctxt);
+
+       EXIT;
+}
+
 static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 {
        struct client_obd               *cli = &obd->u.cli;
@@ -3158,7 +2903,7 @@ static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
                 GOTO(err_close_lock, rc);
 #ifdef LPROCFS
        obd->obd_vars = lprocfs_mdc_obd_vars;
-       lprocfs_seq_obd_setup(obd);
+       lprocfs_obd_setup(obd);
        lprocfs_alloc_md_stats(obd, 0);
 #endif
        sptlrpc_lprocfs_cliobd_attach(obd);
@@ -3168,7 +2913,7 @@ static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 
        obd->obd_namespace->ns_lvbo = &inode_lvbo;
 
-        rc = obd_llog_init(obd, &obd->obd_olg, obd, NULL);
+       rc = mdc_llog_init(obd);
         if (rc) {
                 mdc_cleanup(obd);
                 CERROR("failed to setup llogging subsystems\n");
@@ -3232,10 +2977,7 @@ static int mdc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
                 ptlrpc_lprocfs_unregister_obd(obd);
                 lprocfs_obd_cleanup(obd);
                lprocfs_free_md_stats(obd);
-
-                rc = obd_llog_finish(obd, 0);
-                if (rc != 0)
-                        CERROR("failed to cleanup llogging subsystems\n");
+               mdc_llog_finish(obd);
                 break;
         }
         RETURN(rc);
@@ -3253,47 +2995,10 @@ static int mdc_cleanup(struct obd_device *obd)
         return client_obd_cleanup(obd);
 }
 
-
-static int mdc_llog_init(struct obd_device *obd, struct obd_llog_group *olg,
-                         struct obd_device *tgt, int *index)
-{
-       struct llog_ctxt        *ctxt;
-       int                      rc;
-
-       ENTRY;
-
-       LASSERT(olg == &obd->obd_olg);
-
-       rc = llog_setup(NULL, obd, olg, LLOG_CHANGELOG_REPL_CTXT, tgt,
-                       &llog_client_ops);
-       if (rc)
-               RETURN(rc);
-
-       ctxt = llog_group_get_ctxt(olg, LLOG_CHANGELOG_REPL_CTXT);
-       llog_initiator_connect(ctxt);
-       llog_ctxt_put(ctxt);
-
-       RETURN(0);
-}
-
-static int mdc_llog_finish(struct obd_device *obd, int count)
-{
-       struct llog_ctxt *ctxt;
-
-       ENTRY;
-
-       ctxt = llog_get_context(obd, LLOG_CHANGELOG_REPL_CTXT);
-       if (ctxt)
-               llog_cleanup(NULL, ctxt);
-
-       RETURN(0);
-}
-
 static int mdc_process_config(struct obd_device *obd, obd_count len, void *buf)
 {
         struct lustre_cfg *lcfg = buf;
-       int rc = class_process_proc_seq_param(PARAM_MDC, obd->obd_vars,
-                                             lcfg, obd);
+       int rc = class_process_proc_param(PARAM_MDC, obd->obd_vars, lcfg, obd);
        return (rc > 0 ? 0: rc);
 }
 
@@ -3353,7 +3058,7 @@ static int mdc_interpret_renew_capa(const struct lu_env *env,
         if (body == NULL)
                 GOTO(out, capa = ERR_PTR(-EFAULT));
 
-        if ((body->valid & OBD_MD_FLOSSCAPA) == 0)
+       if ((body->mbo_valid & OBD_MD_FLOSSCAPA) == 0)
                 GOTO(out, capa = ERR_PTR(-ENOENT));
 
         capa = req_capsule_server_get(&req->rq_pill, &RMF_CAPA2);
@@ -3404,14 +3109,10 @@ struct obd_ops mdc_obd_ops = {
         .o_iocontrol        = mdc_iocontrol,
         .o_set_info_async   = mdc_set_info_async,
         .o_statfs           = mdc_statfs,
-        .o_pin              = mdc_pin,
-        .o_unpin            = mdc_unpin,
        .o_fid_init         = client_fid_init,
        .o_fid_fini         = client_fid_fini,
         .o_fid_alloc        = mdc_fid_alloc,
         .o_import_event     = mdc_import_event,
-        .o_llog_init        = mdc_llog_init,
-        .o_llog_finish      = mdc_llog_finish,
         .o_get_info         = mdc_get_info,
         .o_process_config   = mdc_process_config,
         .o_get_uuid         = mdc_get_uuid,
@@ -3431,13 +3132,12 @@ struct md_ops mdc_md_ops = {
         .m_getattr_name     = mdc_getattr_name,
         .m_intent_lock      = mdc_intent_lock,
         .m_link             = mdc_link,
-        .m_is_subdir        = mdc_is_subdir,
         .m_rename           = mdc_rename,
         .m_setattr          = mdc_setattr,
         .m_setxattr         = mdc_setxattr,
         .m_getxattr         = mdc_getxattr,
        .m_fsync                = mdc_fsync,
-       .m_read_entry           = mdc_read_entry,
+       .m_read_page            = mdc_read_page,
         .m_unlink           = mdc_unlink,
         .m_cancel_unused    = mdc_cancel_unused,
         .m_init_ea_size     = mdc_init_ea_size,
@@ -3457,13 +3157,9 @@ struct md_ops mdc_md_ops = {
 int __init mdc_init(void)
 {
        return class_register_type(&mdc_obd_ops, &mdc_md_ops, true, NULL,
-#ifndef HAVE_ONLY_PROCFS_SEQ
-                                  NULL,
-#endif
                                   LUSTRE_MDC_NAME, NULL);
 }
 
-#ifdef __KERNEL__
 static void /*__exit*/ mdc_exit(void)
 {
         class_unregister_type(LUSTRE_MDC_NAME);
@@ -3475,4 +3171,3 @@ MODULE_LICENSE("GPL");
 
 module_init(mdc_init);
 module_exit(mdc_exit);
-#endif