Re: [PATCH 2/2] ceph: do not release the global snaprealm until unmounting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2/22/22 6:22 PM, Jeff Layton wrote:
On Tue, 2022-02-22 at 14:34 +0800, xiubli@xxxxxxxxxx wrote:
From: Xiubo Li <xiubli@xxxxxxxxxx>

The global snaprealm would be created and then destroyed immediately
every time when updating it.

Does this cause some sort of issue, or is it just inefficient?

Just inefficient.


URL: https://tracker.ceph.com/issues/54362
Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx>
---
  fs/ceph/mds_client.c         |  2 +-
  fs/ceph/snap.c               | 13 +++++++++++--
  fs/ceph/super.h              |  2 +-
  include/linux/ceph/ceph_fs.h |  3 ++-
  4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 65bd43d4cafc..325f8071a324 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -4866,7 +4866,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
  	mutex_unlock(&mdsc->mutex);
ceph_cleanup_snapid_map(mdsc);
-	ceph_cleanup_empty_realms(mdsc);
+        ceph_cleanup_global_and_empty_realms(mdsc);
Please use tab indent.

Sure, will fix it.

Thanks

- Xiubo


cancel_work_sync(&mdsc->cap_reclaim_work);
  	cancel_delayed_work_sync(&mdsc->delayed_work); /* cancel timer */
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 66a1a92cf579..cc9097c27052 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -121,7 +121,11 @@ static struct ceph_snap_realm *ceph_create_snap_realm(
  	if (!realm)
  		return ERR_PTR(-ENOMEM);
- atomic_set(&realm->nref, 1); /* for caller */
+	/* Do not release the global dummy snaprealm until unmouting */
+	if (ino == CEPH_INO_GLOBAL_SNAPREALM)
+		atomic_set(&realm->nref, 2);
+	else
+		atomic_set(&realm->nref, 1);
  	realm->ino = ino;
  	INIT_LIST_HEAD(&realm->children);
  	INIT_LIST_HEAD(&realm->child_item);
@@ -261,9 +265,14 @@ static void __cleanup_empty_realms(struct ceph_mds_client *mdsc)
  	spin_unlock(&mdsc->snap_empty_lock);
  }
-void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc)
+void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc)
  {
+	struct ceph_snap_realm *global_realm;
+
  	down_write(&mdsc->snap_rwsem);
+	global_realm = __lookup_snap_realm(mdsc, CEPH_INO_GLOBAL_SNAPREALM);
+	if (global_realm)
+		ceph_put_snap_realm(mdsc, global_realm);
  	__cleanup_empty_realms(mdsc);
  	up_write(&mdsc->snap_rwsem);
  }
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index baac800a6d11..250aefecd628 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -942,7 +942,7 @@ extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
  			     struct ceph_msg *msg);
  extern int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
  				  struct ceph_cap_snap *capsnap);
-extern void ceph_cleanup_empty_realms(struct ceph_mds_client *mdsc);
+extern void ceph_cleanup_global_and_empty_realms(struct ceph_mds_client *mdsc);
extern struct ceph_snapid_map *ceph_get_snapid_map(struct ceph_mds_client *mdsc,
  						   u64 snap);
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h
index f14f9bc290e6..86bf82dbd8b8 100644
--- a/include/linux/ceph/ceph_fs.h
+++ b/include/linux/ceph/ceph_fs.h
@@ -28,7 +28,8 @@
#define CEPH_INO_ROOT 1
-#define CEPH_INO_CEPH   2       /* hidden .ceph dir */
+#define CEPH_INO_CEPH   2            /* hidden .ceph dir */
+#define CEPH_INO_GLOBAL_SNAPREALM  3 /* global dummy snaprealm */
/* arbitrary limit on max # of monitors (cluster of 3 is typical) */
  #define CEPH_MAX_MON   31




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux