[Cluster-devel] [GFS2 PATCH] GFS2: Allocate reservation during write_begin if needed
Hi, This patch adds a call to function gfs2_rs_alloc to make sure a reservation structure has been allocated before attempting to reserve blocks. Regards, Bob Peterson Red Hat File Systems Signed-off-by: Bob Peterson rpete...@redhat.com --- fs/gfs2/aops.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 805b37f..6453e23 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -675,6 +675,9 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, if (error) goto out_unlock; + error = gfs2_rs_alloc(ip); + if (error) + goto out_qunlock; requested = data_blocks + ind_blocks; ap.target = requested; error = gfs2_inplace_reserve(ip, ap);
Re: [Cluster-devel] [GFS2 PATCH] GFS2: Allocate reservation during write_begin if needed
- Original Message - Hi, Since we set the allocation structure when the write call begins, and it is not deallocated until there are no writers left with the file open, how does this happen? Steve. Hi, In a normal write, the code goes through gfs2_page_mkwrite or gfs2_file_aio_write. In the failing scenario, it's going through sendfile. I suppose I could patch sendfile as an alternative, but the advantage here is that this patch will do it only if a block allocation is needed. Regards, Bob Peterson Red Hat File Systems
Re: [Cluster-devel] [GFS2 PATCH] GFS2: Allocate reservation during write_begin if needed
Hi, Since we set the allocation structure when the write call begins, and it is not deallocated until there are no writers left with the file open, how does this happen? Steve. On 17/02/15 17:09, Bob Peterson wrote: Hi, This patch adds a call to function gfs2_rs_alloc to make sure a reservation structure has been allocated before attempting to reserve blocks. Regards, Bob Peterson Red Hat File Systems Signed-off-by: Bob Peterson rpete...@redhat.com --- fs/gfs2/aops.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 805b37f..6453e23 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -675,6 +675,9 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, if (error) goto out_unlock; + error = gfs2_rs_alloc(ip); + if (error) + goto out_qunlock; requested = data_blocks + ind_blocks; ap.target = requested; error = gfs2_inplace_reserve(ip, ap);
Re: [Cluster-devel] [GFS2 PATCH] GFS2: Allocate reservation during write_begin if needed
Hi, On 17/02/15 19:09, Bob Peterson wrote: - Original Message - Hi, Since we set the allocation structure when the write call begins, and it is not deallocated until there are no writers left with the file open, how does this happen? Steve. Hi, In a normal write, the code goes through gfs2_page_mkwrite or gfs2_file_aio_write. In the failing scenario, it's going through sendfile. I suppose I could patch sendfile as an alternative, but the advantage here is that this patch will do it only if a block allocation is needed. Regards, Bob Peterson Red Hat File Systems Ah, I see. In which case that code path should be patched. So it should be part of the splice code I think, since it should be done at the higher level, and not at the write_begin level, since that is too late. We should have a call to the reservation code too at that point, to ensure that we don't have fragmentation issues. So we need a wrapper for |iter_file_splice_write| along the lines of gfs2_file_write_iter I think, Steve.