mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
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:
parent
9276e202eb
commit
3f400b0f58
@ -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 \
|
||||||
|
@ -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 */
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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>
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user