[Virtio-fs] [PATCH 2/3] fuse: Move new mapping setup code in a function
Liu Bo
bo.liu at linux.alibaba.com
Fri Jul 26 01:34:00 UTC 2019
On Wed, Jul 24, 2019 at 05:07:20PM -0400, Vivek Goyal wrote:
> Move new mapping setup code in a separate function. More code will come
> in fuse_iomap_begin() and its becoming too big.
Reviewed-by: Liu Bo <bo.liu at linux.alibaba.com>
thanks,
-liubo
>
> Signed-off-by: Vivek Goyal <vgoyal at redhat.com>
> ---
> fs/fuse/file.c | 116 +++++++++++++++++++++++++++----------------------
> 1 file changed, 64 insertions(+), 52 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 93f8e62e2b5b..a2c19e4a28b5 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -1882,6 +1882,67 @@ static void fuse_fill_iomap(struct inode *inode, loff_t pos, loff_t length,
> }
> }
>
> +static int iomap_begin_setup_new_mapping(struct inode *inode, loff_t pos,
> + loff_t length, unsigned flags,
> + struct iomap *iomap)
> +{
> + struct fuse_inode *fi = get_fuse_inode(inode);
> + struct fuse_conn *fc = get_fuse_conn(inode);
> + struct fuse_dax_mapping *dmap, *alloc_dmap = NULL;
> + int ret;
> +
> + /* Can't do reclaim in fault path yet due to lock ordering.
> + * Read path takes shared inode lock and that's not sufficient
> + * for inline range reclaim. Caller needs to drop lock, wait
> + * and retry.
> + */
> + if (flags & IOMAP_FAULT || !(flags & IOMAP_WRITE)) {
> + alloc_dmap = alloc_dax_mapping(fc);
> + if (!alloc_dmap)
> + return -ENOSPC;
> + } else {
> + alloc_dmap = alloc_dax_mapping_reclaim(fc, inode);
> + if (IS_ERR(alloc_dmap))
> + return PTR_ERR(alloc_dmap);
> + }
> +
> + /* If we are here, we should have memory allocated */
> + if (WARN_ON(!alloc_dmap))
> + return -EBUSY;
> +
> + /*
> + * Drop read lock and take write lock so that only one
> + * caller can try to setup mapping and other waits
> + */
> + down_write(&fi->i_dmap_sem);
> + /*
> + * We dropped lock. Check again if somebody else setup
> + * mapping already.
> + */
> + dmap = fuse_dax_interval_tree_iter_first(&fi->dmap_tree, pos,
> + pos);
> + if (dmap) {
> + fuse_fill_iomap(inode, pos, length, iomap, dmap, flags);
> + dmap_add_to_free_pool(fc, alloc_dmap);
> + up_write(&fi->i_dmap_sem);
> + return 0;
> + }
> +
> + /* Setup one mapping */
> + ret = fuse_setup_one_mapping(inode,
> + ALIGN_DOWN(pos, FUSE_DAX_MEM_RANGE_SZ), alloc_dmap);
> + if (ret < 0) {
> + printk("fuse_setup_one_mapping() failed. err=%d"
> + " pos=0x%llx\n", ret, pos);
> + dmap_add_to_free_pool(fc, alloc_dmap);
> + up_write(&fi->i_dmap_sem);
> + return ret;
> + }
> + fuse_fill_iomap(inode, pos, length, iomap, alloc_dmap, flags);
> + up_write(&fi->i_dmap_sem);
> + return 0;
> +}
> +
> /* This is just for DAX and the mapping is ephemeral, do not use it for other
> * purposes since there is no block device with a permanent mapping.
> */
> @@ -1890,8 +1951,7 @@ static int fuse_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
> {
> struct fuse_inode *fi = get_fuse_inode(inode);
> struct fuse_conn *fc = get_fuse_conn(inode);
> - struct fuse_dax_mapping *dmap, *alloc_dmap = NULL;
> - int ret;
> + struct fuse_dax_mapping *dmap;
>
> /* We don't support FIEMAP */
> BUG_ON(flags & IOMAP_REPORT);
> @@ -1932,56 +1992,8 @@ static int fuse_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
> if (pos >= i_size_read(inode))
> goto iomap_hole;
>
> - /* Can't do reclaim in fault path yet due to lock ordering.
> - * Read path takes shared inode lock and that's not sufficient
> - * for inline range reclaim. Caller needs to drop lock, wait
> - * and retry.
> - */
> - if (flags & IOMAP_FAULT || !(flags & IOMAP_WRITE)) {
> - alloc_dmap = alloc_dax_mapping(fc);
> - if (!alloc_dmap)
> - return -ENOSPC;
> - } else {
> - alloc_dmap = alloc_dax_mapping_reclaim(fc, inode);
> - if (IS_ERR(alloc_dmap))
> - return PTR_ERR(alloc_dmap);
> - }
> -
> - /* If we are here, we should have memory allocated */
> - if (WARN_ON(!alloc_dmap))
> - return -EBUSY;
> -
> - /*
> - * Drop read lock and take write lock so that only one
> - * caller can try to setup mapping and other waits
> - */
> - down_write(&fi->i_dmap_sem);
> - /*
> - * We dropped lock. Check again if somebody else setup
> - * mapping already.
> - */
> - dmap = fuse_dax_interval_tree_iter_first(&fi->dmap_tree, pos,
> - pos);
> - if (dmap) {
> - fuse_fill_iomap(inode, pos, length, iomap, dmap, flags);
> - dmap_add_to_free_pool(fc, alloc_dmap);
> - up_write(&fi->i_dmap_sem);
> - return 0;
> - }
> -
> - /* Setup one mapping */
> - ret = fuse_setup_one_mapping(inode,
> - ALIGN_DOWN(pos, FUSE_DAX_MEM_RANGE_SZ), alloc_dmap);
> - if (ret < 0) {
> - printk("fuse_setup_one_mapping() failed. err=%d"
> - " pos=0x%llx\n", ret, pos);
> - dmap_add_to_free_pool(fc, alloc_dmap);
> - up_write(&fi->i_dmap_sem);
> - return ret;
> - }
> - fuse_fill_iomap(inode, pos, length, iomap, alloc_dmap, flags);
> - up_write(&fi->i_dmap_sem);
> - return 0;
> + return iomap_begin_setup_new_mapping(inode, pos, length, flags,
> + iomap);
> }
>
> /*
> --
> 2.17.2
More information about the Virtio-fs
mailing list