From owner-svn-src-stable@FreeBSD.ORG Sat Jul 3 18:19:59 2010 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 641D1106566B; Sat, 3 Jul 2010 18:19:59 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 513178FC0C; Sat, 3 Jul 2010 18:19:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o63IJxm3088734; Sat, 3 Jul 2010 18:19:59 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o63IJxaS088731; Sat, 3 Jul 2010 18:19:59 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201007031819.o63IJxaS088731@svn.freebsd.org> From: Konstantin Belousov Date: Sat, 3 Jul 2010 18:19:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209668 - in stable/8/sys: kern sys X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Jul 2010 18:19:59 -0000 Author: kib Date: Sat Jul 3 18:19:59 2010 New Revision: 209668 URL: http://svn.freebsd.org/changeset/base/209668 Log: MFC r209106: Add another variation of make_dev(9), make_dev_p(9), that is allowed to fail and can return useful error code. MFC r209237 (by jh): Correct the function name in a KASSERT. MFC r209244 (by ed): Remove the unit argument from the recently added make_dev_p(). Modified: stable/8/sys/kern/kern_conf.c stable/8/sys/sys/conf.h Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) Modified: stable/8/sys/kern/kern_conf.c ============================================================================== --- stable/8/sys/kern/kern_conf.c Sat Jul 3 18:09:11 2010 (r209667) +++ stable/8/sys/kern/kern_conf.c Sat Jul 3 18:19:59 2010 (r209668) @@ -55,9 +55,8 @@ struct mtx devmtx; static void destroy_devl(struct cdev *dev); static int destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg); -static struct cdev *make_dev_credv(int flags, - struct cdevsw *devsw, int unit, - struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, +static int make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, + int unit, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, va_list ap); static struct cdev_priv_list cdevp_free_list = @@ -583,20 +582,20 @@ prep_cdevsw(struct cdevsw *devsw, int fl mtx_assert(&devmtx, MA_OWNED); if (devsw->d_flags & D_INIT) - return (1); + return (0); if (devsw->d_flags & D_NEEDGIANT) { dev_unlock(); dsw2 = malloc(sizeof *dsw2, M_DEVT, (flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK); dev_lock(); if (dsw2 == NULL && !(devsw->d_flags & D_INIT)) - return (0); + return (ENOMEM); } else dsw2 = NULL; if (devsw->d_flags & D_INIT) { if (dsw2 != NULL) cdevsw_free_devlocked(dsw2); - return (1); + return (0); } if (devsw->d_version != D_VERSION_01 && @@ -657,25 +656,28 @@ prep_cdevsw(struct cdevsw *devsw, int fl if (dsw2 != NULL) cdevsw_free_devlocked(dsw2); - return (1); + return (0); } -static struct cdev * -make_dev_credv(int flags, struct cdevsw *devsw, int unit, - struct ucred *cr, uid_t uid, - gid_t gid, int mode, const char *fmt, va_list ap) +static int +make_dev_credv(int flags, struct cdev **dres, struct cdevsw *devsw, int unit, + struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, + va_list ap) { struct cdev *dev; - int i; + int i, res; + KASSERT((flags & MAKEDEV_WAITOK) == 0 || (flags & MAKEDEV_NOWAIT) == 0, + ("make_dev_credv: both WAITOK and NOWAIT specified")); dev = devfs_alloc(flags); if (dev == NULL) - return (NULL); + return (ENOMEM); dev_lock(); - if (!prep_cdevsw(devsw, flags)) { + res = prep_cdevsw(devsw, flags); + if (res != 0) { dev_unlock(); devfs_free(dev); - return (NULL); + return (res); } dev = newdev(devsw, unit, dev); if (flags & MAKEDEV_REF) @@ -688,7 +690,8 @@ make_dev_credv(int flags, struct cdevsw * XXX: still ?? */ dev_unlock_and_free(); - return (dev); + *dres = dev; + return (0); } KASSERT(!(dev->si_flags & SI_NAMED), ("make_dev() by driver %s on pre-existing device (min=%x, name=%s)", @@ -713,7 +716,8 @@ make_dev_credv(int flags, struct cdevsw notify_create(dev, flags); - return (dev); + *dres = dev; + return (0); } struct cdev * @@ -722,10 +726,13 @@ make_dev(struct cdevsw *devsw, int unit, { struct cdev *dev; va_list ap; + int res; va_start(ap, fmt); - dev = make_dev_credv(0, devsw, unit, NULL, uid, gid, mode, fmt, ap); + res = make_dev_credv(0, &dev, devsw, unit, NULL, uid, gid, mode, fmt, + ap); va_end(ap); + KASSERT(res == 0 && dev != NULL, ("make_dev: failed make_dev_credv")); return (dev); } @@ -735,28 +742,50 @@ make_dev_cred(struct cdevsw *devsw, int { struct cdev *dev; va_list ap; + int res; va_start(ap, fmt); - dev = make_dev_credv(0, devsw, unit, cr, uid, gid, mode, fmt, ap); + res = make_dev_credv(0, &dev, devsw, unit, cr, uid, gid, mode, fmt, ap); va_end(ap); + KASSERT(res == 0 && dev != NULL, + ("make_dev_cred: failed make_dev_credv")); return (dev); } struct cdev * -make_dev_credf(int flags, struct cdevsw *devsw, int unit, - struct ucred *cr, uid_t uid, - gid_t gid, int mode, const char *fmt, ...) +make_dev_credf(int flags, struct cdevsw *devsw, int unit, struct ucred *cr, + uid_t uid, gid_t gid, int mode, const char *fmt, ...) { struct cdev *dev; va_list ap; + int res; va_start(ap, fmt); - dev = make_dev_credv(flags, devsw, unit, cr, uid, gid, mode, + res = make_dev_credv(flags, &dev, devsw, unit, cr, uid, gid, mode, fmt, ap); va_end(ap); - return (dev); + KASSERT((flags & MAKEDEV_NOWAIT) != 0 || res == 0, + ("make_dev_credf: failed make_dev_credv")); + return (res == 0 ? dev : NULL); +} + +int +make_dev_p(int flags, struct cdev **cdev, struct cdevsw *devsw, + struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, ...) +{ + va_list ap; + int res; + + va_start(ap, fmt); + res = make_dev_credv(flags, cdev, devsw, 0, cr, uid, gid, mode, + fmt, ap); + va_end(ap); + + KASSERT((flags & MAKEDEV_NOWAIT) != 0 || res == 0, + ("make_dev_p: failed make_dev_credv")); + return (res); } static void Modified: stable/8/sys/sys/conf.h ============================================================================== --- stable/8/sys/sys/conf.h Sat Jul 3 18:09:11 2010 (r209667) +++ stable/8/sys/sys/conf.h Sat Jul 3 18:19:59 2010 (r209668) @@ -279,7 +279,11 @@ struct cdev *make_dev_credf(int _flags, struct cdevsw *_devsw, int _unit, struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode, const char *_fmt, ...) __printflike(8, 9); -struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3); +int make_dev_p(int _flags, struct cdev **_cdev, struct cdevsw *_devsw, + struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode, + const char *_fmt, ...) __printflike(8, 9); +struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) + __printflike(2, 3); void dev_lock(void); void dev_unlock(void); void setconf(void);