* Re: [PATCH 1/1] fs/ceph: More accurate statfs
2017-08-15 18:54 ` [PATCH 1/1] fs/ceph: " Douglas Fuller
@ 2017-08-16 11:32 ` Yan, Zheng
2017-08-16 12:45 ` Ilya Dryomov
1 sibling, 0 replies; 4+ messages in thread
From: Yan, Zheng @ 2017-08-16 11:32 UTC (permalink / raw)
To: Douglas Fuller; +Cc: ceph-devel
On Wed, Aug 16, 2017 at 2:54 AM, Douglas Fuller <dfuller@redhat.com> wrote:
> Improve accuracy of statfs reporting for Ceph filesystems comprising
> exactly one data pool. In this case, the Ceph monitor can now report
> the space usage for the single data pool instead of the global data
> for the entire Ceph cluster. Include support for this message in
> mon_client and leverage it in ceph/super.
>
> Signed-off-by: Douglas Fuller <dfuller@redhat.com>
> ---
> fs/ceph/super.c | 9 ++++++++-
> include/linux/ceph/ceph_fs.h | 2 ++
> include/linux/ceph/mon_client.h | 2 +-
> net/ceph/mon_client.c | 6 +++++-
> 4 files changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> index 1deb8810d7c7..75facee8b6d1 100644
> --- a/fs/ceph/super.c
> +++ b/fs/ceph/super.c
> @@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
> struct ceph_statfs st;
> u64 fsid;
> int err;
> + __le64 data_pool;
> +
> + if (fsc->mdsc->mdsmap->m_num_data_pg_pools == 1) {
> + data_pool = fsc->mdsc->mdsmap->m_data_pg_pools[0];
> + } else {
> + data_pool = CEPH_NOPOOL;
> + }
>
> dout("statfs\n");
> - err = ceph_monc_do_statfs(&fsc->client->monc, &st);
> + err = ceph_monc_do_statfs(&fsc->client->monc, data_pool, &st);
> if (err < 0)
> return err;
>
> diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
> index d1642a4b4c5e..b422170b791a 100644
> --- a/include/linux/ceph/ceph_fs.h
> +++ b/include/linux/ceph/ceph_fs.h
> @@ -167,6 +167,8 @@ struct ceph_mon_request_header {
> struct ceph_mon_statfs {
> struct ceph_mon_request_header monhdr;
> struct ceph_fsid fsid;
> + __u8 contains_data_pool;
> + __le64 data_pool;
> } __attribute__ ((packed));
>
> struct ceph_statfs {
> diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
> index d5a3ecea578d..bd4650ab1248 100644
> --- a/include/linux/ceph/mon_client.h
> +++ b/include/linux/ceph/mon_client.h
> @@ -133,7 +133,7 @@ void ceph_monc_renew_subs(struct ceph_mon_client *monc);
> extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
> unsigned long timeout);
>
> -extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
> +extern int ceph_monc_do_statfs(struct ceph_mon_client *monc, __le64 data_pool,
> struct ceph_statfs *buf);
>
> int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
> diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
> index 875675765531..5ef21986074e 100644
> --- a/net/ceph/mon_client.c
> +++ b/net/ceph/mon_client.c
> @@ -676,7 +676,8 @@ static void handle_statfs_reply(struct ceph_mon_client *monc,
> /*
> * Do a synchronous statfs().
> */
> -int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> +int ceph_monc_do_statfs(struct ceph_mon_client *monc, __le64 data_pool,
> + struct ceph_statfs *buf)
> {
> struct ceph_mon_generic_request *req;
> struct ceph_mon_statfs *h;
> @@ -696,6 +697,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> goto out;
>
> req->u.st = buf;
> + req->request->hdr.version = 2;
>
> mutex_lock(&monc->mutex);
> register_generic_request(req);
> @@ -705,6 +707,8 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> h->monhdr.session_mon = cpu_to_le16(-1);
> h->monhdr.session_mon_tid = 0;
> h->fsid = monc->monmap->fsid;
> + h->contains_data_pool = (data_pool != CEPH_NOPOOL);
> + h->data_pool = data_pool;
> send_generic_request(monc, req);
> mutex_unlock(&monc->mutex);
>
> --
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
> 2.11.0 (Apple Git-81)
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 1/1] fs/ceph: More accurate statfs
2017-08-15 18:54 ` [PATCH 1/1] fs/ceph: " Douglas Fuller
2017-08-16 11:32 ` Yan, Zheng
@ 2017-08-16 12:45 ` Ilya Dryomov
1 sibling, 0 replies; 4+ messages in thread
From: Ilya Dryomov @ 2017-08-16 12:45 UTC (permalink / raw)
To: Douglas Fuller; +Cc: Ceph Development
On Tue, Aug 15, 2017 at 8:54 PM, Douglas Fuller <dfuller@redhat.com> wrote:
> Improve accuracy of statfs reporting for Ceph filesystems comprising
> exactly one data pool. In this case, the Ceph monitor can now report
> the space usage for the single data pool instead of the global data
> for the entire Ceph cluster. Include support for this message in
> mon_client and leverage it in ceph/super.
>
> Signed-off-by: Douglas Fuller <dfuller@redhat.com>
> ---
> fs/ceph/super.c | 9 ++++++++-
> include/linux/ceph/ceph_fs.h | 2 ++
> include/linux/ceph/mon_client.h | 2 +-
> net/ceph/mon_client.c | 6 +++++-
> 4 files changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> index 1deb8810d7c7..75facee8b6d1 100644
> --- a/fs/ceph/super.c
> +++ b/fs/ceph/super.c
> @@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
> struct ceph_statfs st;
> u64 fsid;
> int err;
> + __le64 data_pool;
> +
> + if (fsc->mdsc->mdsmap->m_num_data_pg_pools == 1) {
> + data_pool = fsc->mdsc->mdsmap->m_data_pg_pools[0];
> + } else {
> + data_pool = CEPH_NOPOOL;
> + }
Missing cpu_to_le64() here -- data_pool is __le64, while CEPH_NOPOOL
and m_data_pg_pools are in CPU order.
>
> dout("statfs\n");
> - err = ceph_monc_do_statfs(&fsc->client->monc, &st);
> + err = ceph_monc_do_statfs(&fsc->client->monc, data_pool, &st);
> if (err < 0)
> return err;
>
> diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
> index d1642a4b4c5e..b422170b791a 100644
> --- a/include/linux/ceph/ceph_fs.h
> +++ b/include/linux/ceph/ceph_fs.h
> @@ -167,6 +167,8 @@ struct ceph_mon_request_header {
> struct ceph_mon_statfs {
> struct ceph_mon_request_header monhdr;
> struct ceph_fsid fsid;
> + __u8 contains_data_pool;
> + __le64 data_pool;
> } __attribute__ ((packed));
>
> struct ceph_statfs {
> diff --git a/include/linux/ceph/mon_client.h b/include/linux/ceph/mon_client.h
> index d5a3ecea578d..bd4650ab1248 100644
> --- a/include/linux/ceph/mon_client.h
> +++ b/include/linux/ceph/mon_client.h
> @@ -133,7 +133,7 @@ void ceph_monc_renew_subs(struct ceph_mon_client *monc);
> extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
> unsigned long timeout);
>
> -extern int ceph_monc_do_statfs(struct ceph_mon_client *monc,
> +extern int ceph_monc_do_statfs(struct ceph_mon_client *monc, __le64 data_pool,
> struct ceph_statfs *buf);
>
> int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
> diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
> index 875675765531..5ef21986074e 100644
> --- a/net/ceph/mon_client.c
> +++ b/net/ceph/mon_client.c
> @@ -676,7 +676,8 @@ static void handle_statfs_reply(struct ceph_mon_client *monc,
> /*
> * Do a synchronous statfs().
> */
> -int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> +int ceph_monc_do_statfs(struct ceph_mon_client *monc, __le64 data_pool,
> + struct ceph_statfs *buf)
> {
> struct ceph_mon_generic_request *req;
> struct ceph_mon_statfs *h;
> @@ -696,6 +697,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> goto out;
>
> req->u.st = buf;
> + req->request->hdr.version = 2;
cpu_to_le16(2)
>
> mutex_lock(&monc->mutex);
> register_generic_request(req);
> @@ -705,6 +707,8 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
> h->monhdr.session_mon = cpu_to_le16(-1);
> h->monhdr.session_mon_tid = 0;
> h->fsid = monc->monmap->fsid;
> + h->contains_data_pool = (data_pool != CEPH_NOPOOL);
... and again here, but the other way around.
> + h->data_pool = data_pool;
I'd make ceph_monc_do_statfs() take u64 and do cpu_to_le64() here, in
one place.
Thanks,
Ilya
^ permalink raw reply [flat|nested] 4+ messages in thread