Archived
14
0
Fork 0

drbd: mod_req has now a return value

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
Philipp Reisner 2010-06-09 14:07:43 +02:00
parent 288f422ec1
commit 2a80699f80
2 changed files with 16 additions and 6 deletions

View file

@ -382,10 +382,11 @@ out_conflict:
* and it enforces that we have to think in a very structured manner * 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 ... * 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 bio_and_error *m)
{ {
struct drbd_conf *mdev = req->mdev; struct drbd_conf *mdev = req->mdev;
int rv = 0;
m->bio = NULL; m->bio = NULL;
switch (what) { switch (what) {
@ -657,6 +658,8 @@ void __req_mod(struct drbd_request *req, enum drbd_req_event what,
_req_may_be_done(req, m); _req_may_be_done(req, m);
break; break;
}; };
return rv;
} }
/* we may do a local read if: /* we may do a local read if:

View file

@ -297,36 +297,43 @@ struct bio_and_error {
extern void _req_may_be_done(struct drbd_request *req, extern void _req_may_be_done(struct drbd_request *req,
struct bio_and_error *m); 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); struct bio_and_error *m);
extern void complete_master_bio(struct drbd_conf *mdev, extern void complete_master_bio(struct drbd_conf *mdev,
struct bio_and_error *m); struct bio_and_error *m);
/* use this if you don't want to deal with calling complete_master_bio() /* 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. */ * 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 drbd_conf *mdev = req->mdev;
struct bio_and_error m; struct bio_and_error m;
int rv;
/* __req_mod possibly frees req, do not touch req after that! */ /* __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) if (m.bio)
complete_master_bio(mdev, &m); complete_master_bio(mdev, &m);
return rv;
} }
/* completion of master bio is outside of spinlock. /* completion of master bio is outside of spinlock.
* If you need it irqsave, do it your self! */ * 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) enum drbd_req_event what)
{ {
struct drbd_conf *mdev = req->mdev; struct drbd_conf *mdev = req->mdev;
struct bio_and_error m; struct bio_and_error m;
int rv;
spin_lock_irq(&mdev->req_lock); spin_lock_irq(&mdev->req_lock);
__req_mod(req, what, &m); rv = __req_mod(req, what, &m);
spin_unlock_irq(&mdev->req_lock); spin_unlock_irq(&mdev->req_lock);
if (m.bio) if (m.bio)
complete_master_bio(mdev, &m); complete_master_bio(mdev, &m);
return rv;
} }
#endif #endif