-/* -*- 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.
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2004, 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/
#include <fcntl.h>
#include <sys/queue.h>
-#include <sysio.h>
-#ifdef HAVE_XTIO_H
-#include <xtio.h>
-#endif
-#include <fs.h>
-#include <mount.h>
-#include <inode.h>
-#ifdef HAVE_FILE_H
-#include <file.h>
-#endif
-
-#undef LIST_HEAD
-
#ifdef HAVE_LINUX_UNISTD_H
#include <linux/unistd.h>
#elif defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
-#include <dirent.h>
#include "llite_lib.h"
+#include <dirent.h>
/* (new) readdir implementation overview can be found in lustre/llite/dir.c */
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) {
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);
}
ldlm_lock_dump_handle(D_OTHER, &lockh);
- offset = (__u64)hash_x_index(page->index);
- rc = md_readpage(sbi->ll_md_exp, &lli->lli_fid, NULL,
- offset, page, &request);
+ op_data.op_offset = (__u64)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, __u32 hash,
- int exact, struct ll_dir_chain *chain)
+static cfs_page_t *llu_dir_read_page(struct inode *ino, __u64 hash,
+ int exact, struct ll_dir_chain *chain)
{
cfs_page_t *page;
int rc;
OBD_PAGE_ALLOC(page, 0);
if (!page)
RETURN(ERR_PTR(-ENOMEM));
- page->index = hash_x_index(hash);
+ page->index = hash_x_index(hash, 0);
rc = llu_dir_do_readpage(ino, page);
if (rc) {
return 0;
}
-/*
+/*
* TODO: much of the code here is similar/identical to llite ll_readdir().
* These code can be factored out and shared in a common module.
*/
-ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
+ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
char *buf, size_t nbytes)
{
struct llu_inode_info *lli = llu_i2info(dir);
int filled = 0;
int rc;
int done;
- int shift;
+ __u16 type;
ENTRY;
liblustre_wait_event(0);
RETURN(0);
}
- if (pos == DIR_END_OFF)
+ if (pos == MDS_DIR_END_OFF)
/*
* end-of-file.
*/
rc = 0;
done = 0;
- shift = 0;
ll_dir_chain_init(&chain);
page = llu_dir_read_page(dir, pos, 0, &chain);
struct lu_dirent *ent;
if (!IS_ERR(page)) {
- /*
+ /*
* If page is empty (end of directoryis reached),
- * use this value.
+ * use this value.
*/
- __u64 hash = DIR_END_OFF;
+ __u64 hash = MDS_DIR_END_OFF;
__u64 next;
dp = page->addr;
char *name;
int namelen;
struct lu_fid fid;
- ino_t ino;
+ __u64 ino;
hash = le64_to_cpu(ent->lde_hash);
namelen = le16_to_cpu(ent->lde_namelen);
fid = ent->lde_fid;
name = ent->lde_name;
fid_le_to_cpu(&fid, &fid);
- ino = llu_fid_build_ino(llu_i2sbi(dir), &fid);
-
+ ino = cl_fid_build_ino(&fid, 0);
+ type = ll_dirent_type_get(ent);
done = filldir(buf, nbytes, name, namelen,
- (loff_t)hash, ino, DT_UNKNOWN,
+ (loff_t)hash, ino, type,
&filled);
}
next = le64_to_cpu(dp->ldp_hash_end);
OBD_PAGE_FREE(page);
if (!done) {
pos = next;
- if (pos == DIR_END_OFF)
+ if (pos == MDS_DIR_END_OFF)
/*
* End of directory reached.
*/
PFID(&lli->lli_fid), (unsigned long)pos, rc);
}
}
- lli->lli_dir_pos = (loff_t)(__s32)pos;
+ lli->lli_dir_pos = (loff_t)pos;
*basep = lli->lli_dir_pos;
out:
ll_dir_chain_fini(&chain);