Re: [PATCH v1 3/9] exfat: reuse cache to improve exfat_get_cluster
From: Chi Zhiling
Date: Tue Dec 30 2025 - 20:38:40 EST
On 12/30/25 17:05, Yuezhang.Mo@xxxxxxxx wrote:
- if (exfat_ent_get(sb, *dclus, &content, NULL))
- return -EIO;
+ if (exfat_ent_get(sb, *dclus, &content, &bh))
+ goto err;
As you commented, the buffer_head needs release if no error return.
Here, an error was returned, buffer_head had been released.
I mean, it seems like a duplicate release in there, but in fact it's not.
When exfat_ent_get return an error, *bh is released and set to NULL. So the second brelse() call in exfat_get_cluster() does nothing.
~~~
int exfat_ent_get(struct super_block *sb, unsigned int loc,
unsigned int *content, struct buffer_head **last)
{
...
err:
if (last) {
brelse(*last);
/* Avoid double release */
*last = NULL;
}
return -EIO;
}
~~~
The reason using "goto err" is that I want to handle all errors in the same way. Although this does seem a bit strange and confusing with the comment in exfat_ent_get.
Thank,
*last_dclus = *dclus;
*dclus = content;
@@ -299,7 +300,7 @@ int exfat_get_cluster(struct inode *inode, unsigned int cluster,
exfat_fs_error(sb,
"invalid cluster chain (i_pos %u, last_clus 0x%08x is EOF)",
*fclus, (*last_dclus));
- return -EIO;
+ goto err;
}
break;
@@ -309,6 +310,10 @@ int exfat_get_cluster(struct inode *inode, unsigned int cluster,
cache_init(&cid, *fclus, *dclus);
}
+ brelse(bh);
exfat_cache_add(inode, &cid);
return 0;
+err:
+ brelse(bh);
+ return -EIO;
}