From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-f195.google.com ([209.85.210.195]:41316 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387441AbeKFHku (ORCPT ); Tue, 6 Nov 2018 02:40:50 -0500 Received: by mail-pf1-f195.google.com with SMTP id e22-v6so5091885pfn.8 for ; Mon, 05 Nov 2018 14:18:57 -0800 (PST) From: Andreas Dilger Message-Id: <87C8F7EE-519A-4C36-A56C-D9B5E9814D8C@dilger.ca> Content-Type: multipart/signed; boundary="Apple-Mail=_46BDBBA9-BE11-4A5F-A8CF-D54ACF9F8A1E"; protocol="application/pgp-signature"; micalg=pgp-sha256 Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Subject: Re: [PATCH 18/20] Use FIEMAP for FIBMAP calls Date: Mon, 5 Nov 2018 15:15:58 -0700 In-Reply-To: <20181030131823.29040-19-cmaiolino@redhat.com> Cc: Linux FS-devel Mailing List , Eric Sandeen , hch@lst.de, david@fromorbit.com, darrick.wong@oracle.com To: Carlos Maiolino References: <20181030131823.29040-1-cmaiolino@redhat.com> <20181030131823.29040-19-cmaiolino@redhat.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: --Apple-Mail=_46BDBBA9-BE11-4A5F-A8CF-D54ACF9F8A1E Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Oct 30, 2018, at 7:18 AM, Carlos Maiolino = wrote: >=20 > Enables the usage of FIEMAP ioctl infrastructure to handle FIBMAP = calls, > from this point, ->bmap() methods can start to be removed. >=20 > Signed-off-by: Carlos Maiolino > --- >=20 > This patch can be improved, since fiemap_fill_kernel_extent and > fiemap_fill_usr_extent shares a lot of common code, which still is = WIP. >=20 > fs/inode.c | 35 ++++++++++++++++++++++++++++++----- > fs/ioctl.c | 31 +++++++++++++++++++++++++++++++ > include/linux/fs.h | 2 ++ > 3 files changed, 63 insertions(+), 5 deletions(-) >=20 > diff --git a/fs/inode.c b/fs/inode.c > index d09a6f4f0335..389c2165959c 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1591,11 +1591,36 @@ EXPORT_SYMBOL(iput); > */ > int bmap(struct inode *inode, sector_t *block) > { > - if (!inode->i_mapping->a_ops->bmap) > - return -EINVAL; > - > - *block =3D inode->i_mapping->a_ops->bmap(inode->i_mapping, = *block); > - return 0; > + struct fiemap_ctx f_ctx; > + struct fiemap_extent fextent; > + u64 start =3D *block << inode->i_blkbits; > + int error =3D -EINVAL; > + > + if (inode->i_op->fiemap) { > + fextent.fe_logical =3D 0; > + fextent.fe_physical =3D 0; > + f_ctx.fc_extents_max =3D 1; > + f_ctx.fc_extents_mapped =3D 0; > + f_ctx.fc_data =3D &fextent; > + f_ctx.fc_start =3D start; > + f_ctx.fc_len =3D 1; Should this be "fc_len =3D 1 << inode->i_blkbits" to map a single block? On the one hand, this might return multiple blocks, but on the other hand FIBMAP shouldn't be allowed if that is the case so this code should detect that situation and consider it an error. Cheers, Andreas > + f_ctx.fc_flags =3D 0; > + f_ctx.fc_cb =3D fiemap_fill_kernel_extent; > + > + error =3D inode->i_op->fiemap(inode, &f_ctx); > + > + if (error) > + goto out; > + > + *block =3D (fextent.fe_physical + > + (start - fextent.fe_logical)) >> = inode->i_blkbits; > + > + } else if (inode->i_mapping->a_ops->bmap) { > + *block =3D = inode->i_mapping->a_ops->bmap(inode->i_mapping, *block); > + error =3D 0; > + } > +out: > + return error; > } > EXPORT_SYMBOL(bmap); >=20 > diff --git a/fs/ioctl.c b/fs/ioctl.c > index 71d11201a06b..dce710699b82 100644 > --- a/fs/ioctl.c > +++ b/fs/ioctl.c > @@ -113,6 +113,37 @@ int fiemap_fill_usr_extent(struct fiemap_ctx = *f_ctx, u64 logical, > return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; > } >=20 > +int fiemap_fill_kernel_extent(struct fiemap_ctx *f_ctx, u64 logical, > + u64 phys, u64 len, u32 flags) > +{ > + struct fiemap_extent *extent =3D f_ctx->fc_data; > + > + if (f_ctx->fc_extents_max =3D=3D 0) { > + f_ctx->fc_extents_mapped++; > + return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; > + } > + > + if (f_ctx->fc_extents_mapped >=3D f_ctx->fc_extents_max) > + return 1; > + > + if (flags & SET_UNKNOWN_FLAGS) > + flags |=3D FIEMAP_EXTENT_UNKNOWN; > + if (flags & SET_NO_UNMOUNTED_IO_FLAGS) > + flags |=3D FIEMAP_EXTENT_ENCODED; > + if (flags & SET_NOT_ALIGNED_FLAGS) > + flags |=3D FIEMAP_EXTENT_NOT_ALIGNED; > + > + extent->fe_logical =3D logical; > + extent->fe_physical =3D phys; > + extent->fe_length =3D len; > + extent->fe_flags =3D flags; > + > + f_ctx->fc_extents_mapped++; > + > + if (f_ctx->fc_extents_mapped =3D=3D f_ctx->fc_extents_max) > + return 1; > + return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0; > +} > /** > * fiemap_fill_next_extent - Fiemap helper function > * @fieinfo: Fiemap context passed into ->fiemap > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 4c6dee908a38..7f623a434cb0 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -1704,6 +1704,8 @@ struct fiemap_ctx { > u64 fc_len; > }; >=20 > +int fiemap_fill_kernel_extent(struct fiemap_ctx *f_ctx, u64 logical, > + u64 phys, u64 len, u32 flags); > int fiemap_fill_next_extent(struct fiemap_ctx *f_ctx, u64 logical, > u64 phys, u64 len, u32 flags); > int fiemap_check_flags(struct fiemap_ctx *f_ctx, u32 fs_flags); > -- > 2.17.1 >=20 Cheers, Andreas --Apple-Mail=_46BDBBA9-BE11-4A5F-A8CF-D54ACF9F8A1E Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIzBAEBCAAdFiEEDb73u6ZejP5ZMprvcqXauRfMH+AFAlvgwR8ACgkQcqXauRfM H+CWLw/+OD6xLCzNchSM9B3PNCpziWcHhqMeFcs4tYRbixPBUIE6lthM9qxXjigH pg9jcSw0c5PT0MrRlGVJEcOVO2HLY4Vm7WGgXo1IhZqzM2OmS0pOYh8tadaPaXQG 8MejB4seGm4xWZFPvSxaYzRJjkdNKGeTvmcsyFtd4AOcSSer1OeyQ1mkJwval6aE I3gdBecdOSteS+9CHDZJKJTAFpYOH+LkyQ9hS2aZ7rIVQgVNfGDZQc/h1TAZQbDo bnET7xF3+VXNmhTt6/8farcgweRG/ybctongypbFd9EABFfv6gFszNE+relqZQr/ 0XFBZ2ycN3uxaXSvWjBCF4wwmVFLxRHj1cCcbVuDfC4CqQQ4Fx0x+kqHlH+YudSA CZRHDLFh7sgcG14moRalxmsBg2o5iXb0aAxWr23ES/zoqg8PFSD/0xdFstAhhV0l x0Ud3VNzWB1rhVSOS4qPY0nDzwgLSmxsK1Fn2r4W5u3FvAGSK3xGTn0iVOyM0NX+ 2BE5ZyRRlN6Qh+UIGx/yJCAipEkij1I6xUiZEtVidDADvlK6je9GunV3EqJOpPXk 95auD21nmTMLPjVtq2/OAX5UghzzxPNSTIce7gFzD48kUqMrFSQSwR/Pwneg8YTl 5slrOSudozuptKYYzR/qRdaXVjpDzmRm5nEo5scvw3D+At2xStI= =QXaU -----END PGP SIGNATURE----- --Apple-Mail=_46BDBBA9-BE11-4A5F-A8CF-D54ACF9F8A1E--