[Ocfs-commits] manish commits r8 - in trunk: . ocfs2/Common
ocfs2/Common/inc ocfs2/Linux ocfs2/Linux/inc vendor/redhat
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Tue Sep 14 16:21:59 CDT 2004
Author: manish
Date: 2004-09-14 16:21:57 -0500 (Tue, 14 Sep 2004)
New Revision: 8
Modified:
trunk/configure.in
trunk/ocfs2/Common/inc/ocfscom.h
trunk/ocfs2/Common/inc/ocfsdef.h
trunk/ocfs2/Common/inc/ocfsdisk.h
trunk/ocfs2/Common/inc/ocfsgencreate.h
trunk/ocfs2/Common/inc/ocfsgendirnode.h
trunk/ocfs2/Common/inc/ocfsgenmisc.h
trunk/ocfs2/Common/ocfsgenalloc.c
trunk/ocfs2/Common/ocfsgencreate.c
trunk/ocfs2/Common/ocfsgendirnode.c
trunk/ocfs2/Common/ocfsgendlm.c
trunk/ocfs2/Common/ocfsgenmisc.c
trunk/ocfs2/Linux/inc/ocfsiosup.h
trunk/ocfs2/Linux/ocfsioctl.c
trunk/ocfs2/Linux/ocfsiosup.c
trunk/ocfs2/Linux/ocfsmain.c
trunk/ocfs2/Linux/ocfsproc.c
trunk/vendor/redhat/ocfs-2.4.18-e.spec.in
Log:
Sync
Modified: trunk/configure.in
===================================================================
--- trunk/configure.in 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/configure.in 2004-09-14 21:21:57 UTC (rev 8)
@@ -8,7 +8,7 @@
# Adjust these for the software version.
MAJOR_VERSION=1
MINOR_VERSION=0
-MICRO_VERSION=12
+MICRO_VERSION=13
EXTRA_VERSION=PROD1
# Adjust this only to bump the RPM packaging version
Modified: trunk/ocfs2/Common/inc/ocfscom.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfscom.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfscom.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -148,10 +148,6 @@
i->u.generic_ip = (void *)o; \
} while (0)
-#define FIRST_FILE_ENTRY(dir) ((char *) ((char *)dir)+OCFS_SECTOR_SIZE)
-#define FILEENT(dir,idx) (ocfs_file_entry *) ( ((char *)dir) + \
- ((dir->index[idx]+1) * OCFS_SECTOR_SIZE))
-
#define IS_FE_DELETED(_flg) \
(!(_flg) || \
((_flg) & OCFS_SYNC_FLAG_MARK_FOR_DELETION) || \
Modified: trunk/ocfs2/Common/inc/ocfsdef.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsdef.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfsdef.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -82,6 +82,39 @@
(k) = ((k) >= 1) ? ((k) - 1) : (k); \
} while(0)
+enum {
+ BY_INDEX,
+ BY_OFFSET
+};
+
+/*
+ * FILEENT()
+ * index = true if idx is index value
+ * index = false if idx is offset
+ */
+static inline ocfs_file_entry * FILEENT (ocfs_directory *dir, __u8 idx, int mode)
+{
+ ocfs_dir_node *dirn = (ocfs_dir_node *)dir->d_page[0];
+ __u8 off = (mode == BY_INDEX) ? (dirn->index[idx] + 1) : idx + 1;
+ __u8 slot = off >> dir->d_entinbits;
+ __u8 inslot = off & dir->d_entmask;
+
+ OCFS_ASSERT (slot < dir->d_pagecnt);
+ OCFS_ASSERT (inslot < dir->d_entperpage);
+
+ return (ocfs_file_entry *) ((dir->d_page[slot]) + (inslot * OCFS_SECTOR_SIZE));
+}
+
+static inline unsigned int num_in_bits(unsigned int size)
+{
+ unsigned int bits = 0;
+ do {
+ bits++;
+ size >>= 1;
+ } while (size > 1);
+ return bits;
+}
+
#ifdef LOCAL_ALLOC
#define OCFS_FILE_NUM_TO_SYSFILE_TYPE(num) ( (num >= 0 && num < OCFS_VOL_BITMAP_FILE + OCFS_MAXIMUM_NODES) ? \
num/OCFS_MAXIMUM_NODES : OCFS_INVALID_SYSFILE )
@@ -419,7 +452,6 @@
kmem_cache_t *ofile_cache;
kmem_cache_t *fe_cache;
kmem_cache_t *lockres_cache;
- kmem_cache_t *dirnode_cache;
__u32 flags;
__u32 pref_node_num; /* preferred... osb has the real one */
ocfs_guid guid; /* uniquely identifies a node */
@@ -434,6 +466,10 @@
#ifdef OCFS_LINUX_MEM_DEBUG
struct list_head item_list;
#endif
+ __u32 g_pagecnt; /* num of pages in dirnode */
+ __u32 g_entperpage; /* num of fe's in a page */
+ __u32 g_entinbits; /* in bits */
+ __u32 g_entmask; /* in mask */
atomic_t cnt_lockres; /* count of allocated lockres */
ocfs_dlm_stats net_reqst_stats; /* stats of netdlm vote requests */
ocfs_dlm_stats net_reply_stats; /* stats of netdlm vote reponses */
Modified: trunk/ocfs2/Common/inc/ocfsdisk.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsdisk.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfsdisk.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -156,6 +156,20 @@
OCFS_GCC_ATTR_PACKALGN
ocfs_dir_node; // END CLASS
+/*
+ * Mallocing 128K (for dirnodes) in kernel space is problematic.
+ * So to handle r/w dirnodes, ocfs_directory has been created. It contains
+ * pointers to PAGE_SIZE blocks, enough to read an entire dirnode.
+ */
+typedef struct _ocfs_directory
+{
+ __u32 d_pagecnt;
+ __u32 d_entperpage;
+ __u32 d_entinbits;
+ __u32 d_entmask;
+ __u8 *d_page[OCFS_DEFAULT_DIR_NODE_SIZE / PAGE_SIZE];
+} ocfs_directory;
+
typedef struct _ocfs_vol_node_map
{
__u64 time[OCFS_MAXIMUM_NODES];
Modified: trunk/ocfs2/Common/inc/ocfsgencreate.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsgencreate.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfsgencreate.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -63,8 +63,8 @@
ocfs_inode * oin,
__u64 file_size, __u64 * file_off, struct iattr *attr);
-int ocfs_get_dirnode(ocfs_super *osb, ocfs_dir_node *lockn, __u64 lockn_off,
- ocfs_dir_node *dirn, bool *invalid_dirnode);
+int ocfs_get_directory(ocfs_super *osb, ocfs_dir_node *lockn, __u64 lockn_off,
+ ocfs_directory *dir, bool *invalid_dirnode);
int ocfs_create_directory (ocfs_super * osb, __u64 parent_off, ocfs_file_entry * fe);
Modified: trunk/ocfs2/Common/inc/ocfsgendirnode.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsgendirnode.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfsgendirnode.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -29,7 +29,7 @@
void ocfs_print_file_entry (ocfs_file_entry * fe);
-void ocfs_print_dir_node (ocfs_super * osb, ocfs_dir_node * DirNode);
+void ocfs_print_directory (ocfs_super * osb, ocfs_directory * dir);
int ocfs_alloc_node_block (ocfs_super * osb,
__u64 FileSize,
@@ -46,60 +46,39 @@
int ocfs_recover_dir_node (ocfs_super * osb,
__u64 OrigDirNodeOffset, __u64 SavedDirNodeOffset);
-#define ocfs_read_dir_node(__osb, __dirn, __off) \
- ocfs_read_disk(__osb, __dirn, (__osb)->vol_layout.dir_node_size, __off)
+int ocfs_write_force_directory (ocfs_super * osb, ocfs_directory * dir, __s32 fe_ind);
-int ocfs_write_force_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode, __s32 IndexFileEntry);
+int ocfs_write_directory (ocfs_super * osb, ocfs_directory * dir, __s32 fe_ind);
-int ocfs_write_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode, __s32 IndexFileEntry);
+bool ocfs_walk_directory (ocfs_super * osb, ocfs_directory * dir,
+ ocfs_file_entry * found_fe, ocfs_file * OFile);
-bool ocfs_walk_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode,
- ocfs_file_entry * found_fe, ocfs_file * OFile);
+bool ocfs_search_directory (ocfs_super * osb, ocfs_directory * dir,
+ struct qstr * SearchName, ocfs_file_entry * found_fe,
+ ocfs_file * OFile);
-bool ocfs_search_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode,
- struct qstr * SearchName,
- ocfs_file_entry * found_fe, ocfs_file * OFile);
+bool ocfs_find_index (ocfs_super * osb, ocfs_directory * dir,
+ struct qstr * FileName, int *Index);
-bool ocfs_find_index (ocfs_super * osb,
- ocfs_dir_node * DirNode, struct qstr * FileName, int *Index);
+int ocfs_reindex_directory (ocfs_super * osb, __u64 diroff, ocfs_directory * dir);
-int ocfs_reindex_dir_node (ocfs_super * osb, __u64 DirNodeOffset, ocfs_dir_node * DirNode);
+int ocfs_insert_directory (ocfs_super * osb, ocfs_directory * dir,
+ ocfs_file_entry * InsertEntry, ocfs_dir_node * LockNode,
+ __s32 * IndexOffset);
-int ocfs_insert_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode,
- ocfs_file_entry * InsertEntry,
- ocfs_dir_node * LockNode, __s32 * IndexOffset);
-
int ocfs_del_file_entry (ocfs_super * osb,
ocfs_file_entry * EntryToDel, ocfs_dir_node * LockNode);
-int ocfs_insert_file (ocfs_super * osb, ocfs_dir_node * DirNode,
+int ocfs_insert_file (ocfs_super * osb, ocfs_directory * dir,
ocfs_file_entry * InsertEntry, ocfs_dir_node * LockNode,
ocfs_lock_res * LockResource, bool invalid_dirnode);
-int ocfs_validate_dir_index (ocfs_super *osb, ocfs_dir_node *dirnode);
+int ocfs_validate_dir_index (ocfs_super *osb, ocfs_directory *dir);
-int ocfs_validate_num_del (ocfs_super *osb, ocfs_dir_node *dirnode);
+int ocfs_validate_num_del (ocfs_super *osb, ocfs_directory *dir);
-static inline int ocfs_validate_dirnode (ocfs_super *osb, ocfs_dir_node *dirn)
-{
- int ret = 0;
+int ocfs_validate_directory (ocfs_super *osb, ocfs_directory *dir);
- if (!IS_VALID_DIR_NODE (dirn))
- ret = -EFAIL;
-
- if (ret == 0)
- ret = ocfs_validate_dir_index (osb, dirn);
- if (ret == 0)
- ret = ocfs_validate_num_del (osb, dirn);
-
- return ret;
-}
-
static inline void ocfs_update_hden (ocfs_dir_node *lockn, ocfs_dir_node *dirn,
__u64 off)
{
Modified: trunk/ocfs2/Common/inc/ocfsgenmisc.h
===================================================================
--- trunk/ocfs2/Common/inc/ocfsgenmisc.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/inc/ocfsgenmisc.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -57,6 +57,10 @@
int ocfs_is_dir_empty (ocfs_super * osb, ocfs_dir_node * dirnode, bool * empty);
+ocfs_directory * ocfs_allocate_directory (void);
+
+void ocfs_release_directory (ocfs_directory *dir);
+
/* sorry about all the macros, but file and line are important */
#ifndef USERSPACE_TOOL
@@ -169,7 +173,7 @@
#define ocfs_release_ofile(of) \
do { \
if (of) { \
- ocfs_release_dirnode ((of)->curr_dir_buf); \
+ ocfs_release_directory ((of)->curr_dir_buf); \
ocfs_dbg_slab_free (OcfsGlobalCtxt.ofile_cache, (of)); \
} \
} while (0)
@@ -187,7 +191,7 @@
#define ocfs_release_ofile(of) \
do { \
if (of) { \
- ocfs_release_dirnode ((of)->curr_dir_buf); \
+ ocfs_release_directory ((of)->curr_dir_buf); \
kmem_cache_free (OcfsGlobalCtxt.ofile_cache, (of)); \
} \
} while (0)
@@ -249,41 +253,6 @@
} \
oin; }))
#endif
-
-/* dirnode macros */
-#ifdef OCFS_MEM_DBG
-#define ocfs_allocate_dirnode() \
-((ocfs_dir_node *)({ \
- ocfs_dir_node *_dn = NULL; \
- _dn = ocfs_dbg_slab_alloc (OcfsGlobalCtxt.dirnode_cache, __FILE__, __LINE__); \
- if (_dn) \
- memset (_dn, 0, OCFS_DEFAULT_DIR_NODE_SIZE); \
- _dn; }))
-
-#define ocfs_release_dirnode(_dn) \
- do { \
- if (_dn) { \
- ocfs_dbg_slab_free (OcfsGlobalCtxt.dirnode_cache, (_dn));\
- (_dn) = NULL; \
- } \
- } while (0)
-#else /* !OCFS_MEM_DBG */
-#define ocfs_allocate_dirnode() \
-((ocfs_dir_node *)({ \
- ocfs_dir_node *_dn = NULL; \
- _dn = kmem_cache_alloc (OcfsGlobalCtxt.dirnode_cache, GFP_NOFS);\
- if (_dn) \
- memset (_dn, 0, OCFS_DEFAULT_DIR_NODE_SIZE); \
- _dn; }))
-
-#define ocfs_release_dirnode(_dn) \
- do { \
- if (_dn) { \
- kmem_cache_free (OcfsGlobalCtxt.dirnode_cache, (_dn));\
- (_dn) = NULL; \
- } \
- } while (0)
-#endif
#endif /* !USERSPACE_TOOL */
@@ -350,17 +319,6 @@
if (x) \
ocfs_safefree(oin); })
-/* dirnode macros */
-#define ocfs_allocate_dirnode() \
-((ocfs_dir_node *)({ \
- ocfs_dir_node *_dn = NULL; \
- _dn = (ocfs_dir_node *)ocfs_malloc(OCFS_DEFAULT_DIR_NODE_SIZE);\
- if (_dn) \
- memset (_dn, 0, OCFS_DEFAULT_DIR_NODE_SIZE); \
- _dn; }))
-
-#define ocfs_release_dirnode(_dn) ocfs_safefree(_dn)
-
#endif /* USERSPACE_TOOL */
#endif /* _OCFSGENMISC_H_ */
Modified: trunk/ocfs2/Common/ocfsgenalloc.c
===================================================================
--- trunk/ocfs2/Common/ocfsgenalloc.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/ocfsgenalloc.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -171,9 +171,8 @@
goto finally;
}
- if (fileOffset == 0) {
- LOG_ERROR_ARGS ("offset=0, file=%s", FileEntry->filename);
- }
+ LOG_TRACE_ARGS ("offset=%u.%u, file=%s", HILO(fileOffset),
+ FileEntry->filename);
k = ExtentHeader->next_free_ext;
ExtentHeader->extents[k].file_off = FileEntry->alloc_size;
@@ -196,9 +195,8 @@
goto finally;
}
- if (fileOffset == 0) {
- LOG_ERROR_ARGS ("offset=0, file=%s", FileEntry->filename);
- }
+ LOG_TRACE_ARGS ("offset=%u.%u, file=%s", HILO(fileOffset),
+ FileEntry->filename);
k = FileEntry->next_free_ext;
FileEntry->extents[k].file_off = FileEntry->alloc_size;
Modified: trunk/ocfs2/Common/ocfsgencreate.c
===================================================================
--- trunk/ocfs2/Common/ocfsgencreate.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/ocfsgencreate.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -577,7 +577,8 @@
return status;
} /* ocfs_create_oin_from_entry */
-/* ocfs_find_files_on_disk()
+/*
+ * ocfs_find_files_on_disk()
*
*/
int
@@ -587,7 +588,8 @@
ocfs_file_entry * fe, ocfs_file * ofile)
{
int status = -ENOENT;
- ocfs_dir_node *pDirNode = NULL;
+ ocfs_dir_node *dirn = NULL;
+ ocfs_directory *dir = NULL;
__u64 thisDirNode, lockId;
int tmpstat;
bool bRet;
@@ -620,22 +622,24 @@
if ((ofile == NULL)
|| ((ofile != NULL) && (ofile->curr_dir_buf == NULL))) {
- pDirNode = ocfs_allocate_dirnode();
- if (pDirNode == NULL) {
+ dir = ocfs_allocate_directory();
+ if (dir == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
if (ofile != NULL) {
- ofile->curr_dir_buf = pDirNode;
+ ofile->curr_dir_buf = dir;
}
} else {
- pDirNode = ofile->curr_dir_buf;
+ dir = ofile->curr_dir_buf;
}
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+
if ((ofile != NULL) && (ofile->curr_dir_off > 0)) {
thisDirNode = ofile->curr_dir_off;
- if (pDirNode->node_disk_off == thisDirNode) {
+ if (dirn->node_disk_off == thisDirNode) {
bReadDirNode = false;
}
} else {
@@ -643,9 +647,8 @@
}
if (bReadDirNode) {
- status = ocfs_read_dir_node (osb, pDirNode, thisDirNode);
+ status = ocfs_read_directory (osb, dir, thisDirNode);
if (status < 0) {
- /* Volume should be disabled in this case */
LOG_ERROR_STATUS (status);
goto leave;
}
@@ -657,36 +660,37 @@
/* directory for all files if it is not null, it means we want */
/* a particular file */
if (file_name == NULL) {
- bRet = ocfs_walk_dir_node (osb, pDirNode, fe, ofile);
+ bRet = ocfs_walk_directory (osb, dir, fe, ofile);
if (bRet)
status = 0;
} else {
- bRet = ocfs_search_dir_node (osb, pDirNode, file_name, fe, ofile);
+ bRet = ocfs_search_directory (osb, dir, file_name, fe, ofile);
if (bRet)
status = 0;
}
if (status >= 0 && (fe->attribs & OCFS_ATTRIB_FILE_CDSL)) {
- /* Return the relevant CDSL for this node */
+#ifdef CDSL_ENABLED
ocfs_find_create_cdsl (osb, fe);
+#else
+ status = -EINVAL;
+#endif
}
- leave:
+leave:
if (lock_acq) {
tmpstat = ocfs_release_lock (osb, lockId, OCFS_DLM_SHARED_LOCK,
FLAG_DIR, lockres, dirfe);
if (tmpstat < 0) {
LOG_ERROR_STATUS (tmpstat);
- /* Volume should be disabled in this case */
}
}
ocfs_release_file_entry(dirfe);
ocfs_put_lockres (lockres);
- if (ofile == NULL && pDirNode) {
- ocfs_release_dirnode (pDirNode);
- }
+ if (ofile == NULL && dir)
+ ocfs_release_directory (dir);
LOG_EXIT_STATUS (status);
return status;
@@ -919,9 +923,6 @@
goto leave;
}
- LOG_TRACE_ARGS ("sector=%u.%u, name=%s\n", HI (fe->this_sector),
- LO (fe->this_sector), fe->filename);
-
/* Update the disk as the other node will not see this file directory */
if (DISK_LOCK_FILE_LOCK (pLockNode) < OCFS_DLM_ENABLE_CACHE_LOCK) {
status = ocfs_force_put_file_entry (osb, fe, true);
@@ -932,7 +933,7 @@
}
if (index < pLockNode->num_ent_used) {
- status = ocfs_reindex_dir_node (osb, fe->dir_node_ptr, NULL);
+ status = ocfs_reindex_directory (osb, fe->dir_node_ptr, NULL);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
@@ -1415,19 +1416,21 @@
return status;
} /* ocfs_change_file_size */
-/* ocfs_get_dirnode()
+/* ocfs_get_directory()
*
*/
-int ocfs_get_dirnode(ocfs_super *osb, ocfs_dir_node *lockn, __u64 lockn_off,
- ocfs_dir_node *dirn, bool *invalid_dirnode)
+int ocfs_get_directory(ocfs_super *osb, ocfs_dir_node *lockn, __u64 lockn_off,
+ ocfs_directory *dir, bool *invalid_dirnode)
{
int status = 0;
__u64 node_off;
bool hden = false;
+ ocfs_dir_node *dirn = NULL;
LOG_ENTRY_ARGS ("(lockn_off=%u.%u)\n", HILO (lockn_off));
*invalid_dirnode = false;
+ dirn = (ocfs_dir_node *)dir->d_page[0];
if (lockn->head_del_ent_node != INVALID_NODE_POINTER) {
node_off = lockn->head_del_ent_node;
@@ -1439,13 +1442,13 @@
node_off = lockn->free_node_ptr;
}
- status = ocfs_read_dir_node (osb, dirn, node_off);
+ status = ocfs_read_directory (osb, dir, node_off);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
- status = ocfs_validate_dirnode (osb, dirn);
+ status = ocfs_validate_directory (osb, dir);
if (status >= 0) {
if (dirn->node_disk_off != lockn->head_del_ent_node)
goto leave;
@@ -1465,13 +1468,13 @@
while (1) {
*invalid_dirnode = false;
- status = ocfs_read_dir_node (osb, dirn, node_off);
+ status = ocfs_read_directory (osb, dir, node_off);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
- status = ocfs_validate_dirnode (osb, dirn);
+ status = ocfs_validate_directory (osb, dir);
if (status >= 0) {
if (dirn->num_ent_used < osb->max_dir_node_ent) {
if (hden)
@@ -1500,7 +1503,7 @@
leave:
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs_get_dirnode */
+} /* ocfs_get_directory */
/* ocfs_create_directory()
*
@@ -1509,10 +1512,11 @@
{
int status = 0;
int tmpstat;
- ocfs_file_entry *fileEntry = NULL;
- ocfs_dir_node *PDirNode = NULL;
- ocfs_dir_node *PNewDirNode = NULL;
+ ocfs_dir_node *dirn = NULL;
+ ocfs_dir_node *newdirn = NULL;
ocfs_dir_node *pLockNode = NULL;
+ ocfs_directory *dir = NULL;
+ ocfs_directory *newdir = NULL;
__u64 allocSize = 0;
__u64 bitmapOffset;
__u64 numClustersAlloc = 0;
@@ -1525,8 +1529,6 @@
LOG_ENTRY ();
- fileEntry = fe;
-
pLockNode = (ocfs_dir_node *) ocfs_allocate_file_entry ();
if (pLockNode == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
@@ -1562,69 +1564,62 @@
}
/* update the total allocation size here */
- fileEntry->alloc_size = osb->vol_layout.dir_node_size;
- fileEntry->extents[0].disk_off = bitmapOffset;
- fileEntry->file_size = osb->vol_layout.dir_node_size;
- fileEntry->next_del = INVALID_DIR_NODE_INDEX;
+ fe->alloc_size = osb->vol_layout.dir_node_size;
+ fe->extents[0].disk_off = bitmapOffset;
+ fe->file_size = osb->vol_layout.dir_node_size;
+ fe->next_del = INVALID_DIR_NODE_INDEX;
if (DISK_LOCK_FILE_LOCK (pLockNode) != OCFS_DLM_ENABLE_CACHE_LOCK)
- DISK_LOCK_FILE_LOCK (fileEntry) = OCFS_DLM_NO_LOCK;
+ DISK_LOCK_FILE_LOCK (fe) = OCFS_DLM_NO_LOCK;
- PDirNode = ocfs_allocate_dirnode();
- if (PDirNode == NULL) {
+ dir = ocfs_allocate_directory();
+ if (dir == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
- PNewDirNode = PDirNode;
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ newdir = dir;
+ newdirn = dirn;
- ocfs_initialize_dir_node (osb, PNewDirNode, bitmapOffset, fileOffset,
+ ocfs_initialize_dir_node (osb, newdirn, bitmapOffset, fileOffset,
osb->node_num);
- DISK_LOCK_CURRENT_MASTER (PNewDirNode) = osb->node_num;
- DISK_LOCK_FILE_LOCK (PNewDirNode) = OCFS_DLM_ENABLE_CACHE_LOCK;
- PNewDirNode->dir_node_flags |= DIR_NODE_FLAG_ROOT;
+ DISK_LOCK_CURRENT_MASTER (newdirn) = osb->node_num;
+ DISK_LOCK_FILE_LOCK (newdirn) = OCFS_DLM_ENABLE_CACHE_LOCK;
+ newdirn->dir_node_flags |= DIR_NODE_FLAG_ROOT;
- status = ocfs_write_metadata (osb, PNewDirNode,
- osb->vol_layout.dir_node_size,
- PNewDirNode->node_disk_off);
+ status = ocfs_write_directory (osb, newdir, -1);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
- // do we need to keep this???
- status = ocfs_write_dir_node (osb, PNewDirNode, -1);
- if (status < 0) {
- LOG_ERROR_STATUS (status);
- goto leave;
- }
-
if (pLockResource->lock_type != OCFS_DLM_ENABLE_CACHE_LOCK) {
- status = ocfs_write_force_dir_node (osb, PNewDirNode, -1);
+ status = ocfs_write_force_directory (osb, newdir, -1);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
}
- status = ocfs_get_dirnode(osb, pLockNode, parent_off, PDirNode,
- &invalid_dirnode);
+ status = ocfs_get_directory (osb, pLockNode, parent_off, dir,
+ &invalid_dirnode);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
if (DISK_LOCK_FILE_LOCK (pLockNode) != OCFS_DLM_ENABLE_CACHE_LOCK)
- DISK_LOCK_FILE_LOCK (fileEntry) = OCFS_DLM_NO_LOCK;
+ DISK_LOCK_FILE_LOCK (fe) = OCFS_DLM_NO_LOCK;
- OcfsQuerySystemTime (&DISK_LOCK_LAST_WRITE (fileEntry));
- OcfsQuerySystemTime (&DISK_LOCK_LAST_READ (fileEntry));
+ OcfsQuerySystemTime (&DISK_LOCK_LAST_WRITE (fe));
+ OcfsQuerySystemTime (&DISK_LOCK_LAST_READ (fe));
- DISK_LOCK_WRITER_NODE (fileEntry) = osb->node_num;
- DISK_LOCK_READER_NODE (fileEntry) = osb->node_num;
+ DISK_LOCK_WRITER_NODE (fe) = osb->node_num;
+ DISK_LOCK_READER_NODE (fe) = osb->node_num;
- status = ocfs_insert_file (osb, PDirNode, fileEntry, pLockNode,
+ status = ocfs_insert_file (osb, dir, fe, pLockNode,
pLockResource, invalid_dirnode);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -1634,7 +1629,7 @@
/* lock was released on disk in last locknode write */
bAcquiredLock = false;
- leave:
+leave:
if (bAcquiredLock) {
tmpstat = ocfs_release_lock (osb, lockId, OCFS_DLM_EXCLUSIVE_LOCK,
lockFlags, pLockResource,
@@ -1642,7 +1637,7 @@
if (tmpstat < 0)
LOG_ERROR_STATUS (tmpstat);
}
- ocfs_release_dirnode (PDirNode);
+ ocfs_release_directory (dir);
ocfs_release_file_entry ((ocfs_file_entry *) pLockNode);
ocfs_put_lockres (pLockResource);
LOG_EXIT_STATUS (status);
@@ -1657,7 +1652,7 @@
int status = 0;
int tmpstat;
ocfs_file_entry *fileEntry = NULL;
- ocfs_dir_node *PDirNode = NULL;
+ ocfs_directory *dirblk = NULL;
ocfs_dir_node *pLockNode = NULL;
__u64 lockId = 0;
ocfs_lock_res *pLockResource = NULL;
@@ -1668,9 +1663,6 @@
LOG_ENTRY_ARGS ("(osb=0x%p, poff=%u.%u, fe=0x%p)\n", osb,
HILO(parent_off), fe);
- /* Zero out the entry for the file and rewrite it back to the disk */
- /* Also, the other nodes should update their cache bitmap for file */
- /* ent to mark this one as free now. */
pLockNode = (ocfs_dir_node *) ocfs_allocate_file_entry ();
if (pLockNode == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
@@ -1694,14 +1686,14 @@
/* Change the name and write it back... */
fileEntry = fe;
- PDirNode = ocfs_allocate_dirnode();
- if (PDirNode == NULL) {
+ dirblk = ocfs_allocate_directory();
+ if (dirblk == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
- status = ocfs_get_dirnode(osb, pLockNode, parent_off, PDirNode,
- &invalid_dirnode);
+ status = ocfs_get_directory (osb, pLockNode, parent_off, dirblk,
+ &invalid_dirnode);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
@@ -1715,7 +1707,7 @@
fileEntry->next_del = INVALID_DIR_NODE_INDEX;
- status = ocfs_insert_file (osb, PDirNode, fileEntry, pLockNode,
+ status = ocfs_insert_file (osb, dirblk, fileEntry, pLockNode,
pLockResource, invalid_dirnode);
if (status < 0) {
LOG_ERROR_STATUS (status);
@@ -1725,7 +1717,7 @@
/* lock was released on disk in last locknode write */
bAcquiredLock = false;
- leave:
+leave:
if (bAcquiredLock) {
tmpstat = ocfs_release_lock (osb, lockId, OCFS_DLM_EXCLUSIVE_LOCK,
lockFlags, pLockResource,
@@ -1733,7 +1725,7 @@
if (tmpstat < 0)
LOG_ERROR_STATUS (tmpstat);
}
- ocfs_release_dirnode (PDirNode);
+ ocfs_release_directory (dirblk);
ocfs_release_file_entry ((ocfs_file_entry *) pLockNode);
ocfs_put_lockres (pLockResource);
LOG_EXIT_STATUS (status);
@@ -1880,7 +1872,7 @@
goto leave;
}
break;
-
+#ifdef CDSL_ENABLED
case FLAG_FILE_DELETE_CDSL:
status = ocfs_delete_cdsl (osb, parent_off, fe);
if (status < 0) {
@@ -1907,7 +1899,7 @@
goto leave;
}
break;
-
+#endif /* CDSL_ENABLED */
case FLAG_FILE_TRUNCATE:
status = ocfs_truncate_file (osb, *file_off, file_size, oin);
if (status < 0) {
@@ -1994,7 +1986,7 @@
return status;
} /* ocfs_initialize_oin */
-
+#ifdef CDSL_ENABLED
/*
* ocfs_create_delete_cdsl()
*
@@ -2277,6 +2269,7 @@
LOG_EXIT_STATUS (status);
return (status);
} /* ocfs_find_create_cdsl */
+#endif /* CDSL_ENABLED */
#ifdef UNUSED_CODE
@@ -2398,8 +2391,7 @@
} /* ocfs_check_lock_state */
#endif /* UNUSED_CODE */
-
-
+#ifdef CDSL_ENABLED
/*
* ocfs_delete_cdsl()
*
@@ -2806,8 +2798,8 @@
LOG_EXIT_STATUS (status);
return status;
} /* ocfs_create_cdsl */
+#endif /* CDSL_ENABLED */
-
/*
* ocfs_truncate_file()
*
Modified: trunk/ocfs2/Common/ocfsgendirnode.c
===================================================================
--- trunk/ocfs2/Common/ocfsgendirnode.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/ocfsgendirnode.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -35,38 +35,27 @@
#define OCFS_DEBUG_CONTEXT OCFS_DEBUG_CONTEXT_DIRINFO
/*
- * ocfs_print_file_entry()
+ * ocfs_print_directory()
*
*/
-void ocfs_print_file_entry (ocfs_file_entry * fe)
+void ocfs_print_directory (ocfs_super * osb, ocfs_directory * dir)
{
- LOG_TRACE_ARGS ("This fe has name %s\n", fe->filename);
-} /* ocfs_print_file_entry */
-
-/*
- * ocfs_print_dir_node()
- *
- */
-void ocfs_print_dir_node (ocfs_super * osb, ocfs_dir_node * DirNode)
-{
int i;
- ocfs_file_entry *pOrigFileEntry;
+ ocfs_file_entry *fe;
+ ocfs_dir_node *dirn;
- if (DirNode->dir_node_flags & DIR_NODE_FLAG_ROOT)
- LOG_TRACE_STR ("First dirnode of the dir");
+ dirn = (ocfs_dir_node *)dir->d_page[0];
- LOG_TRACE_ARGS ("signature: %s\n", DirNode->signature);
+ LOG_TRACE_ARGS ("sig=%s, ndo=%u.%u, ent=%u%s\n", dirn->signature,
+ HILO (dirn->node_disk_off), dirn->num_ent_used,
+ ((dirn->dir_node_flags & DIR_NODE_FLAG_ROOT) ?
+ ", rootnode" : " "));
- LOG_TRACE_ARGS ("node_disk_off: %u.%u\n", HILO (DirNode->node_disk_off));
-
- LOG_TRACE_ARGS ("num_ents: %u, num_ent_used: %u\n", DirNode->num_ents,
- DirNode->num_ent_used);
-
- for (i = 0; i < DirNode->num_ent_used; i++) {
- pOrigFileEntry = FILEENT (DirNode, i);
- LOG_TRACE_ARGS ("filename: %s\n", pOrigFileEntry->filename);
+ for (i = 0; i < dirn->num_ent_used; i++) {
+ fe = FILEENT (dir, i, BY_INDEX);
+ LOG_TRACE_ARGS ("name=%s\n", fe->filename);
}
-} /* ocfs_print_dir_node */
+} /* ocfs_print_directory */
/*
* ocfs_alloc_node_block()
@@ -755,46 +744,47 @@
#endif
/*
- * ocfs_write_force_dir_node()
+ * ocfs_write_force_directory()
*
*/
-int ocfs_write_force_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode, __s32 IndexFileEntry)
+int ocfs_write_force_directory (ocfs_super * osb, ocfs_directory * dir,
+ __s32 fe_ind)
{
int status = 0;
+ ocfs_dir_node *dirn = NULL;
+ __u8 *buf = NULL;
+ __u64 offset = 0;
LOG_ENTRY ();
- if (IndexFileEntry != -1) {
- /* Read in the Dir Node from the disk into the buffer supplied */
- status = ocfs_write_disk (osb,
- (__u8 *) (((__u8 *) DirNode) +
- ((IndexFileEntry +
- 1) * osb->sect_size)),
- osb->sect_size,
- DirNode->node_disk_off +
- ((IndexFileEntry +
- 1) * osb->sect_size));
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+
+ if (fe_ind != -1) {
+ buf = (__u8 *) FILEENT (dir, fe_ind, BY_OFFSET);
+ offset = dirn->node_disk_off +
+ ((fe_ind + 1) * osb->sect_size);
+
+ status = ocfs_write_disk (osb, buf, osb->sect_size, offset);
if (status < 0) {
LOG_ERROR_STATUS (status);
+ goto bail;
}
}
- /* Write the first sector last */
- status = ocfs_write_disk (osb, DirNode, osb->sect_size,
- DirNode->node_disk_off);
+ status = ocfs_write_disk (osb, dirn, osb->sect_size,
+ dirn->node_disk_off);
if (status < 0)
LOG_ERROR_STATUS (status);
-
+bail:
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs_write_force_dir_node */
+} /* ocfs_write_force_directory */
/*
- * ocfs_write_dir_node()
+ * ocfs_write_directory()
*
*/
-int ocfs_write_dir_node (ocfs_super * osb, ocfs_dir_node * DirNode, __s32 IndexFileEntry)
+int ocfs_write_directory (ocfs_super * osb, ocfs_directory * dir, __s32 fe_ind)
{
int status = 0;
__u64 offset;
@@ -802,26 +792,24 @@
__u8 *buffer;
bool bCacheWrite = false;
bool bFileCacheWrite = false;
+ ocfs_dir_node *dirn = NULL;
+ ocfs_file_entry *fe = NULL;
LOG_ENTRY ();
- if ((DISK_LOCK_CURRENT_MASTER (DirNode) == osb->node_num) &&
- (DISK_LOCK_FILE_LOCK (DirNode) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ if ((DISK_LOCK_CURRENT_MASTER (dirn) == osb->node_num) &&
+ (DISK_LOCK_FILE_LOCK (dirn) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
bCacheWrite = true;
}
- if (IndexFileEntry != -1) {
- ocfs_file_entry *fe = NULL;
-
- /* Read in the Dir Node from the disk into the buffer supplied */
-
- offset = DirNode->node_disk_off +
- ((IndexFileEntry + 1) * osb->sect_size);
+ if (fe_ind != -1) {
+ offset = dirn->node_disk_off + ((fe_ind + 1) * osb->sect_size);
size = (__u32) osb->sect_size;
- buffer = (__u8 *) (((__u8 *) DirNode) +
- ((IndexFileEntry + 1) * osb->sect_size));
- fe = (ocfs_file_entry *) buffer;
+ fe = FILEENT (dir, fe_ind, BY_OFFSET);
+ buffer = (__u8 *)fe;
+
if ((DISK_LOCK_CURRENT_MASTER (fe) == osb->node_num) &&
(DISK_LOCK_FILE_LOCK (fe) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
bFileCacheWrite = true;
@@ -832,60 +820,56 @@
status = ocfs_write_metadata (osb, buffer, size, offset);
if (status < 0) {
LOG_ERROR_STATUS (status);
+ goto bail;
}
-#if 0
- if (!bCacheWrite) {
- status =
- ocfs_write_disk (osb, buffer, size, offset);
- if (status < 0) {
- LOG_ERROR_STATUS (status);
- }
- }
-#endif
} else {
status = ocfs_write_disk (osb, buffer, size, offset);
if (status < 0) {
LOG_ERROR_STATUS (status);
+ goto bail;
}
}
}
/* Write the first sector last */
- offset = DirNode->node_disk_off;
+ offset = dirn->node_disk_off;
size = (__u32) OCFS_SECTOR_SIZE;
/* Write the dir node */
if (bCacheWrite) {
- status = ocfs_write_metadata (osb, DirNode, size, offset);
+ status = ocfs_write_metadata (osb, dirn, size, offset);
if (status < 0) {
LOG_ERROR_STATUS (status);
+ goto bail;
}
} else {
- status = ocfs_write_disk (osb, DirNode, size, offset);
+ status = ocfs_write_disk (osb, dirn, size, offset);
if (status < 0) {
LOG_ERROR_STATUS (status);
+ goto bail;
}
}
- IF_TRACE (ocfs_print_dir_node (osb, DirNode));
-
+ IF_TRACE (ocfs_print_directory (osb, dir));
+bail:
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs_write_dir_node */
+} /* ocfs_write_directory */
/*
- * ocfs_walk_dir_node()
+ * ocfs_walk_directory()
*
*/
-bool ocfs_walk_dir_node (ocfs_super * osb, ocfs_dir_node * DirNode,
- ocfs_file_entry * found_fe, ocfs_file * OFile)
+bool ocfs_walk_directory (ocfs_super * osb, ocfs_directory * dir,
+ ocfs_file_entry * found_fe, ocfs_file * OFile)
{
__u32 start;
__u32 i;
ocfs_file_entry *fe;
int status;
bool bRet = false;
+ ocfs_dir_node *dirn = NULL;
LOG_ENTRY ();
@@ -894,15 +878,16 @@
else
start = 0;
- if (!IS_VALID_DIR_NODE (DirNode)) {
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ if (!IS_VALID_DIR_NODE (dirn)) {
bRet = false;
goto bail;
}
while (1) {
/* Iterate thru this dirnode and find a matching entry */
- for (i = start; i < DirNode->num_ent_used; i++) {
- fe = FILEENT (DirNode, i);
+ for (i = start; i < dirn->num_ent_used; i++) {
+ fe = FILEENT (dir, i, BY_INDEX);
if (IS_FE_DELETED(fe->sync_flags) ||
(!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
@@ -910,37 +895,32 @@
}
/* Check to see if the name satisfies pattern */
- {
- if ((OFile == NULL)
- && (fe->attribs & OCFS_ATTRIB_DIRECTORY)) {
- continue;
- }
+ if ((OFile == NULL) &&
+ (fe->attribs & OCFS_ATTRIB_DIRECTORY))
+ continue;
- status = 0;
- memcpy ((void *) found_fe, (void *) fe,
- OCFS_SECTOR_SIZE);
+ status = 0;
+ memcpy ((void *) found_fe, (void *) fe, OCFS_SECTOR_SIZE);
- LOG_TRACE_ARGS
- ("Returning entry: %u, name: %s\n", i,
- fe->filename);
+ LOG_TRACE_ARGS ("Returning entry: %u, name: %s\n", i, fe->filename);
- if (OFile != NULL) {
- OFile->curr_dir_off =
- DirNode->node_disk_off;
- OFile->curr_byte_off = i + 1;
- }
+ if (OFile != NULL) {
+ OFile->curr_dir_off = dirn->node_disk_off;
+ OFile->curr_byte_off = i + 1;
+ }
- bRet = true;
+ bRet = true;
+ goto bail;
+ }
+
+ if (dirn->next_node_ptr != -1) {
+ status = ocfs_read_directory (osb, dir, dirn->next_node_ptr);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
goto bail;
}
- }
- if (DirNode->next_node_ptr != -1) {
- status =
- ocfs_read_dir_node (osb, DirNode,
- DirNode->next_node_ptr);
-
- if (!IS_VALID_DIR_NODE (DirNode)) {
+ if (!IS_VALID_DIR_NODE (dirn)) {
bRet = false;
goto bail;
}
@@ -953,31 +933,34 @@
}
if (OFile != NULL) {
- OFile->curr_dir_off = DirNode->node_disk_off;
+ OFile->curr_dir_off = dirn->node_disk_off;
OFile->curr_byte_off = i + 1;
}
- bail:
+bail:
LOG_EXIT_ULONG (bRet);
return bRet;
-} /* ocfs_walk_dir_node */
+} /* ocfs_walk_directory */
/*
* ocfs_search_dir_node()
*
*/
-bool ocfs_search_dir_node (ocfs_super * osb, ocfs_dir_node * DirNode,
- struct qstr * SearchName, ocfs_file_entry * found_fe,
- ocfs_file * OFile)
+bool ocfs_search_directory (ocfs_super * osb, ocfs_directory * dir,
+ struct qstr * SearchName, ocfs_file_entry * found_fe,
+ ocfs_file * OFile)
{
__u32 start;
__u32 index;
ocfs_file_entry *fe;
int status;
bool bRet = false;
+ ocfs_dir_node *dirn = NULL;
LOG_ENTRY ();
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+
if (OFile != NULL)
start = OFile->curr_byte_off;
else
@@ -987,15 +970,14 @@
while (1) {
/* Iterate thru this dirnode and find a matching entry */
- if (index < DirNode->num_ent_used) {
- if (ocfs_find_index (osb, DirNode, SearchName, (int *) &index)) {
- fe = FILEENT (DirNode, index);
+ if (index < dirn->num_ent_used) {
+ if (ocfs_find_index (osb, dir, SearchName, (int *) &index)) {
+ fe = FILEENT (dir, index, BY_INDEX);
memcpy ((void *) found_fe, (void *) fe,
OCFS_SECTOR_SIZE);
if (OFile != NULL) {
- OFile->curr_dir_off =
- DirNode->node_disk_off;
+ OFile->curr_dir_off = dirn->node_disk_off;
OFile->curr_byte_off = index + 1;
}
bRet = true;
@@ -1003,12 +985,14 @@
}
}
- if (DirNode->next_node_ptr != -1) {
- status =
- ocfs_read_dir_node (osb, DirNode,
- DirNode->next_node_ptr);
+ if (dirn->next_node_ptr != -1) {
+ status = ocfs_read_directory (osb, dir, dirn->next_node_ptr);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto bail;
+ }
- if (!IS_VALID_DIR_NODE (DirNode)) {
+ if (!IS_VALID_DIR_NODE (dirn)) {
bRet = false;
goto bail;
}
@@ -1022,31 +1006,34 @@
}
if (OFile != NULL) {
- OFile->curr_dir_off = DirNode->node_disk_off;
+ OFile->curr_dir_off = dirn->node_disk_off;
OFile->curr_byte_off = index + 1;
}
- bail:
+bail:
LOG_EXIT_ULONG (bRet);
return bRet;
-} /* ocfs_search_dir_node */
+} /* ocfs_search_directory */
/*
* ocfs_find_index()
*
*/
-bool ocfs_find_index (ocfs_super * osb, ocfs_dir_node * DirNode,
- struct qstr * FileName, int *Index)
+bool ocfs_find_index (ocfs_super * osb, ocfs_directory * dir,
+ struct qstr * FileName, int * Index)
{
int lowBnd, upBnd;
ocfs_file_entry *fe;
int res = -1, index = 0, start = 0;
int ret = false;
struct qstr q;
+ ocfs_dir_node *dirn = NULL;
LOG_ENTRY ();
- if (!IS_VALID_DIR_NODE (DirNode) || FileName==NULL) {
+
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ if (!IS_VALID_DIR_NODE (dirn) || FileName==NULL) {
ret = false;
goto bail;
}
@@ -1054,9 +1041,9 @@
if (*Index > 0)
start = *Index;
- if (DirNode->index_dirty) {
- for (index = start; index < DirNode->num_ent_used; index++) {
- fe = FILEENT (DirNode, index);
+ if (dirn->index_dirty) {
+ for (index = start; index < dirn->num_ent_used; index++) {
+ fe = FILEENT (dir, index, BY_INDEX);
if (IS_FE_DELETED(fe->sync_flags) ||
(!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
continue;
@@ -1075,16 +1062,16 @@
goto bail;
}
- for (lowBnd = start, upBnd = (DirNode->num_ent_used - start); upBnd;
+ for (lowBnd = start, upBnd = (dirn->num_ent_used - start); upBnd;
upBnd >>= 1) {
index = lowBnd + (upBnd >> 1);
- fe = FILEENT (DirNode, index);
+ fe = FILEENT (dir, index, BY_INDEX);
if (IS_FE_DELETED(fe->sync_flags) ||
(!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
for (index = lowBnd; index < (lowBnd + upBnd); index++) {
- fe = FILEENT (DirNode, index);
+ fe = FILEENT (dir, index, BY_INDEX);
if (IS_FE_DELETED(fe->sync_flags) ||
(!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
continue;
@@ -1132,89 +1119,89 @@
} /* ocfs_find_index */
/*
- * ocfs_reindex_dir_node()
+ * ocfs_reindex_directory()
*
*/
-int ocfs_reindex_dir_node (ocfs_super * osb, __u64 DirNodeOffset, ocfs_dir_node * DirNode)
+int ocfs_reindex_directory (ocfs_super * osb, __u64 diroff, ocfs_directory * dir)
{
int status = 0;
- ocfs_dir_node *pDirNode = NULL;
- ocfs_file_entry *pInsertEntry;
+ ocfs_file_entry *newfe;
ocfs_file_entry *fe;
__u32 index;
- __u8 offset = 0;
+ __u8 slot = 0;
int res;
+ ocfs_dir_node *dirn = NULL;
+ ocfs_directory *dirblk = NULL;
LOG_ENTRY ();
- if (DirNode == NULL) {
- pDirNode = ocfs_allocate_dirnode();
- if (pDirNode == NULL) {
+ if (dir == NULL) {
+ dirblk = ocfs_allocate_directory();
+ if (dirblk == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
- status = ocfs_read_dir_node (osb, pDirNode, DirNodeOffset);
+ status = ocfs_read_directory (osb, dirblk, diroff);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
} else {
- pDirNode = DirNode;
+ dirblk = dir;
}
- if (pDirNode->index_dirty) {
- offset = pDirNode->bad_off;
- pInsertEntry =
- (ocfs_file_entry *) (FIRST_FILE_ENTRY (pDirNode) +
- (offset * OCFS_SECTOR_SIZE));
+ dirn = (ocfs_dir_node *)dirblk->d_page[0];
- for (index = 0; index < pDirNode->num_ent_used; index++) {
- fe = FILEENT (pDirNode, index);
+ if (dirn->index_dirty) {
+ slot = dirn->bad_off;
+ newfe = FILEENT (dirblk, slot, BY_OFFSET);
+ for (index = 0; index < dirn->num_ent_used; index++) {
+ fe = FILEENT (dirblk, index, BY_INDEX);
+
if (IS_FE_DELETED(fe->sync_flags) ||
(!(fe->sync_flags & OCFS_SYNC_FLAG_VALID))) {
continue;
}
- res = strcmp (fe->filename, pInsertEntry->filename);
+ res = strcmp (fe->filename, newfe->filename);
if (res < 0) {
break;
}
}
- if (index < (pDirNode->num_ent_used - 1)) {
- memmove (&pDirNode->index[index + 1],
- &pDirNode->index[index],
- pDirNode->num_ent_used - index);
- pDirNode->index[index] = offset;
+ if (index < (dirn->num_ent_used - 1)) {
+ memmove (&dirn->index[index + 1],
+ &dirn->index[index],
+ dirn->num_ent_used - index);
+ dirn->index[index] = slot;
}
- pDirNode->index_dirty = 0;
+ dirn->index_dirty = 0;
- status = ocfs_write_dir_node (osb, pDirNode, -1);
+ status = ocfs_write_directory (osb, dirblk, -1);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
}
- leave:
- if (DirNode == NULL)
- ocfs_release_dirnode (pDirNode);
+leave:
+ if (!dir)
+ ocfs_release_directory (dirblk);
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs_reindex_dir_node */
+} /* ocfs_reindex_directory */
/*
- * ocfs_insert_dir_node()
+ * ocfs_insert_directory()
*
*/
-int ocfs_insert_dir_node (ocfs_super * osb,
- ocfs_dir_node * DirNode,
- ocfs_file_entry * InsertEntry,
- ocfs_dir_node * LockNode, __s32 * IndexOffset)
+int ocfs_insert_directory (ocfs_super * osb, ocfs_directory * dir,
+ ocfs_file_entry * newfe, ocfs_dir_node * LockNode,
+ __s32 * IndexOffset)
{
int status = 0;
ocfs_file_entry *fe;
@@ -1225,36 +1212,38 @@
__u32 size;
__u8 freeOffset;
struct qstr q;
+ ocfs_dir_node *dirn = NULL;
LOG_ENTRY ();
- if (!IS_VALID_DIR_NODE (DirNode)) {
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ if (!IS_VALID_DIR_NODE (dirn)) {
LOG_ERROR_STATUS(status = -EINVAL);
goto bail;
}
- if (DirNode->index_dirty) {
- status = ocfs_reindex_dir_node (osb, DirNode->node_disk_off, DirNode);
+ if (dirn->index_dirty) {
+ status = ocfs_reindex_directory (osb, dirn->node_disk_off, dir);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto bail;
}
}
- if (DirNode->num_ent_used < osb->max_dir_node_ent) {
- if (DirNode->num_ent_used) {
- q.name = InsertEntry->filename;
- q.len = strlen(InsertEntry->filename);
- if (ocfs_find_index (osb, DirNode, &q, &index)) {
+ if (dirn->num_ent_used < osb->max_dir_node_ent) {
+ if (dirn->num_ent_used) {
+ q.name = newfe->filename;
+ q.len = strlen(newfe->filename);
+ if (ocfs_find_index (osb, dir, &q, &index)) {
/* Already inserted... */
status = -EEXIST;
goto bail;
}
- if (index < DirNode->num_ent_used) {
- fe = FILEENT (DirNode, index);
+ if (index < dirn->num_ent_used) {
+ fe = FILEENT (dir, index, BY_INDEX);
- res = strcmp (fe->filename, InsertEntry->filename);
+ res = strcmp (fe->filename, newfe->filename);
if (res > 0) {
/* We are greater than the entry in question we */
/* shd be less than the one next to it */
@@ -1264,19 +1253,18 @@
} else {
index = 0;
}
-
#ifdef ENABLE_OOPS_IN_DIRINDEX_CHECK
- if (DirNode->num_ent_used > 1) {
+ if (dirn->num_ent_used > 1) {
ocfs_file_entry *f1, *f2;
int x, y;
- f1=FILEENT (DirNode, 0);
- for (x=1; x<DirNode->num_ent_used-1; ++x) {
- f2=FILEENT (DirNode, x);
+ f1=FILEENT (dir, 0, BY_INDEX);
+ for (x=1; x<dirn->num_ent_used-1; ++x) {
+ f2=FILEENT (dir, x, BY_INDEX);
y=strcmp(f1->filename, f2->filename);
if (y < 0) {
LOG_ERROR_ARGS ("ocfs: f1=%s, f2=%s, dn=%u.%u, x=%d",
f1->filename, f2->filename,
- HILO(DirNode->node_disk_off), x);
+ HILO(dirn->node_disk_off), x);
BUG();
}
f1 = f2;
@@ -1284,53 +1272,43 @@
}
#endif
- if (index < DirNode->num_ent_used)
- memmove (&DirNode->index[index + 1],
- &DirNode->index[index],
- DirNode->num_ent_used - index);
+ if (index < dirn->num_ent_used)
+ memmove (&dirn->index[index + 1], &dirn->index[index],
+ dirn->num_ent_used - index);
- if (DirNode->num_ent_used) {
- if (DirNode->num_del) {
+ if (dirn->num_ent_used) {
+ if (dirn->num_del) {
/* Insert at first deleted & change first deleted */
- freeOffset = DirNode->first_del;
- DirNode->num_del--;
- if (DirNode->num_del) {
- lastEntry =
- (ocfs_file_entry
- *) (FIRST_FILE_ENTRY (DirNode) +
- (freeOffset *
- OCFS_SECTOR_SIZE));
- DirNode->first_del =
- lastEntry->next_del;
+ freeOffset = dirn->first_del;
+ dirn->num_del--;
+ if (dirn->num_del) {
+ lastEntry = FILEENT (dir, freeOffset, BY_OFFSET);
+ dirn->first_del = lastEntry->next_del;
}
} else {
/* Insert at end and change the index */
- freeOffset = DirNode->num_ent_used;
+ freeOffset = dirn->num_ent_used;
}
} else {
freeOffset = 0;
}
- lastEntry = (ocfs_file_entry *) (FIRST_FILE_ENTRY (DirNode) +
- (freeOffset *
- OCFS_SECTOR_SIZE));
+ lastEntry = FILEENT (dir, freeOffset, BY_OFFSET);
*IndexOffset = freeOffset;
/* Put the entry at the end */
- InsertEntry->dir_node_ptr = DirNode->node_disk_off;
+ newfe->dir_node_ptr = dirn->node_disk_off;
- memcpy (lastEntry, InsertEntry, osb->sect_size);
+ memcpy (lastEntry, newfe, osb->sect_size);
OCFS_SET_FLAG (lastEntry->sync_flags, OCFS_SYNC_FLAG_VALID);
- lastEntry->this_sector = DirNode->node_disk_off +
- ((freeOffset + 1) * OCFS_SECTOR_SIZE);
- InsertEntry->this_sector = lastEntry->this_sector;
+ lastEntry->this_sector = dirn->node_disk_off +
+ ((freeOffset + 1) * OCFS_SECTOR_SIZE);
+ newfe->this_sector = lastEntry->this_sector;
- if (!(InsertEntry->sync_flags & OCFS_SYNC_FLAG_VALID)) {
- /* This is special for rename... */
-
+ if (!(newfe->sync_flags & OCFS_SYNC_FLAG_VALID)) {
/* Log into recovery that this name only needs to be deleted if we fail */
size = sizeof (ocfs_log_record);
size = (__u32) OCFS_ALIGN (size, osb->sect_size);
@@ -1347,31 +1325,27 @@
pLogRec->log_type = LOG_DELETE_NEW_ENTRY;
pLogRec->rec.del.node_num = osb->node_num;
- pLogRec->rec.del.ent_del = InsertEntry->this_sector;
- pLogRec->rec.del.parent_dirnode_off =
- LockNode->node_disk_off;
+ pLogRec->rec.del.ent_del = newfe->this_sector;
+ pLogRec->rec.del.parent_dirnode_off = LockNode->node_disk_off;
pLogRec->rec.del.flags = 0;
- status =
- ocfs_write_node_log (osb, pLogRec, osb->node_num,
- LOG_RECOVER);
+ status = ocfs_write_node_log (osb, pLogRec, osb->node_num, LOG_RECOVER);
ocfs_safefree (pLogRec);
if (status < 0)
goto bail;
}
- if (DISK_LOCK_FILE_LOCK (InsertEntry) ==
- OCFS_DLM_ENABLE_CACHE_LOCK) {
- status = ocfs_write_metadata (osb, InsertEntry,
- OCFS_SECTOR_SIZE, InsertEntry->this_sector);
+ if (DISK_LOCK_FILE_LOCK (newfe) == OCFS_DLM_ENABLE_CACHE_LOCK) {
+ status = ocfs_write_metadata (osb, newfe, OCFS_SECTOR_SIZE,
+ newfe->this_sector);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto bail;
}
}
- DirNode->index[index] = freeOffset;
- DirNode->num_ent_used++;
+ dirn->index[index] = freeOffset;
+ dirn->num_ent_used++;
} else {
LOG_ERROR_STATUS (status = -ENOSPC);
goto bail;
@@ -1380,7 +1354,7 @@
bail:
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs_insert_dir_node */
+} /* ocfs_insert_directory */
/*
* ocfs_del_file_entry()
@@ -1392,7 +1366,8 @@
int status = 0;
int tmpstat = 0;
__u32 offset;
- ocfs_dir_node *PDirNode = NULL;
+ ocfs_directory *dir = NULL;
+ ocfs_dir_node *dirn = NULL;
ocfs_file_entry *fe;
ocfs_lock_res *dir_lres = NULL;
__u64 dir_off;
@@ -1415,66 +1390,66 @@
}
lock_acq = true;
- PDirNode = ocfs_allocate_dirnode();
- if (PDirNode == NULL) {
+ dir = ocfs_allocate_directory();
+ if (!dir) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
+ dirn = (ocfs_dir_node *)dir->d_page[0];
- status = ocfs_read_dir_node (osb, PDirNode, EntryToDel->dir_node_ptr);
+ status = ocfs_read_directory (osb, dir, EntryToDel->dir_node_ptr);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
- offset = (EntryToDel->this_sector - PDirNode->node_disk_off) /
+ offset = (EntryToDel->this_sector - dirn->node_disk_off) /
OCFS_SECTOR_SIZE;
offset -= 1;
- for (index = 0; index < PDirNode->num_ent_used; index++) {
- if (PDirNode->index[index] != offset)
+ for (index = 0; index < dirn->num_ent_used; index++) {
+ if (dirn->index[index] != offset)
continue;
- fe = FILEENT (PDirNode, index);
+ fe = FILEENT (dir, index, BY_INDEX);
length = OCFS_SECTOR_SIZE;
if (memcmp (fe, EntryToDel, length) == 0) {
- memmove (&PDirNode->index[index],
- &PDirNode->index[index + 1],
- PDirNode->num_ent_used - (index + 1));
+ memmove (&dirn->index[index], &dirn->index[index + 1],
+ dirn->num_ent_used - (index + 1));
- PDirNode->num_ent_used--;
- if (PDirNode->num_ent_used == 0) {
- PDirNode->num_del = 0;
+ dirn->num_ent_used--;
+ if (dirn->num_ent_used == 0) {
+ dirn->num_del = 0;
} else {
/* Insert this dir node as one containing a deleted entry if the */
/* count on the root dir node for deleted entries is 0 */
- if (PDirNode->num_del != 0) {
- PDirNode->num_del++;
+ if (dirn->num_del != 0) {
+ dirn->num_del++;
fe->sync_flags = OCFS_SYNC_FLAG_DELETED;
- fe->next_del = PDirNode->first_del;
- PDirNode->first_del = offset;
+ fe->next_del = dirn->first_del;
+ dirn->first_del = offset;
} else {
- PDirNode->num_del++;
+ dirn->num_del++;
fe->sync_flags = OCFS_SYNC_FLAG_DELETED;
fe->next_del = INVALID_DIR_NODE_INDEX;
- PDirNode->first_del = offset;
+ dirn->first_del = offset;
}
}
if (LockNode->head_del_ent_node == INVALID_NODE_POINTER) {
- if (LockNode->node_disk_off != PDirNode->node_disk_off)
- LockNode->head_del_ent_node = PDirNode->node_disk_off;
+ if (LockNode->node_disk_off != dirn->node_disk_off)
+ LockNode->head_del_ent_node = dirn->node_disk_off;
else
- PDirNode->head_del_ent_node = PDirNode->node_disk_off;
+ dirn->head_del_ent_node = dirn->node_disk_off;
}
/* Release lock in memory and disk under lock */
ocfs_acquire_lockres (dir_lres);
- if (LockNode->node_disk_off == PDirNode->node_disk_off) {
- if (DISK_LOCK_FILE_LOCK (PDirNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
+ if (LockNode->node_disk_off == dirn->node_disk_off) {
+ if (DISK_LOCK_FILE_LOCK (dirn) != OCFS_DLM_ENABLE_CACHE_LOCK) {
dir_lres->lock_type = OCFS_DLM_NO_LOCK;
- DISK_LOCK_FILE_LOCK (PDirNode) = OCFS_DLM_NO_LOCK;
+ DISK_LOCK_FILE_LOCK (dirn) = OCFS_DLM_NO_LOCK;
lock_rls = true;
}
} else {
@@ -1485,14 +1460,14 @@
}
}
- status = ocfs_write_dir_node (osb, PDirNode, offset);
+ status = ocfs_write_directory (osb, dir, offset);
if (status < 0) {
ocfs_release_lockres (dir_lres);
LOG_ERROR_STATUS (status);
goto leave;
}
- if (LockNode->node_disk_off != PDirNode->node_disk_off) {
+ if (LockNode->node_disk_off != dirn->node_disk_off) {
status = ocfs_write_metadata (osb, LockNode, osb->sect_size,
LockNode->node_disk_off);
if (status < 0) {
@@ -1521,7 +1496,7 @@
}
ocfs_put_lockres (dir_lres);
- ocfs_release_dirnode (PDirNode);
+ ocfs_release_directory (dir);
LOG_EXIT_STATUS (status);
return status;
} /* ocfs_del_file_entry */
@@ -1530,49 +1505,51 @@
* ocfs_insert_file()
*
*/
-int ocfs_insert_file (ocfs_super * osb, ocfs_dir_node * DirNode,
+int ocfs_insert_file (ocfs_super * osb, ocfs_directory * dir,
ocfs_file_entry * InsertEntry, ocfs_dir_node * LockNode,
ocfs_lock_res * LockResource, bool invalid_dirnode)
{
int status = 0;
__u64 bitmapOffset = 0;
__u64 numClustersAlloc = 0;
- ocfs_dir_node *pNewDirNode = NULL;
__s32 indexOffset = -1;
+ ocfs_dir_node *dirn = NULL;
+ ocfs_directory *newdir = NULL;
+ ocfs_dir_node *newdirn = NULL;
+ __u64 fileOffset = 0;
LOG_ENTRY ();
- IF_TRACE (ocfs_print_dir_node (osb, DirNode));
+ IF_TRACE (ocfs_print_directory (osb, dir));
- if (!IS_VALID_DIR_NODE (DirNode)) {
+ dirn = (ocfs_dir_node *)dir->d_page[0];
+ if (!IS_VALID_DIR_NODE (dirn)) {
LOG_ERROR_STATUS (status = -EFAIL);
goto leave;
}
- if (!invalid_dirnode && DirNode->num_ent_used < osb->max_dir_node_ent) {
- status = ocfs_insert_dir_node (osb, DirNode, InsertEntry, LockNode,
- &indexOffset);
+ if (!invalid_dirnode && dirn->num_ent_used < osb->max_dir_node_ent) {
+ status = ocfs_insert_directory (osb, dir, InsertEntry, LockNode,
+ &indexOffset);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
} else {
- pNewDirNode = ocfs_allocate_dirnode();
- if (pNewDirNode == NULL) {
+ newdir = ocfs_allocate_directory();
+ if (newdir == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto leave;
}
+ newdirn = (ocfs_dir_node *)newdir->d_page[0];
- if (DirNode->next_node_ptr != INVALID_NODE_POINTER) {
- status = ocfs_read_dir_node (osb, pNewDirNode,
- DirNode->next_node_ptr);
+ if (dirn->next_node_ptr != INVALID_NODE_POINTER) {
+ status = ocfs_read_directory (osb, newdir, dirn->next_node_ptr);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
} else {
- __u64 fileOffset = 0;
-
/* Allocate a new dir node */
status =
ocfs_alloc_node_block (osb, osb->vol_layout.dir_node_size,
@@ -1583,34 +1560,33 @@
LOG_ERROR_STATUS (status);
goto leave;
}
- memset (pNewDirNode, 0, osb->vol_layout.dir_node_size);
- ocfs_initialize_dir_node (osb, pNewDirNode, bitmapOffset,
- fileOffset, osb->node_num);
+ ocfs_initialize_dir_node (osb, newdirn, bitmapOffset,
+ fileOffset, osb->node_num);
}
- if ((DISK_LOCK_CURRENT_MASTER (DirNode) == osb->node_num) &&
- (DISK_LOCK_FILE_LOCK (DirNode) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
- DISK_LOCK_CURRENT_MASTER (pNewDirNode) = osb->node_num;
- DISK_LOCK_FILE_LOCK (pNewDirNode) = OCFS_DLM_ENABLE_CACHE_LOCK;
+ if ((DISK_LOCK_CURRENT_MASTER (dirn) == osb->node_num) &&
+ (DISK_LOCK_FILE_LOCK (dirn) == OCFS_DLM_ENABLE_CACHE_LOCK)) {
+ DISK_LOCK_CURRENT_MASTER (newdirn) = osb->node_num;
+ DISK_LOCK_FILE_LOCK (newdirn) = OCFS_DLM_ENABLE_CACHE_LOCK;
}
- status = ocfs_insert_dir_node (osb, pNewDirNode, InsertEntry, LockNode,
- &indexOffset);
+ status = ocfs_insert_directory (osb, newdir, InsertEntry,
+ LockNode, &indexOffset);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
}
- if (LockNode->node_disk_off == DirNode->node_disk_off) {
- DirNode->free_node_ptr = pNewDirNode->node_disk_off;
+ if (LockNode->node_disk_off == dirn->node_disk_off) {
+ dirn->free_node_ptr = newdirn->node_disk_off;
} else {
- LockNode->free_node_ptr = pNewDirNode->node_disk_off;
+ LockNode->free_node_ptr = newdirn->node_disk_off;
}
/* Insert in this dirnode and setup the pointers */
- DirNode->next_node_ptr = pNewDirNode->node_disk_off;
+ dirn->next_node_ptr = newdirn->node_disk_off;
- status = ocfs_write_dir_node (osb, pNewDirNode, indexOffset);
+ status = ocfs_write_directory (osb, newdir, indexOffset);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto leave;
@@ -1621,10 +1597,10 @@
/* Release the lock in memory and disk under lock */
ocfs_acquire_lockres (LockResource);
- if (LockNode->node_disk_off == DirNode->node_disk_off) {
- if (DISK_LOCK_FILE_LOCK (DirNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
+ if (LockNode->node_disk_off == dirn->node_disk_off) {
+ if (DISK_LOCK_FILE_LOCK (dirn) != OCFS_DLM_ENABLE_CACHE_LOCK) {
LockResource->lock_type = OCFS_DLM_NO_LOCK;
- DISK_LOCK_FILE_LOCK (DirNode) = OCFS_DLM_NO_LOCK;
+ DISK_LOCK_FILE_LOCK (dirn) = OCFS_DLM_NO_LOCK;
}
} else {
if (DISK_LOCK_FILE_LOCK (LockNode) != OCFS_DLM_ENABLE_CACHE_LOCK) {
@@ -1633,14 +1609,14 @@
}
}
- status = ocfs_write_dir_node (osb, DirNode, indexOffset);
+ status = ocfs_write_directory (osb, dir, indexOffset);
if (status < 0) {
ocfs_release_lockres (LockResource);
LOG_ERROR_STATUS (status);
goto leave;
}
- if (LockNode->node_disk_off != DirNode->node_disk_off) {
+ if (LockNode->node_disk_off != dirn->node_disk_off) {
status = ocfs_write_metadata (osb, LockNode, osb->sect_size,
LockNode->node_disk_off);
if (status < 0) {
@@ -1653,7 +1629,7 @@
ocfs_release_lockres (LockResource);
leave:
- ocfs_release_dirnode (pNewDirNode);
+ ocfs_release_directory (newdir);
LOG_EXIT_STATUS (status);
return status;
@@ -1664,16 +1640,19 @@
* ocfs_validate_dir_index()
*
*/
-int ocfs_validate_dir_index (ocfs_super *osb, ocfs_dir_node *dirnode)
+int ocfs_validate_dir_index (ocfs_super *osb, ocfs_directory *dir)
{
ocfs_file_entry *fe = NULL;
+ ocfs_dir_node *dirnode = NULL;
int status = 0;
__u8 i;
__u8 offset;
__u8 *ind = NULL;
- LOG_ENTRY_ARGS ("(osb=0x%p, dn=0x%p)\n", osb, dirnode);
+ LOG_ENTRY_ARGS ("(osb=0x%p, dir=0x%p)\n", osb, dir);
+ dirnode = (ocfs_dir_node *)dir->d_page[0];
+
if ((ind = (__u8 *)ocfs_malloc (256)) == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto bail;
@@ -1689,8 +1668,7 @@
} else
ind[offset] = 1;
- fe = (ocfs_file_entry *) (FIRST_FILE_ENTRY (dirnode) +
- (offset * OCFS_SECTOR_SIZE));
+ fe = FILEENT(dir, offset, BY_OFFSET);
if (!fe->sync_flags) {
status = -EBADSLT;
@@ -1699,7 +1677,7 @@
}
if (status == -EBADSLT)
- LOG_ERROR_ARGS ("corrupted index in dirnode=%u.%u",
+ LOG_TRACE_ARGS ("corrupted index in dirnode=%u.%u",
HILO(dirnode->node_disk_off));
bail:
@@ -1713,9 +1691,10 @@
* ocfs_validate_num_del()
*
*/
-int ocfs_validate_num_del (ocfs_super *osb, ocfs_dir_node *dirnode)
+int ocfs_validate_num_del (ocfs_super *osb, ocfs_directory *dir)
{
ocfs_file_entry *fe = NULL;
+ ocfs_dir_node *dirnode = NULL;
int i;
int j;
int status = 0;
@@ -1725,8 +1704,9 @@
__u64 tmpoff;
int reason = 0;
- LOG_ENTRY_ARGS ("(osb=0x%p, dn=0x%p)\n", osb, dirnode);
+ LOG_ENTRY_ARGS ("(osb=0x%p, dir=0x%p)\n", osb, dir);
+ dirnode = (ocfs_dir_node *)dir->d_page[0];
if (!dirnode->num_del)
goto bail;
@@ -1762,8 +1742,7 @@
} else
ind[offset] = 1;
- fe = (ocfs_file_entry *) (FIRST_FILE_ENTRY (dirnode) +
- (offset * OCFS_SECTOR_SIZE));
+ fe = FILEENT (dir, offset, BY_OFFSET);
/* file has to be deleted to be in the list */
if (fe->sync_flags) {
@@ -1793,3 +1772,23 @@
LOG_EXIT_STATUS (status);
return status;
} /* ocfs_validate_num_del */
+
+/*
+ * ocfs_validate_directory()
+ *
+ */
+int ocfs_validate_directory (ocfs_super *osb, ocfs_directory *dir)
+{
+ int ret = 0;
+ ocfs_dir_node *dirn = (ocfs_dir_node *)dir->d_page[0];
+
+ if (!IS_VALID_DIR_NODE (dirn))
+ ret = -EFAIL;
+
+ if (ret == 0)
+ ret = ocfs_validate_dir_index (osb, dir);
+ if (ret == 0)
+ ret = ocfs_validate_num_del (osb, dir);
+
+ return ret;
+} /* ocfs_validate_directory */
Modified: trunk/ocfs2/Common/ocfsgendlm.c
===================================================================
--- trunk/ocfs2/Common/ocfsgendlm.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/ocfsgendlm.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -579,7 +579,7 @@
status = ocfs_get_vote_on_disk (osb, lock_id, lock_type, flags,
&gotvotemap, vote_map, lock_seq_num, &fileopenmap);
if (status < 0) {
- if (status != -EAGAIN)
+ if (status != -EAGAIN && status != -EBUSY)
LOG_ERROR_STATUS (status);
goto bail;
}
@@ -819,7 +819,7 @@
status = ocfs_wait_for_vote (osb, lock_id, lock_type, flags, vote_map,
5000, lockseqnum, lockres);
if (status < 0) {
- if (status != -EAGAIN)
+ if (status != -EAGAIN && status != -EBUSY)
LOG_ERROR_STATUS (status);
goto bail;
}
@@ -1478,6 +1478,8 @@
updated = false;
continue;
} else {
+ if (status != -EBUSY)
+ LOG_ERROR_STATUS (status);
RELEASE_WITH_FLAG(lockres, lockres_acq);
goto finally;
}
Modified: trunk/ocfs2/Common/ocfsgenmisc.c
===================================================================
--- trunk/ocfs2/Common/ocfsgenmisc.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Common/ocfsgenmisc.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -177,10 +177,15 @@
*/
int ocfs_create_root_dir_node (ocfs_super * osb)
{
- int status = 0, tempstat;
- ocfs_dir_node *NewDirNode = NULL;
- __u64 bitmapOffset, numClustersAlloc, fileOffset = 0;
- __u32 size, i;
+ int status = 0;
+ int tempstat;
+ ocfs_dir_node *newdirn = NULL;
+ ocfs_directory *newdir = NULL;
+ __u64 bitmapOffset;
+ __u64 numClustersAlloc;
+ __u64 fileOffset = 0;
+ __u32 size;
+ __u32 i;
ocfs_vol_disk_hdr *volDiskHdr = NULL;
ocfs_lock_res *LockResource = NULL;
bool lock_acq = false;
@@ -206,11 +211,12 @@
} else
lock_acq = true;
- NewDirNode = ocfs_allocate_dirnode();
- if (NewDirNode == NULL) {
+ newdir = ocfs_allocate_directory();
+ if (newdir == NULL) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto bail;
}
+ newdirn = (ocfs_dir_node *)newdir->d_page[0];
size = (ONE_MEGA_BYTE > osb->vol_layout.cluster_size) ?
ONE_MEGA_BYTE : osb->vol_layout.cluster_size;
@@ -264,11 +270,11 @@
osb->vol_layout.root_start_off = bitmapOffset;
- ocfs_initialize_dir_node (osb, NewDirNode, bitmapOffset, fileOffset,
+ ocfs_initialize_dir_node (osb, newdirn, bitmapOffset, fileOffset,
osb->node_num);
- NewDirNode->dir_node_flags |= DIR_NODE_FLAG_ROOT;
+ newdirn->dir_node_flags |= DIR_NODE_FLAG_ROOT;
- status = ocfs_write_dir_node (osb, NewDirNode, -1);
+ status = ocfs_write_directory (osb, newdir, -1);
if (status < 0) {
LOG_ERROR_STATUS (status);
goto bail;
@@ -293,7 +299,7 @@
goto bail;
}
- bail:
+bail:
if (status < 0) {
LOG_ERROR_STR ("Disabling Volume");
osb->vol_state = VOLUME_DISABLED;
@@ -308,7 +314,7 @@
osb->vol_state = VOLUME_DISABLED;
}
}
- ocfs_release_dirnode (NewDirNode);
+ ocfs_release_directory (newdir);
ocfs_safefree (volDiskHdr);
ocfs_safefree (buf);
ocfs_release_file_entry (sys_fe);
@@ -602,11 +608,7 @@
init_MUTEX (&(osb->comm_lock));
init_MUTEX (&(osb->trans_lock));
-#ifdef __LP64__
-#define HASHBITS 11
-#else
-#define HASHBITS 12
-#endif
+#define HASHBITS 10
if (!ocfs_hash_create (&(osb->root_sect_node), HASHBITS)) {
LOG_ERROR_STATUS (status = -ENOMEM);
goto bail;
@@ -1070,4 +1072,98 @@
ocfs_safefree (dn);
LOG_EXIT_STATUS (status);
return status;
-} /* ocfs _is_dir_empty */
+} /* ocfs_is_dir_empty */
+
+/*
+ * ocfs_allocate_directory()
+ *
+ */
+ocfs_directory * ocfs_allocate_directory (void)
+{
+ ocfs_directory *dir = NULL;
+ int status = -ENOMEM;
+ int i;
+
+ dir = ocfs_malloc (sizeof(ocfs_directory));
+ if (!dir) {
+ LOG_ERROR_STATUS (status);
+ goto bail;
+ }
+ memset (dir, 0, sizeof(ocfs_directory));
+
+ dir->d_pagecnt = OcfsGlobalCtxt.g_pagecnt;
+ dir->d_entperpage = OcfsGlobalCtxt.g_entperpage;
+ dir->d_entinbits = OcfsGlobalCtxt.g_entinbits;
+ dir->d_entmask = OcfsGlobalCtxt.g_entmask;
+
+ for (i = 0; i < dir->d_pagecnt; ++i) {
+#ifdef USERSPACE_TOOL
+ dir->d_page[i] = ocfs_malloc(PAGE_SIZE);
+#else
+ dir->d_page[i] = (__u8 *)get_free_page (GFP_NOFS);
+#endif
+ if (!dir->d_page[i]) {
+ LOG_ERROR_STATUS (status);
+ goto bail;
+ }
+ }
+ LOG_TRACE_ARGS("ocfs: alloced %d pages\n", dir->d_pagecnt);
+ status = 0;
+
+bail:
+ if (status < 0) {
+ ocfs_release_directory (dir);
+ dir = NULL;
+ }
+
+ return dir;
+} /* ocfs_allocate_directory */
+
+/*
+ * ocfs_release_directory()
+ *
+ */
+void ocfs_release_directory (ocfs_directory *dir)
+{
+ int i;
+
+ if (!dir)
+ goto bail;
+
+ for (i = 0; i < dir->d_pagecnt; ++i)
+ if (dir->d_page[i])
+#ifdef USERSPACE_TOOL
+ ocfs_safefree (dir->d_page[i]);
+#else
+ free_page ((unsigned long)dir->d_page[i]);
+#endif
+ ocfs_safefree (dir);
+ LOG_TRACE_ARGS("ocfs: freed 'em all\n");
+
+bail:
+ return ;
+} /* ocfs_release_directory */
+
+#if 0
+/*
+ * ocfs_read_directory()
+ *
+ */
+int ocfs_read_directory (ocfs_super *osb, ocfs_directory *dir, __u64 off)
+{
+ int i;
+ __u64 doff = off;
+ int status = 0;
+
+ for (i = 0; i < dir->d_pagecnt; ++i) {
+ status = ocfs_read_disk (osb, dir->d_page[i], PAGE_SIZE, doff);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto bail;
+ }
+ doff += PAGE_SIZE;
+ }
+bail:
+ return status;
+} /* ocfs_read_directory */
+#endif
Modified: trunk/ocfs2/Linux/inc/ocfsiosup.h
===================================================================
--- trunk/ocfs2/Linux/inc/ocfsiosup.h 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Linux/inc/ocfsiosup.h 2004-09-14 21:21:57 UTC (rev 8)
@@ -69,4 +69,6 @@
int ocfs_read_disk_ex (ocfs_super * osb, void **Buffer, __u32 AllocLen,
__u32 ReadLen, __u64 Offset);
+int ocfs_read_directory (ocfs_super *osb, ocfs_directory *dir, __u64 offset);
+
#endif /* _OCFSIOSUP_H_ */
Modified: trunk/ocfs2/Linux/ocfsioctl.c
===================================================================
--- trunk/ocfs2/Linux/ocfsioctl.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Linux/ocfsioctl.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -39,7 +39,9 @@
ocfs_ioc *data = NULL;
extern char *ocfs_version;
int ret = 0;
+#ifdef CDSL_ENABLED
ocfs_super *osb;
+#endif
ocfs_cdsl *cdsl = NULL;
LOG_ENTRY_ARGS ("(0x%p, 0x%p, %u, %lu)\n", inode, filp, cmd, arg);
@@ -67,6 +69,7 @@
data->nodenum = 999; /* TODO */
ret = copy_to_user ((ocfs_ioc *) arg, data, sizeof (ocfs_ioc));
break;
+#ifdef CDSL_ENABLED
case OCFS_IOC_CDSL_MODIFY:
osb = ((ocfs_super *)(inode->i_sb->u.generic_sbp));
if (!IS_VALID_OSB(osb)) {
@@ -85,6 +88,7 @@
}
break;
case OCFS_IOC_CDSL_GETINFO: /* TODO: implement */
+#endif /* CDSL_ENABLED */
default:
ret = -ENOTTY;
break;
Modified: trunk/ocfs2/Linux/ocfsiosup.c
===================================================================
--- trunk/ocfs2/Linux/ocfsiosup.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Linux/ocfsiosup.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -653,3 +653,79 @@
LOG_EXIT_STATUS (status);
return status;
} /* ocfs_read_disk_ex */
+
+
+/*
+ * ocfs_read_directory()
+ * This function should ideally be merged with LinuxReadForceDisk().
+ *
+ */
+int ocfs_read_directory (ocfs_super *osb, ocfs_directory *dir, __u64 offset)
+{
+ int status = 0;
+ struct super_block *sb;
+ int nr, i, j;
+ __u64 blocknum;
+ kdev_t dev;
+ struct buffer_head *bh;
+ struct buffer_head **bhs = NULL;
+ char *kaddr;
+ __u8 *p = NULL;
+
+ LOG_ENTRY_ARGS ("(osb=0x%p, dir=0x%p, off=%u.%u)\n", osb, dir, HILO(offset));
+
+ OCFS_ASSERT (osb && osb->sb);
+ OCFS_ASSERT (dir);
+
+ sb = osb->sb;
+ dev = sb->s_dev;
+
+ nr = (OCFS_DEFAULT_DIR_NODE_SIZE + 511) >> 9;
+ bhs = kmalloc (nr * sizeof(bh), GFP_KERNEL);
+ if (bhs == NULL) {
+ LOG_ERROR_STATUS (status = -ENOMEM);
+ goto bail;
+ }
+
+ blocknum = offset >> sb->s_blocksize_bits;
+
+ for (i = 0 ; i < nr ; i++) {
+ bh = getblk (dev, blocknum++, sb->s_blocksize);
+ if (bh == NULL) {
+ LOG_ERROR_STATUS (status = -ENOMEM);
+ goto bail;
+ }
+ bhs[i] = bh;
+ lock_buffer(bh);
+ if (!buffer_dirty(bh))
+ mark_buffer_uptodate(bh, false);
+ unlock_buffer(bh);
+ }
+
+ ll_rw_block(READ, nr, bhs);
+
+ p = dir->d_page[0];
+ for (i = 0, j = 0; i < nr; i++) {
+ if (!j)
+ p = dir->d_page[i >> dir->d_entinbits];
+ else
+ p += sb->s_blocksize;
+
+ bh = bhs[i];
+ wait_on_buffer(bh);
+ lock_buffer(bh);
+ kaddr = kmap(bh->b_page);
+ memcpy(p, kaddr + ((unsigned long)(bh)->b_data & ~PAGE_MASK), 512);
+ kunmap(bh->b_page);
+ unlock_buffer(bh);
+ brelse(bh);
+ j = ((j == dir->d_entmask) ? 0 : j + 1);
+ }
+
+bail:
+ if (bhs)
+ kfree(bhs);
+
+ LOG_EXIT_STATUS (status);
+ return status;
+} /* ocfs_read_directory */
Modified: trunk/ocfs2/Linux/ocfsmain.c
===================================================================
--- trunk/ocfs2/Linux/ocfsmain.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Linux/ocfsmain.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -432,7 +432,12 @@
spin_lock (&OcfsGlobalCtxt.comm_seq_lock);
OcfsGlobalCtxt.comm_seq_num = 0;
spin_unlock (&OcfsGlobalCtxt.comm_seq_lock);
-
+
+ OcfsGlobalCtxt.g_pagecnt = OCFS_DEFAULT_DIR_NODE_SIZE / PAGE_SIZE;
+ OcfsGlobalCtxt.g_entperpage = PAGE_SIZE / OCFS_SECTOR_SIZE;
+ OcfsGlobalCtxt.g_entinbits = num_in_bits(OcfsGlobalCtxt.g_entperpage);
+ OcfsGlobalCtxt.g_entmask = OcfsGlobalCtxt.g_entperpage - 1;
+
/* Initialize the proc interface */
ocfs_proc_init ();
@@ -2192,6 +2197,7 @@
status = ocfs_find_files_on_disk (osb, parentDirCluster, &(dentry->d_name),
fe, NULL);
if (status < 0) {
+// BUG();
LOG_ERROR_STATUS (status);
goto leave;
}
@@ -3754,9 +3760,6 @@
OcfsGlobalCtxt.fe_cache = kmem_cache_create ("ocfs_fileentry",
OCFS_SECTOR_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN, NULL, NULL);
- OcfsGlobalCtxt.dirnode_cache = kmem_cache_create ("ocfs_dirnode",
- OCFS_DEFAULT_DIR_NODE_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN, NULL, NULL);
-
OCFS_SET_FLAG (OcfsGlobalCtxt.flags, OCFS_FLAG_MEM_LISTS_INITIALIZED);
return 0;
@@ -3772,7 +3775,6 @@
kmem_cache_destroy (OcfsGlobalCtxt.ofile_cache);
kmem_cache_destroy (OcfsGlobalCtxt.fe_cache);
kmem_cache_destroy (OcfsGlobalCtxt.lockres_cache);
- kmem_cache_destroy (OcfsGlobalCtxt.dirnode_cache);
OCFS_CLEAR_FLAG (OcfsGlobalCtxt.flags, OCFS_FLAG_MEM_LISTS_INITIALIZED);
} /* ocfs_free_mem_lists */
Modified: trunk/ocfs2/Linux/ocfsproc.c
===================================================================
--- trunk/ocfs2/Linux/ocfsproc.c 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/ocfs2/Linux/ocfsproc.c 2004-09-14 21:21:57 UTC (rev 8)
@@ -164,8 +164,6 @@
slabname = "lockres";
else if (item->u.slab == OcfsGlobalCtxt.fe_cache)
slabname = "fe";
- else if (item->u.slab == OcfsGlobalCtxt.dirnode_cache)
- slabname = "dirnode";
else
slabname = "unknown";
Modified: trunk/vendor/redhat/ocfs-2.4.18-e.spec.in
===================================================================
--- trunk/vendor/redhat/ocfs-2.4.18-e.spec.in 2004-06-18 21:45:58 UTC (rev 7)
+++ trunk/vendor/redhat/ocfs-2.4.18-e.spec.in 2004-09-14 21:21:57 UTC (rev 8)
@@ -18,7 +18,7 @@
# This must be changed to the minimum ABI compat kernel version expected
%define base 2.4.18-e
-%define kver %{base}.37
+%define kver %{base}.43
# The minimum -support package required for the kernel bits.
%define support_ver @SUPPORT_REQUIRED_VERSION@
More information about the Ocfs-commits
mailing list