All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steve Dickson <SteveD@redhat.com>
To: Steve Dickson <steved@redhat.com>
Cc: Linux NFS Mailing List <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH v2 1/1] exportfs: Stop racing exportfs on clusters
Date: Mon, 12 Mar 2012 15:17:35 -0400	[thread overview]
Message-ID: <4F5E4BCF.5050908@RedHat.com> (raw)
In-Reply-To: <1331573020-28628-1-git-send-email-steved@redhat.com>



On 03/12/2012 01:23 PM, Steve Dickson wrote:
> This problem can occur when multiple cluster services fail over
> at the same time, causing missing high-available exports.
> Having a lot of nfs-exports will trigger this issue easier.
> 
> https://bugzilla.linux-nfs.org/show_bug.cgi?id=224
> 
> Signed-off-by: Steve Dickson <steved@redhat.com>
Committed... 

steved.

> ---
>  support/include/exportfs.h |    4 ++++
>  utils/exportfs/exportfs.c  |   41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 45 insertions(+), 0 deletions(-)
> 
> diff --git a/support/include/exportfs.h b/support/include/exportfs.h
> index 01e87dd..99916e5 100644
> --- a/support/include/exportfs.h
> +++ b/support/include/exportfs.h
> @@ -32,6 +32,10 @@ enum {
>  	FSLOC_STUB
>  };
>  
> +#ifndef EXP_LOCKFILE
> +#define EXP_LOCKFILE "/var/lib/nfs/export-lock"
> +#endif
> +
>  typedef struct mclient {
>  	struct mclient *	m_next;
>  	char *			m_hostname;
> diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
> index 7432a65..7326802 100644
> --- a/utils/exportfs/exportfs.c
> +++ b/utils/exportfs/exportfs.c
> @@ -16,6 +16,7 @@
>  #include <sys/stat.h>
>  #include <sys/vfs.h>
>  #include <sys/stat.h>
> +#include <sys/file.h>
>  #include <unistd.h>
>  #include <stdbool.h>
>  #include <stdlib.h>
> @@ -44,6 +45,39 @@ static void	validate_export(nfs_export *exp);
>  static int	matchhostname(const char *hostname1, const char *hostname2);
>  static void	export_d_read(const char *dname);
>  
> +static const char *lockfile = EXP_LOCKFILE;
> +static int _lockfd = -1;
> +
> +/*
> + * If we aren't careful, changes made by exportfs can be lost
> + * when multiple exports process run at once:
> + *
> + *	exportfs process 1	exportfs process 2
> + *	------------------------------------------
> + *	reads etab version A	reads etab version A
> + *	adds new export B	adds new export C
> + *	writes A+B		writes A+C
> + *
> + * The locking in support/export/xtab.c will prevent mountd from
> + * seeing a partially written version of etab, and will prevent 
> + * the two writers above from writing simultaneously and
> + * corrupting etab, but to prevent problems like the above we
> + * need these additional lockfile() routines.
> + */
> +void 
> +grab_lockfile()
> +{
> +	_lockfd = open(lockfile, O_CREAT|O_RDWR, 0666);
> +	if (_lockfd != -1) 
> +		lockf(_lockfd, F_LOCK, 0);
> +}
> +void 
> +release_lockfile()
> +{
> +	if (_lockfd != -1)
> +		lockf(_lockfd, F_ULOCK, 0);
> +}
> +
>  int
>  main(int argc, char **argv)
>  {
> @@ -129,6 +163,13 @@ main(int argc, char **argv)
>  			return 0;
>  		}
>  	}
> +
> +	/*
> +	 * Serialize things as best we can
> +	 */
> +	grab_lockfile();
> +	atexit(release_lockfile);
> +
>  	if (f_export && ! f_ignore) {
>  		export_read(_PATH_EXPORTS);
>  		export_d_read(_PATH_EXPORTS_D);

      reply	other threads:[~2012-03-12 19:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-12 17:23 [PATCH v2 1/1] exportfs: Stop racing exportfs on clusters Steve Dickson
2012-03-12 19:17 ` Steve Dickson [this message]

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=4F5E4BCF.5050908@RedHat.com \
    --to=steved@redhat.com \
    --cc=linux-nfs@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.