FreeBSD: Cleanup zfs_readdir()

The FreeBSD project's coverity scans found dead code in `zfs_readdir()`.
Also, the comment above `zfs_readdir()` is out of date.

I fixed the comment and deleted all of the dead code, plus additional
dead code that was found upon review.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13924
This commit is contained in:
Richard Yao 2022-09-20 17:50:16 -04:00 committed by GitHub
parent 9276e202eb
commit 3f400b0f58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 16 additions and 138 deletions

View File

@ -21,7 +21,6 @@ noinst_HEADERS = \
%D%/spl/sys/dirent.h \ %D%/spl/sys/dirent.h \
%D%/spl/sys/disp.h \ %D%/spl/sys/disp.h \
%D%/spl/sys/dkio.h \ %D%/spl/sys/dkio.h \
%D%/spl/sys/extdirent.h \
%D%/spl/sys/fcntl.h \ %D%/spl/sys/fcntl.h \
%D%/spl/sys/file.h \ %D%/spl/sys/file.h \
%D%/spl/sys/freebsd_rwlock.h \ %D%/spl/sys/freebsd_rwlock.h \

View File

@ -1,71 +0,0 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or https://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_EXTDIRENT_H
#define _SYS_EXTDIRENT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/dirent.h>
/*
* Extended file-system independent directory entry. This style of
* dirent provides additional informational flag bits for each
* directory entry. This dirent will be returned instead of the
* standard dirent if a VOP_READDIR() requests dirent flags via
* V_RDDIR_ENTFLAGS, and if the file system supports the flags.
*/
typedef struct edirent {
ino64_t ed_ino; /* "inode number" of entry */
off64_t ed_off; /* offset of disk directory entry */
uint32_t ed_eflags; /* per-entry flags */
unsigned short ed_reclen; /* length of this record */
char ed_name[1]; /* name of file */
} edirent_t;
#define EDIRENT_RECLEN(namelen) \
((offsetof(edirent_t, ed_name[0]) + 1 + (namelen) + 7) & ~ 7)
#define EDIRENT_NAMELEN(reclen) \
((reclen) - (offsetof(edirent_t, ed_name[0])))
/*
* Extended entry flags
* Extended entries include a bitfield of extra information
* regarding that entry.
*/
#define ED_CASE_CONFLICT 0x10 /* Disconsidering case, entry is not unique */
/*
* Extended flags accessor function
*/
#define ED_CASE_CONFLICTS(x) ((x)->ed_eflags & ED_CASE_CONFLICT)
#ifdef __cplusplus
}
#endif
#endif /* _SYS_EXTDIRENT_H */

View File

@ -44,8 +44,6 @@
#define IS_DEVVP(vp) \ #define IS_DEVVP(vp) \
((vp)->v_type == VCHR || (vp)->v_type == VBLK || (vp)->v_type == VFIFO) ((vp)->v_type == VCHR || (vp)->v_type == VBLK || (vp)->v_type == VFIFO)
#define V_XATTRDIR 0x0000 /* attribute unnamed directory */
#define AV_SCANSTAMP_SZ 32 /* length of anti-virus scanstamp */ #define AV_SCANSTAMP_SZ 32 /* length of anti-virus scanstamp */
/* /*
@ -193,11 +191,6 @@
#define MODEMASK 07777 /* mode bits plus permission bits */ #define MODEMASK 07777 /* mode bits plus permission bits */
#define PERMMASK 00777 /* permission bits */ #define PERMMASK 00777 /* permission bits */
/*
* VOP_ACCESS flags
*/
#define V_ACE_MASK 0x1 /* mask represents NFSv4 ACE permissions */
/* /*
* Flags for vnode operations. * Flags for vnode operations.
*/ */
@ -234,12 +227,6 @@ struct taskq;
#define CREATE_XATTR_DIR 0x04 /* Create extended attr dir */ #define CREATE_XATTR_DIR 0x04 /* Create extended attr dir */
#define LOOKUP_HAVE_SYSATTR_DIR 0x08 /* Already created virtual GFS dir */ #define LOOKUP_HAVE_SYSATTR_DIR 0x08 /* Already created virtual GFS dir */
/*
* Flags for VOP_READDIR
*/
#define V_RDDIR_ENTFLAGS 0x01 /* request dirent flags */
#define V_RDDIR_ACCFILTER 0x02 /* filter out inaccessible dirents */
/* /*
* Public vnode manipulation functions. * Public vnode manipulation functions.
*/ */

View File

@ -33,7 +33,6 @@
#include <sys/resource.h> #include <sys/resource.h>
#include <sys/vfs.h> #include <sys/vfs.h>
#include <sys/vnode.h> #include <sys/vnode.h>
#include <sys/extdirent.h>
#include <sys/file.h> #include <sys/file.h>
#include <sys/kmem.h> #include <sys/kmem.h>
#include <sys/uio.h> #include <sys/uio.h>

View File

