|
@@ -80,6 +80,7 @@
|
|
|
enum sgp_type {
|
|
|
SGP_READ, /* don't exceed i_size, don't allocate page */
|
|
|
SGP_CACHE, /* don't exceed i_size, may allocate page */
|
|
|
+ SGP_DIRTY, /* like SGP_CACHE, but set new page dirty */
|
|
|
SGP_WRITE, /* may exceed i_size, may allocate page */
|
|
|
};
|
|
|
|
|
@@ -1333,6 +1334,8 @@ repeat:
|
|
|
clear_highpage(filepage);
|
|
|
flush_dcache_page(filepage);
|
|
|
SetPageUptodate(filepage);
|
|
|
+ if (sgp == SGP_DIRTY)
|
|
|
+ set_page_dirty(filepage);
|
|
|
}
|
|
|
done:
|
|
|
*pagep = filepage;
|
|
@@ -1518,6 +1521,15 @@ static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_
|
|
|
struct inode *inode = filp->f_path.dentry->d_inode;
|
|
|
struct address_space *mapping = inode->i_mapping;
|
|
|
unsigned long index, offset;
|
|
|
+ enum sgp_type sgp = SGP_READ;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Might this read be for a stacking filesystem? Then when reading
|
|
|
+ * holes of a sparse file, we actually need to allocate those pages,
|
|
|
+ * and even mark them dirty, so it cannot exceed the max_blocks limit.
|
|
|
+ */
|
|
|
+ if (segment_eq(get_fs(), KERNEL_DS))
|
|
|
+ sgp = SGP_DIRTY;
|
|
|
|
|
|
index = *ppos >> PAGE_CACHE_SHIFT;
|
|
|
offset = *ppos & ~PAGE_CACHE_MASK;
|
|
@@ -1536,7 +1548,7 @@ static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- desc->error = shmem_getpage(inode, index, &page, SGP_READ, NULL);
|
|
|
+ desc->error = shmem_getpage(inode, index, &page, sgp, NULL);
|
|
|
if (desc->error) {
|
|
|
if (desc->error == -EINVAL)
|
|
|
desc->error = 0;
|