Hi,
At Mon, 22 Jun 2009 03:00:37 +0900 (JST),
Ryusuke Konishi wrote:
>
> On Mon, 22 Jun 2009 01:05:10 +0900 (JST), Ryusuke Konishi wrote:
> > Hi,
> > On Sun, 21 Jun 2009 17:37:08 +0300, Sami Liedes wrote:
> > > On Sun, Jun 21, 2009 at 05:02:34PM +0300, Sami Liedes wrote:
> > > > You say I should start the cleanerd by running
> > > >
> > > > # nilfs_cleanerd /dev/sdb1 /
> > > >
> > > > However nothing in the output of `nilfs_cleanerd -h' indicates
> > > > anything of the second parameter (mount point). Looking at the source,
> > > > that's how mount.nilfs2 runs it too, and that's exactly the case where
> > > > it fails.
> > >
> > > OK, I debugged a bit and figured out what the real problem is. It's
> > > the fact that nilfs_find_fs() is too strict about the mount points
> > > being the same. Namely, it considers /media/lacie and /media/lacie/ to
> > > be different mount points (it merely does a strcmp()).
> > >
> > > /proc/mounts always uses the former syntax, so if the mount command is
> > > something like `mount /dev/mapper/lacie /media/lacie/ -t nilfs2', the
> > > cleanerd is not started because mount passes "/media/lacie/" as the
> > > mount point, and nilfs_find_fs() expects it to not have the last
> > > slash.
> > >
> > > Sami
> >
> > Grr, that's an elementary and influential bug. Okay, I'll fix it.
> >
> > Sami, thank you for finding this!
> >
> > Cheers,
> > Ryusuke Konishi
>
> The following patch will fix this. I've pushed it to the git repo,
> too.
>
> Regards,
> Ryusuke Konishi
> ---
> lib/nilfs.c | 29 +++++++++++++++++++++++++----
> 1 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/lib/nilfs.c b/lib/nilfs.c
> index 15ee98f..9c80538 100644
> --- a/lib/nilfs.c
> +++ b/lib/nilfs.c
> @@ -147,14 +147,27 @@ static int nilfs_find_fs(struct nilfs *nilfs, const
> char *dev, const char *dir,
> size_t len;
> int ret, n;
> char canonical[PATH_MAX + 2];
> + char *cdev = NULL, *cdir = NULL;
>
> - if (dev && myrealpath(dev, canonical, sizeof(canonical)))
> - dev = canonical;
> + ret = -1;
> + if (dev && myrealpath(dev, canonical, sizeof(canonical))) {
> + cdev = strdup(canonical);
> + if (!cdev)
> + goto failed;
> + dev = cdev;
> + }
> +
> + if (dir && myrealpath(dir, canonical, sizeof(canonical))) {
> + cdir = strdup(canonical);
> + if (!cdir)
> + goto failed_dev;
> + dir = cdir;
> + }
>
> fp = fopen(PROCMOUNTS, "r");
> if (fp == NULL)
> - return -1;
> - ret = -1;
> + goto failed_dir;
> +
> while (fgets(line, sizeof(line), fp) != NULL) {
> n = tokenize(line, mntent, NMNTFLDS);
> assert(n == NMNTFLDS);
> @@ -181,6 +194,14 @@ static int nilfs_find_fs(struct nilfs *nilfs, const char
> *dev, const char *dir,
> }
> }
> fclose(fp);
> +
> + failed_dir:
> + free(cdir);
> +
> + failed_dev:
> + free(cdev);
> +
> + failed:
> return ret;
> }
>
> --
> 1.6.2
I've just pull the git repository and it just works fine for me!
thanks!
regards,
--
Jiro SEKIBA <[email protected]>
_______________________________________________
users mailing list
[email protected]
https://www.nilfs.org/mailman/listinfo/users