Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 262645
b: refs/heads/master
c: e1042ba
h: refs/heads/master
i:
  262643: ab51ee8
v: v3
  • Loading branch information
Boaz Harrosh committed Aug 7, 2011
1 parent 65b2ebb commit 8ed1084
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 17 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: 16f75bb35d54b44356f496272c013f7ace5fa698
refs/heads/master: e1042ba0991aab80ced34f7dade6ec25f22b4304
6 changes: 5 additions & 1 deletion trunk/fs/exofs/exofs.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ static inline osd_id exofs_oi_objno(struct exofs_i_info *oi)
}

struct exofs_io_state;
typedef void (*exofs_io_done_fn)(struct exofs_io_state *or, void *private);
typedef void (*exofs_io_done_fn)(struct exofs_io_state *ios, void *private);

struct exofs_io_state {
struct kref kref;
Expand Down Expand Up @@ -137,6 +137,8 @@ struct exofs_io_state {
unsigned out_attr_len;
struct osd_attr *out_attr;

bool reading;

/* Variable array of size numdevs */
unsigned numdevs;
struct exofs_per_dev_state {
Expand Down Expand Up @@ -218,6 +220,8 @@ void exofs_make_credential(u8 cred_a[OSD_CAP_LEN],
int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj,
u64 offset, void *p, unsigned length);

int exofs_get_rw_state(struct exofs_layout *layout, bool is_reading,
u64 offset, u64 length, struct exofs_io_state **ios);
int exofs_get_io_state(struct exofs_layout *layout,
struct exofs_io_state **ios);
void exofs_put_io_state(struct exofs_io_state *ios);
Expand Down
34 changes: 21 additions & 13 deletions trunk/fs/exofs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,6 @@ static int pcol_try_alloc(struct page_collect *pcol)
{
unsigned pages;

if (!pcol->ios) { /* First time allocate io_state */
int ret = exofs_get_io_state(&pcol->sbi->layout, &pcol->ios);

if (ret)
return ret;
}

/* TODO: easily support bio chaining */
pages = exofs_max_io_pages(&pcol->sbi->layout, pcol->expected_pages);

Expand Down Expand Up @@ -269,17 +262,25 @@ static void _unlock_pcol_pages(struct page_collect *pcol, int ret, int rw)
static int read_exec(struct page_collect *pcol)
{
struct exofs_i_info *oi = exofs_i(pcol->inode);
struct exofs_io_state *ios = pcol->ios;
struct exofs_io_state *ios;
struct page_collect *pcol_copy = NULL;
int ret;

if (!pcol->pages)
return 0;

if (!pcol->ios) {
int ret = exofs_get_rw_state(&pcol->sbi->layout, true,
pcol->pg_first << PAGE_CACHE_SHIFT,
pcol->length, &pcol->ios);

if (ret)
return ret;
}

ios = pcol->ios;
ios->pages = pcol->pages;
ios->nr_pages = pcol->nr_pages;
ios->length = pcol->length;
ios->offset = pcol->pg_first << PAGE_CACHE_SHIFT;

if (pcol->read_4_write) {
exofs_oi_read(oi, pcol->ios);
Expand Down Expand Up @@ -507,13 +508,21 @@ static void writepages_done(struct exofs_io_state *ios, void *p)
static int write_exec(struct page_collect *pcol)
{
struct exofs_i_info *oi = exofs_i(pcol->inode);
struct exofs_io_state *ios = pcol->ios;
struct exofs_io_state *ios;
struct page_collect *pcol_copy = NULL;
int ret;

if (!pcol->pages)
return 0;

BUG_ON(pcol->ios);
ret = exofs_get_rw_state(&pcol->sbi->layout, false,
pcol->pg_first << PAGE_CACHE_SHIFT,
pcol->length, &pcol->ios);

if (unlikely(ret))
goto err;

pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL);
if (!pcol_copy) {
EXOFS_ERR("write_exec: Failed to kmalloc(pcol)\n");
Expand All @@ -523,10 +532,9 @@ static int write_exec(struct page_collect *pcol)

*pcol_copy = *pcol;

ios = pcol->ios;
ios->pages = pcol_copy->pages;
ios->nr_pages = pcol_copy->nr_pages;
ios->offset = pcol_copy->pg_first << PAGE_CACHE_SHIFT;
ios->length = pcol_copy->length;
ios->done = writepages_done;
ios->private = pcol_copy;

Expand Down
14 changes: 12 additions & 2 deletions trunk/fs/exofs/ios.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj,
return ret;
}

int exofs_get_io_state(struct exofs_layout *layout,
struct exofs_io_state **pios)
int exofs_get_rw_state(struct exofs_layout *layout, bool is_reading,
u64 offset, u64 length, struct exofs_io_state **pios)
{
struct exofs_io_state *ios;

Expand All @@ -87,10 +87,20 @@ int exofs_get_io_state(struct exofs_layout *layout,

ios->layout = layout;
ios->obj.partition = layout->s_pid;
ios->offset = offset;
ios->length = length;
ios->reading = is_reading;

*pios = ios;
return 0;
}

int exofs_get_io_state(struct exofs_layout *layout,
struct exofs_io_state **ios)
{
return exofs_get_rw_state(layout, true, 0, 0, ios);
}

void exofs_put_io_state(struct exofs_io_state *ios)
{
if (ios) {
Expand Down

0 comments on commit 8ed1084

Please sign in to comment.