The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9f6718073382608519912e178e4c313dd61246b3

commit 9f6718073382608519912e178e4c313dd61246b3
Author:     Mark Johnston <ma...@freebsd.org>
AuthorDate: 2025-07-13 15:05:51 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2025-07-13 18:24:36 +0000

    msdosfs: Fix handling of eofflag in VOP_READDIR
    
    We also need to set it when an end-of-directory marker is reached.
    
    Reported by:    vishwin
    Reviewed by:    kib
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D51290
---
 sys/fs/msdosfs/msdosfs_vnops.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c
index 5db61c8951f6..33e0d94954d7 100644
--- a/sys/fs/msdosfs/msdosfs_vnops.c
+++ b/sys/fs/msdosfs/msdosfs_vnops.c
@@ -1521,6 +1521,9 @@ msdosfs_readdir(struct vop_readdir_args *ap)
            ap->a_vp, uio, ap->a_cred, ap->a_eofflag);
 #endif
 
+       if (ap->a_eofflag != NULL)
+               *ap->a_eofflag = 0;
+
        /*
         * msdosfs_readdir() won't operate properly on regular files since
         * it does i/o only with the filesystem vnode, and hence can
@@ -1614,8 +1617,11 @@ msdosfs_readdir(struct vop_readdir_args *ap)
                on = (offset - bias) & pmp->pm_crbomask;
                n = min(pmp->pm_bpcluster - on, uio->uio_resid);
                diff = dep->de_FileSize - (offset - bias);
-               if (diff <= 0)
-                       break;
+               if (diff <= 0) {
+                       if (ap->a_eofflag != NULL)
+                               *ap->a_eofflag = 1;
+                       goto out;
+               }
                n = min(n, diff);
                error = pcbmap(dep, lbn, &bn, &cn, &blsize);
                if (error)
@@ -1646,6 +1652,8 @@ msdosfs_readdir(struct vop_readdir_args *ap)
                         */
                        if (dentp->deName[0] == SLOT_EMPTY) {
                                brelse(bp);
+                               if (ap->a_eofflag != NULL)
+                                       *ap->a_eofflag = 1;
                                goto out;
                        }
                        /*
@@ -1743,15 +1751,6 @@ out:
 
        uio->uio_offset = off;
 
-       /*
-        * Set the eofflag (NFS uses it)
-        */
-       if (ap->a_eofflag) {
-               if (dep->de_FileSize - (offset - bias) <= 0)
-                       *ap->a_eofflag = 1;
-               else
-                       *ap->a_eofflag = 0;
-       }
        return (error);
 }
 

Reply via email to