|
@@ -414,9 +414,6 @@ int cachefiles_read_or_alloc_page(struct fscache_retrieval *op,
|
|
ASSERT(inode->i_mapping->a_ops->readpages);
|
|
ASSERT(inode->i_mapping->a_ops->readpages);
|
|
|
|
|
|
/* calculate the shift required to use bmap */
|
|
/* calculate the shift required to use bmap */
|
|
- if (inode->i_sb->s_blocksize > PAGE_SIZE)
|
|
|
|
- goto enobufs;
|
|
|
|
-
|
|
|
|
shift = PAGE_SHIFT - inode->i_sb->s_blocksize_bits;
|
|
shift = PAGE_SHIFT - inode->i_sb->s_blocksize_bits;
|
|
|
|
|
|
op->op.flags &= FSCACHE_OP_KEEP_FLAGS;
|
|
op->op.flags &= FSCACHE_OP_KEEP_FLAGS;
|
|
@@ -711,9 +708,6 @@ int cachefiles_read_or_alloc_pages(struct fscache_retrieval *op,
|
|
ASSERT(inode->i_mapping->a_ops->readpages);
|
|
ASSERT(inode->i_mapping->a_ops->readpages);
|
|
|
|
|
|
/* calculate the shift required to use bmap */
|
|
/* calculate the shift required to use bmap */
|
|
- if (inode->i_sb->s_blocksize > PAGE_SIZE)
|
|
|
|
- goto all_enobufs;
|
|
|
|
-
|
|
|
|
shift = PAGE_SHIFT - inode->i_sb->s_blocksize_bits;
|
|
shift = PAGE_SHIFT - inode->i_sb->s_blocksize_bits;
|
|
|
|
|
|
pagevec_init(&pagevec, 0);
|
|
pagevec_init(&pagevec, 0);
|
|
@@ -905,6 +899,15 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
|
|
cache = container_of(object->fscache.cache,
|
|
cache = container_of(object->fscache.cache,
|
|
struct cachefiles_cache, cache);
|
|
struct cachefiles_cache, cache);
|
|
|
|
|
|
|
|
+ pos = (loff_t)page->index << PAGE_SHIFT;
|
|
|
|
+
|
|
|
|
+ /* We mustn't write more data than we have, so we have to beware of a
|
|
|
|
+ * partial page at EOF.
|
|
|
|
+ */
|
|
|
|
+ eof = object->fscache.store_limit_l;
|
|
|
|
+ if (pos >= eof)
|
|
|
|
+ goto error;
|
|
|
|
+
|
|
/* write the page to the backing filesystem and let it store it in its
|
|
/* write the page to the backing filesystem and let it store it in its
|
|
* own time */
|
|
* own time */
|
|
path.mnt = cache->mnt;
|
|
path.mnt = cache->mnt;
|
|
@@ -912,40 +915,38 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
|
|
file = dentry_open(&path, O_RDWR | O_LARGEFILE, cache->cache_cred);
|
|
file = dentry_open(&path, O_RDWR | O_LARGEFILE, cache->cache_cred);
|
|
if (IS_ERR(file)) {
|
|
if (IS_ERR(file)) {
|
|
ret = PTR_ERR(file);
|
|
ret = PTR_ERR(file);
|
|
- } else {
|
|
|
|
- pos = (loff_t) page->index << PAGE_SHIFT;
|
|
|
|
-
|
|
|
|
- /* we mustn't write more data than we have, so we have
|
|
|
|
- * to beware of a partial page at EOF */
|
|
|
|
- eof = object->fscache.store_limit_l;
|
|
|
|
- len = PAGE_SIZE;
|
|
|
|
- if (eof & ~PAGE_MASK) {
|
|
|
|
- ASSERTCMP(pos, <, eof);
|
|
|
|
- if (eof - pos < PAGE_SIZE) {
|
|
|
|
- _debug("cut short %llx to %llx",
|
|
|
|
- pos, eof);
|
|
|
|
- len = eof - pos;
|
|
|
|
- ASSERTCMP(pos + len, ==, eof);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- data = kmap(page);
|
|
|
|
- ret = __kernel_write(file, data, len, &pos);
|
|
|
|
- kunmap(page);
|
|
|
|
- if (ret != len)
|
|
|
|
- ret = -EIO;
|
|
|
|
- fput(file);
|
|
|
|
|
|
+ goto error_2;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ret < 0) {
|
|
|
|
- if (ret == -EIO)
|
|
|
|
- cachefiles_io_error_obj(
|
|
|
|
- object, "Write page to backing file failed");
|
|
|
|
- ret = -ENOBUFS;
|
|
|
|
|
|
+ len = PAGE_SIZE;
|
|
|
|
+ if (eof & ~PAGE_MASK) {
|
|
|
|
+ if (eof - pos < PAGE_SIZE) {
|
|
|
|
+ _debug("cut short %llx to %llx",
|
|
|
|
+ pos, eof);
|
|
|
|
+ len = eof - pos;
|
|
|
|
+ ASSERTCMP(pos + len, ==, eof);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- _leave(" = %d", ret);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ data = kmap(page);
|
|
|
|
+ ret = __kernel_write(file, data, len, &pos);
|
|
|
|
+ kunmap(page);
|
|
|
|
+ fput(file);
|
|
|
|
+ if (ret != len)
|
|
|
|
+ goto error_eio;
|
|
|
|
+
|
|
|
|
+ _leave(" = 0");
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+error_eio:
|
|
|
|
+ ret = -EIO;
|
|
|
|
+error_2:
|
|
|
|
+ if (ret == -EIO)
|
|
|
|
+ cachefiles_io_error_obj(object,
|
|
|
|
+ "Write page to backing file failed");
|
|
|
|
+error:
|
|
|
|
+ _leave(" = -ENOBUFS [%d]", ret);
|
|
|
|
+ return -ENOBUFS;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|