fs/affs/file.c: unlock/release page on error
Subsystems (2)
PATCH 1/1 fs/affs/file.c: unlock/release page on error
When affs_bread_ino() fails, correctly unlock the page and release the page cache with proper error value. All write_end() should unlock/release the page that was locked by write_beg().
--- fs/affs/file.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
fs/affs/file.c +12 -7
@@ -699,8 +699,10 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, boff = tmp % bsize;if (boff) { bh =affs_bread_ino (inode, bidx,0 ); -if (IS_ERR (bh)) -return PTR_ERR (bh); +if (IS_ERR (bh)) { + written =PTR_ERR (bh); + goto err_first_bh; + } tmp =min (bsize - boff, to - from);BUG_ON (boff + tmp > bsize || tmp > bsize);memcpy (AFFS_DATA (bh) + boff, data + from, tmp);
@@ -712,14 +714,16 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, bidx++; }else if (bidx) { bh =affs_bread_ino (inode, bidx -1 ,0 ); -if (IS_ERR (bh)) -return PTR_ERR (bh); +if (IS_ERR (bh)) { + written =PTR_ERR (bh); + goto err_first_bh; + } }while (from + bsize <= to) { prev_bh = bh; bh =affs_getemptyblk_ino (inode, bidx);if (IS_ERR (bh)) - goto out; + goto err_bh;memcpy (AFFS_DATA (bh), data + from, bsize);if (buffer_new (bh)) {AFFS_DATA_HEAD (bh)->ptype =cpu_to_be32 (T_DATA );
@@ -751,7 +755,7 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping, prev_bh = bh; bh =affs_bread_ino (inode, bidx,1 );if (IS_ERR (bh)) - goto out; + goto err_bh; tmp =min (bsize, to - from);BUG_ON (tmp > bsize);memcpy (AFFS_DATA (bh), data + from, tmp);
@@ -790,12 +794,13 @@ done:if (tmp > inode->i_size) inode->i_size =AFFS_I (inode)->mmu_private = tmp; +err_first_bh:unlock_page (page);page_cache_release (page);return written; -out: +err_bh: bh = prev_bh;if (!written) written =PTR_ERR (bh);
Signature · 1 line
2.3.3
Quoted 75 lines · On 21 March 2015 at 18:31 Taesoo Kim <[email protected]> wrote:
When
affs_bread_ino()fails, correctly unlock the page and release the page cache with proper error value. Allwrite_end()should unlock/release the page that was locked bywrite_beg().Signed-off-by Taesoo Kim <[email protected]>---
fs/affs/file.c| 19 ++++++++++++-------1 file changed, 12 insertions(+), 7 deletions(-)fs/affs/file.c +4
-2@@ -699,8 +699,10 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, boff = tmp % bsize; if (boff) { bh = affs_bread_ino(inode, bidx, 0); - if (IS_ERR(bh)) - return PTR_ERR(bh); + if (IS_ERR(bh)) { + written = PTR_ERR(bh); + goto err_first_bh; + } tmp = min(bsize - boff, to - from); BUG_ON(boff + tmp > bsize || tmp > bsize);memcpy(AFFS_DATA(bh) + boff, data + from, tmp);
fs/affs/file.c +5
-3@@ -712,14 +714,16 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, bidx++; } else if (bidx) { bh = affs_bread_ino(inode, bidx - 1, 0); - if (IS_ERR(bh)) - return PTR_ERR(bh); + if (IS_ERR(bh)) { + written = PTR_ERR(bh); + goto err_first_bh; + } } while (from + bsize <= to) { prev_bh = bh; bh = affs_getemptyblk_ino(inode, bidx); if (IS_ERR(bh)) - goto out; + goto err_bh; memcpy(AFFS_DATA(bh), data + from, bsize); if (buffer_new(bh)) {AFFS_DATA_HEAD(bh)->ptype =
cpu_to_be32(T_DATA);fs/affs/file.c +1
-1@@ -751,7 +755,7 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, prev_bh = bh; bh = affs_bread_ino(inode, bidx, 1); if (IS_ERR(bh)) - goto out; + goto err_bh; tmp = min(bsize, to - from); BUG_ON(tmp > bsize);memcpy(AFFS_DATA(bh), data + from, tmp);
fs/affs/file.c +0
-0@@ -790,12 +794,13 @@ done: if (tmp > inode->i_size) inode->i_size = AFFS_I(inode)->mmu_private = tmp;
+err_first_bh:
unlock_page(page);
page_cache_release(page);
return written;fs/affs/file.c +1
-1-out: +err_bh:
Quoted 6 lines
bh =
prev_bh;
if (!written)
written =PTR_ERR(bh);
--
2.3.3
Hi Taesoo,
Your patch is ok for me but we generally send a new message for an update with the version in title and explain updates done to it after ---. Here's an example of an AFFS V2 patch:
http://marc.info/?l=linux-kernel&m=142316316001752&w=2
Regards,
Fabian
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Thank you for letting us know. We will definitely do it for the next time. Thanks again for checking this out.
Taesoo
Quoted 92 lines · Fabian Frederick
Quoted 75 lines · On 21 March 2015 at 18:31 Taesoo Kim <[email protected]> wrote:
When
affs_bread_ino()fails, correctly unlock the page and release the page cache with proper error value. Allwrite_end()should unlock/release the page that was locked bywrite_beg().Signed-off-by Taesoo Kim <[email protected]>---
fs/affs/file.c| 19 ++++++++++++-------1 file changed, 12 insertions(+), 7 deletions(-)fs/affs/file.c +4
-2@@ -699,8 +699,10 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, boff = tmp % bsize; if (boff) { bh = affs_bread_ino(inode, bidx, 0); - if (IS_ERR(bh)) - return PTR_ERR(bh); + if (IS_ERR(bh)) { + written = PTR_ERR(bh); + goto err_first_bh; + } tmp = min(bsize - boff, to - from); BUG_ON(boff + tmp > bsize || tmp > bsize);memcpy(AFFS_DATA(bh) + boff, data + from, tmp);
fs/affs/file.c +5
-3@@ -712,14 +714,16 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, bidx++; } else if (bidx) { bh = affs_bread_ino(inode, bidx - 1, 0); - if (IS_ERR(bh)) - return PTR_ERR(bh); + if (IS_ERR(bh)) { + written = PTR_ERR(bh); + goto err_first_bh; + } } while (from + bsize <= to) { prev_bh = bh; bh = affs_getemptyblk_ino(inode, bidx); if (IS_ERR(bh)) - goto out; + goto err_bh; memcpy(AFFS_DATA(bh), data + from, bsize); if (buffer_new(bh)) {AFFS_DATA_HEAD(bh)->ptype =
cpu_to_be32(T_DATA);fs/affs/file.c +1
-1@@ -751,7 +755,7 @@ static int affs_write_end_ofs(struct file *file, structaddress_space *mapping, prev_bh = bh; bh = affs_bread_ino(inode, bidx, 1); if (IS_ERR(bh)) - goto out; + goto err_bh; tmp = min(bsize, to - from); BUG_ON(tmp > bsize);memcpy(AFFS_DATA(bh), data + from, tmp);
fs/affs/file.c +0
-0@@ -790,12 +794,13 @@ done: if (tmp > inode->i_size) inode->i_size = AFFS_I(inode)->mmu_private = tmp;
+err_first_bh:
unlock_page(page);
page_cache_release(page);
return written;fs/affs/file.c +1
-1-out: +err_bh:Quoted 6 lines
bh =
prev_bh;
if (!written)
written =PTR_ERR(bh);
--
2.3.3Hi Taesoo,
Your patch is ok for me but we generally send a new message for an update with the version in title and explain updates done to it after ---. Here's an example of an AFFS V2 patch:
http://marc.info/?l=linux-kernel&m=142316316001752&w=2Regards,
Fabian