There is a potential leak of i_append_sem during errors for
buffer head read and ldiskfs_joural_get_write_access() at
osd_ldiskfs_write_record().
The patch adds up(i_append_sem) for errors paths.
Fixes:
f832a7dc33c6 ("LU-12593 osd: zeroing a freshly allocated block buffer")
Signed-off-by: Alexander Boyko <c17825@cray.com>
Change-Id: I245d0c45af03519c66b75731e5d57f42de41fe95
Reviewed-on: https://review.whamcloud.com/37406
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
int boffs;
int dirty_inode = 0;
struct ldiskfs_inode_info *ei = LDISKFS_I(inode);
int boffs;
int dirty_inode = 0;
struct ldiskfs_inode_info *ei = LDISKFS_I(inode);
+ bool create, sparse, sync = false;
while (bufsize > 0) {
int credits = handle->h_buffer_credits;
while (bufsize > 0) {
int credits = handle->h_buffer_credits;
unsigned long last_block = (new_size == 0) ? 0 :
(new_size - 1) >> inode->i_blkbits;
unsigned long last_block = (new_size == 0) ? 0 :
(new_size - 1) >> inode->i_blkbits;
bh = __ldiskfs_bread(handle, inode, block, flags);
create = true;
} else {
bh = __ldiskfs_bread(handle, inode, block, flags);
create = true;
} else {
create = false;
}
if (IS_ERR_OR_NULL(bh)) {
create = false;
}
if (IS_ERR_OR_NULL(bh)) {
boffs, size, (unsigned long)bh->b_size);
if (create) {
memset(bh->b_data, 0, bh->b_size);
boffs, size, (unsigned long)bh->b_size);
if (create) {
memset(bh->b_data, 0, bh->b_size);
}
memcpy(bh->b_data + boffs, buf, size);
err = ldiskfs_handle_dirty_metadata(handle, NULL, bh);
}
memcpy(bh->b_data + boffs, buf, size);
err = ldiskfs_handle_dirty_metadata(handle, NULL, bh);
bufsize -= size;
buf += size;
}
bufsize -= size;
buf += size;
}
+ if (sync)
+ up(&ei->i_append_sem);
+
+ if (bh)
+ brelse(bh);
if (write_NUL)
--new_size;
if (write_NUL)
--new_size;