/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * Lustre Light directory handling
+ * GPL HEADER START
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
*
- * Copyright (c) 2002-2004 Cluster File Systems, Inc.
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
*
- * This file is part of Lustre, http://www.lustre.org.
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
- * Lustre is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
*
- * Lustre is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * lustre/liblustre/dir.c
*
- * You should have received a copy of the GNU General Public License
- * along with Lustre; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Lustre Light directory handling
*/
#define DEBUG_SUBSYSTEM S_LLITE
#undef LIST_HEAD
-#ifdef HAVE_ASM_TYPES_H
-#include <asm/types.h>
-#elif defined(HAVE_SYS_TYPES_H)
-#include <sys/types.h>
-#endif
-
#ifdef HAVE_LINUX_UNISTD_H
#include <linux/unistd.h>
#elif defined(HAVE_UNISTD_H)
&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, inode};
+ 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,
+ &op_data, &lockh, NULL, 0, NULL,
LDLM_FL_CANCEL_ON_BLOCK);
request = (struct ptlrpc_request *)it.d.lustre.it_data;
if (request)
return rc;
}
-static struct page *llu_dir_read_page(struct inode *ino, __u32 hash,
+static cfs_page_t *llu_dir_read_page(struct inode *ino, __u32 hash,
int exact, struct ll_dir_chain *chain)
{
- struct page *page;
+ cfs_page_t *page;
int rc;
ENTRY;
return page;
}
-enum {
- EXT2_FT_UNKNOWN,
- EXT2_FT_REG_FILE,
- EXT2_FT_DIR,
- EXT2_FT_CHRDEV,
- EXT2_FT_BLKDEV,
- EXT2_FT_FIFO,
- EXT2_FT_SOCK,
- EXT2_FT_SYMLINK,
- EXT2_FT_MAX
-};
-
-static unsigned char ext2_filetype_table[EXT2_FT_MAX] = {
- [EXT2_FT_UNKNOWN] DT_UNKNOWN,
- [EXT2_FT_REG_FILE] DT_REG,
- [EXT2_FT_DIR] DT_DIR,
- [EXT2_FT_CHRDEV] DT_CHR,
- [EXT2_FT_BLKDEV] DT_BLK,
- [EXT2_FT_FIFO] DT_FIFO,
- [EXT2_FT_SOCK] DT_SOCK,
- [EXT2_FT_SYMLINK] DT_LNK,
-};
+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))
const char *name, int namelen, loff_t offset,
ino_t ino, unsigned int d_type, int *filled)
{
- struct dirent64 *dirent = (struct dirent64 *) (buf + *filled);
+ cfs_dirent_t *dirent = (cfs_dirent_t *) (buf + *filled);
+ cfs_dirent_t holder;
int reclen = ROUND_UP64(NAME_OFFSET(dirent) + namelen + 1);
+ /*
+ * @buf is not guaranteed to be properly aligned. To work around,
+ * first fill stack-allocated @holder, then copy @holder into @buf by
+ * memmove().
+ */
+
/* check overflow */
if ((*filled + reclen) > buflen)
return 1;
- dirent->d_ino = ino;
- dirent->d_off = offset;
- dirent->d_reclen = reclen;
-#ifndef _AIX
- dirent->d_type = (unsigned short) d_type;
+ holder.d_ino = ino;
+#ifdef _DIRENT_HAVE_D_OFF
+ holder.d_off = offset;
+#endif
+ holder.d_reclen = reclen;
+#ifdef _DIRENT_HAVE_D_TYPE
+ holder.d_type = (unsigned short) d_type;
#endif
+ /* gcc unrolls memcpy() of structs into field-wise assignments,
+ * assuming proper alignment. Humor it. */
+ (*memmover)(dirent, &holder, NAME_OFFSET(dirent));
memcpy(dirent->d_name, name, namelen);
dirent->d_name[namelen] = 0;
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);
struct intnl_stat *st = llu_i2stat(dir);
loff_t pos = *basep;
struct ll_dir_chain chain;
- struct page *page;
+ cfs_page_t *page;
int filled = 0;
int rc;
int done;
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 next;