Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 373439
b: refs/heads/master
c: ca8b3a6
h: refs/heads/master
i:
  373437: 51f4270
  373435: 2786f36
  373431: 519a7af
  373423: 73e1a4d
  373407: b833c1b
  373375: 02dbabe
v: v3
  • Loading branch information
Alex Elder authored and Sage Weil committed May 2, 2013
1 parent 994e057 commit 60fd963
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5240d9f95dfe0f0701b35fbff1cb5b70825ad23f
refs/heads/master: ca8b3a69174b04376722672d7dd6b666a7f17c50
5 changes: 4 additions & 1 deletion trunk/include/linux/ceph/messenger.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,10 @@ struct ceph_msg_data {
};

struct ceph_msg_data_cursor {
struct ceph_msg_data *data; /* data item this describes */
size_t total_resid; /* across all data items */
struct list_head *data_head; /* = &ceph_msg->data */

struct ceph_msg_data *data; /* current data item */
size_t resid; /* bytes not yet consumed */
bool last_piece; /* current is last piece */
bool need_crc; /* crc update needed */
Expand Down
48 changes: 32 additions & 16 deletions trunk/net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,7 @@ static void ceph_msg_data_bio_cursor_init(struct ceph_msg_data_cursor *cursor,
BUG_ON(!bio);
BUG_ON(!bio->bi_vcnt);

cursor->resid = length;
cursor->resid = min(length, data->bio_length);
cursor->bio = bio;
cursor->vector_index = 0;
cursor->vector_offset = 0;
Expand Down Expand Up @@ -833,9 +833,8 @@ static void ceph_msg_data_pages_cursor_init(struct ceph_msg_data_cursor *cursor,

BUG_ON(!data->pages);
BUG_ON(!data->length);
BUG_ON(length > data->length); /* short reads are OK */

cursor->resid = length;
cursor->resid = min(length, data->length);
page_count = calc_pages_for(data->alignment, (u64)data->length);
cursor->page_offset = data->alignment & ~PAGE_MASK;
cursor->page_index = 0;
Expand Down Expand Up @@ -904,15 +903,14 @@ ceph_msg_data_pagelist_cursor_init(struct ceph_msg_data_cursor *cursor,

pagelist = data->pagelist;
BUG_ON(!pagelist);
BUG_ON(length > pagelist->length); /* short reads are OK */

if (!length)
return; /* pagelist can be assigned but empty */

BUG_ON(list_empty(&pagelist->head));
page = list_first_entry(&pagelist->head, struct page, lru);

cursor->resid = length;
cursor->resid = min(length, pagelist->length);
cursor->page = page;
cursor->offset = 0;
cursor->last_piece = length <= PAGE_SIZE;
Expand Down Expand Up @@ -982,13 +980,10 @@ static bool ceph_msg_data_pagelist_advance(struct ceph_msg_data_cursor *cursor,
* be processed in that piece. It also tracks whether the current
* piece is the last one in the data item.
*/
static void ceph_msg_data_cursor_init(struct ceph_msg *msg, size_t length)
static void __ceph_msg_data_cursor_init(struct ceph_msg_data_cursor *cursor)
{
struct ceph_msg_data_cursor *cursor = &msg->cursor;
struct ceph_msg_data *data;
size_t length = cursor->total_resid;

data = list_first_entry(&msg->data, struct ceph_msg_data, links);
cursor->data = data;
switch (cursor->data->type) {
case CEPH_MSG_DATA_PAGELIST:
ceph_msg_data_pagelist_cursor_init(cursor, length);
Expand All @@ -1009,6 +1004,25 @@ static void ceph_msg_data_cursor_init(struct ceph_msg *msg, size_t length)
cursor->need_crc = true;
}

static void ceph_msg_data_cursor_init(struct ceph_msg *msg, size_t length)
{
struct ceph_msg_data_cursor *cursor = &msg->cursor;
struct ceph_msg_data *data;

BUG_ON(!length);
BUG_ON(length > msg->data_length);
BUG_ON(list_empty(&msg->data));

data = list_first_entry(&msg->data, struct ceph_msg_data, links);

cursor->data_head = &msg->data;
cursor->total_resid = length;
data = list_first_entry(&msg->data, struct ceph_msg_data, links);
cursor->data = data;

__ceph_msg_data_cursor_init(cursor);
}

/*
* Return the page containing the next piece to process for a given
* data item, and supply the page offset and length of that piece.
Expand Down Expand Up @@ -1073,8 +1087,16 @@ static bool ceph_msg_data_advance(struct ceph_msg_data_cursor *cursor,
BUG();
break;
}
cursor->total_resid -= bytes;
cursor->need_crc = new_piece;

if (!cursor->resid && cursor->total_resid) {
WARN_ON(!cursor->last_piece);
BUG_ON(list_is_last(&cursor->data->links, cursor->data_head));
cursor->data = list_entry_next(cursor->data, links);
__ceph_msg_data_cursor_init(cursor);
}

return new_piece;
}

Expand Down Expand Up @@ -2990,8 +3012,6 @@ void ceph_msg_data_set_pages(struct ceph_msg *msg, struct page **pages,

BUG_ON(!pages);
BUG_ON(!length);
BUG_ON(msg->data_length);
BUG_ON(!list_empty(&msg->data));

data = ceph_msg_data_create(CEPH_MSG_DATA_PAGES);
BUG_ON(!data);
Expand All @@ -3012,8 +3032,6 @@ void ceph_msg_data_set_pagelist(struct ceph_msg *msg,

BUG_ON(!pagelist);
BUG_ON(!pagelist->length);
BUG_ON(msg->data_length);
BUG_ON(!list_empty(&msg->data));

data = ceph_msg_data_create(CEPH_MSG_DATA_PAGELIST);
BUG_ON(!data);
Expand All @@ -3031,8 +3049,6 @@ void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio,
struct ceph_msg_data *data;

BUG_ON(!bio);
BUG_ON(msg->data_length);
BUG_ON(!list_empty(&msg->data));

data = ceph_msg_data_create(CEPH_MSG_DATA_BIO);
BUG_ON(!data);
Expand Down

0 comments on commit 60fd963

Please sign in to comment.