ceph: more accurate statfs
authorDouglas Fuller <dfuller@redhat.com>
Wed, 16 Aug 2017 14:19:27 +0000 (10:19 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:49 +0000 (19:56 +0200)
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>
Reviewed-by: Yan, Zheng <zyan@redhat.com>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/super.c
include/linux/ceph/ceph_fs.h
include/linux/ceph/mon_client.h
net/ceph/mon_client.c

index 1deb8810d7c7666db24352b46cb8de4b379be618..324d29ecbe0bd278d6d0a90f0365c555197d2b25 100644 (file)
@@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
        struct ceph_statfs st;
        u64 fsid;
        int err;
+       u64 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;
 
index d1642a4b4c5ed4fe9661d28b25f99f14dbd858af..b422170b791abeabb83d15463d05ba6401828b3c 100644 (file)
@@ -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 {
index d5a3ecea578d3e5f34eb1efba9d027811cc68557..0fa990bf867a1ca047e5ae71190afe908061f458 100644 (file)
@@ -133,8 +133,8 @@ 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,
-                              struct ceph_statfs *buf);
+int ceph_monc_do_statfs(struct ceph_mon_client *monc, u64 data_pool,
+                       struct ceph_statfs *buf);
 
 int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
                          u64 *newest);
index 875675765531361fffa503707a9a98e4596664dd..63edc6e5f0269f21275d6b7be5673e41ba5a9177 100644 (file)
@@ -676,7 +676,8 @@ bad:
 /*
  * 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, u64 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 = 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);
+       h->data_pool = cpu_to_le64(data_pool);
        send_generic_request(monc, req);
        mutex_unlock(&monc->mutex);