[PATCH] set_page_dirty() return value fixes
We need set_page_dirty() to return true if it actually transitioned the page from a clean to dirty state. This wasn't right in a couple of places. Do a kernel-wide audit, fix things up. This leaves open the possibility of returning a negative errno from set_page_dirty() sometime in the future. But we don't do that at present. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
fa5a734e40
commit
4741c9fd36
@@ -2944,7 +2944,7 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig
|
|||||||
int spdl_err;
|
int spdl_err;
|
||||||
/* Mark output pages dirty. */
|
/* Mark output pages dirty. */
|
||||||
spdl_err = set_page_dirty_lock(outpages[i]);
|
spdl_err = set_page_dirty_lock(outpages[i]);
|
||||||
DEBUG(if (spdl_err)printk("cryptocop_ioctl_process: set_page_dirty_lock returned %d\n", spdl_err));
|
DEBUG(if (spdl_err < 0)printk("cryptocop_ioctl_process: set_page_dirty_lock returned %d\n", spdl_err));
|
||||||
}
|
}
|
||||||
for (i = 0; i < nooutpages; i++){
|
for (i = 0; i < nooutpages; i++){
|
||||||
put_page(outpages[i]);
|
put_page(outpages[i]);
|
||||||
|
@@ -186,7 +186,8 @@ static int ramdisk_writepages(struct address_space *mapping,
|
|||||||
*/
|
*/
|
||||||
static int ramdisk_set_page_dirty(struct page *page)
|
static int ramdisk_set_page_dirty(struct page *page)
|
||||||
{
|
{
|
||||||
SetPageDirty(page);
|
if (!TestSetPageDirty(page))
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -865,8 +865,8 @@ int __set_page_dirty_buffers(struct page *page)
|
|||||||
}
|
}
|
||||||
write_unlock_irq(&mapping->tree_lock);
|
write_unlock_irq(&mapping->tree_lock);
|
||||||
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__set_page_dirty_buffers);
|
EXPORT_SYMBOL(__set_page_dirty_buffers);
|
||||||
|
@@ -350,7 +350,7 @@ struct address_space_operations {
|
|||||||
/* Write back some dirty pages from this mapping. */
|
/* Write back some dirty pages from this mapping. */
|
||||||
int (*writepages)(struct address_space *, struct writeback_control *);
|
int (*writepages)(struct address_space *, struct writeback_control *);
|
||||||
|
|
||||||
/* Set a page dirty */
|
/* Set a page dirty. Return true if this dirtied it */
|
||||||
int (*set_page_dirty)(struct page *page);
|
int (*set_page_dirty)(struct page *page);
|
||||||
|
|
||||||
int (*readpages)(struct file *filp, struct address_space *mapping,
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
||||||
|
@@ -628,8 +628,6 @@ EXPORT_SYMBOL(write_one_page);
|
|||||||
*/
|
*/
|
||||||
int __set_page_dirty_nobuffers(struct page *page)
|
int __set_page_dirty_nobuffers(struct page *page)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!TestSetPageDirty(page)) {
|
if (!TestSetPageDirty(page)) {
|
||||||
struct address_space *mapping = page_mapping(page);
|
struct address_space *mapping = page_mapping(page);
|
||||||
struct address_space *mapping2;
|
struct address_space *mapping2;
|
||||||
@@ -651,8 +649,9 @@ int __set_page_dirty_nobuffers(struct page *page)
|
|||||||
I_DIRTY_PAGES);
|
I_DIRTY_PAGES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__set_page_dirty_nobuffers);
|
EXPORT_SYMBOL(__set_page_dirty_nobuffers);
|
||||||
|
|
||||||
@@ -682,8 +681,10 @@ int fastcall set_page_dirty(struct page *page)
|
|||||||
return (*spd)(page);
|
return (*spd)(page);
|
||||||
return __set_page_dirty_buffers(page);
|
return __set_page_dirty_buffers(page);
|
||||||
}
|
}
|
||||||
if (!PageDirty(page))
|
if (!PageDirty(page)) {
|
||||||
SetPageDirty(page);
|
if (!TestSetPageDirty(page))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(set_page_dirty);
|
EXPORT_SYMBOL(set_page_dirty);
|
||||||
|
Reference in New Issue
Block a user