Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e9f45bd authored by Guillaume Chazarain's avatar Guillaume Chazarain Committed by Linus Torvalds
Browse files

Factor outstanding I/O error handling



Cleanup: setting an outstanding error on a mapping was open coded too many
times.  Factor it out in mapping_set_error().

Signed-off-by: default avatarGuillaume Chazarain <guichaz@yahoo.fr>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c83e4484
Loading
Loading
Loading
Loading
+1 −4
Original line number Original line Diff line number Diff line
@@ -163,10 +163,7 @@ static void inode_go_sync(struct gfs2_glock *gl)
		if (ip) {
		if (ip) {
			struct address_space *mapping = ip->i_inode.i_mapping;
			struct address_space *mapping = ip->i_inode.i_mapping;
			int error = filemap_fdatawait(mapping);
			int error = filemap_fdatawait(mapping);
			if (error == -ENOSPC)
			mapping_set_error(mapping, error);
				set_bit(AS_ENOSPC, &mapping->flags);
			else if (error)
				set_bit(AS_EIO, &mapping->flags);
		}
		}
		clear_bit(GLF_DIRTY, &gl->gl_flags);
		clear_bit(GLF_DIRTY, &gl->gl_flags);
		gfs2_ail_empty_gl(gl);
		gfs2_ail_empty_gl(gl);
+2 −14
Original line number Original line Diff line number Diff line
@@ -663,12 +663,7 @@ confused:
	/*
	/*
	 * The caller has a ref on the inode, so *mapping is stable
	 * The caller has a ref on the inode, so *mapping is stable
	 */
	 */
	if (*ret) {
	mapping_set_error(mapping, *ret);
		if (*ret == -ENOSPC)
			set_bit(AS_ENOSPC, &mapping->flags);
		else
			set_bit(AS_EIO, &mapping->flags);
	}
out:
out:
	return bio;
	return bio;
}
}
@@ -776,14 +771,7 @@ retry:


			if (writepage) {
			if (writepage) {
				ret = (*writepage)(page, wbc);
				ret = (*writepage)(page, wbc);
				if (ret) {
				mapping_set_error(mapping, ret);
					if (ret == -ENOSPC)
						set_bit(AS_ENOSPC,
							&mapping->flags);
					else
						set_bit(AS_EIO,
							&mapping->flags);
				}
			} else {
			} else {
				bio = __mpage_writepage(bio, page, get_block,
				bio = __mpage_writepage(bio, page, get_block,
						&last_block_in_bio, &ret, wbc,
						&last_block_in_bio, &ret, wbc,
+11 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/compiler.h>
#include <linux/compiler.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include <linux/gfp.h>
#include <linux/gfp.h>
#include <linux/bitops.h>


/*
/*
 * Bits in mapping->flags.  The lower __GFP_BITS_SHIFT bits are the page
 * Bits in mapping->flags.  The lower __GFP_BITS_SHIFT bits are the page
@@ -19,6 +20,16 @@
#define	AS_EIO		(__GFP_BITS_SHIFT + 0)	/* IO error on async write */
#define	AS_EIO		(__GFP_BITS_SHIFT + 0)	/* IO error on async write */
#define AS_ENOSPC	(__GFP_BITS_SHIFT + 1)	/* ENOSPC on async write */
#define AS_ENOSPC	(__GFP_BITS_SHIFT + 1)	/* ENOSPC on async write */


static inline void mapping_set_error(struct address_space *mapping, int error)
{
	if (error) {
		if (error == -ENOSPC)
			set_bit(AS_ENOSPC, &mapping->flags);
		else
			set_bit(AS_EIO, &mapping->flags);
	}
}

static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
{
{
	return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
	return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
+1 −6
Original line number Original line Diff line number Diff line
@@ -683,12 +683,7 @@ retry:
			}
			}


			ret = (*writepage)(page, wbc);
			ret = (*writepage)(page, wbc);
			if (ret) {
			mapping_set_error(mapping, ret);
				if (ret == -ENOSPC)
					set_bit(AS_ENOSPC, &mapping->flags);
				else
					set_bit(AS_EIO, &mapping->flags);
			}


			if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE))
			if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE))
				unlock_page(page);
				unlock_page(page);
+2 −6
Original line number Original line Diff line number Diff line
@@ -284,12 +284,8 @@ static void handle_write_error(struct address_space *mapping,
				struct page *page, int error)
				struct page *page, int error)
{
{
	lock_page(page);
	lock_page(page);
	if (page_mapping(page) == mapping) {
	if (page_mapping(page) == mapping)
		if (error == -ENOSPC)
		mapping_set_error(mapping, error);
			set_bit(AS_ENOSPC, &mapping->flags);
		else
			set_bit(AS_EIO, &mapping->flags);
	}
	unlock_page(page);
	unlock_page(page);
}
}