[Unionfs] Can't mount NFS-exported union anymore in unionfs-1.4

Wilhelm Meier wilhelm.meier at fh-kl.de
Mon Nov 27 03:30:52 EST 2006


Hi Junjiro,

Am Samstag, 25. November 2006 04:59 schrieb hooanon05 at yahoo.co.jp:
> Wilhelm Meier:
> > As I said before the two branches are on the same fs, so I get:
> >
> > gs tftproot # unionimap -c gbf.map
> > gs tftproot # unionimap -a gbf.map gbro.map /tftproot/gentoo_A
> > gs tftproot # unionimap -a gbf.map gbrw.map /tftproot/gentoo_Bdiff
> > Specified fs already exists in the forward map
>
> I think it is a bug of unionfs, and here is a patch.

against which version of unionfs this should be? I tried unionfs-1.4, but most 
hunks of the patch failed. Before I try to fix that, please tell me if I'm 
working on the wrong version.

> It allows unionfs to share the reverse maps.
> I hope this fix your oops at mount time, but I am not sure it can fix
> all of your problem.
>
> And I want people whoever want to export unionfs via NFS to read these
> mails.
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-June/004603.html
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-August/004741.html
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-August/004748.html
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-August/004749.html
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-August/004755.html
> http://www.fsl.cs.sunysb.edu/pipermail/unionfs/2006-August/004756.html
>
>
> Junjiro Okajima
>
>
> Index: branchman.c
> ===================================================================
> RCS file: /home/cvs/unionfs/unionfs/branchman.c,v
> retrieving revision 1.66
> diff -u -p -r1.66 branchman.c
> --- branchman.c	31 Oct 2006 00:05:22 -0000	1.66
> +++ branchman.c	25 Nov 2006 03:50:10 -0000
> @@ -214,7 +214,7 @@ int unionfs_ioctl_addbranch(struct inode
>  	print_entry_location();
>
>  #ifdef UNIONFS_IMAP
> -	if (stopd(sb)->usi_persistent) {
> +	if (stopd(inode->i_sb)->usi_persistent) {
>  		printk(KERN_ERR "Cannot manipulate branches if imap is used\n");
>  		err = -EPERM;
>  		goto out;
> Index: main.c
> ===================================================================
> RCS file: /home/cvs/unionfs/unionfs/main.c,v
> retrieving revision 1.176
> diff -u -p -r1.176 main.c
> --- main.c	10 Oct 2006 07:28:13 -0000	1.176
> +++ main.c	25 Nov 2006 03:50:10 -0000
> @@ -581,6 +581,13 @@ static struct unionfs_dentry_info *union
>  		err = -EINVAL;
>  		goto out_error;
>  	}
> +#ifdef UNIONFS_IMAP
> +	else if (stopd(sb)->usi_persistent) {
> +		err = share_imap(stopd(sb), hidden_root_info);
> +		if (err)
> +			goto out_error;
> +	}
> +#endif
>  	goto out;
>
>        out_error:
> Index: persistent_inode.c
> ===================================================================
> RCS file: /home/cvs/unionfs/unionfs/persistent_inode.c,v
> retrieving revision 1.36
> diff -u -p -r1.36 persistent_inode.c
> --- persistent_inode.c	8 Jul 2006 17:58:31 -0000	1.36
> +++ persistent_inode.c	25 Nov 2006 03:50:10 -0000
> @@ -211,7 +211,7 @@ static int verify_reversemap(struct supe
>
>  			d = hidden_root_info->udi_dentry[bindex];
>
> -			err = d->d_sb->s_op->statfs(d->d_sb, &st);
> +			err = d->d_sb->s_op->statfs(d, &st);
>  			if (err)
>  				goto out;
>
> @@ -439,6 +439,38 @@ int parse_imap_option(struct super_block
>  	return err;
>  }
>
> +/*
> + * When several branches are on same superblock, unionfs shares reverse
> maps for them. + */
> +int share_imap(struct unionfs_sb_info *sbi, struct unionfs_dentry_info
> *hidden_root_info) +{
> +	int bindex, bend, i;
> +	struct super_block *hidden_sb;
> +
> +	bend = hidden_root_info->udi_bend;
> +	for (bindex = 0; bindex <= bend; bindex++) {
> +		if (sbi->usi_reversemaps[bindex])
> +			continue;
> +		hidden_sb = hidden_root_info->udi_dentry[bindex]->d_sb;
> +		for (i = 0; i < bend; i++) {
> +			if (i == bindex
> +			    || !sbi->usi_reversemaps[i]
> +			    || hidden_sb != hidden_root_info->udi_dentry[i]->d_sb)
> +				continue;
> +			sbi->usi_reversemaps[bindex] = sbi->usi_reversemaps[i];
> +			get_file(sbi->usi_reversemaps[bindex]);
> +			break;
> +		}
> +		if (!sbi->usi_reversemaps[bindex]) {
> +			printk(KERN_WARNING "no reverse map for branch %d\n",
> +			       bindex);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>   /*
>    * get @ino from @hidden_ino.
>    */
> @@ -540,6 +572,9 @@ int read_uin(struct super_block *sb, uin
>  	spd = stopd(sb);
>  	BUG_ON(!spd);
>
> +	/* read/write lock per file is necessary */
> +	mutex_lock(&sb->s_lock);
> +
>  	/* Find appropriate reverse map and then read from the required position
> */ /* get it from the array. */
>  	err = __read_uin(spd, inode_number, branchnum, uino);
> @@ -553,13 +588,12 @@ int read_uin(struct super_block *sb, uin
>  	/* If we haven't found an entry and we have the O_CREAT flag set we want
> to * create a new entry write it out to the file and return its index */
> -	mutex_lock(&sb->s_lock);
>  	*uino = spd->usi_next_avail++;
>  	err = __write_uin(spd, *uino, branchnum, inode_number);
>  	if (err)
>  		spd->usi_next_avail--;
> -	mutex_unlock(&sb->s_lock);
>        out:
> +	mutex_unlock(&sb->s_lock);
>  	print_exit_status(err);
>  	return err;
>  }
> Index: unionfs_imap.h
> ===================================================================
> RCS file: /home/cvs/unionfs/unionfs/unionfs_imap.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 unionfs_imap.h
> --- unionfs_imap.h	30 May 2006 21:38:45 -0000	1.1
> +++ unionfs_imap.h	25 Nov 2006 03:50:10 -0000
> @@ -72,6 +72,8 @@ extern int parse_imap_option(struct supe
>  			     struct unionfs_dentry_info *hidden_root_info,
>  			     char *options);
>  extern void cleanup_imap_data(struct super_block *sb);
> +extern int share_imap(struct unionfs_sb_info *sbi,
> +		      struct unionfs_dentry_info *hidden_root_info);
>
>  #endif				/*#ifdef UNIONFS_IMAP */

-- 
Wilhelm Meier
email: wilhelm.meier at fh-kl.de


More information about the unionfs mailing list