}
/*
- * ext2_find_entry()
+ * obdfs_find_entry()
*
* finds an entry in the specified directory with the wanted name. It
* returns the cache buffer in which the entry was found, and the entry
- * itself (as a parameter - res_dir). It does NOT read the inode of the
+ * itself (as a parameter - res_dir). It does NOT read the inode of the
* entry - you'll have to do that yourself if you want to.
*/
static struct page * obdfs_find_entry (struct inode * dir,
- const char * const name, int namelen,
- struct ext2_dir_entry_2 ** res_dir, int lock)
+ const char * const name, int namelen,
+ struct ext2_dir_entry_2 ** res_dir,
+ int lock)
{
struct super_block * sb;
unsigned long offset;
}
EXIT;
return NULL;
-}
+} /* obdfs_find_entry */
struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry)
{
d_add(dentry, inode);
EXIT;
return NULL;
-}
+} /* obdfs_lookup */
/*
- * ext2_add_entry()
+ * obdfs_add_entry()
*
* adds a file entry to the specified directory, using the same
* semantics as ext2_find_entry(). It returns NULL if it failed.
}
rec_len = EXT2_DIR_REC_LEN(namelen);
CDEBUG(D_INODE, "reclen: %d\n", rec_len);
+ PDEBUG(page, "starting search");
offset = 0;
de = (struct ext2_dir_entry_2 *) page_address(page);
*err = -ENOSPC;
EXIT;
return NULL;
}
+ PDEBUG(page, "new directory page");
if (dir->i_size <= offset) {
if (dir->i_size == 0) {
*err = -ENOENT;
PDEBUG(page, "addentry");
EXIT;
return NULL;
-}
+} /* obdfs_add_entry */
/*
* obdfs_delete_entry deletes a directory entry by merging it with the
de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
}
return -ENOENT;
-}
+} /* obdfs_delete_entry */
static inline void ext2_set_de_type(struct super_block *sb,
dentry->d_name.name, dentry->d_count,
unhashed);
}
-}
+} /* show_dentry */
#endif
struct inode *obdfs_new_inode(struct inode *dir)
{
- struct obdo *obdo;
+ struct obdo *oa;
struct inode *inode;
- struct obdfs_inode_info *oinfo;
- ino_t ino;
int err;
ENTRY;
- obdo = obdo_alloc();
- if (!obdo) {
+ oa = obdo_alloc();
+ if (!oa) {
EXIT;
return ERR_PTR(-ENOMEM);
}
- err = IOPS(dir, create)(IID(dir), obdo);
- ino = (ino_t)obdo->o_id;
- obdo_free(obdo);
+ err = IOPS(dir, create)(IID(dir), oa);
if ( err ) {
+ obdo_free(oa);
EXIT;
return ERR_PTR(err);
}
- inode = iget(dir->i_sb, ino);
+ inode = iget(dir->i_sb, (ino_t)oa->o_id);
if (!inode) {
+ IOPS(dir, destroy)(IID(dir), oa);
+ obdo_free(oa);
EXIT;
return ERR_PTR(-EIO);
}
if (!list_empty(&inode->i_dentry)) {
CDEBUG(D_INODE, "New inode (%ld) has aliases!\n", inode->i_ino);
+ IOPS(dir, destroy)(IID(dir), oa);
+ obdo_free(oa);
iput(inode);
EXIT;
return ERR_PTR(-EIO);
}
- oinfo = OBD_INFO(inode);
- INIT_LIST_HEAD(&oinfo->oi_list);
+ INIT_LIST_HEAD(&OBD_LIST(inode));
+
EXIT;
return inode;
-}
+} /* obdfs_new_inode */
/*
d_instantiate(dentry, inode);
EXIT;
return err;
-}
+} /* obdfs_create */
int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)
{
mark_inode_dirty(inode);
iput(inode);
goto out;
-}
+} /* obdfs_mknod */
int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
{
iput (inode);
EXIT;
goto out;
-}
+} /* obdfs_mkdir */
/*
UnlockPage(page);
page_cache_release(page);
return 1;
-}
+} /* empty_dir */
int obdfs_rmdir (struct inode * dir, struct dentry *dentry)
{
page_cache_release(page);
EXIT;
return retval;
-}
+} /* obdfs_rmdir */
int obdfs_unlink(struct inode * dir, struct dentry *dentry)
{
page_cache_release(page);
EXIT;
return retval;
-}
+} /* obdfs_unlink */
int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symname)
{
de->inode = cpu_to_le32(inode->i_ino);
ext2_set_de_type(dir->i_sb, de, S_IFLNK);
dir->i_version = ++event;
- obdfs_do_writepage(dir, page, IS_SYNC(dir));
+ err = obdfs_do_writepage(dir, page, IS_SYNC(dir));
UnlockPage(page);
d_instantiate(dentry, inode);
- err = 0;
out:
EXIT;
return err;
mark_inode_dirty(inode);
iput (inode);
goto out;
-}
+} /* obdfs_symlink */
int obdfs_link (struct dentry * old_dentry,
struct inode * dir, struct dentry *dentry)
ext2_set_de_type(dir->i_sb, de, inode->i_mode);
dir->i_version = ++event;
- obdfs_do_writepage(dir, page, IS_SYNC(dir));
+ err = obdfs_do_writepage(dir, page, IS_SYNC(dir));
UnlockPage(page);
page_cache_release(page);
mark_inode_dirty(inode);
inode->i_count++;
d_instantiate(dentry, inode);
- return 0;
-}
+ return err;
+} /* obdfs_link */
#define PARENT_INO(buffer) \
((struct ext2_dir_entry_2 *) ((char *) buffer + \
struct inode * old_inode, * new_inode;
struct page * old_page, * new_page, * dir_page;
struct ext2_dir_entry_2 * old_de, * new_de;
- int retval;
+ int err;
ENTRY;
* same name. Goodbye sticky bit ;-<
*/
old_inode = old_dentry->d_inode;
- retval = -ENOENT;
+ err = -ENOENT;
if (!old_page || le32_to_cpu(old_de->inode) != old_inode->i_ino)
goto end_rename;
if (S_ISDIR(old_inode->i_mode)) {
/* can only rename into empty new directory */
if (new_inode) {
- retval = -ENOTEMPTY;
+ err = -ENOTEMPTY;
if (!empty_dir (new_inode))
goto end_rename;
}
- retval = -EIO;
+ err = -EIO;
dir_page= obdfs_getpage (old_inode, 0, 0, LOCKED);
PDEBUG(dir_page, "rename dir page");
goto end_rename;
if (le32_to_cpu(PARENT_INO(page_address(dir_page))) != old_dir->i_ino)
goto end_rename;
- retval = -EMLINK;
+ err = -EMLINK;
if (!new_inode && new_dir!=old_dir &&
new_dir->i_nlink >= EXT2_LINK_MAX)
goto end_rename;
if (!new_page) {
new_page = obdfs_add_entry (new_dir, new_dentry->d_name.name,
new_dentry->d_name.len, &new_de,
- &retval);
+ &err);
PDEBUG(new_page, "rename new page");
if (!new_page)
goto end_rename;
mark_inode_dirty(old_dir);
if (dir_page) {
PARENT_INO(page_address(dir_page)) = le32_to_cpu(new_dir->i_ino);
- obdfs_do_writepage(old_inode, dir_page, IS_SYNC(old_inode));
+ /* XXX handle err */
+ err = obdfs_do_writepage(old_inode, dir_page, IS_SYNC(old_inode));
old_dir->i_nlink--;
mark_inode_dirty(old_dir);
if (new_inode) {
page_cache_release(old_page);
old_page = obdfs_getpage(old_dir, index >> PAGE_SHIFT, 0, LOCKED);
CDEBUG(D_INODE, "old_page at %p\n", old_page);
- obdfs_do_writepage(old_dir, old_page, IS_SYNC(old_dir));
+ /* XXX handle err */
+ err = obdfs_do_writepage(old_dir, old_page, IS_SYNC(old_dir));
}
- obdfs_do_writepage(new_dir, new_page, IS_SYNC(new_dir));
-
- retval = 0;
+ err = obdfs_do_writepage(new_dir, new_page, IS_SYNC(new_dir));
end_rename:
if (old_page && PageLocked(old_page) )
page_cache_release(dir_page);
- return retval;
-}
+ return err;
+} /* obdfs_rename */