kcmp(2): implement for generic file types

(cherry picked from commit f28526e9466cd60ed33053e922238ba1c9040341)
This commit is contained in:
Konstantin Belousov 2024-01-19 23:44:37 +02:00
parent f8d885c08d
commit 575a909aa2
11 changed files with 18 additions and 0 deletions

View file

@ -139,6 +139,7 @@ static struct fileops kqueueops = {
.fo_chmod = invfo_chmod,
.fo_chown = invfo_chown,
.fo_sendfile = invfo_sendfile,
.fo_cmp = file_kcmp_generic,
.fo_fill_kinfo = kqueue_fill_kinfo,
};

View file

@ -77,6 +77,7 @@ static struct fileops eventfdops = {
.fo_chown = invfo_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = eventfd_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE
};

View file

@ -2160,3 +2160,11 @@ sys_kcmp(struct thread *td, struct kcmp_args *uap)
return (kern_kcmp(td, uap->pid1, uap->pid2, uap->type,
uap->idx1, uap->idx2));
}
int
file_kcmp_generic(struct file *fp1, struct file *fp2, struct thread *td)
{
if (fp1->f_type != fp2->f_type)
return (3);
return (kcmp_cmp((uintptr_t)fp1->f_data, (uintptr_t)fp2->f_data));
}

View file

@ -166,6 +166,7 @@ struct fileops pipeops = {
.fo_chown = pipe_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = pipe_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE
};

View file

@ -112,6 +112,7 @@ struct fileops socketops = {
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = soo_fill_kinfo,
.fo_aio_queue = soo_aio_queue,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE
};

View file

@ -371,6 +371,7 @@ static struct fileops timerfdops = {
.fo_chown = invfo_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = timerfd_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE,
};

View file

@ -610,6 +610,7 @@ static struct fileops ptsdev_ops = {
.fo_chown = invfo_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = ptsdev_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE,
};

View file

@ -2661,6 +2661,7 @@ static struct fileops mqueueops = {
.fo_chown = mqf_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = mqf_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE,
};

View file

@ -153,6 +153,7 @@ static struct fileops ksem_ops = {
.fo_chown = ksem_chown,
.fo_sendfile = invfo_sendfile,
.fo_fill_kinfo = ksem_fill_kinfo,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE
};

View file

@ -169,6 +169,7 @@ struct fileops shm_ops = {
.fo_add_seals = shm_add_seals,
.fo_fallocate = shm_fallocate,
.fo_fspacectl = shm_fspacectl,
.fo_cmp = file_kcmp_generic,
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE,
};

View file

@ -281,6 +281,7 @@ fo_seek_t vn_seek;
fo_fill_kinfo_t vn_fill_kinfo;
fo_kqfilter_t vn_kqfilter_opath;
int vn_fill_kinfo_vnode(struct vnode *vp, struct kinfo_file *kif);
int file_kcmp_generic(struct file *fp1, struct file *fp2, struct thread *td);
void finit(struct file *, u_int, short, void *, struct fileops *);
void finit_vnode(struct file *, u_int, void *, struct fileops *);