Whamcloud - gitweb
obdfs/flushd.c: turned on page aging, and set pupdated to run more often
[fs/lustre-release.git] / lustre / obdfs / namei.c
index 4ffdbaa..87ddc55 100644 (file)
@@ -152,17 +152,18 @@ failure:
        return NULL;
 } /* obdfs_find_entry */
 
-struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry)
+struct dentry *obdfs_lookup(struct inode *dir, struct dentry *dentry)
 {
-       struct inode * inode;
-       struct ext2_dir_entry_2 * de;
-       struct page * page;
+       struct inode *inode;
+       struct ext2_dir_entry_2 *de;
+       struct page *page;
        ENTRY;
 
        if (dentry->d_name.len > EXT2_NAME_LEN)
                return ERR_PTR(-ENAMETOOLONG);
 
-       page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
+       page = obdfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,
+                               &de, LOCKED);
        inode = NULL;
        if ( !page ) 
                CDEBUG(D_INODE, "No page - negative entry.\n");
@@ -197,12 +198,14 @@ struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry)
  * NOTE!! The inode part of 'de' is left at 0 - which means you
  * may not sleep between calling this and putting something into
  * the entry, as someone else might have used it while you slept.
-
+ *
  * returns a locked and held page upon success 
  */
 
-/* XXX I believe these pages should in fact NOT be locked */
 
+/* We do this with a locked page: that's not necessary, since the semaphore
+ * on the inode protects this page as well.
+ */
 static struct page *obdfs_add_entry (struct inode * dir,
                                     const char * name, int namelen,
                                     struct ext2_dir_entry_2 ** res_dir,
@@ -232,8 +235,9 @@ static struct page *obdfs_add_entry (struct inode * dir,
         */
        if (dir->i_size == 0)
        {
-               EXIT;
+               OIDEBUG(dir);
                *err = -ENOENT;
+               EXIT;
                return NULL;
        }
        page = obdfs_getpage(dir, 0, 0, LOCKED);
@@ -242,14 +246,16 @@ static struct page *obdfs_add_entry (struct inode * dir,
                return NULL;
        }
        rec_len = EXT2_DIR_REC_LEN(namelen);
-       CDEBUG(D_INODE, "reclen: %d\n", rec_len);
+       /* 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;
        while (1) {
-               CDEBUG(D_INODE, "Considering entry at %p, (page at %#lx - %#lx), offset %ld\n",
-                      de, page_address(page), page_address(page) + PAGE_SIZE, offset);
+               /* CDEBUG(D_INODE,
+                      "Entry at %p, (page at %#lx - %#lx), offset %ld\n",
+                      de, page_address(page), page_address(page) + PAGE_SIZE,
+                      offset); */
                if ((char *)de >= PAGE_SIZE + (char *)page_address(page)) {
                        UnlockPage(page);
                        page_cache_release(page);
@@ -281,7 +287,6 @@ static struct page *obdfs_add_entry (struct inode * dir,
                                de = (struct ext2_dir_entry_2 *) page_address(page);
                        }
                }
-               CDEBUG(D_INODE, "\n");
                if (!obdfs_check_dir_entry ("ext2_add_entry", dir, de, page,
                                           offset)) {
                        *err = -ENOENT;
@@ -298,27 +303,32 @@ static struct page *obdfs_add_entry (struct inode * dir,
                                EXIT;
                                return NULL;
                }
-               CDEBUG(D_INODE, "Testing for enough space at de %p\n", de);
+               /* CDEBUG(D_INODE, "Testing for enough space at de %p\n", de);*/
                if ( (le32_to_cpu(de->inode) == 0 && le16_to_cpu(de->rec_len) >= rec_len) ||
                     (le16_to_cpu(de->rec_len) >= EXT2_DIR_REC_LEN(de->name_len) + rec_len)) {
                        offset += le16_to_cpu(de->rec_len);
-                       CDEBUG(D_INODE, "Found enough space de %p, offset %#lx\n", de, offset);
+                       /* CDEBUG(D_INODE,
+                              "Found enough space de %p, offset %#lx\n",
+                              de, offset); */
                        if (le32_to_cpu(de->inode)) {
-                               CDEBUG(D_INODE, "Inserting new in %p\n", de);
+                               /*CDEBUG(D_INODE, "Insert new in %p\n", de);*/
                                de1 = (struct ext2_dir_entry_2 *) ((char *) de +
                                        EXT2_DIR_REC_LEN(de->name_len));
-                               CDEBUG(D_INODE, "-- de1 at %p\n", de1);
+                               /*CDEBUG(D_INODE, "-- de1 at %p\n", de1);*/
                                de1->rec_len = cpu_to_le16(le16_to_cpu(de->rec_len) -
                                        EXT2_DIR_REC_LEN(de->name_len));
                                de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
                                de = de1;
                        }
-                       CDEBUG(D_INODE, "Reclen adjusted; copy %d bytes to %p, page at %#lx EOP at %#lx\n", namelen, de->name, page_address(page), page_address(page) + PAGE_SIZE);
+                       /* CDEBUG(D_INODE,
+                              "Reclen adjusted; copy %d bytes to %p, "
+                              "page at %#lx EOP at %#lx\n",
+                              namelen, de->name, page_address(page),
+                              page_address(page) + PAGE_SIZE); */
                        de->inode = 0;
                        de->name_len = namelen;
                        de->file_type = 0;
                        memcpy (de->name, name, namelen);
-                       CDEBUG(D_INODE, "Copy done\n");
                        /*
                         * XXX shouldn't update any times until successful
                         * completion of syscall, but too many callers depend
@@ -336,21 +346,19 @@ static struct page *obdfs_add_entry (struct inode * dir,
                        dir->i_version = ++event;
                        *res_dir = de;
                        *err = 0;
-                       PDEBUG(page, "addentry");
-                       CDEBUG(D_INODE, "Regular exit from add_entry");
+                       PDEBUG(page, "add_entry");
+                       /* XXX unlock page here */
                        EXIT;
                        return page;
                }
-               CDEBUG(D_INODE, "\n");
                offset += le16_to_cpu(de->rec_len);
                de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
                
        }
-       CDEBUG(D_INODE, "\n");
 
        UnlockPage(page);
        page_cache_release(page);
-       PDEBUG(page, "addentry");
+       PDEBUG(page, "add_entry");
        EXIT;
        return NULL;
 } /* obdfs_add_entry */
@@ -459,7 +467,7 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
                return ERR_PTR(-ENOMEM);
        }
 
