diff options
author | Phillip Lougher <phillip@squashfs.org.uk> | 2011-12-29 03:50:20 +0000 |
---|---|---|
committer | Phillip Lougher <phillip@squashfs.org.uk> | 2011-12-30 01:20:14 +0000 |
commit | e552a596687bf0e1802c744a7bb113afbd2bf4d4 (patch) | |
tree | 3080861e7587446872ed1886c2b2d031680a1b04 /fs/squashfs | |
parent | 5f0a6e2d503896062f641639dacfe5055c2f593b (diff) | |
download | lwn-e552a596687bf0e1802c744a7bb113afbd2bf4d4.tar.gz lwn-e552a596687bf0e1802c744a7bb113afbd2bf4d4.zip |
Squashfs: add missing block release on error condition
squashfs_read_metadata forgets to release the cache block if
an error has occurred.
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Diffstat (limited to 'fs/squashfs')
-rw-r--r-- | fs/squashfs/cache.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index f744be98cd5a..ea6e798e548b 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c @@ -332,17 +332,20 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer, u64 *block, int *offset, int length) { struct squashfs_sb_info *msblk = sb->s_fs_info; - int bytes, copied = length; + int bytes, res = length; struct squashfs_cache_entry *entry; TRACE("Entered squashfs_read_metadata [%llx:%x]\n", *block, *offset); while (length) { entry = squashfs_cache_get(sb, msblk->block_cache, *block, 0); - if (entry->error) - return entry->error; - else if (*offset >= entry->length) - return -EIO; + if (entry->error) { + res = entry->error; + goto error; + } else if (*offset >= entry->length) { + res = -EIO; + goto error; + } bytes = squashfs_copy_data(buffer, entry, *offset, length); if (buffer) @@ -358,7 +361,11 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer, squashfs_cache_put(entry); } - return copied; + return res; + +error: + squashfs_cache_put(entry); + return res; } |