Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a80699f authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: mod_req has now a return value

parent 288f422e
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -382,10 +382,11 @@ static int _req_conflicts(struct drbd_request *req)
 *  and it enforces that we have to think in a very structured manner
 *  about the "events" that may happen to a request during its life time ...
 */
void __req_mod(struct drbd_request *req, enum drbd_req_event what,
int __req_mod(struct drbd_request *req, enum drbd_req_event what,
		struct bio_and_error *m)
{
	struct drbd_conf *mdev = req->mdev;
	int rv = 0;
	m->bio = NULL;

	switch (what) {
@@ -657,6 +658,8 @@ void __req_mod(struct drbd_request *req, enum drbd_req_event what,
		_req_may_be_done(req, m);
		break;
	};

	return rv;
}

/* we may do a local read if:
+12 −5
Original line number Diff line number Diff line
@@ -297,36 +297,43 @@ struct bio_and_error {

extern void _req_may_be_done(struct drbd_request *req,
		struct bio_and_error *m);
extern void __req_mod(struct drbd_request *req, enum drbd_req_event what,
extern int __req_mod(struct drbd_request *req, enum drbd_req_event what,
		struct bio_and_error *m);
extern void complete_master_bio(struct drbd_conf *mdev,
		struct bio_and_error *m);

/* use this if you don't want to deal with calling complete_master_bio()
 * outside the spinlock, e.g. when walking some list on cleanup. */
static inline void _req_mod(struct drbd_request *req, enum drbd_req_event what)
static inline int _req_mod(struct drbd_request *req, enum drbd_req_event what)
{
	struct drbd_conf *mdev = req->mdev;
	struct bio_and_error m;
	int rv;

	/* __req_mod possibly frees req, do not touch req after that! */
	__req_mod(req, what, &m);
	rv = __req_mod(req, what, &m);
	if (m.bio)
		complete_master_bio(mdev, &m);

	return rv;
}

/* completion of master bio is outside of spinlock.
 * If you need it irqsave, do it your self! */
static inline void req_mod(struct drbd_request *req,
static inline int req_mod(struct drbd_request *req,
		enum drbd_req_event what)
{
	struct drbd_conf *mdev = req->mdev;
	struct bio_and_error m;
	int rv;

	spin_lock_irq(&mdev->req_lock);
	__req_mod(req, what, &m);
	rv = __req_mod(req, what, &m);
	spin_unlock_irq(&mdev->req_lock);

	if (m.bio)
		complete_master_bio(mdev, &m);

	return rv;
}
#endif