summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/btree.c18
-rw-r--r--drivers/md/bcache/dirent.c4
-rw-r--r--drivers/md/bcache/fs-gc.c2
-rw-r--r--drivers/md/bcache/inode.c2
-rw-r--r--drivers/md/bcache/migrate.c2
-rw-r--r--drivers/md/bcache/request.c2
-rw-r--r--drivers/md/bcache/xattr.c2
7 files changed, 17 insertions, 15 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 02be79a7d547..6edbb06d46f8 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -2804,6 +2804,7 @@ int bch_btree_insert_node(struct btree *b,
* Return values:
* -EINTR: locking changed, this function should be called again.
* -EROFS: cache set read only
+ * -EIO: journal or btree node IO error
*/
int bch_btree_insert_at(struct btree_iter *iter,
struct keylist *insert_keys,
@@ -2837,9 +2838,12 @@ int bch_btree_insert_at(struct btree_iter *iter,
* -EAGAIN means we have to drop locks and wait on
* mca_cannibalize_lock - btree_iter_unlock() does this
*/
- if (ret == -EAGAIN)
+ if (ret == -EAGAIN) {
bch_btree_iter_unlock(iter);
- else if (ret && ret != -EINTR)
+ ret = -EINTR;
+ }
+
+ if (ret && ret != -EINTR)
break;
traverse:
/*
@@ -2938,16 +2942,14 @@ int bch_btree_update(struct cache_set *c, enum btree_id id,
bch_btree_iter_init_intent(&iter, c, id, k->k.p);
- ret = bch_btree_iter_traverse(&iter);
- if (unlikely(ret))
- goto out;
-
u = bch_btree_iter_peek_with_holes(&iter);
- BUG_ON(!u.k || bkey_deleted(u.k));
+
+ if (!u.k || bkey_deleted(u.k))
+ return -ENOENT;
ret = bch_btree_insert_at(&iter, &keylist_single(k), NULL,
journal_seq, 0);
-out: ret2 = bch_btree_iter_unlock(&iter);
+ ret2 = bch_btree_iter_unlock(&iter);
return ret ?: ret2;
}
diff --git a/drivers/md/bcache/dirent.c b/drivers/md/bcache/dirent.c
index 9f780b0f4e59..c007b7b0d39d 100644
--- a/drivers/md/bcache/dirent.c
+++ b/drivers/md/bcache/dirent.c
@@ -187,7 +187,7 @@ insert:
ret = bch_btree_insert_at(&iter, &keys, NULL,
journal_seq,
BTREE_INSERT_ATOMIC);
- if (ret != -EINTR && ret != -EAGAIN)
+ if (ret != -EINTR)
break;
} else {
/* collision */
@@ -247,7 +247,7 @@ int bch_dirent_delete(struct cache_set *c, u64 dir_inum,
NULL, NULL,
BTREE_INSERT_NOFAIL|
BTREE_INSERT_ATOMIC);
- if (ret == -EINTR || ret == -EAGAIN)
+ if (ret == -EINTR)
continue;
}
break;
diff --git a/drivers/md/bcache/fs-gc.c b/drivers/md/bcache/fs-gc.c
index 47e7a7f093e0..3245e1063898 100644
--- a/drivers/md/bcache/fs-gc.c
+++ b/drivers/md/bcache/fs-gc.c
@@ -150,7 +150,7 @@ static int bch_gc_walk_inodes(struct cache_set *c, u64 pos, struct nlink *links)
ret = bch_gc_do_inode(c, &iter,
bkey_s_c_to_inode(k),
links[i]);
- if (ret == -EAGAIN || ret == -EINTR)
+ if (ret == -EINTR)
continue;
if (ret)
goto out;
diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c
index 7061193777e2..53b699920e1d 100644
--- a/drivers/md/bcache/inode.c
+++ b/drivers/md/bcache/inode.c
@@ -130,7 +130,7 @@ again:
NULL, NULL,
BTREE_INSERT_ATOMIC);
- if (ret == -EINTR || ret == -EAGAIN)
+ if (ret == -EINTR)
continue;
bch_btree_iter_unlock(&iter);
diff --git a/drivers/md/bcache/migrate.c b/drivers/md/bcache/migrate.c
index 65727374b804..66b52c759e39 100644
--- a/drivers/md/bcache/migrate.c
+++ b/drivers/md/bcache/migrate.c
@@ -563,7 +563,7 @@ int bch_flag_data_bad(struct cache *ca)
if (bkey_extent_is_data(k.k)) {
ret = bch_flag_key_bad(&iter, ca,
bkey_s_c_to_extent(k));
- if (ret == -EINTR || ret == -EAGAIN)
+ if (ret == -EINTR)
continue;
if (ret)
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
index e7429d89c5c7..13e08ed237ce 100644
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@ -356,7 +356,7 @@ static int cached_dev_cache_miss(struct btree_iter *iter, struct search *s,
sectors);
ret = bch_btree_insert_check_key(iter, &replace.key);
- if (ret == -EINTR || ret == -EAGAIN)
+ if (ret == -EINTR)
return ret;
miss = bio_next_split(bio, sectors, GFP_NOIO, &s->d->bio_split);
diff --git a/drivers/md/bcache/xattr.c b/drivers/md/bcache/xattr.c
index 2f9f176609bc..22e728c18121 100644
--- a/drivers/md/bcache/xattr.c
+++ b/drivers/md/bcache/xattr.c
@@ -275,7 +275,7 @@ int bch_xattr_set(struct inode *inode, const char *name,
insert_flags);
}
- if (ret != -EINTR && ret != -EAGAIN)
+ if (ret != -EINTR)
break;
}
out: