Whamcloud - gitweb
b=20562 increase LUSTRE_SEQ_META_WIDTH to keep FLD compact
[fs/lustre-release.git] / lustre / liblustre / dir.c
index 0e4b61c..3db0c39 100644 (file)
@@ -1,24 +1,41 @@
 /* -*- 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.
  *
- *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
+ * 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.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ * 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).
  *
- *   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.
+ * 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 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.
+ * 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.
  *
- *   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.
+ * 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/liblustre/dir.c
+ *
+ * Lustre Light directory handling
  */
 
 #define DEBUG_SUBSYSTEM S_LLITE
 #include <file.h>
 #endif
 
-#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)
 #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 */
 
@@ -83,13 +92,14 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page)
                            &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)
@@ -120,10 +130,10 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page)
         return rc;
 }
 
-static struct page *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)
 {
-        struct page *page;
+        cfs_page_t *page;
         int rc;
         ENTRY;
 
@@ -182,23 +192,24 @@ static int filldir(char *buf, int buflen,
         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;
         int shift;
+        __u16 type;
         ENTRY;
 
         liblustre_wait_event(0);
@@ -225,9 +236,9 @@ ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
                 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;
@@ -259,10 +270,10 @@ ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
                                 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);
+                                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);
@@ -297,7 +308,7 @@ ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep,
                                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);