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? > 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. > > 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 -- Jeff Layton <jlayton@xxxxxxxxxx>