From owner-svn-src-all@FreeBSD.ORG Tue Aug 26 14:44:09 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 7CE46CF9; Tue, 26 Aug 2014 14:44:09 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 679413F6F; Tue, 26 Aug 2014 14:44:09 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s7QEi9PB027752; Tue, 26 Aug 2014 14:44:09 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s7QEi8hV027747; Tue, 26 Aug 2014 14:44:08 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201408261444.s7QEi8hV027747@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Tue, 26 Aug 2014 14:44:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r270664 - in head/sys: dev/streams kern sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Aug 2014 14:44:09 -0000 Author: glebius Date: Tue Aug 26 14:44:08 2014 New Revision: 270664 URL: http://svnweb.freebsd.org/changeset/base/270664 Log: - Remove socket file operations declaration from sys/file.h. - Make them static in sys_socket.c. - Provide generic invfo_truncate() instead of soo_truncate(). Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: head/sys/dev/streams/streams.c head/sys/kern/kern_descrip.c head/sys/kern/sys_socket.c head/sys/kern/uipc_socket.c head/sys/sys/file.h Modified: head/sys/dev/streams/streams.c ============================================================================== --- head/sys/dev/streams/streams.c Tue Aug 26 13:53:01 2014 (r270663) +++ head/sys/dev/streams/streams.c Tue Aug 26 14:44:08 2014 (r270664) @@ -87,20 +87,8 @@ enum { static struct cdev *dt_ptm, *dt_arp, *dt_icmp, *dt_ip, *dt_tcp, *dt_udp, *dt_rawip, *dt_unix_dgram, *dt_unix_stream, *dt_unix_ord_stream; -static struct fileops svr4_netops = { - .fo_read = soo_read, - .fo_write = soo_write, - .fo_truncate = soo_truncate, - .fo_ioctl = soo_ioctl, - .fo_poll = soo_poll, - .fo_kqfilter = soo_kqfilter, - .fo_stat = soo_stat, - .fo_close = svr4_soo_close, - .fo_chmod = invfo_chmod, - .fo_chown = invfo_chown, - .fo_sendfile = invfo_sendfile, -}; - +static struct fileops svr4_netops; + static struct cdevsw streams_cdevsw = { .d_version = D_VERSION, .d_open = streamsopen, @@ -147,6 +135,11 @@ streams_modevent(module_t mod, int type, printf("WARNING: device config for STREAMS failed\n"); printf("Suggest unloading streams KLD\n"); } + + /* Inherit generic socket file operations, except close(2). */ + bcopy(&socketops, &svr4_netops, sizeof(struct fileops)); + svr4_netops.fo_close = svr4_soo_close; + return 0; case MOD_UNLOAD: /* XXX should check to see if it's busy first */ @@ -345,11 +338,15 @@ svr4_stream_get(fp) static int svr4_soo_close(struct file *fp, struct thread *td) { - struct socket *so = fp->f_data; + struct socket *so = fp->f_data; /* CHECKUNIT_DIAG(ENXIO);*/ svr4_delete_socket(td->td_proc, fp); free(so->so_emuldata, M_TEMP); - return soo_close(fp, td); + + fp->f_ops = &badfileops; + fp->f_data = NULL; + + return soclose(so); } Modified: head/sys/kern/kern_descrip.c ============================================================================== --- head/sys/kern/kern_descrip.c Tue Aug 26 13:53:01 2014 (r270663) +++ head/sys/kern/kern_descrip.c Tue Aug 26 14:44:08 2014 (r270664) @@ -3944,6 +3944,14 @@ struct fileops badfileops = { }; int +invfo_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td) +{ + + return (EINVAL); +} + +int invfo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred, struct thread *td) { Modified: head/sys/kern/sys_socket.c ============================================================================== --- head/sys/kern/sys_socket.c Tue Aug 26 13:53:01 2014 (r270663) +++ head/sys/kern/sys_socket.c Tue Aug 26 14:44:08 2014 (r270664) @@ -56,10 +56,18 @@ __FBSDID("$FreeBSD$"); #include +static fo_rdwr_t soo_read; +static fo_rdwr_t soo_write; +static fo_ioctl_t soo_ioctl; +static fo_poll_t soo_poll; +extern fo_kqfilter_t soo_kqfilter; +static fo_stat_t soo_stat; +static fo_close_t soo_close; + struct fileops socketops = { .fo_read = soo_read, .fo_write = soo_write, - .fo_truncate = soo_truncate, + .fo_truncate = invfo_truncate, .fo_ioctl = soo_ioctl, .fo_poll = soo_poll, .fo_kqfilter = soo_kqfilter, @@ -71,8 +79,7 @@ struct fileops socketops = { .fo_flags = DFLAG_PASSABLE }; -/* ARGSUSED */ -int +static int soo_read(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) { @@ -88,8 +95,7 @@ soo_read(struct file *fp, struct uio *ui return (error); } -/* ARGSUSED */ -int +static int soo_write(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td) { @@ -110,15 +116,7 @@ soo_write(struct file *fp, struct uio *u return (error); } -int -soo_truncate(struct file *fp, off_t length, struct ucred *active_cred, - struct thread *td) -{ - - return (EINVAL); -} - -int +static int soo_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred, struct thread *td) { @@ -226,7 +224,7 @@ soo_ioctl(struct file *fp, u_long cmd, v return (error); } -int +static int soo_poll(struct file *fp, int events, struct ucred *active_cred, struct thread *td) { @@ -241,7 +239,7 @@ soo_poll(struct file *fp, int events, st return (sopoll(so, events, fp->f_cred, td)); } -int +static int soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred, struct thread *td) { @@ -281,8 +279,7 @@ soo_stat(struct file *fp, struct stat *u * file reference but the actual socket will not go away until the socket's * ref count hits 0. */ -/* ARGSUSED */ -int +static int soo_close(struct file *fp, struct thread *td) { int error = 0; Modified: head/sys/kern/uipc_socket.c ============================================================================== --- head/sys/kern/uipc_socket.c Tue Aug 26 13:53:01 2014 (r270663) +++ head/sys/kern/uipc_socket.c Tue Aug 26 14:44:08 2014 (r270664) @@ -160,6 +160,7 @@ static void filt_sowdetach(struct knote static int filt_sowrite(struct knote *kn, long hint); static int filt_solisten(struct knote *kn, long hint); static int inline hhook_run_socket(struct socket *so, void *hctx, int32_t h_id); +fo_kqfilter_t soo_kqfilter; static struct filterops solisten_filtops = { .f_isfd = 1, Modified: head/sys/sys/file.h ============================================================================== --- head/sys/sys/file.h Tue Aug 26 13:53:01 2014 (r270663) +++ head/sys/sys/file.h Tue Aug 26 14:44:08 2014 (r270664) @@ -231,23 +231,10 @@ int fget_write(struct thread *td, int fd struct file **fpp); int _fdrop(struct file *fp, struct thread *td); -/* - * The socket operations are used a couple of places. - * XXX: This is wrong, they should go through the operations vector for - * XXX: sockets instead of going directly for the individual functions. /phk - */ -fo_rdwr_t soo_read; -fo_rdwr_t soo_write; -fo_truncate_t soo_truncate; -fo_ioctl_t soo_ioctl; -fo_poll_t soo_poll; -fo_kqfilter_t soo_kqfilter; -fo_stat_t soo_stat; -fo_close_t soo_close; - fo_chmod_t invfo_chmod; fo_chown_t invfo_chown; fo_sendfile_t invfo_sendfile; +fo_truncate_t invfo_truncate; fo_sendfile_t vn_sendfile; fo_seek_t vn_seek;