summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/performance/write-behind/src/write-behind.c919
1 files changed, 427 insertions, 492 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c
index 43956a920a5..ece77e5c741 100644
--- a/xlators/performance/write-behind/src/write-behind.c
+++ b/xlators/performance/write-behind/src/write-behind.c
@@ -37,16 +37,15 @@
#include "statedump.h"
#include "write-behind-mem-types.h"
-#define MAX_VECTOR_COUNT 8
+#define MAX_VECTOR_COUNT 8
#define WB_AGGREGATE_SIZE 131072 /* 128 KB */
-#define WB_WINDOW_SIZE 1048576 /* 1MB */
-
+#define WB_WINDOW_SIZE 1048576 /* 1MB */
+
typedef struct list_head list_head_t;
struct wb_conf;
struct wb_page;
struct wb_file;
-
typedef struct wb_file {
int disabled;
uint64_t disable_till;
@@ -64,7 +63,6 @@ typedef struct wb_file {
xlator_t *this;
}wb_file_t;
-
typedef struct wb_request {
list_head_t list;
list_head_t winds;
@@ -88,16 +86,15 @@ typedef struct wb_request {
* whatever data currently present in
* request queue.
*/
-
+
}write_request;
-
+
struct {
char marked_for_resume;
}other_requests;
}flags;
} wb_request_t;
-
struct wb_conf {
uint64_t aggregate_size;
uint64_t window_size;
@@ -107,7 +104,6 @@ struct wb_conf {
gf_boolean_t enable_trickling_writes;
};
-
typedef struct wb_local {
list_head_t winds;
int32_t flags;
@@ -120,12 +116,10 @@ typedef struct wb_local {
int32_t reply_count;
} wb_local_t;
-
typedef struct wb_conf wb_conf_t;
typedef struct wb_page wb_page_t;
-
-int32_t
+int32_t
wb_process_queue (call_frame_t *frame, wb_file_t *file);
ssize_t
@@ -173,7 +167,7 @@ wb_request_unref (wb_request_t *this)
"request is NULL");
goto out;
}
-
+
file = this->file;
LOCK (&file->lock);
{
@@ -204,6 +198,7 @@ wb_request_t *
wb_request_ref (wb_request_t *this)
{
wb_file_t *file = NULL;
+
if (this == NULL) {
gf_log ("wb-request", GF_LOG_DEBUG,
"request is NULL");
@@ -229,7 +224,7 @@ wb_enqueue (wb_file_t *file, call_stub_t *stub)
wb_local_t *local = NULL;
struct iovec *vector = NULL;
int32_t count = 0;
-
+
request = GF_CALLOC (1, sizeof (*request), gf_wb_mt_wb_request_t);
if (request == NULL) {
goto out;
@@ -297,7 +292,9 @@ wb_file_t *
wb_file_create (xlator_t *this, fd_t *fd, int32_t flags)
{
wb_file_t *file = NULL;
- wb_conf_t *conf = this->private;
+ wb_conf_t *conf = NULL;
+
+ conf = this->private;
file = GF_CALLOC (1, sizeof (*file), gf_wb_mt_wb_file_t);
if (file == NULL) {
@@ -307,9 +304,9 @@ wb_file_create (xlator_t *this, fd_t *fd, int32_t flags)
INIT_LIST_HEAD (&file->request);
INIT_LIST_HEAD (&file->passive_requests);
- /*
- fd_ref() not required, file should never decide the existance of
- an fd
+ /*
+ fd_ref() not required, file should never decide the existance of
+ an fd
*/
file->fd= fd;
file->disable_till = conf->disable_till;
@@ -324,6 +321,7 @@ out:
return file;
}
+
void
wb_file_destroy (wb_file_t *file)
{
@@ -348,14 +346,13 @@ int32_t
wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf)
{
- wb_local_t *local = NULL;
- list_head_t *winds = NULL;
- wb_file_t *file = NULL;
- wb_request_t *request = NULL, *dummy = NULL;
+ wb_local_t *local = NULL;
+ list_head_t *winds = NULL;
+ wb_file_t *file = NULL;
+ wb_request_t *request = NULL, *dummy = NULL;
wb_local_t *per_request_local = NULL;
- int32_t ret = -1;
- fd_t *fd = NULL;
-
+ int32_t ret = -1;
+ fd_t *fd = NULL;
local = frame->local;
winds = &local->winds;
@@ -379,7 +376,7 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
__wb_request_unref (request);
}
-
+
if (op_ret == -1) {
file->op_ret = op_ret;
file->op_errno = op_errno;
@@ -388,7 +385,7 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
}
UNLOCK (&file->lock);
- ret = wb_process_queue (frame, file);
+ ret = wb_process_queue (frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
LOCK (&file->lock);
{
@@ -410,19 +407,19 @@ wb_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
ssize_t
wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
{
- wb_request_t *dummy = NULL, *request = NULL;
+ wb_request_t *dummy = NULL, *request = NULL;
wb_request_t *first_request = NULL, *next = NULL;
- size_t total_count = 0, count = 0;
- size_t copied = 0;
- call_frame_t *sync_frame = NULL;
- struct iobref *iobref = NULL;
- wb_local_t *local = NULL;
- struct iovec *vector = NULL;
- ssize_t current_size = 0, bytes = 0;
- size_t bytecount = 0;
- wb_conf_t *conf = NULL;
- fd_t *fd = NULL;
- int32_t op_errno = -1;
+ size_t total_count = 0, count = 0;
+ size_t copied = 0;
+ call_frame_t *sync_frame = NULL;
+ struct iobref *iobref = NULL;
+ wb_local_t *local = NULL;
+ struct iovec *vector = NULL;
+ ssize_t current_size = 0, bytes = 0;
+ size_t bytecount = 0;
+ wb_conf_t *conf = NULL;
+ fd_t *fd = NULL;
+ int32_t op_errno = -1;
if (frame == NULL) {
op_errno = EINVAL;
@@ -442,7 +439,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
"synced");
goto out;
}
-
+
list_for_each_entry_safe (request, dummy, winds, winds) {
if (!vector) {
vector = GF_MALLOC (VECTORSIZE (MAX_VECTOR_COUNT),
@@ -475,7 +472,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
}
INIT_LIST_HEAD (&local->winds);
-
+
first_request = request;
current_size = 0;
}
@@ -486,7 +483,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
request->stub->args.writev.vector,
bytecount);
copied += bytecount;
-
+
current_size += request->write_size;
if (request->stub->args.writev.iobref) {
@@ -495,7 +492,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
}
next = NULL;
- if (request->winds.next != winds) {
+ if (request->winds.next != winds) {
next = list_entry (request->winds.next,
wb_request_t, winds);
}
@@ -509,7 +506,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
|| ((current_size + next->write_size)
> conf->aggregate_size))
{
- sync_frame = copy_frame (frame);
+ sync_frame = copy_frame (frame);
if (sync_frame == NULL) {
bytes = -1;
op_errno = ENOMEM;
@@ -530,15 +527,13 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds)
fd_ref (fd);
bytes += current_size;
- STACK_WIND (sync_frame,
- wb_sync_cbk,
+ STACK_WIND (sync_frame, wb_sync_cbk,
FIRST_CHILD(sync_frame->this),
FIRST_CHILD(sync_frame->this)->fops->writev,
- fd, vector,
- count,
+ fd, vector, count,
first_request->stub->args.writev.off,
iobref);
-
+
iobref_unref (iobref);
GF_FREE (vector);
first_request = NULL;
@@ -603,17 +598,17 @@ out:
}
-int32_t
+int32_t
wb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, struct iatt *buf)
{
- wb_local_t *local = NULL;
- wb_request_t *request = NULL;
+ wb_local_t *local = NULL;
+ wb_request_t *request = NULL;
call_frame_t *process_frame = NULL;
- wb_file_t *file = NULL;
- int32_t ret = -1;
- fd_t *fd = NULL;
-
+ wb_file_t *file = NULL;
+ int32_t ret = -1;
+ fd_t *fd = NULL;
+
local = frame->local;
file = local->file;
@@ -663,10 +658,8 @@ wb_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
static int32_t
wb_stat_helper (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
- STACK_WIND (frame, wb_stat_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->stat,
- loc);
+ STACK_WIND (frame, wb_stat_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->stat, loc);
return 0;
}
@@ -674,20 +667,20 @@ wb_stat_helper (call_frame_t *frame, xlator_t *this, loc_t *loc)
int32_t
wb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
- wb_file_t *file = NULL;
- fd_t *iter_fd = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1, op_errno = EINVAL;
+ wb_file_t *file = NULL;
+ fd_t *iter_fd = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1, op_errno = EINVAL;
if (loc->inode) {
/* FIXME: fd_lookup extends life of fd till stat returns */
iter_fd = fd_lookup (loc->inode, frame->root->pid);
if (iter_fd) {
if (!fd_ctx_get (iter_fd, this, &tmp_file)) {
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
} else {
fd_unref (iter_fd);
iter_fd = NULL;
@@ -726,20 +719,18 @@ wb_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)
}
} else {
- STACK_WIND (frame, wb_stat_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->stat,
- loc);
+ STACK_WIND (frame, wb_stat_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->stat, loc);
}
- return 0;
+ return 0;
unwind:
STACK_UNWIND_STRICT (stat, frame, -1, op_errno, NULL);
if (stub) {
call_stub_destroy (stub);
}
-
+
if (iter_fd != NULL) {
fd_unref (iter_fd);
}
@@ -748,15 +739,15 @@ unwind:
}
-int32_t
+int32_t
wb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, struct iatt *buf)
{
- wb_local_t *local = NULL;
- wb_request_t *request = NULL;
- wb_file_t *file = NULL;
- int32_t ret = -1;
-
+ wb_local_t *local = NULL;
+ wb_request_t *request = NULL;
+ wb_file_t *file = NULL;
+ int32_t ret = -1;
+
local = frame->local;
file = local->file;
@@ -776,27 +767,24 @@ wb_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
}
-int32_t
+int32_t
wb_fstat_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
{
- STACK_WIND (frame,
- wb_fstat_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->fstat,
- fd);
+ STACK_WIND (frame, wb_fstat_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fstat, fd);
return 0;
}
-int32_t
+int32_t
wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
{
- wb_file_t *file = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1;
+ wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1;
int op_errno = EINVAL;
if ((!IA_ISDIR (fd->inode->ia_type))
@@ -809,7 +797,7 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
return 0;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
if (local == NULL) {
@@ -827,7 +815,7 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
op_errno = ENOMEM;
goto unwind;
}
-
+
request = wb_enqueue (file, stub);
if (request == NULL) {
op_errno = ENOMEM;
@@ -843,11 +831,8 @@ wb_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)
goto unwind;
}
} else {
- STACK_WIND (frame,
- wb_fstat_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->fstat,
- fd);
+ STACK_WIND (frame, wb_fstat_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fstat, fd);
}
return 0;
@@ -867,12 +852,12 @@ wb_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
struct iatt *postbuf)
{
- wb_local_t *local = NULL;
- wb_request_t *request = NULL;
- wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ wb_request_t *request = NULL;
+ wb_file_t *file = NULL;
call_frame_t *process_frame = NULL;
- int32_t ret = -1;
- fd_t *fd = NULL;
+ int32_t ret = -1;
+ fd_t *fd = NULL;
local = frame->local;
file = local->file;
@@ -886,7 +871,8 @@ wb_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
}
- STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, prebuf, postbuf);
+ STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, prebuf,
+ postbuf);
if (request) {
wb_request_unref (request);
@@ -920,48 +906,43 @@ wb_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
-static int32_t
+static int32_t
wb_truncate_helper (call_frame_t *frame, xlator_t *this, loc_t *loc,
off_t offset)
{
- STACK_WIND (frame,
- wb_truncate_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->truncate,
- loc,
- offset);
+ STACK_WIND (frame, wb_truncate_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->truncate, loc, offset);
return 0;
}
-int32_t
+int32_t
wb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
{
- wb_file_t *file = NULL;
- fd_t *iter_fd = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1, op_errno = ENOMEM;
+ wb_file_t *file = NULL;
+ fd_t *iter_fd = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1, op_errno = ENOMEM;
- if (loc->inode)
- {
- /*
- FIXME: fd_lookup extends life of fd till the execution of
- truncate_cbk
+ if (loc->inode) {
+ /*
+ FIXME: fd_lookup extends life of fd till the execution of
+ truncate_cbk
*/
iter_fd = fd_lookup (loc->inode, frame->root->pid);
if (iter_fd) {
if (!fd_ctx_get (iter_fd, this, &tmp_file)){
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
} else {
fd_unref (iter_fd);
}
}
}
-
+
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
if (local == NULL) {
@@ -970,7 +951,7 @@ wb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
}
local->file = file;
-
+
frame->local = local;
if (file) {
stub = fop_truncate_stub (frame, wb_truncate_helper, loc,
@@ -985,19 +966,15 @@ wb_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)
op_errno = ENOMEM;
goto unwind;
}
-
+
ret = wb_process_queue (frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
op_errno = ENOMEM;
goto unwind;
}
} else {
- STACK_WIND (frame,
- wb_truncate_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->truncate,
- loc,
- offset);
+ STACK_WIND (frame, wb_truncate_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->truncate, loc, offset);
}
return 0;
@@ -1018,10 +995,10 @@ wb_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
struct iatt *postbuf)
{
- wb_local_t *local = NULL;
+ wb_local_t *local = NULL;
wb_request_t *request = NULL;
- wb_file_t *file = NULL;
- int32_t ret = -1;
+ wb_file_t *file = NULL;
+ int32_t ret = -1;
local = frame->local;
file = local->file;
@@ -1036,7 +1013,8 @@ wb_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
}
- STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, prebuf, postbuf);
+ STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, prebuf,
+ postbuf);
return 0;
}
@@ -1046,25 +1024,21 @@ static int32_t
wb_ftruncate_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,
off_t offset)
{
- STACK_WIND (frame,
- wb_ftruncate_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->ftruncate,
- fd,
- offset);
+ STACK_WIND (frame, wb_ftruncate_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->ftruncate, fd, offset);
return 0;
}
-
+
int32_t
wb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
{
- wb_file_t *file = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1;
+ wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1;
int op_errno = EINVAL;
if ((!IA_ISDIR (fd->inode->ia_type))
@@ -1073,18 +1047,16 @@ wb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
" not stored in context of fd(%p), returning EBADFD",
fd);
- STACK_UNWIND_STRICT (ftruncate, frame, -1, EBADFD,
- NULL, NULL);
+ STACK_UNWIND_STRICT (ftruncate, frame, -1, EBADFD, NULL, NULL);
return 0;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM,
- NULL, NULL);
+ STACK_UNWIND_STRICT (ftruncate, frame, -1, ENOMEM, NULL, NULL);
return 0;
}
@@ -1112,12 +1084,8 @@ wb_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)
goto unwind;
}
} else {
- STACK_WIND (frame,
- wb_ftruncate_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->ftruncate,
- fd,
- offset);
+ STACK_WIND (frame, wb_ftruncate_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->ftruncate, fd, offset);
}
return 0;
@@ -1133,18 +1101,18 @@ unwind:
}
-int32_t
+int32_t
wb_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *statpre,
struct iatt *statpost)
{
- wb_local_t *local = NULL;
- wb_request_t *request = NULL;
- call_frame_t *process_frame = NULL;
- wb_file_t *file = NULL;
- int32_t ret = -1;
- fd_t *fd = NULL;
-
+ wb_local_t *local = NULL;
+ wb_request_t *request = NULL;
+ call_frame_t *process_frame = NULL;
+ wb_file_t *file = NULL;
+ int32_t ret = -1;
+ fd_t *fd = NULL;
+
local = frame->local;
file = local->file;
request = local->request;
@@ -1192,33 +1160,27 @@ wb_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
-static int32_t
+static int32_t
wb_setattr_helper (call_frame_t *frame, xlator_t *this, loc_t *loc,
struct iatt *stbuf, int32_t valid)
{
- STACK_WIND (frame,
- wb_setattr_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->setattr,
- loc,
- stbuf,
- valid);
-
+ STACK_WIND (frame, wb_setattr_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->setattr, loc, stbuf, valid);
return 0;
}
-int32_t
+int32_t
wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
struct iatt *stbuf, int32_t valid)
{
- wb_file_t *file = NULL;
- fd_t *iter_fd = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1, op_errno = EINVAL;
+ wb_file_t *file = NULL;
+ fd_t *iter_fd = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1, op_errno = EINVAL;
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
@@ -1230,24 +1192,22 @@ wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
frame->local = local;
- if (!(valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME))) {
- STACK_WIND (frame,
- wb_setattr_cbk,
- FIRST_CHILD (this),
- FIRST_CHILD (this)->fops->setattr,
- loc, stbuf, valid);
+ if (!(valid & (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME))) {
+ STACK_WIND (frame, wb_setattr_cbk, FIRST_CHILD (this),
+ FIRST_CHILD (this)->fops->setattr, loc, stbuf,
+ valid);
goto out;
}
if (loc->inode) {
- /*
- FIXME: fd_lookup extends life of fd till the execution
- of wb_utimens_cbk
+ /*
+ FIXME: fd_lookup extends life of fd till the execution
+ of wb_utimens_cbk
*/
iter_fd = fd_lookup (loc->inode, frame->root->pid);
if (iter_fd) {
if (!fd_ctx_get (iter_fd, this, &tmp_file)) {
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
} else {
fd_unref (iter_fd);
}
@@ -1258,7 +1218,8 @@ wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
local->file = file;
if (file) {
- stub = fop_setattr_stub (frame, wb_setattr_helper, loc, stbuf, valid);
+ stub = fop_setattr_stub (frame, wb_setattr_helper, loc, stbuf,
+ valid);
if (stub == NULL) {
op_errno = ENOMEM;
goto unwind;
@@ -1276,18 +1237,14 @@ wb_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
goto unwind;
}
} else {
- STACK_WIND (frame,
- wb_setattr_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->setattr,
- loc,
- stbuf, valid);
+ STACK_WIND (frame, wb_setattr_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->setattr, loc, stbuf,
+ valid);
}
return 0;
unwind:
- STACK_UNWIND_STRICT (setattr, frame, -1, op_errno,
- NULL, NULL);
+ STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL);
if (stub) {
call_stub_destroy (stub);
@@ -1296,14 +1253,15 @@ out:
return 0;
}
+
int32_t
wb_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, fd_t *fd)
{
int32_t wbflags = 0, flags = 0;
- wb_file_t *file = NULL;
- wb_conf_t *conf = NULL;
- wb_local_t *local = NULL;
+ wb_file_t *file = NULL;
+ wb_conf_t *conf = NULL;
+ wb_local_t *local = NULL;
conf = this->private;
@@ -1329,17 +1287,17 @@ wb_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
if (((flags & O_DIRECT) == O_DIRECT)
|| ((flags & O_ACCMODE) == O_RDONLY)
|| (((flags & O_SYNC) == O_SYNC)
- && conf->enable_O_SYNC == _gf_true)) {
+ && conf->enable_O_SYNC == _gf_true)) {
file->window_conf = 0;
}
if (wbflags & GF_OPEN_NOWB) {
file->disabled = 1;
}
-
+
LOCK_INIT (&file->lock);
}
-
+
out:
STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd);
return 0;
@@ -1350,7 +1308,7 @@ int32_t
wb_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
fd_t *fd, int32_t wbflags)
{
- wb_local_t *local = NULL;
+ wb_local_t *local = NULL;
int32_t op_errno = EINVAL;
local = GF_CALLOC (1, sizeof (*local),
@@ -1362,14 +1320,11 @@ wb_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
local->flags = flags;
local->wbflags = wbflags;
-
+
frame->local = local;
- STACK_WIND (frame,
- wb_open_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->open,
- loc, flags, fd, wbflags);
+ STACK_WIND (frame, wb_open_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->open, loc, flags, fd, wbflags);
return 0;
unwind:
@@ -1385,9 +1340,10 @@ wb_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
struct iatt *postparent)
{
long flags = 0;
- wb_file_t *file = NULL;
- wb_conf_t *conf = this->private;
+ wb_file_t *file = NULL;
+ wb_conf_t *conf = NULL;
+ conf = this->private;
if (op_ret != -1) {
if (frame->local) {
flags = (long) frame->local;
@@ -1405,17 +1361,17 @@ wb_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (((flags & O_DIRECT) == O_DIRECT)
|| ((flags & O_ACCMODE) == O_RDONLY)
|| (((flags & O_SYNC) == O_SYNC)
- && (conf->enable_O_SYNC == _gf_true))) {
+ && (conf->enable_O_SYNC == _gf_true))) {
file->window_conf = 0;
}
}
LOCK_INIT (&file->lock);
}
-
+
frame->local = NULL;
-out:
+out:
STACK_UNWIND_STRICT (create, frame, op_ret, op_errno, fd, inode, buf,
preparent, postparent);
return 0;
@@ -1428,13 +1384,13 @@ wb_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
{
frame->local = (void *)(long)flags;
- STACK_WIND (frame, wb_create_cbk,
- FIRST_CHILD(this),
+ STACK_WIND (frame, wb_create_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->create,
loc, flags, mode, fd, params);
return 0;
}
+
/* Mark all the contiguous write requests for winding starting from head of
* request list. Stops marking at the first non-write request found. If
* file is opened with O_APPEND, make sure all the writes marked for winding
@@ -1462,9 +1418,10 @@ __wb_mark_wind_all (wb_file_t *file, list_head_t *list, list_head_t *winds)
if (!request->flags.write_request.stack_wound) {
if (first_request) {
first_request = 0;
- offset_expected = request->stub->args.writev.off;
+ offset_expected
+ = request->stub->args.writev.off;
}
-
+
if (request->stub->args.writev.off != offset_expected) {
break;
}
@@ -1484,9 +1441,9 @@ __wb_mark_wind_all (wb_file_t *file, list_head_t *list, list_head_t *winds)
request->flags.write_request.stack_wound = 1;
list_add_tail (&request->winds, winds);
- }
+ }
}
-
+
return size;
}
@@ -1496,8 +1453,8 @@ __wb_can_wind (list_head_t *list, char *other_fop_in_queue,
char *non_contiguous_writes, char *incomplete_writes,
char *wind_all)
{
- wb_request_t *request = NULL;
- char first_request = 1;
+ wb_request_t *request = NULL;
+ char first_request = 1;
off_t offset_expected = 0;
list_for_each_entry (request, list, list)
@@ -1519,13 +1476,16 @@ __wb_can_wind (list_head_t *list, char *other_fop_in_queue,
if (!request->flags.write_request.stack_wound) {
if (first_request) {
+ char flush = 0;
first_request = 0;
offset_expected
= request->stub->args.writev.off;
+
+ flush = request->flags.write_request.flush_all;
if (wind_all != NULL) {
- *wind_all = request->flags.write_request.flush_all;
+ *wind_all = flush;
}
- }
+ }
if (offset_expected != request->stub->args.writev.off) {
if (non_contiguous_writes) {
@@ -1577,7 +1537,7 @@ out:
}
-size_t
+size_t
__wb_mark_unwind_till (list_head_t *list, list_head_t *unwinds, size_t size)
{
size_t written_behind = 0;
@@ -1603,9 +1563,10 @@ __wb_mark_unwind_till (list_head_t *list, list_head_t *unwinds, size_t size)
written_behind += request->write_size;
request->flags.write_request.write_behind = 1;
list_add_tail (&request->unwinds, unwinds);
-
+
if (!request->flags.write_request.got_reply) {
- file->window_current += request->write_size;
+ file->window_current
+ += request->write_size;
}
}
} else {
@@ -1621,8 +1582,8 @@ out:
void
__wb_mark_unwinds (list_head_t *list, list_head_t *unwinds)
{
- wb_request_t *request = NULL;
- wb_file_t *file = NULL;
+ wb_request_t *request = NULL;
+ wb_file_t *file = NULL;
if (list_empty (list)) {
goto out;
@@ -1633,7 +1594,8 @@ __wb_mark_unwinds (list_head_t *list, list_head_t *unwinds)
if (file->window_current <= file->window_conf) {
__wb_mark_unwind_till (list, unwinds,
- file->window_conf - file->window_current);
+ file->window_conf
+ - file->window_current);
}
out:
@@ -1645,13 +1607,14 @@ uint32_t
__wb_get_other_requests (list_head_t *list, list_head_t *other_requests)
{
wb_request_t *request = NULL;
- uint32_t count = 0;
+ uint32_t count = 0;
+
list_for_each_entry (request, list, list) {
if ((request->stub == NULL)
|| (request->stub->fop == GF_FOP_WRITE)) {
break;
}
-
+
if (!request->flags.other_requests.marked_for_resume) {
request->flags.other_requests.marked_for_resume = 1;
list_add_tail (&request->other_requests,
@@ -1667,14 +1630,13 @@ __wb_get_other_requests (list_head_t *list, list_head_t *other_requests)
int32_t
wb_stack_unwind (list_head_t *unwinds)
{
- struct iatt buf = {0,};
+ struct iatt buf = {0,};
wb_request_t *request = NULL, *dummy = NULL;
- call_frame_t *frame = NULL;
- wb_local_t *local = NULL;
- int ret = 0, write_requests_removed = 0;
+ call_frame_t *frame = NULL;
+ wb_local_t *local = NULL;
+ int ret = 0, write_requests_removed = 0;
- list_for_each_entry_safe (request, dummy, unwinds, unwinds)
- {
+ list_for_each_entry_safe (request, dummy, unwinds, unwinds) {
frame = request->stub->frame;
local = frame->local;
@@ -1695,11 +1657,11 @@ int32_t
wb_resume_other_requests (call_frame_t *frame, wb_file_t *file,
list_head_t *other_requests)
{
- int32_t ret = 0;
- wb_request_t *request = NULL, *dummy = NULL;
+ int32_t ret = 0;
+ wb_request_t *request = NULL, *dummy = NULL;
int32_t fops_removed = 0;
- char wind = 0;
- call_stub_t *stub = NULL;
+ char wind = 0;
+ call_stub_t *stub = NULL;
if (list_empty (other_requests)) {
goto out;
@@ -1709,8 +1671,8 @@ wb_resume_other_requests (call_frame_t *frame, wb_file_t *file,
other_requests) {
wind = request->stub->wind;
stub = request->stub;
-
- LOCK (&file->lock);
+
+ LOCK (&file->lock);
{
request->stub = NULL;
}
@@ -1719,15 +1681,15 @@ wb_resume_other_requests (call_frame_t *frame, wb_file_t *file,
if (!wind) {
wb_request_unref (request);
fops_removed++;
- }
-
+ }
+
call_resume (stub);
}
if (fops_removed > 0) {
ret = wb_process_queue (frame, file);
}
-
+
out:
return ret;
}
@@ -1787,7 +1749,7 @@ __wb_copy_into_holder (wb_request_t *holder, wb_request_t *request)
"out of memory");
goto out;
}
-
+
ret = iobref_add (iobref, iobuf);
if (ret != 0) {
iobuf_unref (iobuf);
@@ -1797,14 +1759,14 @@ __wb_copy_into_holder (wb_request_t *holder, wb_request_t *request)
iobuf, iobref);
goto out;
}
-
+
iov_unload (iobuf->ptr, holder->stub->args.writev.vector,
holder->stub->args.writev.count);
holder->stub->args.writev.vector[0].iov_base = iobuf->ptr;
-
+
iobref_unref (holder->stub->args.writev.iobref);
holder->stub->args.writev.iobref = iobref;
-
+
iobuf_unref (iobuf);
holder->flags.write_request.virgin = 0;
@@ -1866,12 +1828,12 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size)
if (ret != 0) {
break;
}
-
+
__wb_request_unref (request);
} else {
holder = request;
}
- } else {
+ } else {
break;
}
}
@@ -1880,19 +1842,19 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size)
}
-int32_t
+int32_t
wb_process_queue (call_frame_t *frame, wb_file_t *file)
{
- list_head_t winds, unwinds, other_requests;
- size_t size = 0;
- wb_conf_t *conf = NULL;
- uint32_t count = 0;
- int32_t ret = -1;
+ list_head_t winds = {0, }, unwinds = {0, }, other_requests = {0, };
+ size_t size = 0;
+ wb_conf_t *conf = NULL;
+ uint32_t count = 0;
+ int32_t ret = -1;
INIT_LIST_HEAD (&winds);
INIT_LIST_HEAD (&unwinds);
INIT_LIST_HEAD (&other_requests);
-
+
if (file == NULL) {
errno = EINVAL;
goto out;
@@ -1902,7 +1864,7 @@ wb_process_queue (call_frame_t *frame, wb_file_t *file)
size = conf->aggregate_size;
LOCK (&file->lock);
{
- /*
+ /*
* make sure requests are marked for unwinding and adjacent
* continguous write buffers (each of size less than that of
* an iobuf) are packed properly so that iobufs are filled to
@@ -1945,18 +1907,18 @@ int32_t
wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
int32_t count, off_t offset, struct iobref *iobref)
{
- wb_file_t *file = NULL;
- char wb_disabled = 0;
+ wb_file_t *file = NULL;
+ char wb_disabled = 0;
call_frame_t *process_frame = NULL;
- size_t size = 0;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_local_t *local = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1;
- int32_t op_ret = -1, op_errno = EINVAL;
-
- if (vector != NULL)
+ size_t size = 0;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_local_t *local = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1;
+ int32_t op_ret = -1, op_errno = EINVAL;
+
+ if (vector != NULL)
size = iov_length (vector, count);
if ((!IA_ISDIR (fd->inode->ia_type))
@@ -1969,7 +1931,7 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
goto unwind;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
if ((!IA_ISDIR (fd->inode->ia_type)) && (file == NULL)) {
gf_log (this->name, GF_LOG_DEBUG,
"wb_file not found for fd %p", fd);
@@ -2001,14 +1963,13 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
}
if (op_ret == -1) {
- STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno,
- NULL, NULL);
+ STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, NULL,
+ NULL);
return 0;
}
if (wb_disabled) {
- STACK_WIND (frame, wb_writev_cbk,
- FIRST_CHILD (frame->this),
+ STACK_WIND (frame, wb_writev_cbk, FIRST_CHILD (frame->this),
FIRST_CHILD (frame->this)->fops->writev,
fd, vector, count, offset, iobref);
return 0;
@@ -2043,7 +2004,7 @@ wb_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,
op_errno = ENOMEM;
goto unwind;
}
-
+
ret = wb_process_queue (process_frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
op_errno = ENOMEM;
@@ -2074,10 +2035,10 @@ wb_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, struct iovec *vector, int32_t count,
struct iatt *stbuf, struct iobref *iobref)
{
- wb_local_t *local = NULL;
- wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ wb_file_t *file = NULL;
wb_request_t *request = NULL;
- int32_t ret = 0;
+ int32_t ret = 0;
local = frame->local;
file = local->file;
@@ -2085,7 +2046,7 @@ wb_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
if ((request != NULL) && (file != NULL)) {
wb_request_unref (request);
-
+
ret = wb_process_queue (frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
op_ret = -1;
@@ -2093,7 +2054,8 @@ wb_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
}
}
- STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count, stbuf, iobref);
+ STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count,
+ stbuf, iobref);
return 0;
}
@@ -2103,12 +2065,9 @@ static int32_t
wb_readv_helper (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
off_t offset)
{
- STACK_WIND (frame,
- wb_readv_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->readv,
- fd, size, offset);
-
+ STACK_WIND (frame, wb_readv_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->readv, fd, size, offset);
+
return 0;
}
@@ -2117,12 +2076,12 @@ int32_t
wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
off_t offset)
{
- wb_file_t *file = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- int32_t ret = -1;
- wb_request_t *request = NULL;
+ wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ int32_t ret = -1;
+ wb_request_t *request = NULL;
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
@@ -2130,18 +2089,17 @@ wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
" not stored in context of fd(%p), returning EBADFD",
fd);
- STACK_UNWIND_STRICT (readv, frame, -1, EBADFD,
- NULL, 0, NULL, NULL);
+ STACK_UNWIND_STRICT (readv, frame, -1, EBADFD, NULL, 0, NULL,
+ NULL);
return 0;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
- local = GF_CALLOC (1, sizeof (*local),
- gf_wb_mt_wb_local_t);
+ local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
if (local == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM,
- NULL, 0, NULL, NULL);
+ STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0, NULL,
+ NULL);
return 0;
}
@@ -2152,31 +2110,29 @@ wb_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
stub = fop_readv_stub (frame, wb_readv_helper, fd, size,
offset);
if (stub == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM,
- NULL, 0, NULL, NULL);
+ STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
+ NULL, NULL);
return 0;
}
request = wb_enqueue (file, stub);
if (request == NULL) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM,
- NULL, 0, NULL, NULL);
+ STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
+ NULL, NULL);
call_stub_destroy (stub);
return 0;
}
ret = wb_process_queue (frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
- STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM,
- NULL, 0, NULL, NULL);
+ STACK_UNWIND_STRICT (readv, frame, -1, ENOMEM, NULL, 0,
+ NULL, NULL);
call_stub_destroy (stub);
return 0;
}
} else {
- STACK_WIND (frame,
- wb_readv_cbk,
- FIRST_CHILD(this),
+ STACK_WIND (frame, wb_readv_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->readv,
fd, size, offset);
}
@@ -2216,7 +2172,7 @@ wb_ffr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
}
UNLOCK (&file->lock);
}
-
+
STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno);
return 0;
@@ -2253,7 +2209,7 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
wb_request_unref (local->request);
}
-
+
if (conf->flush_behind) {
flush_frame = copy_frame (frame);
if (flush_frame == NULL) {
@@ -2261,17 +2217,11 @@ wb_flush_helper (call_frame_t *frame, xlator_t *this, fd_t *fd)
goto unwind;
}
- STACK_WIND (flush_frame,
- wb_ffr_bg_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->flush,
- fd);
+ STACK_WIND (flush_frame, wb_ffr_bg_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->flush, fd);
} else {
- STACK_WIND (frame,
- wb_ffr_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->flush,
- fd);
+ STACK_WIND (frame, wb_ffr_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->flush, fd);
}
if (process_frame != NULL) {
@@ -2299,14 +2249,14 @@ unwind:
int32_t
wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
{
- wb_conf_t *conf = NULL;
- wb_file_t *file = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
+ wb_conf_t *conf = NULL;
+ wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
call_frame_t *flush_frame = NULL;
- wb_request_t *request = NULL;
- int32_t ret = 0;
+ wb_request_t *request = NULL;
+ int32_t ret = 0;
conf = this->private;
@@ -2320,7 +2270,7 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
return 0;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
if (file != NULL) {
local = GF_CALLOC (1, sizeof (*local), gf_wb_mt_wb_local_t);
@@ -2362,17 +2312,12 @@ wb_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)
STACK_UNWIND_STRICT (flush, frame, 0, 0);
- STACK_WIND (flush_frame,
- wb_ffr_bg_cbk,
+ STACK_WIND (flush_frame, wb_ffr_bg_cbk,
FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->flush,
- fd);
+ FIRST_CHILD(this)->fops->flush, fd);
} else {
- STACK_WIND (frame,
- wb_ffr_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->flush,
- fd);
+ STACK_WIND (frame, wb_ffr_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->flush, fd);
}
}
@@ -2384,10 +2329,10 @@ static int32_t
wb_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf)
{
- wb_local_t *local = NULL;
- wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ wb_file_t *file = NULL;
wb_request_t *request = NULL;
- int32_t ret = -1;
+ int32_t ret = -1;
local = frame->local;
file = local->file;
@@ -2417,7 +2362,7 @@ wb_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,
}
STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf);
-
+
return 0;
}
@@ -2426,11 +2371,8 @@ static int32_t
wb_fsync_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,
int32_t datasync)
{
- STACK_WIND (frame,
- wb_fsync_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->fsync,
- fd, datasync);
+ STACK_WIND (frame, wb_fsync_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fsync, fd, datasync);
return 0;
}
@@ -2438,12 +2380,12 @@ wb_fsync_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,
int32_t
wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
{
- wb_file_t *file = NULL;
- wb_local_t *local = NULL;
- uint64_t tmp_file = 0;
- call_stub_t *stub = NULL;
- wb_request_t *request = NULL;
- int32_t ret = -1;
+ wb_file_t *file = NULL;
+ wb_local_t *local = NULL;
+ uint64_t tmp_file = 0;
+ call_stub_t *stub = NULL;
+ wb_request_t *request = NULL;
+ int32_t ret = -1;
if ((!IA_ISDIR (fd->inode->ia_type))
&& fd_ctx_get (fd, this, &tmp_file)) {
@@ -2455,7 +2397,7 @@ wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
return 0;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
local = GF_CALLOC (1, sizeof (*local),
gf_wb_mt_wb_local_t);
@@ -2471,33 +2413,29 @@ wb_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync)
if (file) {
stub = fop_fsync_stub (frame, wb_fsync_helper, fd, datasync);
if (stub == NULL) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM,
- NULL, NULL);
+ STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
+ NULL);
return 0;
}
-
+
request = wb_enqueue (file, stub);
if (request == NULL) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM,
- NULL, NULL);
+ STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
+ NULL);
call_stub_destroy (stub);
return 0;
}
ret = wb_process_queue (frame, file);
if ((ret == -1) && (errno == ENOMEM)) {
- STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM,
- NULL, NULL);
+ STACK_UNWIND_STRICT (fsync, frame, -1, ENOMEM, NULL,
+ NULL);
call_stub_destroy (stub);
return 0;
}
-
} else {
- STACK_WIND (frame,
- wb_fsync_cbk,
- FIRST_CHILD(this),
- FIRST_CHILD(this)->fops->fsync,
- fd, datasync);
+ STACK_WIND (frame, wb_fsync_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->fsync, fd, datasync);
}
return 0;
@@ -2508,9 +2446,9 @@ int32_t
wb_release (xlator_t *this, fd_t *fd)
{
uint64_t file_ptr = 0;
- wb_file_t *file = NULL;
+ wb_file_t *file = NULL;
- fd_ctx_get (fd, this, &file_ptr);
+ fd_ctx_get (fd, this, &file_ptr);
file = (wb_file_t *) (long) file_ptr;
if (file != NULL) {
@@ -2526,22 +2464,19 @@ wb_release (xlator_t *this, fd_t *fd)
return 0;
}
+
int
wb_priv_dump (xlator_t *this)
{
- wb_conf_t *conf = NULL;
- char key[GF_DUMP_MAX_BUF_LEN];
- char key_prefix[GF_DUMP_MAX_BUF_LEN];
+ wb_conf_t *conf = NULL;
+ char key[GF_DUMP_MAX_BUF_LEN] = {0, };
+ char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, };
+ int ret = -1;
- if (!this)
- return -1;
+ GF_VALIDATE_OR_GOTO ("write-behind", this, out);
conf = this->private;
- if (!conf) {
- gf_log (this->name, GF_LOG_WARNING,
- "conf null in xlator");
- return -1;
- }
+ GF_VALIDATE_OR_GOTO (this->name, conf, out);
gf_proc_dump_build_key (key_prefix,
"xlator.performance.write-behind",
@@ -2562,16 +2497,18 @@ wb_priv_dump (xlator_t *this)
gf_proc_dump_build_key (key, key_prefix, "enable_trickling_writes");
gf_proc_dump_write (key, "%d", conf->enable_trickling_writes);
- return 0;
+ ret = 0;
+out:
+ return ret;
}
void
__wb_dump_requests (struct list_head *head, char *prefix, char passive)
{
- char key[GF_DUMP_MAX_BUF_LEN];
- char key_prefix[GF_DUMP_MAX_BUF_LEN];
- wb_request_t *request = NULL;
+ char key[GF_DUMP_MAX_BUF_LEN] = {0, };
+ char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, }, flag = 0;
+ wb_request_t *request = NULL;
list_for_each_entry (request, head, list) {
gf_proc_dump_build_key (key, prefix,
@@ -2589,9 +2526,9 @@ __wb_dump_requests (struct list_head *head, char *prefix, char passive)
gf_proc_dump_write (key, "%d", request->refcount);
if (request->fop == GF_FOP_WRITE) {
+ flag = request->flags.write_request.stack_wound;
gf_proc_dump_build_key (key, key_prefix, "stack_wound");
- gf_proc_dump_write (key, "%d",
- request->flags.write_request.stack_wound);
+ gf_proc_dump_write (key, "%d", flag);
gf_proc_dump_build_key (key, key_prefix, "size");
gf_proc_dump_write (key, "%"GF_PRI_SIZET,
@@ -2601,27 +2538,27 @@ __wb_dump_requests (struct list_head *head, char *prefix, char passive)
gf_proc_dump_write (key, "%"PRId64,
request->stub->args.writev.off);
+ flag = request->flags.write_request.write_behind;
gf_proc_dump_build_key (key, key_prefix,
"write_behind");
- gf_proc_dump_write (key, "%d",
- request->flags.write_request.write_behind);
+ gf_proc_dump_write (key, "%d", flag);
+ flag = request->flags.write_request.got_reply;
gf_proc_dump_build_key (key, key_prefix, "got_reply");
- gf_proc_dump_write (key, "%d",
- request->flags.write_request.got_reply);
+ gf_proc_dump_write (key, "%d", flag);
+ flag = request->flags.write_request.virgin;
gf_proc_dump_build_key (key, key_prefix, "virgin");
- gf_proc_dump_write (key, "%d",
- request->flags.write_request.virgin);
+ gf_proc_dump_write (key, "%d", flag);
+ flag = request->flags.write_request.flush_all;
gf_proc_dump_build_key (key, key_prefix, "flush_all");
- gf_proc_dump_write (key, "%d",
- request->flags.write_request.flush_all);
+ gf_proc_dump_write (key, "%d", flag);
} else {
+ flag = request->flags.other_requests.marked_for_resume;
gf_proc_dump_build_key (key, key_prefix,
"marked_for_resume");
- gf_proc_dump_write (key, "%d",
- request->flags.other_requests.marked_for_resume);
+ gf_proc_dump_write (key, "%d", flag);
}
}
}
@@ -2630,11 +2567,11 @@ __wb_dump_requests (struct list_head *head, char *prefix, char passive)
int
wb_file_dump (xlator_t *this, fd_t *fd)
{
- wb_file_t *file = NULL;
- uint64_t tmp_file = 0;
- int32_t ret = -1;
- char key[GF_DUMP_MAX_BUF_LEN];
- char key_prefix[GF_DUMP_MAX_BUF_LEN];
+ wb_file_t *file = NULL;
+ uint64_t tmp_file = 0;
+ int32_t ret = -1;
+ char key[GF_DUMP_MAX_BUF_LEN] = {0, };
+ char key_prefix[GF_DUMP_MAX_BUF_LEN] = {0, };
if ((fd == NULL) || (this == NULL)) {
ret = 0;
@@ -2647,7 +2584,7 @@ wb_file_dump (xlator_t *this, fd_t *fd)
goto out;
}
- file = (wb_file_t *)(long)tmp_file;
+ file = (wb_file_t *)(long)tmp_file;
if (file == NULL) {
ret = 0;
goto out;
@@ -2702,7 +2639,7 @@ wb_file_dump (xlator_t *this, fd_t *fd)
}
}
UNLOCK (&file->lock);
-
+
out:
return ret;
}
@@ -2727,25 +2664,22 @@ mem_acct_init (xlator_t *this)
return ret;
}
+
int
validate_options (xlator_t *this, dict_t *options, char **op_errstr)
{
- char *str=NULL;
- uint64_t window_size;
- gf_boolean_t flush_behind;
-
- int ret = 0;
-
-
+ char *str = NULL;
+ uint64_t window_size = 0;;
+ gf_boolean_t flush_behind = 0;
+ int ret = 0;
- ret = dict_get_str (options, "cache-size",
- &str);
+ ret = dict_get_str (options, "cache-size", &str);
if (ret == 0) {
ret = gf_string2bytesize (str, &window_size);
if (ret != 0) {
gf_log(this->name, GF_LOG_WARNING, "Validation"
- "'option cache-size %s failed , Invalid"
- " number format, ", str);
+ "'option cache-size %s failed , Invalid"
+ " number format, ", str);
*op_errstr = gf_strdup ("Error, Invalid num format");
ret = -1;
goto out;
@@ -2753,8 +2687,8 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
if (window_size < (512 * GF_UNIT_KB)) {
gf_log(this->name, GF_LOG_WARNING, "Validation"
- "'option cache-size %s' failed , Min value"
- "should be 512KiB ", str);
+ "'option cache-size %s' failed , Min value"
+ "should be 512KiB ", str);
*op_errstr = gf_strdup ("Error, Should be min 512KB");
ret = -1;
goto out;
@@ -2762,21 +2696,21 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
if (window_size > (1 * GF_UNIT_GB)) {
gf_log(this->name, GF_LOG_WARNING, "Reconfiguration"
- "'option cache-size %s' failed , Max value"
- "can be 1 GiB", str);
+ "'option cache-size %s' failed , Max value"
+ "can be 1 GiB", str);
*op_errstr = gf_strdup ("Error, Max Value is 1GB");
ret = -1;
goto out;
}
-
gf_log(this->name, GF_LOG_DEBUG, "Validated "
- "'option cache-size %s '", str);
+ "'option cache-size %s '", str);
}
- ret = dict_get_str (options, "flush-behind",
+
+ ret = dict_get_str (options, "flush-behind",
&str);
if (ret == 0) {
- ret = gf_string2boolean (str,
+ ret = gf_string2boolean (str,
&flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_WARNING,
@@ -2786,23 +2720,24 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
goto out;
}
}
+
ret =0;
out:
- return ret;
-
+ return ret;
}
+
int
reconfigure (xlator_t *this, dict_t *options)
{
- char *str=NULL;
- uint64_t window_size;
- wb_conf_t *conf = NULL;
- int ret = 0;
+ char *str = NULL;
+ uint64_t window_size = 0;
+ wb_conf_t *conf = NULL;
+ int ret = 0;
- conf = this->private;
+ conf = this->private;
- ret = dict_get_str (options, "cache-size",
+ ret = dict_get_str (options, "cache-size",
&str);
if (ret == 0) {
ret = gf_string2bytesize (str, &window_size);
@@ -2811,40 +2746,40 @@ reconfigure (xlator_t *this, dict_t *options)
"'option cache-size %s failed , Invalid"
" number format, Defaulting to old value "
"(%"PRIu64")", str, conf->window_size);
- ret = -1;
- goto out;
+ ret = -1;
+ goto out;
}
- if (window_size < (512 * GF_UNIT_KB)) {
+ if (window_size < (512 * GF_UNIT_KB)) {
gf_log(this->name, GF_LOG_ERROR, "Reconfiguration"
"'option cache-size %s' failed , Max value"
"can be 512KiB, Defaulting to old value "
"(%"PRIu64")", str, conf->window_size);
- ret = -1;
- goto out;
+ ret = -1;
+ goto out;
}
- if (window_size > (2 * GF_UNIT_GB)) {
+ if (window_size > (2 * GF_UNIT_GB)) {
gf_log(this->name, GF_LOG_ERROR, "Reconfiguration"
"'option cache-size %s' failed , Max value"
"can be 1 GiB, Defaulting to old value "
"(%"PRIu64")", str, conf->window_size);
- ret = -1;
- goto out;
+ ret = -1;
+ goto out;
}
- conf->window_size = window_size;
- gf_log(this->name, GF_LOG_DEBUG, "Reconfiguring "
+ conf->window_size = window_size;
+ gf_log(this->name, GF_LOG_DEBUG, "Reconfiguring "
"'option cache-size %s ' to %"PRIu64, str,
conf->window_size);
- }
- else
+ } else {
conf->window_size = WB_WINDOW_SIZE;
-
- ret = dict_get_str (options, "flush-behind",
+ }
+
+ ret = dict_get_str (options, "flush-behind",
&str);
if (ret == 0) {
- ret = gf_string2boolean (str,
+ ret = gf_string2boolean (str,
&conf->flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
@@ -2852,28 +2787,28 @@ reconfigure (xlator_t *this, dict_t *options)
conf->flush_behind = 1;
return -1;
}
+
if (conf->flush_behind) {
gf_log (this->name, GF_LOG_DEBUG,
"enabling flush-behind");
- }
- else
- gf_log (this->name, GF_LOG_DEBUG,
+ } else {
+ gf_log (this->name, GF_LOG_DEBUG,
"disabling flush-behind");
+ }
}
-
out:
- return 0;
-
+ return 0;
}
-int32_t
+
+int32_t
init (xlator_t *this)
{
dict_t *options = NULL;
- wb_conf_t *conf = NULL;
- char *str = NULL;
- int32_t ret = -1;
+ wb_conf_t *conf = NULL;
+ char *str = NULL;
+ int32_t ret = -1;
if ((this->children == NULL)
|| this->children->next) {
@@ -2888,7 +2823,7 @@ init (xlator_t *this)
gf_log (this->name, GF_LOG_WARNING,
"dangling volume. check volfile");
}
-
+
options = this->options;
conf = GF_CALLOC (1, sizeof (*conf), gf_wb_mt_wb_conf_t);
@@ -2897,7 +2832,7 @@ init (xlator_t *this)
"FATAL: Out of memory");
return -1;
}
-
+
conf->enable_O_SYNC = _gf_false;
ret = dict_get_str (options, "enable-O_SYNC",
&str);
@@ -2914,35 +2849,35 @@ init (xlator_t *this)
/* configure 'options aggregate-size <size>' */
conf->aggregate_size = WB_AGGREGATE_SIZE;
conf->disable_till = 0;
- ret = dict_get_str (options, "disable-for-first-nbytes",
+ ret = dict_get_str (options, "disable-for-first-nbytes",
&str);
if (ret == 0) {
- ret = gf_string2bytesize (str,
+ ret = gf_string2bytesize (str,
&conf->disable_till);
if (ret != 0) {
- gf_log (this->name, GF_LOG_ERROR,
+ gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
- "disable-for-first-nbytes\"",
+ "disable-for-first-nbytes\"",
str);
return -1;
}
}
gf_log (this->name, GF_LOG_DEBUG,
- "disabling write-behind for first %"PRIu64" bytes",
+ "disabling write-behind for first %"PRIu64" bytes",
conf->disable_till);
-
+
/* configure 'option window-size <size>' */
- conf->window_size = WB_WINDOW_SIZE;
- ret = dict_get_str (options, "cache-size",
+ conf->window_size = WB_WINDOW_SIZE;
+ ret = dict_get_str (options, "cache-size",
&str);
if (ret == 0) {
- ret = gf_string2bytesize (str,
+ ret = gf_string2bytesize (str,
&conf->window_size);
if (ret != 0) {
- gf_log (this->name, GF_LOG_ERROR,
+ gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
- "window-size\"",
+ "window-size\"",
str);
GF_FREE (conf);
return -1;
@@ -2968,10 +2903,10 @@ init (xlator_t *this)
/* configure 'option flush-behind <on/off>' */
conf->flush_behind = 1;
- ret = dict_get_str (options, "flush-behind",
+ ret = dict_get_str (options, "flush-behind",
&str);
if (ret == 0) {
- ret = gf_string2boolean (str,
+ ret = gf_string2boolean (str,
&conf->flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
@@ -2980,8 +2915,8 @@ init (xlator_t *this)
}
if (conf->flush_behind) {
- gf_log (this->name, GF_LOG_DEBUG,
- "enabling flush-behind");
+ gf_log (this->name, GF_LOG_DEBUG,
+ "enabling flush-behind");
}
}
@@ -3011,6 +2946,7 @@ fini (xlator_t *this)
if (!conf)
return;
+
this->private = NULL;
GF_FREE (conf);
return;
@@ -3031,7 +2967,6 @@ struct xlator_fops fops = {
.setattr = wb_setattr,
};
-
struct xlator_cbks cbks = {
.release = wb_release
};
@@ -3042,13 +2977,13 @@ struct xlator_dumpops dumpops = {
};
struct volume_options options[] = {
- { .key = {"flush-behind"},
+ { .key = {"flush-behind"},
.type = GF_OPTION_TYPE_BOOL
},
- { .key = {"cache-size", "window-size"},
- .type = GF_OPTION_TYPE_SIZET,
- .min = 512 * GF_UNIT_KB,
- .max = 1 * GF_UNIT_GB
+ { .key = {"cache-size", "window-size"},
+ .type = GF_OPTION_TYPE_SIZET,
+ .min = 512 * GF_UNIT_KB,
+ .max = 1 * GF_UNIT_GB
},
{ .key = {"disable-for-first-nbytes"},
.type = GF_OPTION_TYPE_SIZET,
@@ -3057,7 +2992,7 @@ struct volume_options options[] = {
},
{ .key = {"enable-O_SYNC"},
.type = GF_OPTION_TYPE_BOOL,
- },
+ },
{ .key = {"enable-trickling-writes"},
.type = GF_OPTION_TYPE_BOOL,
},