Re: svn commit: r212050 - head/cddl/contrib/opensolaris/cmd/zpool

[ Available lists | Index of svn-src-all | Month of Aug 2010 | Week of 31 Aug 2010 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Pawel Jakub Dawidek <pjd@FreeBSD.org>
Date
31 Aug 2010 18:58:11
Subject
Re: svn commit: r212050 - head/cddl/contrib/opensolaris/cmd/zpool
Message-ID
20100831185752.GA1932@garage.freebsd.pl

In reply to

[ Hide this part ]
On Tue, Aug 31, 2010 at 08:44:21PM +0200, Fabian Keil wrote:
> Pawel Jakub Dawidek <pjd@FreeBSD.org> wrote:
> > static int
> > +is_root_pool(zpool_handle_t *zhp)
> > +{
> > + static struct statfs sfs;
> > + static char *poolname = NULL;
> > + static boolean_t stated = B_FALSE;
>
> Why are those variables static? They all seem to be (re)initialized
> before first-use in the function.

Not really. We enter while () loop only if stated is false and it will
be false only for the first call. By having those variables static we
statfs(2) the root file system only once.

> > + while (!stated) {
> > + stated = B_TRUE;
> > + if (statfs("/", &sfs) == -1) {
> > + (void) fprintf(stderr,
> > + "Unable to stat root file system: %s.\n",
> > + strerror(errno));
> > + break;
> > + }
> > + if (strcmp(sfs.f_fstypename, "zfs") != 0)
> > + break;
> > + poolname = sfs.f_mntfromname;
> > + if ((slash = strchr(poolname, '/')) != NULL)
> > + *slash = '\0';
> > + break;
> > + }
> > + return (poolname != NULL && strcmp(poolname, zpool_get_name(zhp)) == 0);
> > +}
>
> This while "loop" doesn't seem to loop at all, is this intended?

Yes. This is a trick to avoid goto. I don't like tricks in code in
general, but I hope the code is readable.

--
Pawel Jakub Dawidek http://www.wheelsystems.com
pjd@FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!


[ Show this part (application/pgp-signature) ]

Elapsed time: 0.197 seconds