From owner-svn-src-projects@FreeBSD.ORG Mon Jan 21 07:02:22 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 8F4ADFD6; Mon, 21 Jan 2013 07:02:22 +0000 (UTC) (envelope-from bryanv@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 660E2E49; Mon, 21 Jan 2013 07:02:22 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0L72MWZ000511; Mon, 21 Jan 2013 07:02:22 GMT (envelope-from bryanv@svn.freebsd.org) Received: (from bryanv@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0L72MRg000510; Mon, 21 Jan 2013 07:02:22 GMT (envelope-from bryanv@svn.freebsd.org) Message-Id: <201301210702.r0L72MRg000510@svn.freebsd.org> From: Bryan Venteicher Date: Mon, 21 Jan 2013 07:02:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r245724 - projects/virtio/sys/dev/virtio/block X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Jan 2013 07:02:22 -0000 Author: bryanv Date: Mon Jan 21 07:02:21 2013 New Revision: 245724 URL: http://svnweb.freebsd.org/changeset/base/245724 Log: virtio_blk: Add resize support Approved by: grehan (implicit) Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.c Modified: projects/virtio/sys/dev/virtio/block/virtio_blk.c ============================================================================== --- projects/virtio/sys/dev/virtio/block/virtio_blk.c Mon Jan 21 07:01:32 2013 (r245723) +++ projects/virtio/sys/dev/virtio/block/virtio_blk.c Mon Jan 21 07:02:21 2013 (r245724) @@ -110,6 +110,7 @@ static int vtblk_detach(device_t); static int vtblk_suspend(device_t); static int vtblk_resume(device_t); static int vtblk_shutdown(device_t); +static int vtblk_config_change(device_t); static int vtblk_open(struct disk *); static int vtblk_close(struct disk *); @@ -122,6 +123,7 @@ static void vtblk_negotiate_features(str static int vtblk_maximum_segments(struct vtblk_softc *, struct virtio_blk_config *); static int vtblk_alloc_virtqueue(struct vtblk_softc *); +static void vtblk_resize_disk(struct vtblk_softc *, uint64_t); static void vtblk_alloc_disk(struct vtblk_softc *, struct virtio_blk_config *); static void vtblk_create_disk(struct vtblk_softc *); @@ -204,6 +206,9 @@ static device_method_t vtblk_methods[] = DEVMETHOD(device_resume, vtblk_resume), DEVMETHOD(device_shutdown, vtblk_shutdown), + /* VirtIO methods. */ + DEVMETHOD(virtio_config_change, vtblk_config_change), + DEVMETHOD_END }; @@ -415,6 +420,27 @@ vtblk_shutdown(device_t dev) } static int +vtblk_config_change(device_t dev) +{ + struct vtblk_softc *sc; + struct virtio_blk_config blkcfg; + uint64_t capacity; + + sc = device_get_softc(dev); + + virtio_read_device_config(dev, 0, &blkcfg, + sizeof(struct virtio_blk_config)); + + /* Capacity is always in 512-byte units. */ + capacity = blkcfg.capacity * 512; + + if (sc->vtblk_disk->d_mediasize != capacity) + vtblk_resize_disk(sc, capacity); + + return (0); +} + +static int vtblk_open(struct disk *dp) { struct vtblk_softc *sc; @@ -580,6 +606,31 @@ vtblk_alloc_virtqueue(struct vtblk_softc } static void +vtblk_resize_disk(struct vtblk_softc *sc, uint64_t new_capacity) +{ + device_t dev; + struct disk *dp; + int error; + + dev = sc->vtblk_dev; + dp = sc->vtblk_disk; + + dp->d_mediasize = new_capacity; + if (bootverbose) { + device_printf(dev, "resized %juMB (%ju %u byte sectors)\n", + (uintmax_t) dp->d_mediasize >> 20, + (uintmax_t) dp->d_mediasize / dp->d_sectorsize, + dp->d_sectorsize); + } + + error = disk_resize(dp, M_NOWAIT); + if (error) { + device_printf(dev, + "disk_resize(9) failed, error: %d\n", error); + } +} + +static void vtblk_alloc_disk(struct vtblk_softc *sc, struct virtio_blk_config *blkcfg) { device_t dev;