Hi,
On Thu, 9 Jul 2009 15:06:28 +0200, Quentin RAMEAU wrote:
> Hi,
> 
> I am sorry for that delayed response. I applied this patch, nilfs is still
> working, but it didin't solve my problem.
> There is some news though, I found out that nilfs_cleanerd works when I use
> an initrd, mounting my root fs in it, and doing a switch_root then.
> (I can restart it etc, works fine)
>
> Here is my /proc/mounts without initrd:
> $ cat /proc/mounts
> rootfs / rootfs rw 0 0
> /dev/root / nilfs2 rw,relatime 0 0
> proc /proc proc rw,relatime 0 0
> sysfs /sys sysfs rw,relatime 0 0
> none /dev ramfs rw,relatime 0 0
> devpts /dev/pts devpts rw,relatime,mode=600 0 0
> /dev/hda2 /boot ext3 rw,relatime,errors=continue,data=writeback 0 0
> /dev/hda4 /DATA nilfs2 rw,relatime 0 0
> fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0

Thank you for trying the patch.

In the first example, the root device (/dev/root) is a symbolic link
to the actual device (i.e. hda3). So the first hurdle seems to be
handled with the patch.  Unfortunately, another problem seems to be
there.

But it's OK, I think I can pursue the problem with the help of your
/proc/mounts information.

Thanks,
Ryusuke Konishi
 
> and with initrd:
> $ cat /proc/mounts
> rootfs / rootfs rw 0 0
> tmpfs /dev tmpfs rw,relatime 0 0
> devpts /dev/pts devpts rw,relatime,mode=600 0 0
> /dev/hda3 / nilfs2 rw,relatime 0 0
> proc /proc proc rw,relatime 0 0
> sysfs /sys sysfs rw,relatime 0 0
> none /dev ramfs rw,relatime 0 0
> devpts /dev/pts devpts rw,relatime,mode=600 0 0
> /dev/hda2 /boot ext3 rw,relatime,errors=continue,data=writeback 0 0
> /dev/hda4 /DATA nilfs2 rw,relatime 0 0
> fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
> 
> 2009/7/5 Ryusuke Konishi <[email protected]>
> 
> > Hi!
> > On Sat, 4 Jul 2009 16:43:31 +0200, Quentin RAMEAU wrote:
> > > Hello,
> > >
> > > I formated my root fs with nilfs a few days ago, but I can't start
> > cleanerd
> > > for that fs.
> > > I have another nilfs on that system that seems to work correctly.
> > >
> > > Maybe I am doing something wrong, at least, there something that could be
> > > done, here is some info about it:
> > >
> > > $ uname -r
> > > 2.6.30-zen1
> > >
> > > $ mount -t nilfs2
> > > /dev/hda3 on / type nilfs2 (rw,gcpid=1510)
> > > /dev/hda4 on /DATA type nilfs2 (rw,gcpid=1675)
> > >
> > > $ ps -ef | grep nilfs
> > > root      1675     1  0 12:56 ?        00:00:02 /sbin/nilfs_cleanerd -n
> > > /dev/hda4 /DATA
> > >
> > > $ nilfs_cleanerd /dev/hda3 && tail /var/log/everything/current | grep
> > nilfs
> > > Jul 04 15:46:29 [nilfs_cleanerd] start
> > > Jul 04 15:46:29 [nilfs_cleanerd] cannot open nilfs on /dev/hda3: Invalid
> > > argument
> > > Jul 04 15:46:29 [nilfs_cleanerd] cannot create cleanerd on /dev/hda3:
> > > Invalid argument
> > > Jul 04 15:46:29 [nilfs_cleanerd] shutdown
> >
> > I think this comes from a matching error in /proc/mounts. I found a
> > symlink entry is used for the device of root filesystem in some
> > environments.  The current nilfs library does not support such case.
> >
> > What's going on your /proc/mounts?
> >
> > Anyway, I wrote a patch to handle the above case.
> >
> > If this is the case, could you try the following patch?
> >
> > Thanks in advance,
> > Ryusuke Konishi
> >
> > --
> > diff --git a/lib/nilfs.c b/lib/nilfs.c
> > index 75179e3..df8792b 100644
> > --- a/lib/nilfs.c
> > +++ b/lib/nilfs.c
> > @@ -148,6 +148,7 @@ static int nilfs_find_fs(struct nilfs *nilfs, const
> > char *dev, const char *dir,
> >        int ret, n;
> >        char canonical[PATH_MAX + 2];
> >        char *cdev = NULL, *cdir = NULL;
> > +       char *mdev, *mdir;
> >
> >        ret = -1;
> >        if (dev && myrealpath(dev, canonical, sizeof(canonical))) {
> > @@ -172,20 +173,36 @@ static int nilfs_find_fs(struct nilfs *nilfs, const
> > char *dev, const char *dir,
> >                n = tokenize(line, mntent, NMNTFLDS);
> >                assert(n == NMNTFLDS);
> >
> > -               if ((dev == NULL || strcmp(mntent[MNTFLD_FS], dev) == 0) &&
> > -                   (dir == NULL || strcmp(mntent[MNTFLD_DIR], dir) == 0)
> > &&
> > -                   strcmp(mntent[MNTFLD_TYPE], NILFS_FSTYPE) == 0 &&
> > -                   has_mntopt(mntent[MNTFLD_OPTS], opt)) {
> > +               if (strcmp(mntent[MNTFLD_TYPE], NILFS_FSTYPE) != 0)
> > +                       continue;
> > +
> > +               if (dir != NULL) {
> > +                       mdir = mntent[MNTFLD_DIR];
> > +                       if (myrealpath(mdir, canonical, sizeof(canonical)))
> > +                               mdir = canonical;
> > +                       if (strcmp(mdir, dir) != 0)
> > +                               continue;
> > +               }
> > +
> > +               if (dev != NULL) {
> > +                       mdev = mntent[MNTFLD_FS];
> > +                       if (myrealpath(mdev, canonical, sizeof(canonical)))
> > +                               mdev = canonical;
> > +                       if (strcmp(mdev, dev) != 0)
> > +                               continue;
> > +               }
> > +
> > +               if (has_mntopt(mntent[MNTFLD_OPTS], opt)) {
> >                        nilfs->n_dev = strdup(mntent[MNTFLD_FS]);
> >                        if (nilfs->n_dev == NULL)
> > -                               break;
> > +                               goto failed_proc_mounts;
> >                        len = strlen(mntent[MNTFLD_DIR]) +
> >                                strlen(NILFS_IOC) + 2;
> >                        nilfs->n_ioc = malloc(sizeof(char) * len);
> >                        if (nilfs->n_ioc == NULL) {
> >                                free(nilfs->n_dev);
> >                                nilfs->n_dev = NULL;
> > -                               break;
> > +                               goto failed_proc_mounts;
> >                        }
> >                        snprintf(nilfs->n_ioc, len, "%s/%s",
> >                                 mntent[MNTFLD_DIR], NILFS_IOC);
> > @@ -193,6 +210,10 @@ static int nilfs_find_fs(struct nilfs *nilfs, const
> > char *dev, const char *dir,
> >                        break;
> >                }
> >        }
> > +       if (ret < 0)
> > +               errno = ENOENT;
> > +
> > + failed_proc_mounts:
> >        fclose(fp);
> >
> >  failed_dir:
> >
_______________________________________________
users mailing list
[email protected]
https://www.nilfs.org/mailman/listinfo/users

Reply via email to