Skip to content

Commit e75437f

Browse files
committed
Merge branch 'for-3.18/drivers' of git://git.kernel.dk/linux-block
Pull block layer driver update from Jens Axboe: "This is the block driver pull request for 3.18. Not a lot in there this round, and nothing earth shattering. - A round of drbd fixes from the linbit team, and an improvement in asender performance. - Removal of deprecated (and unused) IRQF_DISABLED flag in rsxx and hd from Michael Opdenacker. - Disable entropy collection from flash devices by default, from Mike Snitzer. - A small collection of xen blkfront/back fixes from Roger Pau Monné and Vitaly Kuznetsov" * 'for-3.18/drivers' of git://git.kernel.dk/linux-block: block: disable entropy contributions for nonrot devices xen, blkfront: factor out flush-related checks from do_blkif_request() xen-blkback: fix leak on grant map error path xen/blkback: unmap all persistent grants when frontend gets disconnected rsxx: Remove deprecated IRQF_DISABLED block: hd: remove deprecated IRQF_DISABLED drbd: use RB_DECLARE_CALLBACKS() to define augment callbacks drbd: compute the end before rb_insert_augmented() drbd: Add missing newline in resync progress display in /proc/drbd drbd: reduce lock contention in drbd_worker drbd: Improve asender performance drbd: Get rid of the WORK_PENDING macro drbd: Get rid of the __no_warn and __cond_lock macros drbd: Avoid inconsistent locking warning drbd: Remove superfluous newline from "resync_extents" debugfs entry. drbd: Use consistent names for all the bi_end_io callbacks drbd: Use better variable names
2 parents d3dc366 + b277da0 commit e75437f

30 files changed

+132
-147
lines changed

