Commit a52ff901 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ceph-for-6.10-rc8' of https://github.com/ceph/ceph-client

Pull ceph fixes from Ilya Dryomov:
 "A fix for a possible use-after-free following "rbd unmap" or "umount"
  marked for stable and two kernel-doc fixups"

* tag 'ceph-for-6.10-rc8' of https://github.com/ceph/ceph-client:
  libceph: fix crush_choose_firstn() kernel-doc warnings
  libceph: suppress crush_choose_indep() kernel-doc warnings
  libceph: fix race between delayed_work() and ceph_monc_stop()
parents ac6a9e07 359bc01d
...@@ -429,7 +429,10 @@ static int is_out(const struct crush_map *map, ...@@ -429,7 +429,10 @@ static int is_out(const struct crush_map *map,
/** /**
* crush_choose_firstn - choose numrep distinct items of given type * crush_choose_firstn - choose numrep distinct items of given type
* @map: the crush_map * @map: the crush_map
* @work: working space initialized by crush_init_workspace()
* @bucket: the bucket we are choose an item from * @bucket: the bucket we are choose an item from
* @weight: weight vector (for map leaves)
* @weight_max: size of weight vector
* @x: crush input value * @x: crush input value
* @numrep: the number of items to choose * @numrep: the number of items to choose
* @type: the type of item to choose * @type: the type of item to choose
...@@ -445,6 +448,7 @@ static int is_out(const struct crush_map *map, ...@@ -445,6 +448,7 @@ static int is_out(const struct crush_map *map,
* @vary_r: pass r to recursive calls * @vary_r: pass r to recursive calls
* @out2: second output vector for leaf items (if @recurse_to_leaf) * @out2: second output vector for leaf items (if @recurse_to_leaf)
* @parent_r: r value passed from the parent * @parent_r: r value passed from the parent
* @choose_args: weights and ids for each known bucket
*/ */
static int crush_choose_firstn(const struct crush_map *map, static int crush_choose_firstn(const struct crush_map *map,
struct crush_work *work, struct crush_work *work,
...@@ -636,9 +640,8 @@ static int crush_choose_firstn(const struct crush_map *map, ...@@ -636,9 +640,8 @@ static int crush_choose_firstn(const struct crush_map *map,
} }
/** /*
* crush_choose_indep: alternative breadth-first positionally stable mapping * crush_choose_indep: alternative breadth-first positionally stable mapping
*
*/ */
static void crush_choose_indep(const struct crush_map *map, static void crush_choose_indep(const struct crush_map *map,
struct crush_work *work, struct crush_work *work,
......
...@@ -1085,13 +1085,19 @@ static void delayed_work(struct work_struct *work) ...@@ -1085,13 +1085,19 @@ static void delayed_work(struct work_struct *work)
struct ceph_mon_client *monc = struct ceph_mon_client *monc =
container_of(work, struct ceph_mon_client, delayed_work.work); container_of(work, struct ceph_mon_client, delayed_work.work);
dout("monc delayed_work\n");
mutex_lock(&monc->mutex); mutex_lock(&monc->mutex);
dout("%s mon%d\n", __func__, monc->cur_mon);
if (monc->cur_mon < 0) {
goto out;
}
if (monc->hunting) { if (monc->hunting) {
dout("%s continuing hunt\n", __func__); dout("%s continuing hunt\n", __func__);
reopen_session(monc); reopen_session(monc);
} else { } else {
int is_auth = ceph_auth_is_authenticated(monc->auth); int is_auth = ceph_auth_is_authenticated(monc->auth);
dout("%s is_authed %d\n", __func__, is_auth);
if (ceph_con_keepalive_expired(&monc->con, if (ceph_con_keepalive_expired(&monc->con,
CEPH_MONC_PING_TIMEOUT)) { CEPH_MONC_PING_TIMEOUT)) {
dout("monc keepalive timeout\n"); dout("monc keepalive timeout\n");
...@@ -1116,6 +1122,8 @@ static void delayed_work(struct work_struct *work) ...@@ -1116,6 +1122,8 @@ static void delayed_work(struct work_struct *work)
} }
} }
__schedule_delayed(monc); __schedule_delayed(monc);
out:
mutex_unlock(&monc->mutex); mutex_unlock(&monc->mutex);
} }
...@@ -1232,13 +1240,15 @@ EXPORT_SYMBOL(ceph_monc_init); ...@@ -1232,13 +1240,15 @@ EXPORT_SYMBOL(ceph_monc_init);
void ceph_monc_stop(struct ceph_mon_client *monc) void ceph_monc_stop(struct ceph_mon_client *monc)
{ {
dout("stop\n"); dout("stop\n");
cancel_delayed_work_sync(&monc->delayed_work);
mutex_lock(&monc->mutex); mutex_lock(&monc->mutex);
__close_session(monc); __close_session(monc);
monc->hunting = false;
monc->cur_mon = -1; monc->cur_mon = -1;
mutex_unlock(&monc->mutex); mutex_unlock(&monc->mutex);
cancel_delayed_work_sync(&monc->delayed_work);
/* /*
* flush msgr queue before we destroy ourselves to ensure that: * flush msgr queue before we destroy ourselves to ensure that:
* - any work that references our embedded con is finished. * - any work that references our embedded con is finished.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment