Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=041388b54ed95cd169546bd83bacd08ee32bd7ea
Commit:     041388b54ed95cd169546bd83bacd08ee32bd7ea
Parent:     c734c79bc397eace039bea406997efa89f879c14
Author:     Lachlan McIlroy <[EMAIL PROTECTED]>
AuthorDate: Tue Dec 18 16:19:34 2007 +1100
Committer:  Lachlan McIlroy <[EMAIL PROTECTED]>
CommitDate: Tue Dec 18 17:16:23 2007 +1100

    [XFS] Put the correct offset in dirent d_off
    
    The recent filldir regression fix was not putting the correct d_off in
    each dirent. This was resulting in incorrect cookies being passed to dmapi
    ioctls and the wrong offset appearing in the dirents. readdir was
    unaffected as the filp->f_pos was being updated with the correct offset
    and this was being written into the last dirent in each buffer. Fix the
    XFS code to do the right thing.
    
    SGI-PV: 973746
    SGI-Modid: xfs-linux-melb:xfs-kern:30240a
    
    Signed-off-by: David Chinner <[EMAIL PROTECTED]>
    Signed-off-by: Christoph Hellwig <[EMAIL PROTECTED]>
    Signed-off-by: Lachlan McIlroy <[EMAIL PROTECTED]>
---
 fs/xfs/linux-2.6/xfs_file.c |    4 ++--
 fs/xfs/xfs_dir2_block.c     |    6 ++----
 fs/xfs/xfs_dir2_leaf.c      |    2 +-
 fs/xfs/xfs_dir2_sf.c        |    9 +++------
 4 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
index 54c5646..e1fcef2 100644
--- a/fs/xfs/linux-2.6/xfs_file.c
+++ b/fs/xfs/linux-2.6/xfs_file.c
@@ -356,13 +356,13 @@ xfs_file_readdir(
 
                        reclen = sizeof(struct hack_dirent) + de->namlen;
                        size -= reclen;
-                       curr_offset = de->offset /* & 0x7fffffff */;
                        de = (struct hack_dirent *)((char *)de + reclen);
+                       curr_offset = de->offset /* & 0x7fffffff */;
                }
        }
 
  done:
-       if (!error) {
+       if (!error) {
                if (size == 0)
                        filp->f_pos = offset & 0x7fffffff;
                else if (de)
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c
index c171767..a5f4f4f 100644
--- a/fs/xfs/xfs_dir2_block.c
+++ b/fs/xfs/xfs_dir2_block.c
@@ -508,7 +508,7 @@ xfs_dir2_block_getdents(
                        continue;
 
                cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
-                                                   ptr - (char *)block);
+                                           (char *)dep - (char *)block);
                ino = be64_to_cpu(dep->inumber);
 #if XFS_BIG_INUMS
                ino += mp->m_inoadd;
@@ -519,9 +519,7 @@ xfs_dir2_block_getdents(
                 */
                if (filldir(dirent, dep->name, dep->namelen, cook,
                            ino, DT_UNKNOWN)) {
-                       *offset = xfs_dir2_db_off_to_dataptr(mp,
-                                       mp->m_dirdatablk,
-                                       (char *)dep - (char *)block);
+                       *offset = cook;
                        xfs_da_brelse(NULL, bp);
                        return 0;
                }
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c
index e7c12fa..0ca0020 100644
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -1091,7 +1091,7 @@ xfs_dir2_leaf_getdents(
                 * Won't fit.  Return to caller.
                 */
                if (filldir(dirent, dep->name, dep->namelen,
-                           xfs_dir2_byte_to_dataptr(mp, curoff + length),
+                           xfs_dir2_byte_to_dataptr(mp, curoff),
                            ino, DT_UNKNOWN))
                        break;
 
diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c
index 182c703..919d275 100644
--- a/fs/xfs/xfs_dir2_sf.c
+++ b/fs/xfs/xfs_dir2_sf.c
@@ -752,7 +752,7 @@ xfs_dir2_sf_getdents(
 #if XFS_BIG_INUMS
                ino += mp->m_inoadd;
 #endif
-               if (filldir(dirent, ".", 1, dotdot_offset, ino, DT_DIR)) {
+               if (filldir(dirent, ".", 1, dot_offset, ino, DT_DIR)) {
                        *offset = dot_offset;
                        return 0;
                }
@@ -762,13 +762,11 @@ xfs_dir2_sf_getdents(
         * Put .. entry unless we're starting past it.
         */
        if (*offset <= dotdot_offset) {
-               off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
-                                                 XFS_DIR2_DATA_FIRST_OFFSET);
                ino = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent);
 #if XFS_BIG_INUMS
                ino += mp->m_inoadd;
 #endif
-               if (filldir(dirent, "..", 2, off, ino, DT_DIR)) {
+               if (filldir(dirent, "..", 2, dotdot_offset, ino, DT_DIR)) {
                        *offset = dotdot_offset;
                        return 0;
                }
@@ -793,8 +791,7 @@ xfs_dir2_sf_getdents(
 #endif
 
                if (filldir(dirent, sfep->name, sfep->namelen,
-                           off + xfs_dir2_data_entsize(sfep->namelen),
-                           ino, DT_UNKNOWN)) {
+                                           off, ino, DT_UNKNOWN)) {
                        *offset = off;
                        return 0;
                }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to