From 245bfd34da590e12884bd1a5677f3227a36d4bcf Mon Sep 17 00:00:00 2001 From: Ryan Moeller Date: Thu, 21 May 2020 01:55:35 +0000 Subject: [PATCH] Deduplicate fsid comparisons Comparing fsid_t objects requires internal knowledge of the fsid structure and yet this is duplicated across a number of places in the code. Simplify by creating a fsidcmp function (macro). Reviewed by: mjg, rmacklem Approved by: mav (mentor) MFC after: 1 week Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D24749 --- lib/libugidfw/ugidfw.c | 5 ++--- sbin/mksnap_ffs/mksnap_ffs.c | 3 +-- sbin/umount/umount.c | 3 +-- sys/fs/nfs/nfsdport.h | 3 +-- sys/fs/nfsserver/nfs_nfsdport.c | 22 ++++++------------- sys/fs/nfsserver/nfs_nfsdsocket.c | 8 ++----- sys/fs/nfsserver/nfs_nfsdstate.c | 15 +++++-------- sys/kern/vfs_subr.c | 13 ++++------- .../mac_bsdextended/mac_bsdextended.c | 5 ++--- .../mac_bsdextended/mac_bsdextended.h | 2 +- sys/sys/mount.h | 2 ++ usr.sbin/autofs/autounmountd.c | 3 +-- usr.sbin/mountd/mountd.c | 15 +++++-------- 13 files changed, 34 insertions(+), 65 deletions(-) diff --git a/lib/libugidfw/ugidfw.c b/lib/libugidfw/ugidfw.c index a77fd9d15bc6..4fc09bbb163f 100644 --- a/lib/libugidfw/ugidfw.c +++ b/lib/libugidfw/ugidfw.c @@ -334,9 +334,8 @@ bsde_rule_to_string(struct mac_bsdextended_rule *rule, char *buf, size_t buflen) if (rule->mbr_object.mbo_flags & MBO_FSID_DEFINED) { numfs = getmntinfo(&mntbuf, MNT_NOWAIT); for (i = 0; i < numfs; i++) - if (memcmp(&(rule->mbr_object.mbo_fsid), - &(mntbuf[i].f_fsid), - sizeof(mntbuf[i].f_fsid)) == 0) + if (fsidcmp(&rule->mbr_object.mbo_fsid, + &mntbuf[i].f_fsid) == 0) break; len = snprintf(cur, left, "filesys %s ", i == numfs ? "???" : mntbuf[i].f_mntonname); diff --git a/sbin/mksnap_ffs/mksnap_ffs.c b/sbin/mksnap_ffs/mksnap_ffs.c index 374617bf50fd..5d230701de85 100644 --- a/sbin/mksnap_ffs/mksnap_ffs.c +++ b/sbin/mksnap_ffs/mksnap_ffs.c @@ -81,8 +81,7 @@ issamefs(const char *path, struct statfs *stfsp) return (-1); if (statfs(path, &stfsbuf) < 0) return (-1); - if ((stfsbuf.f_fsid.val[0] != stfsp->f_fsid.val[0]) || - (stfsbuf.f_fsid.val[1] != stfsp->f_fsid.val[1])) + if (fsidcmp(&stfsbuf.f_fsid, &stfsp->f_fsid) != 0) return (0); return (1); } diff --git a/sbin/umount/umount.c b/sbin/umount/umount.c index b936c9dc174a..6a58fdb5524e 100644 --- a/sbin/umount/umount.c +++ b/sbin/umount/umount.c @@ -505,8 +505,7 @@ getmntentry(const char *fromname, const char *onname, fsid_t *fsid, dowhat what) continue; if (onname != NULL && strcmp(sfs->f_mntonname, onname) != 0) continue; - if (fsid != NULL && bcmp(&sfs->f_fsid, fsid, - sizeof(*fsid)) != 0) + if (fsid != NULL && fsidcmp(&sfs->f_fsid, fsid) != 0) continue; switch (what) { diff --git a/sys/fs/nfs/nfsdport.h b/sys/fs/nfs/nfsdport.h index f6834761bf31..7d73acab43b2 100644 --- a/sys/fs/nfs/nfsdport.h +++ b/sys/fs/nfs/nfsdport.h @@ -85,8 +85,7 @@ struct nfsexstuff { #define NFSVNO_SETEXRDONLY(e) ((e)->nes_exflag = (MNT_EXPORTED|MNT_EXRDONLY)) #define NFSVNO_CMPFH(f1, f2) \ - ((f1)->fh_fsid.val[0] == (f2)->fh_fsid.val[0] && \ - (f1)->fh_fsid.val[1] == (f2)->fh_fsid.val[1] && \ + (fsidcmp(&(f1)->fh_fsid, &(f2)->fh_fsid) == 0 && \ bcmp(&(f1)->fh_fid, &(f2)->fh_fid, sizeof(struct fid)) == 0) #define NFSLOCKHASH(f) \ diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index a136c6fd3895..b7c8f2f8be38 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -4019,11 +4019,8 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, struct ucred *cred, if (tds->nfsdev_nmp != NULL) { if (tds->nfsdev_mdsisset == 0 && ds == NULL) ds = tds; - else if (tds->nfsdev_mdsisset != 0 && - mp->mnt_stat.f_fsid.val[0] == - tds->nfsdev_mdsfsid.val[0] && - mp->mnt_stat.f_fsid.val[1] == - tds->nfsdev_mdsfsid.val[1]) { + else if (tds->nfsdev_mdsisset != 0 && fsidcmp( + &mp->mnt_stat.f_fsid, &tds->nfsdev_mdsfsid) == 0) { ds = fds = tds; break; } @@ -4043,10 +4040,8 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, struct ucred *cred, if (tds->nfsdev_nmp != NULL && ((tds->nfsdev_mdsisset == 0 && fds == NULL) || (tds->nfsdev_mdsisset != 0 && fds != NULL && - mp->mnt_stat.f_fsid.val[0] == - tds->nfsdev_mdsfsid.val[0] && - mp->mnt_stat.f_fsid.val[1] == - tds->nfsdev_mdsfsid.val[1]))) { + fsidcmp(&mp->mnt_stat.f_fsid, + &tds->nfsdev_mdsfsid) == 0))) { dsdir[mirrorcnt] = i; dvp[mirrorcnt] = tds->nfsdev_dsdir[i]; mirrorcnt++; @@ -4778,10 +4773,8 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char *buf, int *buflenp, fndds->nfsdev_mdsisset == 0) || (tds->nfsdev_mdsisset != 0 && fndds->nfsdev_mdsisset != 0 && - tds->nfsdev_mdsfsid.val[0] == - mp->mnt_stat.f_fsid.val[0] && - tds->nfsdev_mdsfsid.val[1] == - mp->mnt_stat.f_fsid.val[1]))) { + fsidcmp(&tds->nfsdev_mdsfsid, + &mp->mnt_stat.f_fsid) == 0))) { *newnmpp = tds->nfsdev_nmp; break; } @@ -5968,8 +5961,7 @@ nfsrv_pnfsstatfs(struct statfs *sf, struct mount *mp) /* First, search for matches for same file system. */ TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) { if (ds->nfsdev_nmp != NULL && ds->nfsdev_mdsisset != 0 && - ds->nfsdev_mdsfsid.val[0] == mp->mnt_stat.f_fsid.val[0] && - ds->nfsdev_mdsfsid.val[1] == mp->mnt_stat.f_fsid.val[1]) { + fsidcmp(&ds->nfsdev_mdsfsid, &mp->mnt_stat.f_fsid) == 0) { if (++i > nfsrv_devidcnt) break; *tdvpp++ = ds->nfsdev_dvp; diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c index a3e4e0f808a7..2d0a66b2ec05 100644 --- a/sys/fs/nfsserver/nfs_nfsdsocket.c +++ b/sys/fs/nfsserver/nfs_nfsdsocket.c @@ -1059,10 +1059,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram, u_char *tag, if (!error && !nd->nd_repstat) { if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP) { new_mp = nvp->v_mount; - if (cur_fsid.val[0] != - new_mp->mnt_stat.f_fsid.val[0] || - cur_fsid.val[1] != - new_mp->mnt_stat.f_fsid.val[1]) { + if (fsidcmp(&cur_fsid, &new_mp->mnt_stat.f_fsid) != 0) { /* crossed a server mount point */ nd->nd_repstat = nfsvno_checkexp(new_mp, nd->nd_nam, &nes, &credanon); @@ -1091,8 +1088,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram, u_char *tag, if (vp == NULL || savevp == NULL) { nd->nd_repstat = NFSERR_NOFILEHANDLE; break; - } else if (cur_fsid.val[0] != save_fsid.val[0] || - cur_fsid.val[1] != save_fsid.val[1]) { + } else if (fsidcmp(&cur_fsid, &save_fsid) != 0) { nd->nd_repstat = NFSERR_XDEV; break; } diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c index b829107801f2..5d15c68c4ead 100644 --- a/sys/fs/nfsserver/nfs_nfsdstate.c +++ b/sys/fs/nfsserver/nfs_nfsdstate.c @@ -7535,8 +7535,7 @@ nfsrv_freelayouts(nfsquad_t *clid, fsid_t *fs, int laytype, int iomode) TAILQ_FOREACH_SAFE(lyp, &lhyp->list, lay_list, nlyp) { if (clid->qval != lyp->lay_clientid.qval) continue; - if (fs != NULL && (fs->val[0] != lyp->lay_fsid.val[0] || - fs->val[1] != lyp->lay_fsid.val[1])) + if (fs != NULL && fsidcmp(fs, &lyp->lay_fsid) != 0) continue; if (laytype != lyp->lay_type) continue; @@ -7830,10 +7829,8 @@ nfsrv_delds(char *devid, NFSPROC_T *p) TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) { if (ds != fndds && ds->nfsdev_nmp != NULL && ds->nfsdev_mdsisset != 0 && - ds->nfsdev_mdsfsid.val[0] == - fndds->nfsdev_mdsfsid.val[0] && - ds->nfsdev_mdsfsid.val[1] == - fndds->nfsdev_mdsfsid.val[1]) { + fsidcmp(&ds->nfsdev_mdsfsid, + &fndds->nfsdev_mdsfsid) == 0) { fndmirror = 1; break; } @@ -8737,10 +8734,8 @@ nfsrv_findmirroredds(struct nfsmount *nmp) TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) { if (ds != fndds && ds->nfsdev_nmp != NULL && ds->nfsdev_mdsisset != 0 && - ds->nfsdev_mdsfsid.val[0] == - fndds->nfsdev_mdsfsid.val[0] && - ds->nfsdev_mdsfsid.val[1] == - fndds->nfsdev_mdsfsid.val[1]) { + fsidcmp(&ds->nfsdev_mdsfsid, + &fndds->nfsdev_mdsfsid) == 0) { fndmirror = 1; break; } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index bc38e7a83188..737fac0dcdec 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -841,8 +841,7 @@ vfs_getvfs(fsid_t *fsid) CTR2(KTR_VFS, "%s: fsid %p", __func__, fsid); mtx_lock(&mountlist_mtx); TAILQ_FOREACH(mp, &mountlist, mnt_list) { - if (mp->mnt_stat.f_fsid.val[0] == fsid->val[0] && - mp->mnt_stat.f_fsid.val[1] == fsid->val[1]) { + if (fsidcmp(&mp->mnt_stat.f_fsid, fsid) == 0) { vfs_ref(mp); mtx_unlock(&mountlist_mtx); return (mp); @@ -877,16 +876,13 @@ vfs_busyfs(fsid_t *fsid) hash = fsid->val[0] ^ fsid->val[1]; hash = (hash >> 16 ^ hash) & (FSID_CACHE_SIZE - 1); mp = cache[hash]; - if (mp == NULL || - mp->mnt_stat.f_fsid.val[0] != fsid->val[0] || - mp->mnt_stat.f_fsid.val[1] != fsid->val[1]) + if (mp == NULL || fsidcmp(&mp->mnt_stat.f_fsid, fsid) != 0) goto slow; if (vfs_busy(mp, 0) != 0) { cache[hash] = NULL; goto slow; } - if (mp->mnt_stat.f_fsid.val[0] == fsid->val[0] && - mp->mnt_stat.f_fsid.val[1] == fsid->val[1]) + if (fsidcmp(&mp->mnt_stat.f_fsid, fsid) == 0) return (mp); else vfs_unbusy(mp); @@ -894,8 +890,7 @@ vfs_busyfs(fsid_t *fsid) slow: mtx_lock(&mountlist_mtx); TAILQ_FOREACH(mp, &mountlist, mnt_list) { - if (mp->mnt_stat.f_fsid.val[0] == fsid->val[0] && - mp->mnt_stat.f_fsid.val[1] == fsid->val[1]) { + if (fsidcmp(&mp->mnt_stat.f_fsid, fsid) == 0) { error = vfs_busy(mp, MBF_MNTLSTLOCK); if (error) { cache[hash] = NULL; diff --git a/sys/security/mac_bsdextended/mac_bsdextended.c b/sys/security/mac_bsdextended/mac_bsdextended.c index 65cfb36ea496..dc597052b272 100644 --- a/sys/security/mac_bsdextended/mac_bsdextended.c +++ b/sys/security/mac_bsdextended/mac_bsdextended.c @@ -302,9 +302,8 @@ ugidfw_rulecheck(struct mac_bsdextended_rule *rule, } if (rule->mbr_object.mbo_flags & MBO_FSID_DEFINED) { - match = (bcmp(&(vp->v_mount->mnt_stat.f_fsid), - &(rule->mbr_object.mbo_fsid), - sizeof(rule->mbr_object.mbo_fsid)) == 0); + match = (fsidcmp(&vp->v_mount->mnt_stat.f_fsid, + &rule->mbr_object.mbo_fsid) == 0); if (rule->mbr_object.mbo_neg & MBO_FSID_DEFINED) match = !match; if (!match) diff --git a/sys/security/mac_bsdextended/mac_bsdextended.h b/sys/security/mac_bsdextended/mac_bsdextended.h index c09abc0f2ab0..8b998b41067d 100644 --- a/sys/security/mac_bsdextended/mac_bsdextended.h +++ b/sys/security/mac_bsdextended/mac_bsdextended.h @@ -101,7 +101,7 @@ struct mac_bsdextended_object { uid_t mbo_uid_max; gid_t mbo_gid_min; gid_t mbo_gid_max; - struct fsid mbo_fsid; + fsid_t mbo_fsid; int mbo_type; }; diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 1941f2da2f09..00040932e7a3 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -52,6 +52,8 @@ typedef struct fsid { int32_t val[2]; } fsid_t; /* filesystem id type */ +#define fsidcmp(a, b) memcmp((a), (b), sizeof(fsid_t)) + /* * File identifier. * These are unique per filesystem on a single machine. diff --git a/usr.sbin/autofs/autounmountd.c b/usr.sbin/autofs/autounmountd.c index 25c29e739380..006ab697208d 100644 --- a/usr.sbin/autofs/autounmountd.c +++ b/usr.sbin/autofs/autounmountd.c @@ -67,8 +67,7 @@ automounted_find(fsid_t fsid) struct automounted_fs *af; TAILQ_FOREACH(af, &automounted, af_next) { - if (af->af_fsid.val[0] == fsid.val[0] && - af->af_fsid.val[1] == fsid.val[1]) + if (fsidcmp(&af->af_fsid, &fsid) == 0) return (af); } diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c index 79d6ac7f5693..36b3659ea487 100644 --- a/usr.sbin/mountd/mountd.c +++ b/usr.sbin/mountd/mountd.c @@ -1568,10 +1568,8 @@ get_exportlist_one(int passno) ep = get_exp(); } else { if (ep) { - if (ep->ex_fs.val[0] != - fsb.f_fsid.val[0] || - ep->ex_fs.val[1] != - fsb.f_fsid.val[1]) { + if (fsidcmp(&ep->ex_fs, &fsb.f_fsid) + != 0) { getexp_err(ep, tgrp, "fsid mismatch"); goto nextline; @@ -2088,8 +2086,7 @@ compare_nmount_exportlist(struct iovec *iov, int iovlen, char *errmsg) if ((oep->ex_flag & EX_DONE) == 0) { LOGDEBUG("not done delete=%s", oep->ex_fsdir); if (statfs(oep->ex_fsdir, &ofs) >= 0 && - oep->ex_fs.val[0] == ofs.f_fsid.val[0] && - oep->ex_fs.val[1] == ofs.f_fsid.val[1]) { + fsidcmp(&oep->ex_fs, &ofs.f_fsid) == 0) { LOGDEBUG("do delete"); /* * Clear has_publicfh if if was set @@ -2353,8 +2350,7 @@ ex_search(fsid_t *fsid, struct exportlisthead *exhp) i = EXPHASH(fsid); SLIST_FOREACH(ep, &exhp[i], entries) { - if (ep->ex_fs.val[0] == fsid->val[0] && - ep->ex_fs.val[1] == fsid->val[1]) + if (fsidcmp(&ep->ex_fs, fsid) == 0) return (ep); } @@ -3122,8 +3118,7 @@ do_mount(struct exportlist *ep, struct grouplist *grp, int exflags, * filesystem. */ if (statfs(dirp, &fsb1) != 0 || - bcmp(&fsb1.f_fsid, &fsb->f_fsid, - sizeof (fsb1.f_fsid)) != 0) { + fsidcmp(&fsb1.f_fsid, &fsb->f_fsid) != 0) { *cp = savedc; syslog(LOG_ERR, "can't export %s %s", dirp,