-       /* Send a hint to the create method on the type of file created */
+       /* Send a hint to the create method on the type of file to create */
        oa->o_mode = mode;
        oa->o_valid |= OBD_MD_FLMODE;
 
@@ -480,8 +488,6 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
                return ERR_PTR(-EIO);
        }
 
-       inode->i_mode = mode; /* XXX not sure if we need this or iget does it */
-
        if (!list_empty(&inode->i_dentry)) {
                CDEBUG(D_INODE, "New inode (%ld) has aliases!\n", inode->i_ino);
                IOPS(dir, destroy)(IID(dir), oa);
@@ -490,8 +496,6 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
                EXIT;
                return ERR_PTR(-EIO);
        }
-
-       INIT_LIST_HEAD(&OBDFS_LIST(inode));
        obdo_free(oa);
 
        EXIT;
@@ -552,7 +556,6 @@ int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)
        int err;
 
         ENTRY;
-
        inode = obdfs_new_inode(dir, mode);
        if ( IS_ERR(inode) ) {
                EXIT;
@@ -657,7 +660,6 @@ int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
        dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
        mark_inode_dirty(dir);
        err = obdfs_do_writepage(dir, page, IS_SYNC(dir));
-       /* XXX handle err? */
 
        UnlockPage(page);
 
@@ -872,7 +874,7 @@ int obdfs_symlink (struct inode * dir, struct dentry *dentry,
        for (l = 0; l < inode->i_sb->s_blocksize - 1 && symname [l]; l++)
                ;
 
-       oinfo = OBDFS_INFO(inode);
+       oinfo = obdfs_i2info(inode);
 
        if (l >= sizeof(oinfo->oi_inline)) {
                CDEBUG(D_INODE, "l=%d, normal symlink\n", l);
@@ -891,7 +893,6 @@ int obdfs_symlink (struct inode * dir, struct dentry *dentry,
                oinfo->oi_flags |= OBD_FL_INLINEDATA;
 
                CDEBUG(D_INODE, "l=%d, fast symlink\n", l);
-
        }
        i = 0;
        while (i < inode->i_sb->s_blocksize - 1 && (c = *(symname++)))
@@ -1064,9 +1065,10 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry,
        old_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
        mark_inode_dirty(old_dir);
        if (dir_page) {
-               PARENT_INO(page_address(dir_page)) = le32_to_cpu(new_dir->i_ino);
+               PARENT_INO(page_address(dir_page)) =le32_to_cpu(new_dir->i_ino);
+               err = 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) {
@@ -1083,10 +1085,11 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry,
                /* lock the old_page and release unlocked copy */
                CDEBUG(D_INODE, "old_page at %p\n", old_page);
                page_cache_release(old_page);
-               old_page = obdfs_getpage(old_dir, index >> PAGE_SHIFT, 0, LOCKED);
+               old_page = obdfs_getpage(old_dir, index << PAGE_SHIFT, 0,
+                                        LOCKED);
                CDEBUG(D_INODE, "old_page at %p\n", old_page);
-               /* XXX handle err */
                err = obdfs_do_writepage(old_dir, old_page, IS_SYNC(old_dir));
+               /* XXX handle err */
        }
 
        err = obdfs_do_writepage(new_dir, new_page, IS_SYNC(new_dir));
@@ -1105,6 +1108,5 @@ end_rename:
        if (dir_page)
                page_cache_release(dir_page);
 
-
        return err;
 } /* obdfs_rename */