Commit 57680915 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6

* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6:
  [XFS] Put the correct offset in dirent d_off
  [XFS] Don't wait for pending I/Os when purging blocks beyond eof.
parents d5565337 041388b5
...@@ -356,13 +356,13 @@ xfs_file_readdir( ...@@ -356,13 +356,13 @@ xfs_file_readdir(
reclen = sizeof(struct hack_dirent) + de->namlen; reclen = sizeof(struct hack_dirent) + de->namlen;
size -= reclen; size -= reclen;
curr_offset = de->offset /* & 0x7fffffff */;
de = (struct hack_dirent *)((char *)de + reclen); de = (struct hack_dirent *)((char *)de + reclen);
curr_offset = de->offset /* & 0x7fffffff */;
} }
} }
done: done:
if (!error) { if (!error) {
if (size == 0) if (size == 0)
filp->f_pos = offset & 0x7fffffff; filp->f_pos = offset & 0x7fffffff;
else if (de) else if (de)
......
...@@ -508,7 +508,7 @@ xfs_dir2_block_getdents( ...@@ -508,7 +508,7 @@ xfs_dir2_block_getdents(
continue; continue;
cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
ptr - (char *)block); (char *)dep - (char *)block);
ino = be64_to_cpu(dep->inumber); ino = be64_to_cpu(dep->inumber);
#if XFS_BIG_INUMS #if XFS_BIG_INUMS
ino += mp->m_inoadd; ino += mp->m_inoadd;
...@@ -519,9 +519,7 @@ xfs_dir2_block_getdents( ...@@ -519,9 +519,7 @@ xfs_dir2_block_getdents(
*/ */
if (filldir(dirent, dep->name, dep->namelen, cook, if (filldir(dirent, dep->name, dep->namelen, cook,
ino, DT_UNKNOWN)) { ino, DT_UNKNOWN)) {
*offset = xfs_dir2_db_off_to_dataptr(mp, *offset = cook;
mp->m_dirdatablk,
(char *)dep - (char *)block);
xfs_da_brelse(NULL, bp); xfs_da_brelse(NULL, bp);
return 0; return 0;
} }
......
...@@ -1091,7 +1091,7 @@ xfs_dir2_leaf_getdents( ...@@ -1091,7 +1091,7 @@ xfs_dir2_leaf_getdents(
* Won't fit. Return to caller. * Won't fit. Return to caller.
*/ */
if (filldir(dirent, dep->name, dep->namelen, 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)) ino, DT_UNKNOWN))
break; break;
......
...@@ -752,7 +752,7 @@ xfs_dir2_sf_getdents( ...@@ -752,7 +752,7 @@ xfs_dir2_sf_getdents(
#if XFS_BIG_INUMS #if XFS_BIG_INUMS
ino += mp->m_inoadd; ino += mp->m_inoadd;
#endif #endif
if (filldir(dirent, ".", 1, dotdot_offset, ino, DT_DIR)) { if (filldir(dirent, ".", 1, dot_offset, ino, DT_DIR)) {
*offset = dot_offset; *offset = dot_offset;
return 0; return 0;
} }
...@@ -762,13 +762,11 @@ xfs_dir2_sf_getdents( ...@@ -762,13 +762,11 @@ xfs_dir2_sf_getdents(
* Put .. entry unless we're starting past it. * Put .. entry unless we're starting past it.
*/ */
if (*offset <= dotdot_offset) { 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); ino = xfs_dir2_sf_get_inumber(sfp, &sfp->hdr.parent);
#if XFS_BIG_INUMS #if XFS_BIG_INUMS
ino += mp->m_inoadd; ino += mp->m_inoadd;
#endif #endif
if (filldir(dirent, "..", 2, off, ino, DT_DIR)) { if (filldir(dirent, "..", 2, dotdot_offset, ino, DT_DIR)) {
*offset = dotdot_offset; *offset = dotdot_offset;
return 0; return 0;
} }
...@@ -793,8 +791,7 @@ xfs_dir2_sf_getdents( ...@@ -793,8 +791,7 @@ xfs_dir2_sf_getdents(
#endif #endif
if (filldir(dirent, sfep->name, sfep->namelen, if (filldir(dirent, sfep->name, sfep->namelen,
off + xfs_dir2_data_entsize(sfep->namelen), off, ino, DT_UNKNOWN)) {
ino, DT_UNKNOWN)) {
*offset = off; *offset = off;
return 0; return 0;
} }
......
...@@ -1459,8 +1459,10 @@ xfs_itruncate_start( ...@@ -1459,8 +1459,10 @@ xfs_itruncate_start(
mp = ip->i_mount; mp = ip->i_mount;
vp = XFS_ITOV(ip); vp = XFS_ITOV(ip);
vn_iowait(ip); /* wait for the completion of any pending DIOs */ /* wait for the completion of any pending DIOs */
if (new_size < ip->i_size)
vn_iowait(ip);
/* /*
* Call toss_pages or flushinval_pages to get rid of pages * Call toss_pages or flushinval_pages to get rid of pages
* overlapping the region being removed. We have to use * overlapping the region being removed. We have to use
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment