From nobody Mon Feb 9 09:09:38 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) client-ip=207.211.31.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1589371162; cv=none; d=zohomail.com; s=zohoarc; b=U7CaKEwEayORmSZ7ayky8Errjd2OP64elDO2rOmJwbstr2T2/7bTdBeRzN6bAusAa8ClpjLAvWeG3W8oUnkahoKTuaK0Bux0B7/B/8bJQca3H8TiqaKd7JaGCwhy6xt6winOMO8NRwHaQXo41Wexq+ScUej2KYOixUJW2Bk09uE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1589371162; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Qfe4vI3U0dh5/UtX2TTLMc/4mERyZzX8RR40W9POwGg=; b=J0fhnXRCBQUA1ljmaGko3eyMnsHqS88+td73LACAXNr6Jf22yDpoIpFsZvWbOnPvQngNnQpbEYpvFZnAySWcHW+ny9iP8l9hyK8UIkjzLACZYrtAAq4jR2+SBkwaE+h2l8ONzB4FaxGtLpnCgak3R56MV62Gm4Qpv3FjOrEkUU8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by mx.zohomail.com with SMTPS id 1589371162388552.9171869328597; Wed, 13 May 2020 04:59:22 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-443-MG6zkFvkNTOLKaXobAnAqA-1; Wed, 13 May 2020 07:59:19 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9A159107ACF8; Wed, 13 May 2020 11:59:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7164210027AF; Wed, 13 May 2020 11:59:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 3FD984EA14; Wed, 13 May 2020 11:59:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 04DBx7XX016453 for ; Wed, 13 May 2020 07:59:07 -0400 Received: by smtp.corp.redhat.com (Postfix) id 79558114D0C; Wed, 13 May 2020 11:59:07 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 73D67114CE5 for ; Wed, 13 May 2020 11:59:07 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 56B6485A5B0 for ; Wed, 13 May 2020 11:59:07 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-226-eo_cUua5PPmZu8yHykj7Eg-1; Wed, 13 May 2020 07:59:05 -0400 Received: by mail-wr1-f67.google.com with SMTP id i15so20499570wrx.10 for ; Wed, 13 May 2020 04:59:04 -0700 (PDT) Received: from localhost.localdomain (public-gprs367127.centertel.pl. [37.47.65.88]) by smtp.gmail.com with ESMTPSA id l1sm27838422wrc.24.2020.05.13.04.59.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2020 04:59:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1589371161; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=Qfe4vI3U0dh5/UtX2TTLMc/4mERyZzX8RR40W9POwGg=; b=RN4yDgweOxH97DD9Hnu4TECLEcUFxggrvhWh4n3QGHVZvM3Mi9PTS+Mb/nTnMYYOt5HJjM ZhuZiwCuvqMjuNF5GBPBQ44BC5KSa8XMkkjtbsV3feK1frjqhE7MefwTMeQpZ04FHtbfde 0CnCxBiNNgxZngalBi17bFw24KP/oM0= X-MC-Unique: MG6zkFvkNTOLKaXobAnAqA-1 X-MC-Unique: eo_cUua5PPmZu8yHykj7Eg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qfe4vI3U0dh5/UtX2TTLMc/4mERyZzX8RR40W9POwGg=; b=heDT8XWPFmmc4gaHpG6gdKNW1PNiqxb0NlC3puHpD2XGqXXHoc1wBvpd4LlxpCqpLM 9dp2fobDrMTSjdziTxJWkZJKrb/F3PdEOuu5LFFIm/6WtkU+np3iUmt6yfCmWLmdEDkM 0cHp2GKqePPj5U0D84UBXA8BqIZmvdGiwGNiOD3K577D7xZd0wkTXLnGfNOHK+HBNbmo Plc3gfSIKgdVzJz/t7vhUQ1y7ylbUz1IZVWNk1jthGeSGDJMoabG/h3yxMM2M/n2dOz0 fqJaJa8m6AOzpnHDnrxvTkqp8E7+zOF8a85JZAsH1n52hHVUQ4ft9bHszLoODkj3vLoG CtSA== X-Gm-Message-State: AGi0PuaWpnwTnngNGAOxHQlWrIQX77Vvo/nvD/cH3MGccPvHgZjxfvYc NIMOFWfpnt7jKBzU82prQykoeUt7 X-Google-Smtp-Source: APiQypKXu20l5DL7qMr/tt9D9rXi0fxAFFwjT1UmIHQuO7q80NFU6EQg+9ALWZnugbtBthGzUJIhSg== X-Received: by 2002:a05:6000:1ca:: with SMTP id t10mr30464017wrx.230.1589371143233; Wed, 13 May 2020 04:59:03 -0700 (PDT) From: Rafael Fonseca To: libvirt-list@redhat.com Subject: [PATCH 40/40] util: convert virStorageSource to GObject Date: Wed, 13 May 2020 13:57:24 +0200 Message-Id: <20200513115724.157687-41-r4f4rfs@gmail.com> In-Reply-To: <20200513115724.157687-1-r4f4rfs@gmail.com> References: <20200513115724.157687-1-r4f4rfs@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Rafael Fonseca X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Signed-off-by: Rafael Fonseca --- src/libvirt_private.syms | 1 + src/qemu/qemu_blockjob.c | 64 ++++++++++++++++----------------------- src/qemu/qemu_domain.c | 10 +++--- src/util/virstoragefile.c | 40 ++++++++++++------------ src/util/virstoragefile.h | 6 ++-- 5 files changed, 55 insertions(+), 66 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 14dace4628..8bc510c5bc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3092,6 +3092,7 @@ virStorageGenerateQcowPassphrase; =20 =20 # util/virstoragefile.h +vir_storage_source_get_type; virStorageAuthDefCopy; virStorageAuthDefFormat; virStorageAuthDefFree; diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 671bfad19b..cd16b81a24 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -91,10 +91,10 @@ static void qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) { if (job->type =3D=3D QEMU_BLOCKJOB_TYPE_CREATE) - virObjectUnref(job->data.create.src); + g_object_unref(job->data.create.src); =20 if (job->type =3D=3D QEMU_BLOCKJOB_TYPE_BACKUP) { - virObjectUnref(job->data.backup.store); + g_object_unref(job->data.backup.store); g_free(job->data.backup.bitmap); } } @@ -105,8 +105,8 @@ qemuBlockJobDataFinalize(GObject *obj) { qemuBlockJobDataPtr job =3D QEMU_BLOCK_JOB_DATA(obj); =20 - virObjectUnref(job->chain); - virObjectUnref(job->mirrorChain); + g_clear_object(&job->chain); + g_clear_object(&job->mirrorChain); =20 qemuBlockJobDataDisposeJobdata(job); =20 @@ -185,7 +185,7 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job, =20 if (disk) { job->disk =3D disk; - job->chain =3D virObjectRef(disk->src); + job->chain =3D g_object_ref(disk->src); QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob =3D g_object_ref(job); } =20 @@ -337,9 +337,9 @@ qemuBlockJobNewCreate(virDomainObjPtr vm, return NULL; =20 if (virStorageSourceIsBacking(chain)) - job->chain =3D virObjectRef(chain); + job->chain =3D g_object_ref(chain); =20 - job->data.create.src =3D virObjectRef(src); + job->data.create.src =3D g_object_ref(src); =20 if (qemuBlockJobRegister(job, vm, NULL, true) < 0) return NULL; @@ -370,7 +370,7 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, if (!(job =3D qemuBlockJobDataNew(QEMU_BLOCKJOB_TYPE_COPY, jobname))) return NULL; =20 - job->mirrorChain =3D virObjectRef(mirror); + job->mirrorChain =3D g_object_ref(mirror); =20 if (shallow && !reuse) job->data.copy.shallownew =3D true; @@ -399,7 +399,7 @@ qemuBlockJobDiskNewBackup(virDomainObjPtr vm, return NULL; =20 job->data.backup.bitmap =3D g_strdup(bitmap); - job->data.backup.store =3D virObjectRef(store); + job->data.backup.store =3D g_object_ref(store); =20 /* backup jobs are usually started in bulk by transaction so the caller * shall save the status XML */ @@ -688,14 +688,12 @@ qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr v= m, /* discard any detected backing store */ if (virStorageSourceIsBacking(n->backingStore) && n->backingStore->detected) { - virObjectUnref(n->backingStore); - n->backingStore =3D NULL; + g_clear_object(&n->backingStore); break; } } =20 - virObjectUnref(persistDisk->src); - persistDisk->src =3D g_steal_pointer(©); + g_set_object(&persistDisk->src, copy); } =20 =20 @@ -729,8 +727,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPt= r driver, disk->dst); } =20 - virObjectUnref(disk->src); - disk->src =3D disk->mirror; + g_set_object(&disk->src, disk->mirror); } else { if (disk->mirror) { virDomainLockImageDetach(driver->lockManager, vm, disk->mirror= ); @@ -740,7 +737,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPt= r driver, * Remove security driver metadata so that they are not leaked= . */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirr= or); =20 - virObjectUnref(disk->mirror); + g_object_unref(disk->mirror); } =20 qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->src); @@ -817,8 +814,7 @@ qemuBlockJobEventProcessLegacy(virQEMUDriverPtr driver, * Remove security driver metadata so that they are not leaked= . */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirr= or); =20 - virObjectUnref(disk->mirror); - disk->mirror =3D NULL; + g_clear_object(&disk->mirror); } disk->mirrorState =3D VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorJob =3D VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; @@ -930,8 +926,7 @@ qemuBlockJobClearConfigChain(virDomainObjPtr vm, if (!virStorageSourceIsSameLocation(disk->src, cfgdisk->src)) return; =20 - virObjectUnref(cfgdisk->src->backingStore); - cfgdisk->src->backingStore =3D NULL; + g_clear_object(&cfgdisk->src->backingStore); } =20 =20 @@ -997,14 +992,14 @@ qemuBlockJobProcessEventCompletedPull(virQEMUDriverPt= r driver, if (baseparent) baseparent->backingStore =3D NULL; qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, tmp= ); - virObjectUnref(tmp); + g_clear_object(&tmp); =20 if (cfgdisk) { tmp =3D cfgdisk->src->backingStore; cfgdisk->src->backingStore =3D cfgbase; if (cfgbaseparent) cfgbaseparent->backingStore =3D NULL; - virObjectUnref(tmp); + g_clear_object(&tmp); } } =20 @@ -1171,8 +1166,7 @@ qemuBlockJobProcessEventCompletedCommit(virQEMUDriver= Ptr driver, if (job->data.commit.deleteCommittedImages) qemuBlockJobDeleteImages(driver, vm, job->disk, job->data.commit.t= op); =20 - virObjectUnref(job->data.commit.top); - job->data.commit.top =3D NULL; + g_clear_object(&job->data.commit.top); =20 if (cfgbaseparent) { cfgbase =3D cfgbaseparent->backingStore; @@ -1183,7 +1177,7 @@ qemuBlockJobProcessEventCompletedCommit(virQEMUDriver= Ptr driver, else cfgdisk->src =3D cfgbase; =20 - virObjectUnref(cfgtop); + g_clear_object(&cfgtop); } } =20 @@ -1249,7 +1243,7 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMU= DriverPtr driver, cfgbaseparent->backingStore =3D NULL; cfgdisk->src =3D cfgbase; cfgdisk->src->readonly =3D cfgtop->readonly; - virObjectUnref(cfgtop); + g_clear_object(&cfgtop); } =20 /* Move security driver metadata */ @@ -1265,11 +1259,9 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEM= UDriverPtr driver, if (job->data.commit.deleteCommittedImages) qemuBlockJobDeleteImages(driver, vm, job->disk, job->data.commit.t= op); =20 - virObjectUnref(job->data.commit.top); - job->data.commit.top =3D NULL; + g_clear_object(&job->data.commit.top); /* the mirror element does not serve functional purpose for the commit= job */ - virObjectUnref(job->disk->mirror); - job->disk->mirror =3D NULL; + g_clear_object(&job->disk->mirror); } =20 =20 @@ -1302,8 +1294,7 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDri= verPtr driver, qemuBlockJobRewriteConfigDiskSource(vm, job->disk, job->disk->mirror); =20 qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job= ->disk->src); - virObjectUnref(job->disk->src); - job->disk->src =3D g_steal_pointer(&job->disk->mirror); + g_set_object(&job->disk->src, job->disk->mirror); } =20 =20 @@ -1321,8 +1312,7 @@ qemuBlockJobProcessEventConcludedCopyAbort(virQEMUDri= verPtr driver, return; =20 qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job= ->disk->mirror); - virObjectUnref(job->disk->mirror); - job->disk->mirror =3D NULL; + g_clear_object(&job->disk->mirror); } =20 =20 @@ -1343,8 +1333,7 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDri= verPtr driver, * not leaking security driver metadata is more important. */ qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror); =20 - virObjectUnref(disk->mirror); - disk->mirror =3D NULL; + g_clear_object(&disk->mirror); } =20 =20 @@ -1394,8 +1383,7 @@ qemuBlockJobProcessEventConcludedCreate(virQEMUDriver= Ptr driver, * it will handle further hotplug of the created volume and also that * the 'chain' which was registered is under their control */ if (job->synchronous) { - virObjectUnref(job->chain); - job->chain =3D NULL; + g_clear_object(&job->chain); return; } =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 02f0ccaa08..336a2f53c3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1184,7 +1184,7 @@ qemuDomainDiskPrivateFinalize(GObject *obj) { qemuDomainDiskPrivatePtr priv =3D QEMU_DOMAIN_DISK(obj); =20 - virObjectUnref(priv->migrSource); + g_clear_object(&priv->migrSource); VIR_FREE(priv->qomName); VIR_FREE(priv->nodeCopyOnRead); g_clear_object(&priv->blockjob); @@ -2270,10 +2270,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePt= r priv) =20 virHashRemoveAll(priv->blockjobs); =20 - virObjectUnref(priv->pflash0); - priv->pflash0 =3D NULL; - virObjectUnref(priv->pflash1); - priv->pflash1 =3D NULL; + g_clear_object(&priv->pflash0); + g_clear_object(&priv->pflash1); =20 virDomainBackupDefFree(priv->backup); priv->backup =3D NULL; @@ -3410,7 +3408,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObj= Ptr vm, =20 if (mirror) { if (disk) - job->mirrorChain =3D virObjectRef(disk->mirror); + job->mirrorChain =3D g_object_ref(disk->mirror); else invalidData =3D true; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 173a6a75f3..7f56a20215 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -45,7 +45,21 @@ =20 VIR_LOG_INIT("util.storagefile"); =20 -static virClassPtr virStorageSourceClass; +G_DEFINE_TYPE(virStorageSource, vir_storage_source, G_TYPE_OBJECT); +static void virStorageSourceFinalize(GObject *obj); + +static void +vir_storage_source_init(virStorageSource *src G_GNUC_UNUSED) +{ +} + +static void +vir_storage_source_class_init(virStorageSourceClass *klass) +{ + GObjectClass *obj =3D G_OBJECT_CLASS(klass); + + obj->finalize =3D virStorageSourceFinalize; +} =20 VIR_ENUM_IMPL(virStorage, VIR_STORAGE_TYPE_LAST, @@ -2654,8 +2668,7 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr= def) VIR_FREE(def->backingStoreRaw); =20 /* recursively free backing chain */ - virObjectUnref(def->backingStore); - def->backingStore =3D NULL; + g_clear_object(&def->backingStore); } =20 =20 @@ -2707,34 +2720,21 @@ virStorageSourceClear(virStorageSourcePtr def) =20 =20 static void -virStorageSourceDispose(void *obj) +virStorageSourceFinalize(GObject *obj) { - virStorageSourcePtr src =3D obj; + virStorageSourcePtr src =3D VIR_STORAGE_SOURCE(obj); =20 virStorageSourceClear(src); -} =20 - -static int -virStorageSourceOnceInit(void) -{ - if (!VIR_CLASS_NEW(virStorageSource, virClassForObject())) - return -1; - - return 0; + G_OBJECT_CLASS(vir_storage_source_parent_class)->finalize(obj); } =20 =20 -VIR_ONCE_GLOBAL_INIT(virStorageSource); - =20 virStorageSourcePtr virStorageSourceNew(void) { - if (virStorageSourceInitialize() < 0) - return NULL; - - return virObjectNew(virStorageSourceClass); + return VIR_STORAGE_SOURCE(g_object_new(VIR_TYPE_STORAGE_SOURCE, NULL)); } =20 =20 diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 58e8e1d8cf..c8bab3aaf8 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -275,7 +275,7 @@ typedef virStorageSource *virStorageSourcePtr; * IMPORTANT: When adding fields to this struct it's also necessary to add * appropriate code to the virStorageSourceCopy deep copy function */ struct _virStorageSource { - virObject parent; + GObject parent; =20 unsigned int id; /* backing chain identifier, 0 is unset */ int type; /* virStorageType */ @@ -386,7 +386,9 @@ struct _virStorageSource { bool ssh_host_key_check_disabled; }; =20 -G_DEFINE_AUTOPTR_CLEANUP_FUNC(virStorageSource, virObjectUnref); +#define VIR_TYPE_STORAGE_SOURCE vir_storage_source_get_type() +G_DECLARE_FINAL_TYPE(virStorageSource, vir_storage_source, VIR, STORAGE_SO= URCE, GObject); + =20 =20 #ifndef DEV_BSIZE --=20 2.26.2