* [PATCH 0/3] libceph, rbd, ceph: "blacklist" -> "blocklist"
@ 2020-09-15 20:33 Ilya Dryomov
2020-09-15 20:33 ` [PATCH 1/3] " Ilya Dryomov
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Ilya Dryomov @ 2020-09-15 20:33 UTC (permalink / raw)
To: ceph-devel
Hello,
This switches the kernel client to the conscious language. Two
instances of "blacklist" remain because they are part of the on-wire
format: the "osd blacklist add" monitor command used as a fallback
and the session reject error string. The latter is to be addressed
in the near future:
https://tracker.ceph.com/issues/47450
Thanks,
Ilya
Ilya Dryomov (3):
libceph, rbd, ceph: "blacklist" -> "blocklist"
libceph: switch to the new "osd blocklist add" command
ceph: add a note explaining session reject error string
Documentation/filesystems/ceph.rst | 6 +--
drivers/block/rbd.c | 8 ++--
fs/ceph/addr.c | 24 +++++------
fs/ceph/file.c | 4 +-
fs/ceph/mds_client.c | 20 +++++----
fs/ceph/super.c | 4 +-
fs/ceph/super.h | 4 +-
include/linux/ceph/mon_client.h | 2 +-
include/linux/ceph/rados.h | 2 +-
net/ceph/mon_client.c | 67 +++++++++++++++++++++++-------
10 files changed, 90 insertions(+), 51 deletions(-)
--
2.19.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] libceph, rbd, ceph: "blacklist" -> "blocklist"
2020-09-15 20:33 [PATCH 0/3] libceph, rbd, ceph: "blacklist" -> "blocklist" Ilya Dryomov
@ 2020-09-15 20:33 ` Ilya Dryomov
2020-09-16 2:16 ` Xiubo Li
2020-09-15 20:33 ` [PATCH 2/3] libceph: switch to the new "osd blocklist add" command Ilya Dryomov
2020-09-15 20:33 ` [PATCH 3/3] ceph: add a note explaining session reject error string Ilya Dryomov
2 siblings, 1 reply; 7+ messages in thread
From: Ilya Dryomov @ 2020-09-15 20:33 UTC (permalink / raw)
To: ceph-devel
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
Documentation/filesystems/ceph.rst | 6 +++---
drivers/block/rbd.c | 8 ++++----
fs/ceph/addr.c | 24 ++++++++++++------------
fs/ceph/file.c | 4 ++--
fs/ceph/mds_client.c | 16 ++++++++--------
fs/ceph/super.c | 4 ++--
fs/ceph/super.h | 4 ++--
include/linux/ceph/mon_client.h | 2 +-
include/linux/ceph/rados.h | 2 +-
net/ceph/mon_client.c | 8 ++++----
10 files changed, 39 insertions(+), 39 deletions(-)
diff --git a/Documentation/filesystems/ceph.rst b/Documentation/filesystems/ceph.rst
index 0aa70750df0f..7d2ef4e27273 100644
--- a/Documentation/filesystems/ceph.rst
+++ b/Documentation/filesystems/ceph.rst
@@ -163,14 +163,14 @@ Mount Options
to the default VFS implementation if this option is used.
recover_session=<no|clean>
- Set auto reconnect mode in the case where the client is blacklisted. The
+ Set auto reconnect mode in the case where the client is blocklisted. The
available modes are "no" and "clean". The default is "no".
* no: never attempt to reconnect when client detects that it has been
- blacklisted. Operations will generally fail after being blacklisted.
+ blocklisted. Operations will generally fail after being blocklisted.
* clean: client reconnects to the ceph cluster automatically when it
- detects that it has been blacklisted. During reconnect, client drops
+ detects that it has been blocklisted. During reconnect, client drops
dirty data/metadata, invalidates page caches and writable file handles.
After reconnect, file locks become stale because the MDS loses track
of them. If an inode contains any stale file locks, read/write on the
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 180587ce606c..d21fecfe3eba 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4010,10 +4010,10 @@ static int rbd_try_lock(struct rbd_device *rbd_dev)
rbd_warn(rbd_dev, "breaking header lock owned by %s%llu",
ENTITY_NAME(lockers[0].id.name));
- ret = ceph_monc_blacklist_add(&client->monc,
+ ret = ceph_monc_blocklist_add(&client->monc,
&lockers[0].info.addr);
if (ret) {
- rbd_warn(rbd_dev, "blacklist of %s%llu failed: %d",
+ rbd_warn(rbd_dev, "blocklist of %s%llu failed: %d",
ENTITY_NAME(lockers[0].id.name), ret);
goto out;
}
@@ -4077,7 +4077,7 @@ static int rbd_try_acquire_lock(struct rbd_device *rbd_dev)
ret = rbd_try_lock(rbd_dev);
if (ret < 0) {
rbd_warn(rbd_dev, "failed to lock header: %d", ret);
- if (ret == -EBLACKLISTED)
+ if (ret == -EBLOCKLISTED)
goto out;
ret = 1; /* request lock anyway */
@@ -4613,7 +4613,7 @@ static void rbd_reregister_watch(struct work_struct *work)
ret = __rbd_register_watch(rbd_dev);
if (ret) {
rbd_warn(rbd_dev, "failed to reregister watch: %d", ret);
- if (ret != -EBLACKLISTED && ret != -ENOENT) {
+ if (ret != -EBLOCKLISTED && ret != -ENOENT) {
queue_delayed_work(rbd_dev->task_wq,
&rbd_dev->watch_dwork,
RBD_RETRY_DELAY);
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index b03dbaa9d345..7b1f3dad576f 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -271,8 +271,8 @@ static int ceph_do_readpage(struct file *filp, struct page *page)
if (err < 0) {
SetPageError(page);
ceph_fscache_readpage_cancel(inode, page);
- if (err == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (err == -EBLOCKLISTED)
+ fsc->blocklisted = true;
goto out;
}
if (err < PAGE_SIZE)
@@ -312,8 +312,8 @@ static void finish_read(struct ceph_osd_request *req)
int i;
dout("finish_read %p req %p rc %d bytes %d\n", inode, req, rc, bytes);
- if (rc == -EBLACKLISTED)
- ceph_inode_to_client(inode)->blacklisted = true;
+ if (rc == -EBLOCKLISTED)
+ ceph_inode_to_client(inode)->blocklisted = true;
/* unlock all pages, zeroing any data we didn't read */
osd_data = osd_req_op_extent_osd_data(req, 0);
@@ -737,8 +737,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
end_page_writeback(page);
return err;
}
- if (err == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (err == -EBLOCKLISTED)
+ fsc->blocklisted = true;
dout("writepage setting page/mapping error %d %p\n",
err, page);
mapping_set_error(&inode->i_data, err);
@@ -801,8 +801,8 @@ static void writepages_finish(struct ceph_osd_request *req)
if (rc < 0) {
mapping_set_error(mapping, rc);
ceph_set_error_write(ci);
- if (rc == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (rc == -EBLOCKLISTED)
+ fsc->blocklisted = true;
} else {
ceph_clear_error_write(ci);
}
@@ -2038,16 +2038,16 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
if (err >= 0 || err == -ENOENT)
have |= POOL_READ;
else if (err != -EPERM) {
- if (err == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (err == -EBLOCKLISTED)
+ fsc->blocklisted = true;
goto out_unlock;
}
if (err2 == 0 || err2 == -EEXIST)
have |= POOL_WRITE;
else if (err2 != -EPERM) {
- if (err2 == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (err2 == -EBLOCKLISTED)
+ fsc->blocklisted = true;
err = err2;
goto out_unlock;
}
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 762a280b7037..209535d5b8d3 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -933,8 +933,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
ceph_release_page_vector(pages, num_pages);
if (ret < 0) {
- if (ret == -EBLACKLISTED)
- fsc->blacklisted = true;
+ if (ret == -EBLOCKLISTED)
+ fsc->blocklisted = true;
break;
}
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 76d8d9495d1d..bb2d938a17ac 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -3303,7 +3303,7 @@ static void handle_forward(struct ceph_mds_client *mdsc,
}
static int __decode_session_metadata(void **p, void *end,
- bool *blacklisted)
+ bool *blocklisted)
{
/* map<string,string> */
u32 n;
@@ -3318,7 +3318,7 @@ static int __decode_session_metadata(void **p, void *end,
ceph_decode_32_safe(p, end, len, bad);
ceph_decode_need(p, end, len, bad);
if (err_str && strnstr(*p, "blacklisted", len))
- *blacklisted = true;
+ *blocklisted = true;
*p += len;
}
return 0;
@@ -3341,7 +3341,7 @@ static void handle_session(struct ceph_mds_session *session,
u32 op;
u64 seq, features = 0;
int wake = 0;
- bool blacklisted = false;
+ bool blocklisted = false;
/* decode */
ceph_decode_need(&p, end, sizeof(*h), bad);
@@ -3354,7 +3354,7 @@ static void handle_session(struct ceph_mds_session *session,
if (msg_version >= 3) {
u32 len;
/* version >= 2, metadata */
- if (__decode_session_metadata(&p, end, &blacklisted) < 0)
+ if (__decode_session_metadata(&p, end, &blocklisted) < 0)
goto bad;
/* version >= 3, feature bits */
ceph_decode_32_safe(&p, end, len, bad);
@@ -3445,8 +3445,8 @@ static void handle_session(struct ceph_mds_session *session,
session->s_state = CEPH_MDS_SESSION_REJECTED;
cleanup_session_requests(mdsc, session);
remove_session_caps(session);
- if (blacklisted)
- mdsc->fsc->blacklisted = true;
+ if (blocklisted)
+ mdsc->fsc->blocklisted = true;
wake = 2; /* for good measure */
break;
@@ -4367,14 +4367,14 @@ static void maybe_recover_session(struct ceph_mds_client *mdsc)
if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED)
return;
- if (!READ_ONCE(fsc->blacklisted))
+ if (!READ_ONCE(fsc->blocklisted))
return;
if (fsc->last_auto_reconnect &&
time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30))
return;
- pr_info("auto reconnect after blacklisted\n");
+ pr_info("auto reconnect after blocklisted\n");
fsc->last_auto_reconnect = jiffies;
ceph_force_reconnect(fsc->sb);
}
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index b3fc9bb61afc..2516304379d3 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -1241,13 +1241,13 @@ int ceph_force_reconnect(struct super_block *sb)
* see remove_session_caps_cb() */
flush_workqueue(fsc->inode_wq);
- /* In case that we were blacklisted. This also reset
+ /* In case that we were blocklisted. This also reset
* all mon/osd connections */
ceph_reset_client_addr(fsc->client);
ceph_osdc_clear_abort_err(&fsc->client->osdc);
- fsc->blacklisted = false;
+ fsc->blocklisted = false;
fsc->mount_state = CEPH_MOUNT_MOUNTED;
if (sb->s_root) {
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index 483a52d281cd..582694899130 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -32,7 +32,7 @@
#define CEPH_BLOCK_SHIFT 22 /* 4 MB */
#define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
-#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blacklisted */
+#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blocklisted */
#define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
#define CEPH_MOUNT_OPT_RBYTES (1<<5) /* dir st_bytes = rbytes */
#define CEPH_MOUNT_OPT_NOASYNCREADDIR (1<<7) /* no dcache readdir */
@@ -109,7 +109,7 @@ struct ceph_fs_client {
unsigned long mount_state;
unsigned long last_auto_reconnect;
- bool blacklisted;
+ bool blocklisted;
bool have_copy_from2;
diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
index ce4ffeb384d7..b658961156a0 100644
--- a/include/linux/ceph/mon_client.h
+++ b/include/linux/ceph/mon_client.h
@@ -142,7 +142,7 @@ int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
int ceph_monc_get_version_async(struct ceph_mon_client *monc, const char *what,
ceph_monc_callback_t cb, u64 private_data);
-int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
+int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
struct ceph_entity_addr *client_addr);
extern int ceph_monc_open_session(struct ceph_mon_client *monc);
diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h
index 3a518fd0eaad..43a7a1573b51 100644
--- a/include/linux/ceph/rados.h
+++ b/include/linux/ceph/rados.h
@@ -424,7 +424,7 @@ enum {
};
#define EOLDSNAPC ERESTART /* ORDERSNAP flag set; writer has old snapc*/
-#define EBLACKLISTED ESHUTDOWN /* blacklisted */
+#define EBLOCKLISTED ESHUTDOWN /* blocklisted */
/* xattr comparison */
enum {
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index d633a0aeaa55..efcdde471278 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -896,7 +896,7 @@ static void handle_command_ack(struct ceph_mon_client *monc,
ceph_msg_dump(msg);
}
-int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
+int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
struct ceph_entity_addr *client_addr)
{
struct ceph_mon_generic_request *req;
@@ -936,9 +936,9 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
ret = wait_generic_request(req);
if (!ret)
/*
- * Make sure we have the osdmap that includes the blacklist
+ * Make sure we have the osdmap that includes the blocklist
* entry. This is needed to ensure that the OSDs pick up the
- * new blacklist before processing any future requests from
+ * new blocklist before processing any future requests from
* this client.
*/
ret = ceph_wait_for_latest_osdmap(monc->client, 0);
@@ -947,7 +947,7 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
put_generic_request(req);
return ret;
}
-EXPORT_SYMBOL(ceph_monc_blacklist_add);
+EXPORT_SYMBOL(ceph_monc_blocklist_add);
/*
* Resend pending generic requests.
--
2.19.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] libceph: switch to the new "osd blocklist add" command
2020-09-15 20:33 [PATCH 0/3] libceph, rbd, ceph: "blacklist" -> "blocklist" Ilya Dryomov
2020-09-15 20:33 ` [PATCH 1/3] " Ilya Dryomov
@ 2020-09-15 20:33 ` Ilya Dryomov
2020-09-15 20:33 ` [PATCH 3/3] ceph: add a note explaining session reject error string Ilya Dryomov
2 siblings, 0 replies; 7+ messages in thread
From: Ilya Dryomov @ 2020-09-15 20:33 UTC (permalink / raw)
To: ceph-devel
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
net/ceph/mon_client.c | 65 +++++++++++++++++++++++++++++++++----------
1 file changed, 50 insertions(+), 15 deletions(-)
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index efcdde471278..32bce480f8e4 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -896,8 +896,8 @@ static void handle_command_ack(struct ceph_mon_client *monc,
ceph_msg_dump(msg);
}
-int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
- struct ceph_entity_addr *client_addr)
+static int do_mon_command_vargs(struct ceph_mon_client *monc,
+ const char *fmt, va_list ap)
{
struct ceph_mon_generic_request *req;
struct ceph_mon_command *h;
@@ -925,28 +925,63 @@ int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
h->monhdr.session_mon_tid = 0;
h->fsid = monc->monmap->fsid;
h->num_strs = cpu_to_le32(1);
- len = sprintf(h->str, "{ \"prefix\": \"osd blacklist\", \
- \"blacklistop\": \"add\", \
- \"addr\": \"%pISpc/%u\" }",
- &client_addr->in_addr, le32_to_cpu(client_addr->nonce));
+ len = vsprintf(h->str, fmt, ap);
h->str_len = cpu_to_le32(len);
send_generic_request(monc, req);
mutex_unlock(&monc->mutex);
ret = wait_generic_request(req);
- if (!ret)
- /*
- * Make sure we have the osdmap that includes the blocklist
- * entry. This is needed to ensure that the OSDs pick up the
- * new blocklist before processing any future requests from
- * this client.
- */
- ret = ceph_wait_for_latest_osdmap(monc->client, 0);
-
out:
put_generic_request(req);
return ret;
}
+
+static int do_mon_command(struct ceph_mon_client *monc, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, fmt);
+ ret = do_mon_command_vargs(monc, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
+ struct ceph_entity_addr *client_addr)
+{
+ int ret;
+
+ ret = do_mon_command(monc,
+ "{ \"prefix\": \"osd blocklist\", \
+ \"blocklistop\": \"add\", \
+ \"addr\": \"%pISpc/%u\" }",
+ &client_addr->in_addr,
+ le32_to_cpu(client_addr->nonce));
+ if (ret == -EINVAL) {
+ /*
+ * The monitor returns EINVAL on an unrecognized command.
+ * Try the legacy command -- it is exactly the same except
+ * for the name.
+ */
+ ret = do_mon_command(monc,
+ "{ \"prefix\": \"osd blacklist\", \
+ \"blacklistop\": \"add\", \
+ \"addr\": \"%pISpc/%u\" }",
+ &client_addr->in_addr,
+ le32_to_cpu(client_addr->nonce));
+ }
+ if (ret)
+ return ret;
+
+ /*
+ * Make sure we have the osdmap that includes the blocklist
+ * entry. This is needed to ensure that the OSDs pick up the
+ * new blocklist before processing any future requests from
+ * this client.
+ */
+ return ceph_wait_for_latest_osdmap(monc->client, 0);
+}
EXPORT_SYMBOL(ceph_monc_blocklist_add);
/*
--
2.19.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] ceph: add a note explaining session reject error string
2020-09-15 20:33 [PATCH 0/3] libceph, rbd, ceph: "blacklist" -> "blocklist" Ilya Dryomov
2020-09-15 20:33 ` [PATCH 1/3] " Ilya Dryomov
2020-09-15 20:33 ` [PATCH 2/3] libceph: switch to the new "osd blocklist add" command Ilya Dryomov
@ 2020-09-15 20:33 ` Ilya Dryomov
2 siblings, 0 replies; 7+ messages in thread
From: Ilya Dryomov @ 2020-09-15 20:33 UTC (permalink / raw)
To: ceph-devel
error_string key in the metadata map of MClientSession message
is intended for humans, but unfortunately became part of the on-wire
format with the introduction of recover_session=clean mode in commit
131d7eb4faa1 ("ceph: auto reconnect after blacklisted").
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
---
fs/ceph/mds_client.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index bb2d938a17ac..08f1c0c31dc2 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -3317,6 +3317,10 @@ static int __decode_session_metadata(void **p, void *end,
*p += len;
ceph_decode_32_safe(p, end, len, bad);
ceph_decode_need(p, end, len, bad);
+ /*
+ * Match "blocklisted (blacklisted)" from newer MDSes,
+ * or "blacklisted" from older MDSes.
+ */
if (err_str && strnstr(*p, "blacklisted", len))
*blocklisted = true;
*p += len;
--
2.19.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] libceph, rbd, ceph: "blacklist" -> "blocklist"
2020-09-15 20:33 ` [PATCH 1/3] " Ilya Dryomov
@ 2020-09-16 2:16 ` Xiubo Li
2020-09-16 7:15 ` Ilya Dryomov
0 siblings, 1 reply; 7+ messages in thread
From: Xiubo Li @ 2020-09-16 2:16 UTC (permalink / raw)
To: Ilya Dryomov, ceph-devel
On 2020/9/16 4:33, Ilya Dryomov wrote:
> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> ---
> Documentation/filesystems/ceph.rst | 6 +++---
> drivers/block/rbd.c | 8 ++++----
> fs/ceph/addr.c | 24 ++++++++++++------------
> fs/ceph/file.c | 4 ++--
> fs/ceph/mds_client.c | 16 ++++++++--------
> fs/ceph/super.c | 4 ++--
> fs/ceph/super.h | 4 ++--
> include/linux/ceph/mon_client.h | 2 +-
> include/linux/ceph/rados.h | 2 +-
> net/ceph/mon_client.c | 8 ++++----
> 10 files changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/Documentation/filesystems/ceph.rst b/Documentation/filesystems/ceph.rst
> index 0aa70750df0f..7d2ef4e27273 100644
> --- a/Documentation/filesystems/ceph.rst
> +++ b/Documentation/filesystems/ceph.rst
> @@ -163,14 +163,14 @@ Mount Options
> to the default VFS implementation if this option is used.
>
> recover_session=<no|clean>
> - Set auto reconnect mode in the case where the client is blacklisted. The
> + Set auto reconnect mode in the case where the client is blocklisted. The
> available modes are "no" and "clean". The default is "no".
>
> * no: never attempt to reconnect when client detects that it has been
> - blacklisted. Operations will generally fail after being blacklisted.
> + blocklisted. Operations will generally fail after being blocklisted.
>
> * clean: client reconnects to the ceph cluster automatically when it
> - detects that it has been blacklisted. During reconnect, client drops
> + detects that it has been blocklisted. During reconnect, client drops
> dirty data/metadata, invalidates page caches and writable file handles.
> After reconnect, file locks become stale because the MDS loses track
> of them. If an inode contains any stale file locks, read/write on the
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 180587ce606c..d21fecfe3eba 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -4010,10 +4010,10 @@ static int rbd_try_lock(struct rbd_device *rbd_dev)
> rbd_warn(rbd_dev, "breaking header lock owned by %s%llu",
> ENTITY_NAME(lockers[0].id.name));
>
> - ret = ceph_monc_blacklist_add(&client->monc,
> + ret = ceph_monc_blocklist_add(&client->monc,
> &lockers[0].info.addr);
> if (ret) {
> - rbd_warn(rbd_dev, "blacklist of %s%llu failed: %d",
> + rbd_warn(rbd_dev, "blocklist of %s%llu failed: %d",
> ENTITY_NAME(lockers[0].id.name), ret);
> goto out;
> }
> @@ -4077,7 +4077,7 @@ static int rbd_try_acquire_lock(struct rbd_device *rbd_dev)
> ret = rbd_try_lock(rbd_dev);
> if (ret < 0) {
> rbd_warn(rbd_dev, "failed to lock header: %d", ret);
> - if (ret == -EBLACKLISTED)
> + if (ret == -EBLOCKLISTED)
> goto out;
>
> ret = 1; /* request lock anyway */
> @@ -4613,7 +4613,7 @@ static void rbd_reregister_watch(struct work_struct *work)
> ret = __rbd_register_watch(rbd_dev);
> if (ret) {
> rbd_warn(rbd_dev, "failed to reregister watch: %d", ret);
> - if (ret != -EBLACKLISTED && ret != -ENOENT) {
> + if (ret != -EBLOCKLISTED && ret != -ENOENT) {
> queue_delayed_work(rbd_dev->task_wq,
> &rbd_dev->watch_dwork,
> RBD_RETRY_DELAY);
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index b03dbaa9d345..7b1f3dad576f 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -271,8 +271,8 @@ static int ceph_do_readpage(struct file *filp, struct page *page)
> if (err < 0) {
> SetPageError(page);
> ceph_fscache_readpage_cancel(inode, page);
> - if (err == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (err == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> goto out;
> }
> if (err < PAGE_SIZE)
> @@ -312,8 +312,8 @@ static void finish_read(struct ceph_osd_request *req)
> int i;
>
> dout("finish_read %p req %p rc %d bytes %d\n", inode, req, rc, bytes);
> - if (rc == -EBLACKLISTED)
> - ceph_inode_to_client(inode)->blacklisted = true;
> + if (rc == -EBLOCKLISTED)
> + ceph_inode_to_client(inode)->blocklisted = true;
>
> /* unlock all pages, zeroing any data we didn't read */
> osd_data = osd_req_op_extent_osd_data(req, 0);
> @@ -737,8 +737,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
> end_page_writeback(page);
> return err;
> }
> - if (err == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (err == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> dout("writepage setting page/mapping error %d %p\n",
> err, page);
> mapping_set_error(&inode->i_data, err);
> @@ -801,8 +801,8 @@ static void writepages_finish(struct ceph_osd_request *req)
> if (rc < 0) {
> mapping_set_error(mapping, rc);
> ceph_set_error_write(ci);
> - if (rc == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (rc == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> } else {
> ceph_clear_error_write(ci);
> }
> @@ -2038,16 +2038,16 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
> if (err >= 0 || err == -ENOENT)
> have |= POOL_READ;
> else if (err != -EPERM) {
> - if (err == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (err == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> goto out_unlock;
> }
>
> if (err2 == 0 || err2 == -EEXIST)
> have |= POOL_WRITE;
> else if (err2 != -EPERM) {
> - if (err2 == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (err2 == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> err = err2;
> goto out_unlock;
> }
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index 762a280b7037..209535d5b8d3 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -933,8 +933,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
> ceph_release_page_vector(pages, num_pages);
>
> if (ret < 0) {
> - if (ret == -EBLACKLISTED)
> - fsc->blacklisted = true;
> + if (ret == -EBLOCKLISTED)
> + fsc->blocklisted = true;
> break;
> }
>
> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> index 76d8d9495d1d..bb2d938a17ac 100644
> --- a/fs/ceph/mds_client.c
> +++ b/fs/ceph/mds_client.c
> @@ -3303,7 +3303,7 @@ static void handle_forward(struct ceph_mds_client *mdsc,
> }
>
> static int __decode_session_metadata(void **p, void *end,
> - bool *blacklisted)
> + bool *blocklisted)
> {
> /* map<string,string> */
> u32 n;
> @@ -3318,7 +3318,7 @@ static int __decode_session_metadata(void **p, void *end,
> ceph_decode_32_safe(p, end, len, bad);
> ceph_decode_need(p, end, len, bad);
> if (err_str && strnstr(*p, "blacklisted", len))
BTW, for new MDS shouldn't we check "blocklisted" first ? And then
"blacklisted" ?
https://github.com/ceph/ceph/blob/master/src/mds/Server.cc#L617
BRs
> - *blacklisted = true;
> + *blocklisted = true;
> *p += len;
> }
> return 0;
> @@ -3341,7 +3341,7 @@ static void handle_session(struct ceph_mds_session *session,
> u32 op;
> u64 seq, features = 0;
> int wake = 0;
> - bool blacklisted = false;
> + bool blocklisted = false;
>
> /* decode */
> ceph_decode_need(&p, end, sizeof(*h), bad);
> @@ -3354,7 +3354,7 @@ static void handle_session(struct ceph_mds_session *session,
> if (msg_version >= 3) {
> u32 len;
> /* version >= 2, metadata */
> - if (__decode_session_metadata(&p, end, &blacklisted) < 0)
> + if (__decode_session_metadata(&p, end, &blocklisted) < 0)
> goto bad;
> /* version >= 3, feature bits */
> ceph_decode_32_safe(&p, end, len, bad);
> @@ -3445,8 +3445,8 @@ static void handle_session(struct ceph_mds_session *session,
> session->s_state = CEPH_MDS_SESSION_REJECTED;
> cleanup_session_requests(mdsc, session);
> remove_session_caps(session);
> - if (blacklisted)
> - mdsc->fsc->blacklisted = true;
> + if (blocklisted)
> + mdsc->fsc->blocklisted = true;
> wake = 2; /* for good measure */
> break;
>
> @@ -4367,14 +4367,14 @@ static void maybe_recover_session(struct ceph_mds_client *mdsc)
> if (READ_ONCE(fsc->mount_state) != CEPH_MOUNT_MOUNTED)
> return;
>
> - if (!READ_ONCE(fsc->blacklisted))
> + if (!READ_ONCE(fsc->blocklisted))
> return;
>
> if (fsc->last_auto_reconnect &&
> time_before(jiffies, fsc->last_auto_reconnect + HZ * 60 * 30))
> return;
>
> - pr_info("auto reconnect after blacklisted\n");
> + pr_info("auto reconnect after blocklisted\n");
> fsc->last_auto_reconnect = jiffies;
> ceph_force_reconnect(fsc->sb);
> }
> diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> index b3fc9bb61afc..2516304379d3 100644
> --- a/fs/ceph/super.c
> +++ b/fs/ceph/super.c
> @@ -1241,13 +1241,13 @@ int ceph_force_reconnect(struct super_block *sb)
> * see remove_session_caps_cb() */
> flush_workqueue(fsc->inode_wq);
>
> - /* In case that we were blacklisted. This also reset
> + /* In case that we were blocklisted. This also reset
> * all mon/osd connections */
> ceph_reset_client_addr(fsc->client);
>
> ceph_osdc_clear_abort_err(&fsc->client->osdc);
>
> - fsc->blacklisted = false;
> + fsc->blocklisted = false;
> fsc->mount_state = CEPH_MOUNT_MOUNTED;
>
> if (sb->s_root) {
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index 483a52d281cd..582694899130 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -32,7 +32,7 @@
> #define CEPH_BLOCK_SHIFT 22 /* 4 MB */
> #define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
>
> -#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blacklisted */
> +#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blocklisted */
> #define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
> #define CEPH_MOUNT_OPT_RBYTES (1<<5) /* dir st_bytes = rbytes */
> #define CEPH_MOUNT_OPT_NOASYNCREADDIR (1<<7) /* no dcache readdir */
> @@ -109,7 +109,7 @@ struct ceph_fs_client {
> unsigned long mount_state;
>
> unsigned long last_auto_reconnect;
> - bool blacklisted;
> + bool blocklisted;
>
> bool have_copy_from2;
>
> diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
> index ce4ffeb384d7..b658961156a0 100644
> --- a/include/linux/ceph/mon_client.h
> +++ b/include/linux/ceph/mon_client.h
> @@ -142,7 +142,7 @@ int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
> int ceph_monc_get_version_async(struct ceph_mon_client *monc, const char *what,
> ceph_monc_callback_t cb, u64 private_data);
>
> -int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
> +int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
> struct ceph_entity_addr *client_addr);
>
> extern int ceph_monc_open_session(struct ceph_mon_client *monc);
> diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h
> index 3a518fd0eaad..43a7a1573b51 100644
> --- a/include/linux/ceph/rados.h
> +++ b/include/linux/ceph/rados.h
> @@ -424,7 +424,7 @@ enum {
> };
>
> #define EOLDSNAPC ERESTART /* ORDERSNAP flag set; writer has old snapc*/
> -#define EBLACKLISTED ESHUTDOWN /* blacklisted */
> +#define EBLOCKLISTED ESHUTDOWN /* blocklisted */
>
> /* xattr comparison */
> enum {
> diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
> index d633a0aeaa55..efcdde471278 100644
> --- a/net/ceph/mon_client.c
> +++ b/net/ceph/mon_client.c
> @@ -896,7 +896,7 @@ static void handle_command_ack(struct ceph_mon_client *monc,
> ceph_msg_dump(msg);
> }
>
> -int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
> +int ceph_monc_blocklist_add(struct ceph_mon_client *monc,
> struct ceph_entity_addr *client_addr)
> {
> struct ceph_mon_generic_request *req;
> @@ -936,9 +936,9 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
> ret = wait_generic_request(req);
> if (!ret)
> /*
> - * Make sure we have the osdmap that includes the blacklist
> + * Make sure we have the osdmap that includes the blocklist
> * entry. This is needed to ensure that the OSDs pick up the
> - * new blacklist before processing any future requests from
> + * new blocklist before processing any future requests from
> * this client.
> */
> ret = ceph_wait_for_latest_osdmap(monc->client, 0);
> @@ -947,7 +947,7 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc,
> put_generic_request(req);
> return ret;
> }
> -EXPORT_SYMBOL(ceph_monc_blacklist_add);
> +EXPORT_SYMBOL(ceph_monc_blocklist_add);
>
> /*
> * Resend pending generic requests.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] libceph, rbd, ceph: "blacklist" -> "blocklist"
2020-09-16 2:16 ` Xiubo Li
@ 2020-09-16 7:15 ` Ilya Dryomov
2020-09-16 7:25 ` Xiubo Li
0 siblings, 1 reply; 7+ messages in thread
From: Ilya Dryomov @ 2020-09-16 7:15 UTC (permalink / raw)
To: Xiubo Li; +Cc: Ceph Development
On Wed, Sep 16, 2020 at 4:16 AM Xiubo Li <xiubli@redhat.com> wrote:
>
> On 2020/9/16 4:33, Ilya Dryomov wrote:
> > Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
> > ---
> > Documentation/filesystems/ceph.rst | 6 +++---
> > drivers/block/rbd.c | 8 ++++----
> > fs/ceph/addr.c | 24 ++++++++++++------------
> > fs/ceph/file.c | 4 ++--
> > fs/ceph/mds_client.c | 16 ++++++++--------
> > fs/ceph/super.c | 4 ++--
> > fs/ceph/super.h | 4 ++--
> > include/linux/ceph/mon_client.h | 2 +-
> > include/linux/ceph/rados.h | 2 +-
> > net/ceph/mon_client.c | 8 ++++----
> > 10 files changed, 39 insertions(+), 39 deletions(-)
> >
> > diff --git a/Documentation/filesystems/ceph.rst b/Documentation/filesystems/ceph.rst
> > index 0aa70750df0f..7d2ef4e27273 100644
> > --- a/Documentation/filesystems/ceph.rst
> > +++ b/Documentation/filesystems/ceph.rst
> > @@ -163,14 +163,14 @@ Mount Options
> > to the default VFS implementation if this option is used.
> >
> > recover_session=<no|clean>
> > - Set auto reconnect mode in the case where the client is blacklisted. The
> > + Set auto reconnect mode in the case where the client is blocklisted. The
> > available modes are "no" and "clean". The default is "no".
> >
> > * no: never attempt to reconnect when client detects that it has been
> > - blacklisted. Operations will generally fail after being blacklisted.
> > + blocklisted. Operations will generally fail after being blocklisted.
> >
> > * clean: client reconnects to the ceph cluster automatically when it
> > - detects that it has been blacklisted. During reconnect, client drops
> > + detects that it has been blocklisted. During reconnect, client drops
> > dirty data/metadata, invalidates page caches and writable file handles.
> > After reconnect, file locks become stale because the MDS loses track
> > of them. If an inode contains any stale file locks, read/write on the
> > diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> > index 180587ce606c..d21fecfe3eba 100644
> > --- a/drivers/block/rbd.c
> > +++ b/drivers/block/rbd.c
> > @@ -4010,10 +4010,10 @@ static int rbd_try_lock(struct rbd_device *rbd_dev)
> > rbd_warn(rbd_dev, "breaking header lock owned by %s%llu",
> > ENTITY_NAME(lockers[0].id.name));
> >
> > - ret = ceph_monc_blacklist_add(&client->monc,
> > + ret = ceph_monc_blocklist_add(&client->monc,
> > &lockers[0].info.addr);
> > if (ret) {
> > - rbd_warn(rbd_dev, "blacklist of %s%llu failed: %d",
> > + rbd_warn(rbd_dev, "blocklist of %s%llu failed: %d",
> > ENTITY_NAME(lockers[0].id.name), ret);
> > goto out;
> > }
> > @@ -4077,7 +4077,7 @@ static int rbd_try_acquire_lock(struct rbd_device *rbd_dev)
> > ret = rbd_try_lock(rbd_dev);
> > if (ret < 0) {
> > rbd_warn(rbd_dev, "failed to lock header: %d", ret);
> > - if (ret == -EBLACKLISTED)
> > + if (ret == -EBLOCKLISTED)
> > goto out;
> >
> > ret = 1; /* request lock anyway */
> > @@ -4613,7 +4613,7 @@ static void rbd_reregister_watch(struct work_struct *work)
> > ret = __rbd_register_watch(rbd_dev);
> > if (ret) {
> > rbd_warn(rbd_dev, "failed to reregister watch: %d", ret);
> > - if (ret != -EBLACKLISTED && ret != -ENOENT) {
> > + if (ret != -EBLOCKLISTED && ret != -ENOENT) {
> > queue_delayed_work(rbd_dev->task_wq,
> > &rbd_dev->watch_dwork,
> > RBD_RETRY_DELAY);
> > diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> > index b03dbaa9d345..7b1f3dad576f 100644
> > --- a/fs/ceph/addr.c
> > +++ b/fs/ceph/addr.c
> > @@ -271,8 +271,8 @@ static int ceph_do_readpage(struct file *filp, struct page *page)
> > if (err < 0) {
> > SetPageError(page);
> > ceph_fscache_readpage_cancel(inode, page);
> > - if (err == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (err == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > goto out;
> > }
> > if (err < PAGE_SIZE)
> > @@ -312,8 +312,8 @@ static void finish_read(struct ceph_osd_request *req)
> > int i;
> >
> > dout("finish_read %p req %p rc %d bytes %d\n", inode, req, rc, bytes);
> > - if (rc == -EBLACKLISTED)
> > - ceph_inode_to_client(inode)->blacklisted = true;
> > + if (rc == -EBLOCKLISTED)
> > + ceph_inode_to_client(inode)->blocklisted = true;
> >
> > /* unlock all pages, zeroing any data we didn't read */
> > osd_data = osd_req_op_extent_osd_data(req, 0);
> > @@ -737,8 +737,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
> > end_page_writeback(page);
> > return err;
> > }
> > - if (err == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (err == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > dout("writepage setting page/mapping error %d %p\n",
> > err, page);
> > mapping_set_error(&inode->i_data, err);
> > @@ -801,8 +801,8 @@ static void writepages_finish(struct ceph_osd_request *req)
> > if (rc < 0) {
> > mapping_set_error(mapping, rc);
> > ceph_set_error_write(ci);
> > - if (rc == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (rc == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > } else {
> > ceph_clear_error_write(ci);
> > }
> > @@ -2038,16 +2038,16 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
> > if (err >= 0 || err == -ENOENT)
> > have |= POOL_READ;
> > else if (err != -EPERM) {
> > - if (err == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (err == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > goto out_unlock;
> > }
> >
> > if (err2 == 0 || err2 == -EEXIST)
> > have |= POOL_WRITE;
> > else if (err2 != -EPERM) {
> > - if (err2 == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (err2 == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > err = err2;
> > goto out_unlock;
> > }
> > diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> > index 762a280b7037..209535d5b8d3 100644
> > --- a/fs/ceph/file.c
> > +++ b/fs/ceph/file.c
> > @@ -933,8 +933,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
> > ceph_release_page_vector(pages, num_pages);
> >
> > if (ret < 0) {
> > - if (ret == -EBLACKLISTED)
> > - fsc->blacklisted = true;
> > + if (ret == -EBLOCKLISTED)
> > + fsc->blocklisted = true;
> > break;
> > }
> >
> > diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> > index 76d8d9495d1d..bb2d938a17ac 100644
> > --- a/fs/ceph/mds_client.c
> > +++ b/fs/ceph/mds_client.c
> > @@ -3303,7 +3303,7 @@ static void handle_forward(struct ceph_mds_client *mdsc,
> > }
> >
> > static int __decode_session_metadata(void **p, void *end,
> > - bool *blacklisted)
> > + bool *blocklisted)
> > {
> > /* map<string,string> */
> > u32 n;
> > @@ -3318,7 +3318,7 @@ static int __decode_session_metadata(void **p, void *end,
> > ceph_decode_32_safe(p, end, len, bad);
> > ceph_decode_need(p, end, len, bad);
> > if (err_str && strnstr(*p, "blacklisted", len))
>
> BTW, for new MDS shouldn't we check "blocklisted" first ? And then
> "blacklisted" ?
>
> https://github.com/ceph/ceph/blob/master/src/mds/Server.cc#L617
We could, but it would be fixed in a better way by [1], see [2] for
context.
[1] https://tracker.ceph.com/issues/47450
[2] https://github.com/ceph/ceph/pull/37072
Thanks,
Ilya
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] libceph, rbd, ceph: "blacklist" -> "blocklist"
2020-09-16 7:15 ` Ilya Dryomov
@ 2020-09-16 7:25 ` Xiubo Li
0 siblings, 0 replies; 7+ messages in thread
From: Xiubo Li @ 2020-09-16 7:25 UTC (permalink / raw)
To: Ilya Dryomov; +Cc: Ceph Development
On 2020/9/16 15:15, Ilya Dryomov wrote:
> On Wed, Sep 16, 2020 at 4:16 AM Xiubo Li <xiubli@redhat.com> wrote:
>> On 2020/9/16 4:33, Ilya Dryomov wrote:
>>> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
>>> ---
>>> Documentation/filesystems/ceph.rst | 6 +++---
>>> drivers/block/rbd.c | 8 ++++----
>>> fs/ceph/addr.c | 24 ++++++++++++------------
>>> fs/ceph/file.c | 4 ++--
>>> fs/ceph/mds_client.c | 16 ++++++++--------
>>> fs/ceph/super.c | 4 ++--
>>> fs/ceph/super.h | 4 ++--
>>> include/linux/ceph/mon_client.h | 2 +-
>>> include/linux/ceph/rados.h | 2 +-
>>> net/ceph/mon_client.c | 8 ++++----
>>> 10 files changed, 39 insertions(+), 39 deletions(-)
>>>
>>> diff --git a/Documentation/filesystems/ceph.rst b/Documentation/filesystems/ceph.rst
>>> index 0aa70750df0f..7d2ef4e27273 100644
>>> --- a/Documentation/filesystems/ceph.rst
>>> +++ b/Documentation/filesystems/ceph.rst
>>> @@ -163,14 +163,14 @@ Mount Options
>>> to the default VFS implementation if this option is used.
>>>
>>> recover_session=<no|clean>
>>> - Set auto reconnect mode in the case where the client is blacklisted. The
>>> + Set auto reconnect mode in the case where the client is blocklisted. The
>>> available modes are "no" and "clean". The default is "no".
>>>
>>> * no: never attempt to reconnect when client detects that it has been
>>> - blacklisted. Operations will generally fail after being blacklisted.
>>> + blocklisted. Operations will generally fail after being blocklisted.
>>>
>>> * clean: client reconnects to the ceph cluster automatically when it
>>> - detects that it has been blacklisted. During reconnect, client drops
>>> + detects that it has been blocklisted. During reconnect, client drops
>>> dirty data/metadata, invalidates page caches and writable file handles.
>>> After reconnect, file locks become stale because the MDS loses track
>>> of them. If an inode contains any stale file locks, read/write on the
>>> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
>>> index 180587ce606c..d21fecfe3eba 100644
>>> --- a/drivers/block/rbd.c
>>> +++ b/drivers/block/rbd.c
>>> @@ -4010,10 +4010,10 @@ static int rbd_try_lock(struct rbd_device *rbd_dev)
>>> rbd_warn(rbd_dev, "breaking header lock owned by %s%llu",
>>> ENTITY_NAME(lockers[0].id.name));
>>>
>>> - ret = ceph_monc_blacklist_add(&client->monc,
>>> + ret = ceph_monc_blocklist_add(&client->monc,
>>> &lockers[0].info.addr);
>>> if (ret) {
>>> - rbd_warn(rbd_dev, "blacklist of %s%llu failed: %d",
>>> + rbd_warn(rbd_dev, "blocklist of %s%llu failed: %d",
>>> ENTITY_NAME(lockers[0].id.name), ret);
>>> goto out;
>>> }
>>> @@ -4077,7 +4077,7 @@ static int rbd_try_acquire_lock(struct rbd_device *rbd_dev)
>>> ret = rbd_try_lock(rbd_dev);
>>> if (ret < 0) {
>>> rbd_warn(rbd_dev, "failed to lock header: %d", ret);
>>> - if (ret == -EBLACKLISTED)
>>> + if (ret == -EBLOCKLISTED)
>>> goto out;
>>>
>>> ret = 1; /* request lock anyway */
>>> @@ -4613,7 +4613,7 @@ static void rbd_reregister_watch(struct work_struct *work)
>>> ret = __rbd_register_watch(rbd_dev);
>>> if (ret) {
>>> rbd_warn(rbd_dev, "failed to reregister watch: %d", ret);
>>> - if (ret != -EBLACKLISTED && ret != -ENOENT) {
>>> + if (ret != -EBLOCKLISTED && ret != -ENOENT) {
>>> queue_delayed_work(rbd_dev->task_wq,
>>> &rbd_dev->watch_dwork,
>>> RBD_RETRY_DELAY);
>>> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
>>> index b03dbaa9d345..7b1f3dad576f 100644
>>> --- a/fs/ceph/addr.c
>>> +++ b/fs/ceph/addr.c
>>> @@ -271,8 +271,8 @@ static int ceph_do_readpage(struct file *filp, struct page *page)
>>> if (err < 0) {
>>> SetPageError(page);
>>> ceph_fscache_readpage_cancel(inode, page);
>>> - if (err == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (err == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> goto out;
>>> }
>>> if (err < PAGE_SIZE)
>>> @@ -312,8 +312,8 @@ static void finish_read(struct ceph_osd_request *req)
>>> int i;
>>>
>>> dout("finish_read %p req %p rc %d bytes %d\n", inode, req, rc, bytes);
>>> - if (rc == -EBLACKLISTED)
>>> - ceph_inode_to_client(inode)->blacklisted = true;
>>> + if (rc == -EBLOCKLISTED)
>>> + ceph_inode_to_client(inode)->blocklisted = true;
>>>
>>> /* unlock all pages, zeroing any data we didn't read */
>>> osd_data = osd_req_op_extent_osd_data(req, 0);
>>> @@ -737,8 +737,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
>>> end_page_writeback(page);
>>> return err;
>>> }
>>> - if (err == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (err == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> dout("writepage setting page/mapping error %d %p\n",
>>> err, page);
>>> mapping_set_error(&inode->i_data, err);
>>> @@ -801,8 +801,8 @@ static void writepages_finish(struct ceph_osd_request *req)
>>> if (rc < 0) {
>>> mapping_set_error(mapping, rc);
>>> ceph_set_error_write(ci);
>>> - if (rc == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (rc == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> } else {
>>> ceph_clear_error_write(ci);
>>> }
>>> @@ -2038,16 +2038,16 @@ static int __ceph_pool_perm_get(struct ceph_inode_info *ci,
>>> if (err >= 0 || err == -ENOENT)
>>> have |= POOL_READ;
>>> else if (err != -EPERM) {
>>> - if (err == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (err == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> goto out_unlock;
>>> }
>>>
>>> if (err2 == 0 || err2 == -EEXIST)
>>> have |= POOL_WRITE;
>>> else if (err2 != -EPERM) {
>>> - if (err2 == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (err2 == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> err = err2;
>>> goto out_unlock;
>>> }
>>> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
>>> index 762a280b7037..209535d5b8d3 100644
>>> --- a/fs/ceph/file.c
>>> +++ b/fs/ceph/file.c
>>> @@ -933,8 +933,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
>>> ceph_release_page_vector(pages, num_pages);
>>>
>>> if (ret < 0) {
>>> - if (ret == -EBLACKLISTED)
>>> - fsc->blacklisted = true;
>>> + if (ret == -EBLOCKLISTED)
>>> + fsc->blocklisted = true;
>>> break;
>>> }
>>>
>>> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
>>> index 76d8d9495d1d..bb2d938a17ac 100644
>>> --- a/fs/ceph/mds_client.c
>>> +++ b/fs/ceph/mds_client.c
>>> @@ -3303,7 +3303,7 @@ static void handle_forward(struct ceph_mds_client *mdsc,
>>> }
>>>
>>> static int __decode_session_metadata(void **p, void *end,
>>> - bool *blacklisted)
>>> + bool *blocklisted)
>>> {
>>> /* map<string,string> */
>>> u32 n;
>>> @@ -3318,7 +3318,7 @@ static int __decode_session_metadata(void **p, void *end,
>>> ceph_decode_32_safe(p, end, len, bad);
>>> ceph_decode_need(p, end, len, bad);
>>> if (err_str && strnstr(*p, "blacklisted", len))
>> BTW, for new MDS shouldn't we check "blocklisted" first ? And then
>> "blacklisted" ?
>>
>> https://github.com/ceph/ceph/blob/master/src/mds/Server.cc#L617
> We could, but it would be fixed in a better way by [1], see [2] for
> context.
>
> [1] https://tracker.ceph.com/issues/47450
> [2] https://github.com/ceph/ceph/pull/37072
Yeah, that fix is cool.
Thanks
> Thanks,
>
> Ilya
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-09-16 7:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 20:33 [PATCH 0/3] libceph, rbd, ceph: "blacklist" -> "blocklist" Ilya Dryomov
2020-09-15 20:33 ` [PATCH 1/3] " Ilya Dryomov
2020-09-16 2:16 ` Xiubo Li
2020-09-16 7:15 ` Ilya Dryomov
2020-09-16 7:25 ` Xiubo Li
2020-09-15 20:33 ` [PATCH 2/3] libceph: switch to the new "osd blocklist add" command Ilya Dryomov
2020-09-15 20:33 ` [PATCH 3/3] ceph: add a note explaining session reject error string Ilya Dryomov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).