Whamcloud - gitweb
LU-4788 lfsck: replace cfs_list_t with list_head
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index 92f0332..1699d29 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,
@@ -374,7 +340,7 @@ static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt,
        /* Flush local XATTR locks to get rid of a possible cancel RPC */
        if (opcode == MDS_REINT && fid_is_sane(fid) &&
            exp->exp_connect_data.ocd_ibits_known & MDS_INODELOCK_XATTR) {
-               CFS_LIST_HEAD(cancels);
+               struct list_head cancels = LIST_HEAD_INIT(cancels);
                int count;
 
                /* Without that packing would fail */
@@ -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;
         }
 }
@@ -879,7 +848,7 @@ int mdc_close(struct obd_export *exp, struct md_op_data *op_data,
                req_fmt = &RQF_MDS_RELEASE_CLOSE;
 
                /* allocate a FID for volatile file */
-               rc = mdc_fid_alloc(exp, &op_data->op_fid2, op_data);
+               rc = mdc_fid_alloc(NULL, exp, &op_data->op_fid2, op_data);
                if (rc < 0) {
                        CERROR("%s: "DFID" failed to allocate FID: %d\n",
                               obd->obd_name, PFID(&op_data->op_fid1), rc);
@@ -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);
@@ -1240,8 +1208,8 @@ static struct page *mdc_page_locate(struct address_space *mapping, __u64 *hash,
                                LASSERTF(*start <= *hash, "start = "LPX64
                                         ",end = "LPX64",hash = "LPX64"\n",
                                         *start, *end, *hash);
-                       CDEBUG(D_VFSTRACE, "page%lu [%llu %llu], hash"LPU64"\n",
-                              offset, *start, *end, *hash);
+                       CDEBUG(D_VFSTRACE, "offset %lx ["LPX64" "LPX64"],"
+                             " hash "LPX64"\n", offset, *start, *end, *hash);
                        if (*hash > *end) {
                                kunmap(page);
                                mdc_release_page(page, 0);
@@ -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,13 +1458,25 @@ 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;
-       struct inode            *dir = NULL;
+       struct inode            *dir = op_data->op_data;
        struct address_space    *mapping;
        struct lu_dirpage       *dp;
        __u64                   start = 0;
@@ -1517,18 +1490,10 @@ static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data,
 
        *ppage = NULL;
 
-       if (op_data->op_mea1 != NULL) {
-               __u32 index = op_data->op_stripe_offset;
-
-               dir = op_data->op_mea1->lsm_md_oinfo[index].lmo_root;
-       } else {
-               dir = op_data->op_data;
-       }
        LASSERT(dir != NULL);
-
        mapping = dir->i_mapping;
 
-       rc = mdc_intent_lock(exp, op_data, NULL, 0, &it, 0, &enq_req,
+       rc = mdc_intent_lock(exp, op_data, &it, &enq_req,
                             cb_op->md_blocking_ast, 0);
        if (enq_req != NULL)
                ptlrpc_req_finished(enq_req);
@@ -1542,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);
@@ -1604,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);
@@ -1616,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
 
                /*
@@ -1639,149 +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;
-       ENTRY;
-
-       CDEBUG(D_INFO, DFID "offset = "LPU64"\n", PFID(&op_data->op_fid1),
-              op_data->op_hash_offset);
-
-       *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);
-
-       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)
-                       break;
-       }
-
-       /* If it can not find entry in current page, try next page. */
-       if (ent == NULL) {
-               __u64 orig_offset = op_data->op_hash_offset;
-
-               if (le64_to_cpu(dp->ldp_hash_end) == MDS_DIR_END_OFF) {
-                       mdc_release_page(page, 0);
-                       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);
-               }
-
-               op_data->op_hash_offset = orig_offset;
-       }
-
-       *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,
@@ -2407,7 +2229,7 @@ static int mdc_quotactl(struct obd_device *unused, struct obd_export *exp,
 static int mdc_ioc_swap_layouts(struct obd_export *exp,
                                struct md_op_data *op_data)
 {
-       CFS_LIST_HEAD(cancels);
+       struct list_head cancels = LIST_HEAD_INIT(cancels);
        struct ptlrpc_request   *req;
        int                      rc, count;
        struct mdc_swap_layouts *msl, *payload;
@@ -2473,7 +2295,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) {
@@ -2895,93 +2718,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)
 {
@@ -3067,13 +2803,13 @@ static int mdc_import_event(struct obd_device *obd, struct obd_import *imp,
         RETURN(rc);
 }
 
-int mdc_fid_alloc(struct obd_export *exp, struct lu_fid *fid,
-                  struct md_op_data *op_data)
+int mdc_fid_alloc(const struct lu_env *env, struct obd_export *exp,
+                 struct lu_fid *fid, struct md_op_data *op_data)
 {
-        struct client_obd *cli = &exp->exp_obd->u.cli;
-        struct lu_client_seq *seq = cli->cl_seq;
-        ENTRY;
-        RETURN(seq_client_alloc_fid(NULL, seq, fid));
+       struct client_obd *cli = &exp->exp_obd->u.cli;
+       struct lu_client_seq *seq = cli->cl_seq;
+       ENTRY;
+       RETURN(seq_client_alloc_fid(env, seq, fid));
 }
 
 struct obd_uuid *mdc_get_uuid(struct obd_export *exp) {
@@ -3332,7 +3068,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);
@@ -3383,8 +3119,6 @@ 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,
@@ -3410,13 +3144,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,
@@ -3442,7 +3175,6 @@ int __init mdc_init(void)
                                   LUSTRE_MDC_NAME, NULL);
 }
 
-#ifdef __KERNEL__
 static void /*__exit*/ mdc_exit(void)
 {
         class_unregister_type(LUSTRE_MDC_NAME);
@@ -3454,4 +3186,3 @@ MODULE_LICENSE("GPL");
 
 module_init(mdc_init);
 module_exit(mdc_exit);
-#endif