features/quota: Remember '/' loc_t to initiate xattr calls.

Signed-off-by: Pavan Vilas Sondur <pavan@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>

BUG: 685 (writing to a file fails complaining of "Transport endpoint not being connected")
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=685
This commit is contained in:
Pavan Sondur 2010-03-02 03:45:26 +00:00 committed by Anand V. Avati
parent 2c7e6f22f7
commit f2097590eb

View File

@ -56,6 +56,8 @@ struct quota_priv {
uint32_t current_free_disk; /* current free disk space available, in % */
uint32_t refresh_interval; /* interval in seconds */
uint32_t min_disk_last_updated_time; /* used for interval calculation */
loc_t root_loc; /* Store '/' loc_t to make xattr calls */
};
@ -75,14 +77,6 @@ quota_statvfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
}
static void
build_root_loc (xlator_t *this, loc_t *loc)
{
memset (loc, 0, sizeof (*loc));
loc->path = "/";
}
void
gf_quota_usage_subtract (xlator_t *this, size_t size)
{
@ -119,16 +113,17 @@ gf_quota_update_current_free_disk (xlator_t *this)
{
call_frame_t *frame = NULL;
call_pool_t *pool = NULL;
loc_t loc;
struct quota_priv *priv = NULL;
pool = this->ctx->pool;
frame = create_frame (this, pool);
build_root_loc (this, &loc);
priv = this->private;
STACK_WIND (frame, quota_statvfs_cbk,
this->children->xlator,
this->children->xlator->fops->statfs, &loc);
this->children->xlator->fops->statfs, &(priv->root_loc));
return ;
}
@ -708,7 +703,7 @@ quota_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (priv->disk_usage_limit) {
if (op_ret >= 0) {
gf_quota_usage_add (this, (postbuf->st_blocks -
local->stbuf.st_blocks) * 512);
prebuf->st_blocks) * 512);
}
fd_unref (local->fd);
iobref_unref (local->iobref);
@ -915,16 +910,17 @@ gf_quota_get_disk_usage (xlator_t *this)
{
call_frame_t *frame = NULL;
call_pool_t *pool = NULL;
loc_t loc;
struct quota_priv *priv = NULL;
pool = this->ctx->pool;
frame = create_frame (this, pool);
build_root_loc (this, &loc);
priv = this->private;
STACK_WIND (frame, quota_getxattr_cbk,
this->children->xlator,
this->children->xlator->fops->getxattr,
&loc,
&(priv->root_loc),
"trusted.glusterfs-quota-du");
return ;
}
@ -936,11 +932,10 @@ gf_quota_cache_sync (xlator_t *this)
struct quota_priv *priv = NULL;
call_frame_t *frame = NULL;
dict_t *dict = get_new_dict ();
loc_t loc;
priv = this->private;
build_root_loc (this, &loc);
frame = create_frame (this, this->ctx->pool);
dict_set (dict, "trusted.glusterfs-quota-du",
@ -952,7 +947,7 @@ gf_quota_cache_sync (xlator_t *this)
(void *) (dict_t *) dict,
this->children->xlator,
this->children->xlator->fops->setxattr,
&loc, dict, 0);
&(priv->root_loc), dict, 0);
}
@ -972,25 +967,58 @@ notify (xlator_t *this,
void *data,
...)
{
struct quota_priv *priv = this->private;
switch (event)
{
case GF_EVENT_CHILD_UP:
if (priv->only_first_time) {
priv->only_first_time = 0;
if (priv->disk_usage_limit) {
gf_quota_get_disk_usage (this);
}
}
default:
default_notify (this, event, data);
break;
}
default_notify (this, event, data);
return 0;
}
int32_t
quota_lookup_cbk (call_frame_t *frame,
void *cookie,
xlator_t *this,
int32_t op_ret,
int32_t op_errno,
inode_t *inode,
struct stat *buf,
dict_t *dict,
struct stat *postparent)
{
STACK_UNWIND (frame,
op_ret,
op_errno,
inode,
buf,
dict,
postparent);
return 0;
}
int32_t
quota_lookup (call_frame_t *frame,
xlator_t *this,
loc_t *loc,
dict_t *xattr_req)
{
struct quota_priv *priv = NULL;
priv = this->private;
if (priv->only_first_time) {
if (strcmp (loc->path, "/") == 0) {
loc_copy(&(priv->root_loc), loc);
priv->only_first_time = 0;
if (priv->disk_usage_limit)
gf_quota_get_disk_usage (this);
}
}
STACK_WIND (frame,
quota_lookup_cbk,
FIRST_CHILD(this),
FIRST_CHILD(this)->fops->lookup,
loc,
xattr_req);
return 0;
}
int32_t
init (xlator_t *this)
@ -1071,6 +1099,7 @@ fini (xlator_t *this)
struct xlator_fops fops = {
.create = quota_create,
.open = quota_open,
.lookup = quota_lookup,
.truncate = quota_truncate,
.ftruncate = quota_ftruncate,
.writev = quota_writev,