Message ID | 1485583614-26225-1-git-send-email-fdmanana@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
On Sat, Jan 28, 2017 at 06:06:54AM +0000, fdmanana@kernel.org wrote: > From: Robbie Ko <robbieko@synology.com> > > When falling back from a nocow write to a regular cow write, we were > leaking the subvolume writers counter in 2 situations, preventing > snapshot creation from ever completing in the future, as it waits > for that counter to go down to zero before the snapshot creation > starts. > > In run_delalloc_nocow, maybe not release subv_writers conter, > will lead to create snapshot hang. Reviewed-by: Liu Bo <bo.li.liu@oracle.com> Thanks, -liubo > > Signed-off-by: Robbie Ko <robbieko@synology.com> > Reviewed-by: Filipe Manana <fdmanana@suse.com> > [Improved changelog and subject] > Signed-off-by: Filipe Manana <fdmanana@suse.com> > --- > fs/btrfs/inode.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index a713d9d..7221d66 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -1404,10 +1404,16 @@ static noinline int run_delalloc_nocow(struct inode *inode, > * either valid or do not exist. > */ > if (csum_exist_in_range(fs_info, disk_bytenr, > - num_bytes)) > + num_bytes)) { > + if (!nolock) > + btrfs_end_write_no_snapshoting(root); > goto out_check; > - if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) > + } > + if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) { > + if (!nolock) > + btrfs_end_write_no_snapshoting(root); > goto out_check; > + } > nocow = 1; > } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { > extent_end = found_key.offset + > -- > 2.7.0.rc3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a713d9d..7221d66 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1404,10 +1404,16 @@ static noinline int run_delalloc_nocow(struct inode *inode, * either valid or do not exist. */ if (csum_exist_in_range(fs_info, disk_bytenr, - num_bytes)) + num_bytes)) { + if (!nolock) + btrfs_end_write_no_snapshoting(root); goto out_check; - if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) + } + if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) { + if (!nolock) + btrfs_end_write_no_snapshoting(root); goto out_check; + } nocow = 1; } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { extent_end = found_key.offset +