Page MenuHomeFreeBSD

D39755.id120909.diff
No OneTemporary

D39755.id120909.diff

diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -75,15 +75,9 @@
static int vop_nolookup(struct vop_lookup_args *);
static int vop_norename(struct vop_rename_args *);
static int vop_nostrategy(struct vop_strategy_args *);
-static int get_next_dirent(struct vnode *vp, struct dirent **dpp,
- char *dirbuf, int dirbuflen, off_t *off,
- char **cpos, int *len, int *eofflag,
- struct thread *td);
static int dirent_exists(struct vnode *vp, const char *dirname,
struct thread *td);
-#define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
-
static int vop_stdis_text(struct vop_is_text_args *ap);
static int vop_stdunset_text(struct vop_unset_text_args *ap);
static int vop_stdadd_writecount(struct vop_add_writecount_args *ap);
@@ -281,65 +275,6 @@
return (EOPNOTSUPP);
}
-static int
-get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf,
- int dirbuflen, off_t *off, char **cpos, int *len,
- int *eofflag, struct thread *td)
-{
- int error, reclen;
- struct uio uio;
- struct iovec iov;
- struct dirent *dp;
-
- KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
- KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
-
- if (*len == 0) {
- iov.iov_base = dirbuf;
- iov.iov_len = dirbuflen;
-
- uio.uio_iov = &iov;
- uio.uio_iovcnt = 1;
- uio.uio_offset = *off;
- uio.uio_resid = dirbuflen;
- uio.uio_segflg = UIO_SYSSPACE;
- uio.uio_rw = UIO_READ;
- uio.uio_td = td;
-
- *eofflag = 0;
-
-#ifdef MAC
- error = mac_vnode_check_readdir(td->td_ucred, vp);
- if (error == 0)
-#endif
- error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag,
- NULL, NULL);
- if (error)
- return (error);
-
- *off = uio.uio_offset;
-
- *cpos = dirbuf;
- *len = (dirbuflen - uio.uio_resid);
-
- if (*len == 0)
- return (ENOENT);
- }
-
- dp = (struct dirent *)(*cpos);
- reclen = dp->d_reclen;
- *dpp = dp;
-
- /* check for malformed directory.. */
- if (reclen < DIRENT_MINSIZE)
- return (EINVAL);
-
- *cpos += reclen;
- *len -= reclen;
-
- return (0);
-}
-
/*
* Check if a named file exists in a given directory vnode.
*/
@@ -369,8 +304,8 @@
off = 0;
len = 0;
do {
- error = get_next_dirent(vp, &dp, dirbuf, dirbuflen, &off,
- &cpos, &len, &eofflag, td);
+ error = vn_dir_next_dirent(vp, &dp, dirbuf, dirbuflen, &off,
+ &cpos, &len, &eofflag, td);
if (error)
goto out;
@@ -808,8 +743,8 @@
len = 0;
do {
/* call VOP_READDIR of parent */
- error = get_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off,
- &cpos, &len, &eofflag, td);
+ error = vn_dir_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off,
+ &cpos, &len, &eofflag, td);
if (error)
goto out;
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -65,6 +65,7 @@
#include <sys/mutex.h>
#include <sys/namei.h>
#include <sys/vnode.h>
+#include <sys/dirent.h>
#include <sys/bio.h>
#include <sys/buf.h>
#include <sys/filio.h>
@@ -3739,6 +3740,67 @@
return (error);
}
+#define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
+
+int
+vn_dir_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf,
+ int dirbuflen, off_t *off, char **cpos, int *len,
+ int *eofflag, struct thread *td)
+{
+ int error, reclen;
+ struct uio uio;
+ struct iovec iov;
+ struct dirent *dp;
+
+ KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
+ KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
+
+ if (*len == 0) {
+ iov.iov_base = dirbuf;
+ iov.iov_len = dirbuflen;
+
+ uio.uio_iov = &iov;
+ uio.uio_iovcnt = 1;
+ uio.uio_offset = *off;
+ uio.uio_resid = dirbuflen;
+ uio.uio_segflg = UIO_SYSSPACE;
+ uio.uio_rw = UIO_READ;
+ uio.uio_td = td;
+
+ *eofflag = 0;
+
+#ifdef MAC
+ error = mac_vnode_check_readdir(td->td_ucred, vp);
+ if (error == 0)
+#endif
+ error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag,
+ NULL, NULL);
+ if (error)
+ return (error);
+
+ *off = uio.uio_offset;
+
+ *cpos = dirbuf;
+ *len = (dirbuflen - uio.uio_resid);
+
+ if (*len == 0)
+ return (ENOENT);
+ }
+
+ dp = (struct dirent *)(*cpos);
+ reclen = dp->d_reclen;
+ *dpp = dp;
+
+ /* check for malformed directory.. */
+ if (reclen < DIRENT_MINSIZE)
+ return (EINVAL);
+
+ *cpos += reclen;
+ *len -= reclen;
+
+ return (0);
+}
+
static u_long vn_lock_pair_pause_cnt;
SYSCTL_ULONG(_debug, OID_AUTO, vn_lock_pair_pause, CTLFLAG_RD,
&vn_lock_pair_pause_cnt, 0,
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -746,6 +746,10 @@
struct thread *fsize_td);
int vn_deallocate(struct vnode *vp, off_t *offset, off_t *length, int flags,
int ioflg, struct ucred *active_cred, struct ucred *file_cred);
+struct dirent;
+int vn_dir_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf,
+ int dirbuflen, off_t *off, char **cpos, int *len,
+ int *eofflag, struct thread *td);
void vn_finished_write(struct mount *mp);
void vn_finished_secondary_write(struct mount *mp);
int vn_fsync_buf(struct vnode *vp, int waitfor);
@@ -1098,7 +1102,6 @@
void vfs_hash_remove(struct vnode *vp);
int vfs_kqfilter(struct vop_kqfilter_args *);
-struct dirent;
int vfs_read_dirent(struct vop_readdir_args *ap, struct dirent *dp, off_t off);
int vfs_emptydir(struct vnode *vp);

File Metadata

Mime Type
text/plain
Expires
Tue, Jun 16, 6:15 PM (15 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33997184
Default Alt Text
D39755.id120909.diff (5 KB)

Event Timeline