[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