@ -76,7 +76,6 @@
#include <sys/zfs_quota.h> #include <sys/zfs_quota.h>
#include <sys/zfs_sa.h> #include <sys/zfs_sa.h>
#include <sys/zfs_rlock.h> #include <sys/zfs_rlock.h>
#include <sys/extdirent.h>
#include <sys/bio.h> #include <sys/bio.h>
#include <sys/buf.h> #include <sys/buf.h>
#include <sys/sched.h> #include <sys/sched.h>
@ -1648,10 +1647,11 @@ zfs_rmdir(znode_t *dzp, const char *name, znode_t *cwd, cred_t *cr, int flags)
* and return buffer. * and return buffer.
* cr - credentials of caller. * cr - credentials of caller.
* ct - caller context * ct - caller context
* flags - case flags
* *
* OUT: uio - updated offset and range, buffer filled. * OUT: uio - updated offset and range, buffer filled.
* eofp - set to true if end-of-file detected. * eofp - set to true if end-of-file detected.
* ncookies- number of entries in cookies
* cookies - offsets to directory entries
* *
* RETURN: 0 on success, error code on failure. * RETURN: 0 on success, error code on failure.
* *
@ -1669,7 +1669,6 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
{ {
znode_t *zp = VTOZ(vp); znode_t *zp = VTOZ(vp);
iovec_t *iovp; iovec_t *iovp;
edirent_t *eodp;
dirent64_t *odp; dirent64_t *odp;
zfsvfs_t *zfsvfs = zp->z_zfsvfs; zfsvfs_t *zfsvfs = zp->z_zfsvfs;
objset_t *os; objset_t *os;
@ -1687,7 +1686,6 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
uint8_t type; uint8_t type;
int ncooks; int ncooks;
cookie_t *cooks = NULL; cookie_t *cooks = NULL;
int flags = 0;
if ((error = zfs_enter_verify_zp(zfsvfs, zp, FTAG)) != 0) if ((error = zfs_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
return (error); return (error);
@ -1755,7 +1753,6 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
outbuf = NULL; outbuf = NULL;
odp = (struct dirent64 *)iovp->iov_base; odp = (struct dirent64 *)iovp->iov_base;
} }
eodp = (struct edirent *)odp;
if (ncookies != NULL) { if (ncookies != NULL) {
/* /*
@ -1824,25 +1821,7 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
type = ZFS_DIRENT_TYPE(zap.za_first_integer); type = ZFS_DIRENT_TYPE(zap.za_first_integer);
} }
if (flags & V_RDDIR_ACCFILTER) { reclen = DIRENT64_RECLEN(strlen(zap.za_name));
/*
* If we have no access at all, don't include
* this entry in the returned information
*/
znode_t *ezp;
if (zfs_zget(zp->z_zfsvfs, objnum, &ezp) != 0)
goto skip_entry;
if (!zfs_has_access(ezp, cr)) {
vrele(ZTOV(ezp));
goto skip_entry;
}
vrele(ZTOV(ezp));
}
if (flags & V_RDDIR_ENTFLAGS)
reclen = EDIRENT_RECLEN(strlen(zap.za_name));
else
reclen = DIRENT64_RECLEN(strlen(zap.za_name));
/* /*
* Will this entry fit in the buffer? * Will this entry fit in the buffer?
@ -1857,33 +1836,19 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
} }
break; break;
} }
if (flags & V_RDDIR_ENTFLAGS) { /*
/* * Add normal entry:
* Add extended flag entry: */
*/ odp->d_ino = objnum;
eodp->ed_ino = objnum; odp->d_reclen = reclen;
eodp->ed_reclen = reclen; odp->d_namlen = strlen(zap.za_name);
/* NOTE: ed_off is the offset for the *next* entry */ /* NOTE: d_off is the offset for the *next* entry. */
next = &(eodp->ed_off); next = &odp->d_off;
eodp->ed_eflags = zap.za_normalization_conflict ? strlcpy(odp->d_name, zap.za_name, odp->d_namlen + 1);
ED_CASE_CONFLICT : 0; odp->d_type = type;
(void) strncpy(eodp->ed_name, zap.za_name, dirent_terminate(odp);
EDIRENT_NAMELEN(reclen)); odp = (dirent64_t *)((intptr_t)odp + reclen);
eodp = (edirent_t *)((intptr_t)eodp + reclen);
} else {
/*
* Add normal entry:
*/
odp->d_ino = objnum;
odp->d_reclen = reclen;
odp->d_namlen = strlen(zap.za_name);
/* NOTE: d_off is the offset for the *next* entry. */
next = &odp->d_off;
strlcpy(odp->d_name, zap.za_name, odp->d_namlen + 1);
odp->d_type = type;
dirent_terminate(odp);
odp = (dirent64_t *)((intptr_t)odp + reclen);
}
outcount += reclen; outcount += reclen;
ASSERT3S(outcount, <=, bufsize); ASSERT3S(outcount, <=, bufsize);
@ -1893,7 +1858,6 @@ zfs_readdir(vnode_t *vp, zfs_uio_t *uio, cred_t *cr, int *eofp,
dmu_prefetch(os, objnum, 0, 0, 0, dmu_prefetch(os, objnum, 0, 0, 0,
ZIO_PRIORITY_SYNC_READ); ZIO_PRIORITY_SYNC_READ);
skip_entry:
/* /*
* Move to the next entry, fill in the previous offset. * Move to the next entry, fill in the previous offset.
*/ */