diff options
-rw-r--r-- | fs/gfs2/glops.c | 5 | ||||
-rw-r--r-- | fs/mpage.c | 16 | ||||
-rw-r--r-- | include/linux/pagemap.h | 11 | ||||
-rw-r--r-- | mm/page-writeback.c | 7 | ||||
-rw-r--r-- | mm/vmscan.c | 8 |
5 files changed, 17 insertions, 30 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index 39c8ae23bd9c..7b82657a9910 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -163,10 +163,7 @@ static void inode_go_sync(struct gfs2_glock *gl) | |||
163 | if (ip) { | 163 | if (ip) { |
164 | struct address_space *mapping = ip->i_inode.i_mapping; | 164 | struct address_space *mapping = ip->i_inode.i_mapping; |
165 | int error = filemap_fdatawait(mapping); | 165 | int error = filemap_fdatawait(mapping); |
166 | if (error == -ENOSPC) | 166 | mapping_set_error(mapping, error); |
167 | set_bit(AS_ENOSPC, &mapping->flags); | ||
168 | else if (error) | ||
169 | set_bit(AS_EIO, &mapping->flags); | ||
170 | } | 167 | } |
171 | clear_bit(GLF_DIRTY, &gl->gl_flags); | 168 | clear_bit(GLF_DIRTY, &gl->gl_flags); |
172 | gfs2_ail_empty_gl(gl); | 169 | gfs2_ail_empty_gl(gl); |
diff --git a/fs/mpage.c b/fs/mpage.c index 692a3e578fc8..fa2441f57b41 100644 --- a/fs/mpage.c +++ b/fs/mpage.c | |||
@@ -663,12 +663,7 @@ confused: | |||
663 | /* | 663 | /* |
664 | * The caller has a ref on the inode, so *mapping is stable | 664 | * The caller has a ref on the inode, so *mapping is stable |
665 | */ | 665 | */ |
666 | if (*ret) { | 666 | mapping_set_error(mapping, *ret); |
667 | if (*ret == -ENOSPC) | ||
668 | set_bit(AS_ENOSPC, &mapping->flags); | ||
669 | else | ||
670 | set_bit(AS_EIO, &mapping->flags); | ||
671 | } | ||
672 | out: | 667 | out: |
673 | return bio; | 668 | return bio; |
674 | } | 669 | } |
@@ -776,14 +771,7 @@ retry: | |||
776 | 771 | ||
777 | if (writepage) { | 772 | if (writepage) { |
778 | ret = (*writepage)(page, wbc); | 773 | ret = (*writepage)(page, wbc); |
779 | if (ret) { | 774 | mapping_set_error(mapping, ret); |
780 | if (ret == -ENOSPC) | ||
781 | set_bit(AS_ENOSPC, | ||
782 | &mapping->flags); | ||
783 | else | ||
784 | set_bit(AS_EIO, | ||
785 | &mapping->flags); | ||
786 | } | ||
787 | } else { | 775 | } else { |
788 | bio = __mpage_writepage(bio, page, get_block, | 776 | bio = __mpage_writepage(bio, page, get_block, |
789 | &last_block_in_bio, &ret, wbc, | 777 | &last_block_in_bio, &ret, wbc, |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index b4def5e083ed..8a83537d6978 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
12 | #include <asm/uaccess.h> | 12 | #include <asm/uaccess.h> |
13 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
14 | #include <linux/bitops.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * Bits in mapping->flags. The lower __GFP_BITS_SHIFT bits are the page | 17 | * Bits in mapping->flags. The lower __GFP_BITS_SHIFT bits are the page |
@@ -19,6 +20,16 @@ | |||
19 | #define AS_EIO (__GFP_BITS_SHIFT + 0) /* IO error on async write */ | 20 | #define AS_EIO (__GFP_BITS_SHIFT + 0) /* IO error on async write */ |
20 | #define AS_ENOSPC (__GFP_BITS_SHIFT + 1) /* ENOSPC on async write */ | 21 | #define AS_ENOSPC (__GFP_BITS_SHIFT + 1) /* ENOSPC on async write */ |
21 | 22 | ||
23 | static inline void mapping_set_error(struct address_space *mapping, int error) | ||
24 | { | ||
25 | if (error) { | ||
26 | if (error == -ENOSPC) | ||
27 | set_bit(AS_ENOSPC, &mapping->flags); | ||
28 | else | ||
29 | set_bit(AS_EIO, &mapping->flags); | ||
30 | } | ||
31 | } | ||
32 | |||
22 | static inline gfp_t mapping_gfp_mask(struct address_space * mapping) | 33 | static inline gfp_t mapping_gfp_mask(struct address_space * mapping) |
23 | { | 34 | { |
24 | return (__force gfp_t)mapping->flags & __GFP_BITS_MASK; | 35 | return (__force gfp_t)mapping->flags & __GFP_BITS_MASK; |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 029dfad5a235..63cd88840eb2 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -683,12 +683,7 @@ retry: | |||
683 | } | 683 | } |
684 | 684 | ||
685 | ret = (*writepage)(page, wbc); | 685 | ret = (*writepage)(page, wbc); |
686 | if (ret) { | 686 | mapping_set_error(mapping, ret); |
687 | if (ret == -ENOSPC) | ||
688 | set_bit(AS_ENOSPC, &mapping->flags); | ||
689 | else | ||
690 | set_bit(AS_EIO, &mapping->flags); | ||
691 | } | ||
692 | 687 | ||
693 | if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) | 688 | if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) |
694 | unlock_page(page); | 689 | unlock_page(page); |
diff --git a/mm/vmscan.c b/mm/vmscan.c index 56651a10c366..1c8e75a1cfcd 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -284,12 +284,8 @@ static void handle_write_error(struct address_space *mapping, | |||
284 | struct page *page, int error) | 284 | struct page *page, int error) |
285 | { | 285 | { |
286 | lock_page(page); | 286 | lock_page(page); |
287 | if (page_mapping(page) == mapping) { | 287 | if (page_mapping(page) == mapping) |
288 | if (error == -ENOSPC) | 288 | mapping_set_error(mapping, error); |
289 | set_bit(AS_ENOSPC, &mapping->flags); | ||
290 | else | ||
291 | set_bit(AS_EIO, &mapping->flags); | ||
292 | } | ||
293 | unlock_page(page); | 289 | unlock_page(page); |
294 | } | 290 | } |
295 | 291 | ||