-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#define DEBUG_SUBSYSTEM S_LLITE
-#include <unistd.h>
-#include <stdlib.h>
+#include <errno.h>
+#include <stddef.h>
#include <string.h>
-#include <assert.h>
-#include <time.h>
-#include <sys/types.h>
#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/queue.h>
-
-#ifdef HAVE_LINUX_UNISTD_H
-#include <linux/unistd.h>
-#elif defined(HAVE_UNISTD_H)
-#include <unistd.h>
-#endif
-
-
+#include <sys/types.h>
+#include <libcfs/libcfs.h>
+#include <lustre/lustre_idl.h>
+#include <liblustre.h>
+#include <lclient.h>
+#include <lustre_dlm.h>
+#include <lustre_lite.h>
+#include <lustre_net.h>
+#include <lustre_req_layout.h>
+#include <obd.h>
+#include <obd_class.h>
+#include <obd_support.h>
#include "llite_lib.h"
#include <dirent.h>
/* (new) readdir implementation overview can be found in lustre/llite/dir.c */
-
static int llu_dir_do_readpage(struct inode *inode, struct page *page)
{
struct llu_inode_info *lli = llu_i2info(inode);
struct lookup_intent it = { .it_op = IT_READDIR };
struct md_op_data op_data = {{ 0 }};
ldlm_policy_data_t policy = { .l_inodebits = { MDS_INODELOCK_UPDATE } };
- __u64 offset;
int rc = 0;
ENTRY;
+ llu_prep_md_op_data(&op_data, inode, NULL, NULL, 0, 0, LUSTRE_OPC_ANY);
rc = md_lock_match(sbi->ll_md_exp, LDLM_FL_BLOCK_GRANTED,
&lli->lli_fid, LDLM_IBITS, &policy, LCK_CR, &lockh);
if (!rc) {
- struct ldlm_enqueue_info einfo = {LDLM_IBITS, LCK_CR,
- llu_md_blocking_ast, ldlm_completion_ast, NULL, NULL,
- inode};
-
- llu_prep_md_op_data(&op_data, inode, NULL, NULL, 0, 0,
- LUSTRE_OPC_ANY);
-
- rc = md_enqueue(sbi->ll_md_exp, &einfo, &it,
- &op_data, &lockh, NULL, 0, NULL,
- LDLM_FL_CANCEL_ON_BLOCK);
+ struct ldlm_enqueue_info einfo = {
+ .ei_type = LDLM_IBITS,
+ .ei_mode = LCK_CR,
+ .ei_cb_bl = llu_md_blocking_ast,
+ .ei_cb_cp = ldlm_completion_ast,
+ .ei_cbdata = inode,
+ };
+
+ rc = md_enqueue(sbi->ll_md_exp, &einfo, NULL, &it, &op_data,
+ &lockh, LDLM_FL_CANCEL_ON_BLOCK);
request = (struct ptlrpc_request *)it.d.lustre.it_data;
if (request)
ptlrpc_req_finished(request);
}
ldlm_lock_dump_handle(D_OTHER, &lockh);
- offset = (__u64)hash_x_index(page->index, 0);
- rc = md_readpage(sbi->ll_md_exp, &lli->lli_fid, NULL,
- offset, page, &request);
+ op_data.op_hash_offset = hash_x_index(page->index, 0);
+ op_data.op_npages = 1;
+ rc = md_readpage(sbi->ll_md_exp, &op_data, &page, &request);
if (!rc) {
body = req_capsule_server_get(&request->rq_pill, &RMF_MDT_BODY);
LASSERT(body != NULL); /* checked by md_readpage() */
return rc;
}
-static cfs_page_t *llu_dir_read_page(struct inode *ino, __u64 hash,
+static struct page *llu_dir_read_page(struct inode *ino, __u64 hash,
int exact, struct ll_dir_chain *chain)
{
- cfs_page_t *page;
+ struct page *page;
int rc;
ENTRY;
return page;
}
-void *(*memmover)(void *, const void *, size_t) = memmove;
+static void *(*memmover)(void *, const void *, size_t) = memmove;
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
#define ROUND_UP64(x) (((x)+sizeof(__u64)-1) & ~(sizeof(__u64)-1))
-static int filldir(char *buf, int buflen,
- const char *name, int namelen, loff_t offset,
- ino_t ino, unsigned int d_type, int *filled)
+static int filldir(char *buf, int buflen, const char *name, int namelen,
+ loff_t offset, ino_t ino, unsigned int d_type, int *filled)
{
- cfs_dirent_t *dirent = (cfs_dirent_t *) (buf + *filled);
- cfs_dirent_t holder;
- int reclen = ROUND_UP64(NAME_OFFSET(dirent) + namelen + 1);
+ struct intnl_dirent *dirent = (struct intnl_dirent *)(buf + *filled);
+ struct intnl_dirent holder;
+ int reclen = ROUND_UP64(NAME_OFFSET(dirent) + namelen + 1);
/*
* @buf is not guaranteed to be properly aligned. To work around,
struct intnl_stat *st = llu_i2stat(dir);
loff_t pos = *basep;
struct ll_dir_chain chain;
- cfs_page_t *page;
+ struct page *page;
int filled = 0;
int rc;
int done;
- int shift;
__u16 type;
ENTRY;
rc = 0;
done = 0;
- shift = 0;
ll_dir_chain_init(&chain);
page = llu_dir_read_page(dir, pos, 0, &chain);