Message ID | 1447273666-2679-1-git-send-email-thomas.betker@freenet.de |
---|---|
State | Not Applicable |
Delegated to: | David Woodhouse |
Headers | show |
On Wed, 2015-11-11 at 21:27 +0100, Thomas Betker wrote: > > int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs, > unsigned long count, loff_t to, size_t *retlen) > { > + int ret; > + > + ret = mtd_writev(c->mtd, vecs, count, to, retlen); > + > if (!jffs2_is_writebuffered(c)) { > if (jffs2_sum_active()) { > int res; > + > + if (ret || > + *retlen != iov_length((struct iovec *) vecs, count)) > + return ret; > + > res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to); > if (res) { > return res; OK... but perhaps we can dispense with the separate 'ret' and 'res' variables and the rats nest of conditions, and do something like: int ret; ret = mtd_writev(…); if (!ret && *retlen == iov_length(…) && !jffs2_is_writebuffered(c) && jffs2_sum_active()) ret = jffs2_sum_add_kvec(…); return ret;
Hello David: > > + int ret; > > + > > + ret = mtd_writev(c->mtd, vecs, count, to, retlen); > > + > > if (!jffs2_is_writebuffered(c)) { > > if (jffs2_sum_active()) { > > int res; > > + > > + if (ret || > > + *retlen != iov_length((struct iovec *) > vecs, count)) > > + return ret; > > + > > res = jffs2_sum_add_kvec(c, vecs, count, > (uint32_t) to); > > if (res) { > > return res; > > OK... but perhaps we can dispense with the separate 'ret' and 'res' > variables and the rats nest of conditions, and do something like: > > int ret; > > ret = mtd_writev(…); > > if (!ret && *retlen == iov_length(…) && > !jffs2_is_writebuffered(c) && jffs2_sum_active()) > ret = jffs2_sum_add_kvec(…); > > return ret; While the logic is the same, will the compiler generate the same code? When CONFIG_JFFS2_SUMMARY is not set, "if (jffs2_sum_active())" means "if (0)", and I would assume that the compiler removes the whole clause, "if" and all. However, I am not sure what happens with "if (!ret && whatever && 0)". That's why I was taking pains to keep the original control flow intact, even if it's a rat's nest (it is). If I remember correctly, jffs2_flash_direct_writev() is called quite often, and I didn't want performance to suffer. I may be completely wrong here, of course, but then why wasn't the original source code "if (!jffs2_is_writebuffered(c) && jffs2_sum_active())"? Best regards, Thomas
diff --git a/fs/jffs2/writev.c b/fs/jffs2/writev.c index a1bda9d..eec4197 100644 --- a/fs/jffs2/writev.c +++ b/fs/jffs2/writev.c @@ -16,9 +16,18 @@ int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen) { + int ret; + + ret = mtd_writev(c->mtd, vecs, count, to, retlen); + if (!jffs2_is_writebuffered(c)) { if (jffs2_sum_active()) { int res; + + if (ret || + *retlen != iov_length((struct iovec *) vecs, count)) + return ret; + res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to); if (res) { return res; @@ -26,19 +35,23 @@ int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs, } } - return mtd_writev(c->mtd, vecs, count, to, retlen); + return ret; } int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf) { int ret; + ret = mtd_write(c->mtd, ofs, len, retlen, buf); if (jffs2_sum_active()) { struct kvec vecs[1]; int res; + if (ret || *retlen != len) + return ret; + vecs[0].iov_base = (unsigned char *) buf; vecs[0].iov_len = len; @@ -47,5 +60,6 @@ int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, return res; } } + return ret; }