File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -4838,7 +4838,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc)
48384838 mutex_unlock (& mdsc -> mutex );
48394839
48404840 ceph_cleanup_snapid_map (mdsc );
4841- ceph_cleanup_empty_realms (mdsc );
4841+ ceph_cleanup_global_and_empty_realms (mdsc );
48424842
48434843 cancel_work_sync (& mdsc -> cap_reclaim_work );
48444844 cancel_delayed_work_sync (& mdsc -> delayed_work ); /* cancel timer */
Original file line number Diff line number Diff line change @@ -121,7 +121,11 @@ static struct ceph_snap_realm *ceph_create_snap_realm(
121121 if (!realm )
122122 return ERR_PTR (- ENOMEM );
123123
124- atomic_set (& realm -> nref , 1 ); /* for caller */
124+ /* Do not release the global dummy snaprealm until unmouting */
125+ if (ino == CEPH_INO_GLOBAL_SNAPREALM )
126+ atomic_set (& realm -> nref , 2 );
127+ else
128+ atomic_set (& realm -> nref , 1 );
125129 realm -> ino = ino ;
126130 INIT_LIST_HEAD (& realm -> children );
127131 INIT_LIST_HEAD (& realm -> child_item );
@@ -261,9 +265,14 @@ static void __cleanup_empty_realms(struct ceph_mds_client *mdsc)
261265 spin_unlock (& mdsc -> snap_empty_lock );
262266}
263267
264- void ceph_cleanup_empty_realms (struct ceph_mds_client * mdsc )
268+ void ceph_cleanup_global_and_empty_realms (struct ceph_mds_client * mdsc )
265269{
270+ struct ceph_snap_realm * global_realm ;
271+
266272 down_write (& mdsc -> snap_rwsem );
273+ global_realm = __lookup_snap_realm (mdsc , CEPH_INO_GLOBAL_SNAPREALM );
274+ if (global_realm )
275+ ceph_put_snap_realm (mdsc , global_realm );
267276 __cleanup_empty_realms (mdsc );
268277 up_write (& mdsc -> snap_rwsem );
269278}
Original file line number Diff line number Diff line change @@ -940,7 +940,7 @@ extern void ceph_handle_snap(struct ceph_mds_client *mdsc,
940940 struct ceph_msg * msg );
941941extern int __ceph_finish_cap_snap (struct ceph_inode_info * ci ,
942942 struct ceph_cap_snap * capsnap );
943- extern void ceph_cleanup_empty_realms (struct ceph_mds_client * mdsc );
943+ extern void ceph_cleanup_global_and_empty_realms (struct ceph_mds_client * mdsc );
944944
945945extern struct ceph_snapid_map * ceph_get_snapid_map (struct ceph_mds_client * mdsc ,
946946 u64 snap );
Original file line number Diff line number Diff line change 2828
2929
3030#define CEPH_INO_ROOT 1
31- #define CEPH_INO_CEPH 2 /* hidden .ceph dir */
31+ #define CEPH_INO_CEPH 2 /* hidden .ceph dir */
32+ #define CEPH_INO_GLOBAL_SNAPREALM 3 /* global dummy snaprealm */
3233
3334/* arbitrary limit on max # of monitors (cluster of 3 is typical) */
3435#define CEPH_MAX_MON 31
You can’t perform that action at this time.
0 commit comments