aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_dir2_sf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_dir2_sf.c')
-rw-r--r--fs/xfs/xfs_dir2_sf.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c
index 6157424dbf8f..97676a347da1 100644
--- a/fs/xfs/xfs_dir2_sf.c
+++ b/fs/xfs/xfs_dir2_sf.c
@@ -768,9 +768,7 @@ xfs_dir2_sf_create(
768int /* error */ 768int /* error */
769xfs_dir2_sf_getdents( 769xfs_dir2_sf_getdents(
770 xfs_inode_t *dp, /* incore directory inode */ 770 xfs_inode_t *dp, /* incore directory inode */
771 void *dirent, 771 struct dir_context *ctx)
772 xfs_off_t *offset,
773 filldir_t filldir)
774{ 772{
775 int i; /* shortform entry number */ 773 int i; /* shortform entry number */
776 xfs_mount_t *mp; /* filesystem mount point */ 774 xfs_mount_t *mp; /* filesystem mount point */
@@ -802,7 +800,7 @@ xfs_dir2_sf_getdents(
802 /* 800 /*
803 * If the block number in the offset is out of range, we're done. 801 * If the block number in the offset is out of range, we're done.
804 */ 802 */
805 if (xfs_dir2_dataptr_to_db(mp, *offset) > mp->m_dirdatablk) 803 if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk)
806 return 0; 804 return 0;
807 805
808 /* 806 /*
@@ -819,22 +817,20 @@ xfs_dir2_sf_getdents(
819 /* 817 /*
820 * Put . entry unless we're starting past it. 818 * Put . entry unless we're starting past it.
821 */ 819 */
822 if (*offset <= dot_offset) { 820 if (ctx->pos <= dot_offset) {
823 if (filldir(dirent, ".", 1, dot_offset & 0x7fffffff, dp->i_ino, DT_DIR)) { 821 ctx->pos = dot_offset & 0x7fffffff;
824 *offset = dot_offset & 0x7fffffff; 822 if (!dir_emit(ctx, ".", 1, dp->i_ino, DT_DIR))
825 return 0; 823 return 0;
826 }
827 } 824 }
828 825
829 /* 826 /*
830 * Put .. entry unless we're starting past it. 827 * Put .. entry unless we're starting past it.
831 */ 828 */
832 if (*offset <= dotdot_offset) { 829 if (ctx->pos <= dotdot_offset) {
833 ino = xfs_dir2_sf_get_parent_ino(sfp); 830 ino = xfs_dir2_sf_get_parent_ino(sfp);
834 if (filldir(dirent, "..", 2, dotdot_offset & 0x7fffffff, ino, DT_DIR)) { 831 ctx->pos = dotdot_offset & 0x7fffffff;
835 *offset = dotdot_offset & 0x7fffffff; 832 if (!dir_emit(ctx, "..", 2, ino, DT_DIR))
836 return 0; 833 return 0;
837 }
838 } 834 }
839 835
840 /* 836 /*
@@ -845,21 +841,20 @@ xfs_dir2_sf_getdents(
845 off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, 841 off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
846 xfs_dir2_sf_get_offset(sfep)); 842 xfs_dir2_sf_get_offset(sfep));
847 843
848 if (*offset > off) { 844 if (ctx->pos > off) {
849 sfep = xfs_dir2_sf_nextentry(sfp, sfep); 845 sfep = xfs_dir2_sf_nextentry(sfp, sfep);
850 continue; 846 continue;
851 } 847 }
852 848
853 ino = xfs_dir2_sfe_get_ino(sfp, sfep); 849 ino = xfs_dir2_sfe_get_ino(sfp, sfep);
854 if (filldir(dirent, (char *)sfep->name, sfep->namelen, 850 ctx->pos = off & 0x7fffffff;
855 off & 0x7fffffff, ino, DT_UNKNOWN)) { 851 if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen,
856 *offset = off & 0x7fffffff; 852 ino, DT_UNKNOWN))
857 return 0; 853 return 0;
858 }
859 sfep = xfs_dir2_sf_nextentry(sfp, sfep); 854 sfep = xfs_dir2_sf_nextentry(sfp, sfep);
860 } 855 }
861 856
862 *offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & 857 ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) &
863 0x7fffffff; 858 0x7fffffff;
864 return 0; 859 return 0;
865} 860}