On Thu, May 10, 2018 at 08:42:50AM +0200, Christoph Hellwig wrote:
> On Wed, May 09, 2018 at 09:46:28AM -0700, Darrick J. Wong wrote:
> > On Wed, May 09, 2018 at 09:48:07AM +0200, Christoph Hellwig wrote:
> > > This adds a simple iomap-based implementation of the legacy ->bmap
> > > interface. Note that we can't easily add checks for rt or reflink
> > > files, so these will have to remain in the callers. This interface
> > > just needs to die..
> >
> > You /can/ check these...
> >
> > if (iomap->bdev != inode->i_sb->s_bdev)
> > return 0;
> > if (iomap->flags & IOMAP_F_SHARED)
> > return 0;
>
> The latter only checks for a shared extent, not a file with possibly
> shared extents. I'd rather keep the check for a file with possible
> shared extents.
<nod>
> > > +static loff_t
> > > +iomap_bmap_actor(struct inode *inode, loff_t pos, loff_t length,
> > > + void *data, struct iomap *iomap)
> > > +{
> > > + sector_t *bno = data;
> > > +
> > > + if (iomap->type == IOMAP_MAPPED)
> > > + *bno = (iomap->addr + pos - iomap->offset) >> inode->i_blkbits;
> >
> > Does this need to be careful w.r.t. overflow on systems where sector_t
> > is a 32-bit unsigned long?
> >
> > Also, ioctl_fibmap() typecasts the returned sector_t to an int, which
> > also seems broken. I agree the interface needs to die, but ioctls take
> > a long time to deprecate.
>
> Not much we can do about the interface.
Yes, the interface is fubar, but if file /foo maps to block 8589934720
then do we return the truncated result 128?
--D