public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Jan Tulak <jtulak@redhat.com>
Cc: xfs-oss <xfs@oss.sgi.com>
Subject: Re: [PATCH 12/14] xfsprogs: make fsr use mntinfo when there is no mntent
Date: Fri, 25 Sep 2015 08:53:38 +1000	[thread overview]
Message-ID: <20150924225338.GV19114@dastard> (raw)
In-Reply-To: <CACj3i70gPpRyO-Mho9WC4SE+=69pTu8d4RCLXJR7hnTxUbOGzA@mail.gmail.com>

On Thu, Sep 24, 2015 at 04:38:49PM +0200, Jan Tulak wrote:
> On Wed, Sep 23, 2015 at 5:36 AM, Dave Chinner <david@fromorbit.com> wrote:
> 
> > On Tue, Sep 15, 2015 at 11:59:22AM +0200, Jan Tulak wrote:
> > > @@ -202,6 +205,27 @@ find_mountpoint(char *mtab, char *argname, struct
> > stat64 *sb)
> > >       }
> > >
> > >       while ((t = getmntent(mtabp))) {
> > > +#elif defined(HAVE_GETMNTINFO)
> > > +     struct statfs   *stats;
> > > +     int error, i, count;
> > > +     // because "t" is a pointer, but we don't need to use
> > > +     // malloc for this usage
> > > +     struct mntent t_tmp;
> > > +     t = &t_tmp;
> > > +
> > > +
> > > +     error = 0;
> > > +     if ((count = getmntinfo(&stats, 0)) < 0) {
> > > +             fprintf(stderr, _("%s: getmntinfo() failed: %s\n"),
> > > +                             progname, strerror(errno));
> > > +             return 0;
> > > +     }
> > > +
> > > +     for (i = 0; i < count; i++) {
> > > +             mntinfo2mntent(&stats[i], t);
> > > +#else
> > > +# error "How do I extract info about mounted filesystems on this
> > platform?"
> > > +#endif
> >
> > No, please don't do that. Having a loop iterator split across two
> > separate defines is unmaintainable. Write two separate functions
> > with the different loop iterators, then factor the common bit out
> > of them into a single function.
> >
> >
> I did a little refactoring to solve it. What I would like to ask ab​out is
> this:
> When I can put ifdef just inside of a function like fnc(void) { #ifdef...
> #else ... #endif }, with little to no code outside of the ifdef, is it
> better to put the ifdef outside, or keep it inside?

The idea is that the "little differences" are put in functions that
end up in include/<platform>.h or libxfs/<platform>.c, so there are
no ifdefs in any of the application or library code. The build will
automatically include the correct function on the given platform,
and so the application code does not need such ifdefs at all.

e.g. you could implement these functions to abstract the differences
away from xfs_fsr and any other code that iterates the mount table:

struct mntent_cursor {
	/* variables needed to track iteration of the mtab */
};

platform_first_mntent()
platform_next_mntent()
platform_end_mntent()

and so the code would look like:

	struct mntent_cursor	cursor;

	mntent = platform_first_mntent(&cursor)

	do {
		/* process mntent */
	} while (mntent = platform_next_mntent(&cursor, mntent));

	platform_end_mntent(&cursor);

This completely abstracts the differences related to the the mount
table traversal, and allows the aplication level code to be written
in a clean, easily maintainable fashion...

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2015-09-24 22:53 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-15  9:59 [PATCH 00/14 v5] xfsprogs: Partial OSX support Jan Tulak
2015-09-15  9:59 ` [PATCH 01/14] xfsprogs: Add a way to compile without blkid Jan Tulak
2015-09-15  9:59 ` [PATCH 02/14] xfsprogs: Add XATTR_LIST_MAX to OS X headers Jan Tulak
2015-09-15  9:59 ` [PATCH 03/14] xfsprogs: avoid dependency on Linux XATTR_SIZE_MAX Jan Tulak
2015-09-23  3:09   ` Dave Chinner
2015-09-15  9:59 ` [PATCH 04/14] xfsprogs: prefix XATTR_LIST_MAX with XFS_ Jan Tulak
2015-09-23  3:15   ` Dave Chinner
2015-09-24  8:28     ` Jan Tulak
2015-09-24 22:41       ` Dave Chinner
2015-10-07 11:17   ` [PATCH 04/14 v2] " Jan Tulak
2015-09-15  9:59 ` [PATCH 05/14] xfsprogs: Add includes required for OS X builds (delta) Jan Tulak
2015-09-15  9:59 ` [PATCH 06/14] xfsprogs: Add autoconf check for fsetxattr call Jan Tulak
2015-09-15  9:59 ` [PATCH 07/14] xfsprogs: uuid changes for OS X Jan Tulak
2015-09-15  9:59 ` [PATCH 08/14] xfsprogs: Remove conflicting define " Jan Tulak
2015-09-15  9:59 ` [PATCH 09/14] xfsprogs: change nftw64 to nftw Jan Tulak
2015-09-15  9:59 ` [PATCH 10/14] xfsprogs: Add a timer implementation for OS X Jan Tulak
2015-09-23  3:25   ` Dave Chinner
2015-09-24  9:26     ` Jan Tulak
2015-09-30  8:23   ` [PATCH 10/14 v2] " Jan Tulak
2015-09-15  9:59 ` [PATCH 11/14] xfsprogs: Add statvfs64 for osx Jan Tulak
2015-09-23  3:32   ` Dave Chinner
2015-09-24  9:33     ` Jan Tulak
2015-09-30  8:21   ` [PATCH 11/14 v2] " Jan Tulak
2015-09-15  9:59 ` [PATCH 12/14] xfsprogs: make fsr use mntinfo when there is no mntent Jan Tulak
2015-09-23  3:36   ` Dave Chinner
2015-09-24 14:38     ` Jan Tulak
2015-09-24 22:53       ` Dave Chinner [this message]
2015-09-29 16:07         ` Jan Tulak
2015-09-29 16:04   ` [PATCH 12/14 v2] " Jan Tulak
2015-10-13  4:54     ` Dave Chinner
2015-10-13  8:45       ` Jan Tulak
2015-10-13  9:56     ` [PATCH 12/14 v3] " Jan Tulak
2015-09-15  9:59 ` [PATCH 13/14] xfsprogs: Make mremap conditional Jan Tulak
2015-10-13  4:42   ` Dave Chinner
2015-09-15  9:59 ` [PATCH 14/14] xfsprogs: rename lstat64 to lstat for OS X Jan Tulak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150924225338.GV19114@dastard \
    --to=david@fromorbit.com \
    --cc=jtulak@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox