if ((ftp->id != hmcdrv_cache_file.id) ||
strcmp(hmcdrv_cache_file.fname, ftp->fname)) return -1;
if (ftp->ofs >= hmcdrv_cache_file.fsize) /* EOF ? */ return0;
if ((hmcdrv_cache_file.ofs < 0) || /* has content? */
time_after(jiffies, hmcdrv_cache_file.timeout)) return -1;
/* there seems to be cached content - calculate the maximum number *ofbytesthatcanbereturned(regardingfilesizeandoffset)
*/
len = hmcdrv_cache_file.fsize - ftp->ofs;
if (len > ftp->len)
len = ftp->len;
/* check if the requested chunk falls into our cache (which starts *atoffset'hmcdrv_cache_file.ofs'inthefileofinterest)
*/
pos = ftp->ofs - hmcdrv_cache_file.ofs;
/* only cache content if the read/dir cache really exists *(hmcdrv_cache_file.len>0),islargeenoughtohandlethe *request(hmcdrv_cache_file.len>=ftp->len)andthereisaneed *todoso(ftp->len>0)
*/ if ((ftp->len > 0) && (hmcdrv_cache_file.len >= ftp->len)) {
/* because the cache is not located at ftp->buf, we have to *assembleanewHMCdriveFTPcmdspecification(pointing *toourcache,andusingtheincreasedsize)
*/ struct hmcdrv_ftp_cmdspec cftp = *ftp; /* make a copy */
cftp.buf = hmcdrv_cache_file.content; /* and update */
cftp.len = hmcdrv_cache_file.len; /* buffer data */
len = func(&cftp, &hmcdrv_cache_file.fsize); /* now do */
if (len > 0) {
pr_debug("caching %zd bytes content for '%s'\n",
len, ftp->fname);
if (len >= 0) /* got it from cache ? */ return len; /* yes */
len = hmcdrv_cache_do(ftp, func);
if (len >= 0) return len;
} else {
len = func(ftp, NULL); /* simply do original command */
}
/* invalidate the (read) cache in case there was a write operation *oranerroronread/dir
*/
hmcdrv_cache_file.id = HMCDRV_FTP_NOOP;
hmcdrv_cache_file.fsize = LLONG_MAX;
hmcdrv_cache_file.ofs = -1;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.