On Sun, May 19, 2019 at 03:48:05PM +0800, Eric Ren wrote:
Hi,
@@ -1784,8 +1822,23 @@ static int fuse_iomap_begin(struct inode *inode,
> loff_t pos, loff_t length,
> if (pos >= i_size_read(inode))
> goto iomap_hole;
>
> - alloc_dmap = alloc_dax_mapping(fc);
> - if (!alloc_dmap)
> + /* 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);
>
alloc_dmap could be NULL as follows:
alloc_dax_mapping_reclaim
-->fuse_dax_reclaim_first_mapping
-->fuse_dax_reclaim_first_mapping_locked
--> fuse_dax_interval_tree_iter_first ==> return NULL
and
IS_ERR(NULL) is false, so we may miss that error case.
Hi Eric,
Good catch. I will fix it next version.
Thanks
Vivek