drivers/block/drbd/drbd_actlog.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,14 @@ static int _drbd_md_sync_page_io(struct drbd_device *device,
158158
if (bio_add_page(bio, device->md_io.page, size, 0) != size)
159159
goto out;
160160
bio->bi_private = device;
161-
bio->bi_end_io = drbd_md_io_complete;
161+
bio->bi_end_io = drbd_md_endio;
162162
bio->bi_rw = rw;
163163

164164
if (!(rw & WRITE) && device->state.disk == D_DISKLESS && device->ldev == NULL)
165165
/* special case, drbd_md_read() during drbd_adm_attach(): no get_ldev */
166166
;
167167
else if (!get_ldev_if_state(device, D_ATTACHING)) {
168-
/* Corresponding put_ldev in drbd_md_io_complete() */
168+
/* Corresponding put_ldev in drbd_md_endio() */
169169
drbd_err(device, "ASSERT FAILED: get_ldev_if_state() == 1 in _drbd_md_sync_page_io()\n");
170170
err = -ENODEV;
171171
goto out;

drivers/block/drbd/drbd_bitmap.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ static void drbd_bm_aio_ctx_destroy(struct kref *kref)
941941
}
942942

943943
/* bv_page may be a copy, or may be the original */
944-
static void bm_async_io_complete(struct bio *bio, int error)
944+
static void drbd_bm_endio(struct bio *bio, int error)
945945
{
946946
struct drbd_bm_aio_ctx *ctx = bio->bi_private;
947947
struct drbd_device *device = ctx->device;
@@ -1027,7 +1027,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho
10271027
* according to api. Do we want to assert that? */
10281028
bio_add_page(bio, page, len, 0);
10291029
bio->bi_private = ctx;
1030-
bio->bi_end_io = bm_async_io_complete;
1030+
bio->bi_end_io = drbd_bm_endio;
10311031

10321032
if (drbd_insert_fault(device, (rw & WRITE) ? DRBD_FAULT_MD_WR : DRBD_FAULT_MD_RD)) {
10331033
bio->bi_rw |= rw;
@@ -1125,7 +1125,7 @@ static int bm_rw(struct drbd_device *device, const unsigned int flags, unsigned
11251125
}
11261126

11271127
/*
1128-
* We initialize ctx->in_flight to one to make sure bm_async_io_complete
1128+
* We initialize ctx->in_flight to one to make sure drbd_bm_endio
11291129
* will not set ctx->done early, and decrement / test it here. If there
11301130
* are still some bios in flight, we need to wait for them here.
11311131
* If all IO is done already (or nothing had been submitted), there is

drivers/block/drbd/drbd_debugfs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ static void resync_dump_detail(struct seq_file *m, struct lc_element *e)
695695
{
696696
struct bm_extent *bme = lc_entry(e, struct bm_extent, lce);
697697

698-
seq_printf(m, "%5d %s %s %s\n", bme->rs_left,
698+
seq_printf(m, "%5d %s %s %s", bme->rs_left,
699699
test_bit(BME_NO_WRITES, &bme->flags) ? "NO_WRITES" : "---------",
700700
test_bit(BME_LOCKED, &bme->flags) ? "LOCKED" : "------",
701701
test_bit(BME_PRIORITY, &bme->flags) ? "PRIORITY" : "--------"

drivers/block/drbd/drbd_int.h

+10-9
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@
6161
# define __must_hold(x)
6262
#endif
6363

64-
#define __no_warn(lock, stmt) do { __acquire(lock); stmt; __release(lock); } while (0)
65-
6664
/* module parameter, defined in drbd_main.c */
6765
extern unsigned int minor_count;
6866
extern bool disable_sendpage;
@@ -1483,7 +1481,7 @@ extern int drbd_khelper(struct drbd_device *device, char *cmd);
14831481

14841482
/* drbd_worker.c */
14851483
/* bi_end_io handlers */
1486-
extern void drbd_md_io_complete(struct bio *bio, int error);
1484+
extern void drbd_md_endio(struct bio *bio, int error);
14871485
extern void drbd_peer_request_endio(struct bio *bio, int error);
14881486
extern void drbd_request_endio(struct bio *bio, int error);
14891487
extern int drbd_worker(struct drbd_thread *thi);
@@ -2100,16 +2098,19 @@ static inline bool is_sync_state(enum drbd_conns connection_state)
21002098

21012099
/**
21022100
* get_ldev() - Increase the ref count on device->ldev. Returns 0 if there is no ldev
2103-
* @M: DRBD device.
2101+
* @_device: DRBD device.
2102+
* @_min_state: Minimum device state required for success.
21042103
*
21052104
* You have to call put_ldev() when finished working with device->ldev.
21062105
*/
2107-
#define get_ldev(M) __cond_lock(local, _get_ldev_if_state(M,D_INCONSISTENT))
2108-
#define get_ldev_if_state(M,MINS) __cond_lock(local, _get_ldev_if_state(M,MINS))
2106+
#define get_ldev_if_state(_device, _min_state) \
2107+
(_get_ldev_if_state((_device), (_min_state)) ? \
2108+
({ __acquire(x); true; }) : false)
2109+
#define get_ldev(_device) get_ldev_if_state(_device, D_INCONSISTENT)
21092110

21102111
static inline void put_ldev(struct drbd_device *device)
21112112
{
2112-
enum drbd_disk_state ds = device->state.disk;
2113+
enum drbd_disk_state disk_state = device->state.disk;
21132114
/* We must check the state *before* the atomic_dec becomes visible,
21142115
* or we have a theoretical race where someone hitting zero,
21152116
* while state still D_FAILED, will then see D_DISKLESS in the
@@ -2122,10 +2123,10 @@ static inline void put_ldev(struct drbd_device *device)
21222123
__release(local);
21232124
D_ASSERT(device, i >= 0);
21242125
if (i == 0) {
2125-
if (ds == D_DISKLESS)
2126+
if (disk_state == D_DISKLESS)
21262127
/* even internal references gone, safe to destroy */
21272128
drbd_device_post_work(device, DESTROY_DISK);
2128-
if (ds == D_FAILED)
2129+
if (disk_state == D_FAILED)
21292130
/* all application IO references gone. */
21302131
if (!test_and_set_bit(GOING_DISKLESS, &device->flags))
21312132
drbd_device_post_work(device, GO_DISKLESS);

drivers/block/drbd/drbd_interval.c

+6-34
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,8 @@ compute_subtree_last(struct drbd_interval *node)
3737
return max;
3838
}
3939

40-
static void augment_propagate(struct rb_node *rb, struct rb_node *stop)
41-
{
42-
while (rb != stop) {
43-
struct drbd_interval *node = rb_entry(rb, struct drbd_interval, rb);
44-
sector_t subtree_last = compute_subtree_last(node);
45-
if (node->end == subtree_last)
46-
break;
47-
node->end = subtree_last;
48-
rb = rb_parent(&node->rb);
49-
}
50-
}
51-
52-
static void augment_copy(struct rb_node *rb_old, struct rb_node *rb_new)
53-
{
54-
struct drbd_interval *old = rb_entry(rb_old, struct drbd_interval, rb);
55-
struct drbd_interval *new = rb_entry(rb_new, struct drbd_interval, rb);
56-
57-
new->end = old->end;
58-
}
59-
60-
static void augment_rotate(struct rb_node *rb_old, struct rb_node *rb_new)
61-
{
62-
struct drbd_interval *old = rb_entry(rb_old, struct drbd_interval, rb);
63-
struct drbd_interval *new = rb_entry(rb_new, struct drbd_interval, rb);
64-
65-
new->end = old->end;
66-
old->end = compute_subtree_last(old);
67-
}
68-
69-
static const struct rb_augment_callbacks augment_callbacks = {
70-
augment_propagate,
71-
augment_copy,
72-
augment_rotate,
73-
};
40+
RB_DECLARE_CALLBACKS(static, augment_callbacks, struct drbd_interval, rb,
41+
sector_t, end, compute_subtree_last);
7442

7543
/**
7644
* drbd_insert_interval - insert a new interval into a tree
@@ -79,6 +47,7 @@ bool
7947
drbd_insert_interval(struct rb_root *root, struct drbd_interval *this)
8048
{
8149
struct rb_node **new = &root->rb_node, *parent = NULL;
50+
sector_t this_end = this->sector + (this->size >> 9);
8251

8352
BUG_ON(!IS_ALIGNED(this->size, 512));
8453

@@ -87,6 +56,8 @@ drbd_insert_interval(struct rb_root *root, struct drbd_interval *this)
8756
rb_entry(*new, struct drbd_interval, rb);
8857

8958
parent = *new;
59+
if (here->end < this_end)
60+
here->end = this_end;
9061
if (this->sector < here->sector)
9162
new = &(*new)->rb_left;
9263
else if (this->sector > here->sector)
@@ -99,6 +70,7 @@ drbd_insert_interval(struct rb_root *root, struct drbd_interval *this)
9970
return false;
10071
}
10172

73+
this->end = this_end;
10274
rb_link_node(&this->rb, parent, new);
10375
rb_insert_augmented(&this->rb, root, &augment_callbacks);
10476
return true;

drivers/block/drbd/drbd_main.c

+14-14
Original file line numberDiff line numberDiff line change
@@ -1622,13 +1622,13 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request *
16221622
struct drbd_socket *sock;
16231623
struct p_data *p;
16241624
unsigned int dp_flags = 0;
1625-
int dgs;
1625+
int digest_size;
16261626
int err;
16271627

16281628
sock = &peer_device->connection->data;
16291629
p = drbd_prepare_command(peer_device, sock);
1630-
dgs = peer_device->connection->integrity_tfm ?
1631-
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
1630+
digest_size = peer_device->connection->integrity_tfm ?
1631+
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
16321632

16331633
if (!p)
16341634
return -EIO;
@@ -1659,9 +1659,9 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request *
16591659

16601660
/* our digest is still only over the payload.
16611661
* TRIM does not carry any payload. */
1662-
if (dgs)
1662+
if (digest_size)
16631663
drbd_csum_bio(peer_device->connection->integrity_tfm, req->master_bio, p + 1);
1664-
err = __send_command(peer_device->connection, device->vnr, sock, P_DATA, sizeof(*p) + dgs, NULL, req->i.size);
1664+
err = __send_command(peer_device->connection, device->vnr, sock, P_DATA, sizeof(*p) + digest_size, NULL, req->i.size);
16651665
if (!err) {
16661666
/* For protocol A, we have to memcpy the payload into
16671667
* socket buffers, as we may complete right away
@@ -1674,23 +1674,23 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request *
16741674
* out ok after sending on this side, but does not fit on the
16751675
* receiving side, we sure have detected corruption elsewhere.
16761676
*/
1677-
if (!(req->rq_state & (RQ_EXP_RECEIVE_ACK | RQ_EXP_WRITE_ACK)) || dgs)
1677+
if (!(req->rq_state & (RQ_EXP_RECEIVE_ACK | RQ_EXP_WRITE_ACK)) || digest_size)
16781678
err = _drbd_send_bio(peer_device, req->master_bio);
16791679
else
16801680
err = _drbd_send_zc_bio(peer_device, req->master_bio);
16811681

16821682
/* double check digest, sometimes buffers have been modified in flight. */
1683-
if (dgs > 0 && dgs <= 64) {
1683+
if (digest_size > 0 && digest_size <= 64) {
16841684
/* 64 byte, 512 bit, is the largest digest size
16851685
* currently supported in kernel crypto. */
16861686
unsigned char digest[64];
16871687
drbd_csum_bio(peer_device->connection->integrity_tfm, req->master_bio, digest);
1688-
if (memcmp(p + 1, digest, dgs)) {
1688+
if (memcmp(p + 1, digest, digest_size)) {
16891689
drbd_warn(device,
16901690
"Digest mismatch, buffer modified by upper layers during write: %llus +%u\n",
16911691
(unsigned long long)req->i.sector, req->i.size);
16921692
}
1693-
} /* else if (dgs > 64) {
1693+
} /* else if (digest_size > 64) {
16941694
... Be noisy about digest too large ...
16951695
} */
16961696
}
@@ -1711,23 +1711,23 @@ int drbd_send_block(struct drbd_peer_device *peer_device, enum drbd_packet cmd,
17111711
struct drbd_socket *sock;
17121712
struct p_data *p;
17131713
int err;
1714-
int dgs;
1714+
int digest_size;
17151715

17161716
sock = &peer_device->connection->data;
17171717
p = drbd_prepare_command(peer_device, sock);
17181718

1719-
dgs = peer_device->connection->integrity_tfm ?
1720-
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
1719+
digest_size = peer_device->connection->integrity_tfm ?
1720+
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
17211721

17221722
if (!p)
17231723
return -EIO;
17241724
p->sector = cpu_to_be64(peer_req->i.sector);
17251725
p->block_id = peer_req->block_id;
17261726
p->seq_num = 0; /* unused */
17271727
p->dp_flags = 0;
1728-
if (dgs)
1728+
if (digest_size)
17291729
drbd_csum_ee(peer_device->connection->integrity_tfm, peer_req, p + 1);
1730-
err = __send_command(peer_device->connection, device->vnr, sock, cmd, sizeof(*p) + dgs, NULL, peer_req->i.size);
1730+
err = __send_command(peer_device->connection, device->vnr, sock, cmd, sizeof(*p) + digest_size, NULL, peer_req->i.size);
17311731
if (!err)
17321732
err = _drbd_send_zc_ee(peer_device, peer_req);
17331733
mutex_unlock(&sock->mutex); /* locked by drbd_prepare_command() */

drivers/block/drbd/drbd_proc.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,12 @@ static void drbd_syncer_progress(struct drbd_device *device, struct seq_file *se
142142
(unsigned long) Bit2KB(rs_left >> 10),
143143
(unsigned long) Bit2KB(rs_total >> 10));
144144
else
145-
seq_printf(seq, "(%lu/%lu)K\n\t",
145+
seq_printf(seq, "(%lu/%lu)K",
146146
(unsigned long) Bit2KB(rs_left),
147147
(unsigned long) Bit2KB(rs_total));
148148

149+
seq_printf(seq, "\n\t");
150+
149151
/* see drivers/md/md.c
150152
* We do not want to overflow, so the order of operands and
151153
* the * 100 / 100 trick are important. We do a +1 to be

0 commit comments

Comments
 (0)