On 8/3/11 2:02 PM, Christoph Hellwig wrote: > On Wed, Aug 03, 2011 at 01:41:59PM -0500, Eric Sandeen wrote: >> This is for RH bug 727938, xfs_fsr regression for root file system >> >> Fedora has made /etc/mtab a symlink to /proc/mounts, but when >> we issue "xfs_fsr /" and fsr's getmntany() goes looking for >> the "/" entry, the first one it finds is >> >> rootfs / rootfs rw 0 0 >> >> it says no way, that's a rootfs filesystem type, not xfs! >> And it never finds this later: >> >> /dev/sda2 / xfs rw,relatime,attr2,noquota 0 0 >> >> This patch to skip over the rootfs entry seems to fix it. > > I don't like this. rootfs is the symptom, but the underlying problem > is that in Linux we're perfectly fine to have multiple filesystems > mounted on a single mountpoint, and the getmntany can't deal with it. > > I think the right fix is to simply remove the break from the loop, It's not quite that simple. when we do *mp = *t; /* break; */ we are pointing the mp string pointers at the strings in the getmntent entry, which will keep moving as we iterate. We'll need a strdup or something to copy it out on each good find, with appropriate frees etc, I guess. Is there a better way to do it? This seems pretty ugly. memset(mp, 0, sizeof(struct mntent)); while ((t = getmntent(fp))) { if (mpref->mnt_fsname) { /* device */ if (stat64(t->mnt_fsname, &ms) < 0) continue; if (s->st_rdev != ms.st_rdev) continue; } if (mpref->mnt_dir) { /* mount point */ if (stat64(t->mnt_dir, &ms) < 0) continue; if (s->st_ino != ms.st_ino || s->st_dev != ms.st_dev) continue; } /* This one matches */ found = 1; free(mp->mnt_fsname); free(mp->mnt_dir); free(mp->mnt_type); mp->mnt_fsname = strdup(t->mnt_fsname); mp->mnt_dir = strdup(t->mnt_dir); mp->mnt_type = strdup(t->mnt_type); } return (found); (and then free the strings in the caller when we're done ...) -Eric _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs