|
Packit |
b2c0d9 |
/*
|
|
Packit |
b2c0d9 |
Copyright (c) 2008-2015 Red Hat, Inc. <http://www.redhat.com>
|
|
Packit |
b2c0d9 |
This file is part of GlusterFS.
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
This file is licensed to you under your choice of the GNU Lesser
|
|
Packit |
b2c0d9 |
General Public License, version 3 or any later version (LGPLv3 or
|
|
Packit |
b2c0d9 |
later), or the GNU General Public License, version 2 (GPLv2), in all
|
|
Packit |
b2c0d9 |
cases as published by the Free Software Foundation.
|
|
Packit |
b2c0d9 |
*/
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
/* libglusterfs/src/defaults.c:
|
|
Packit |
b2c0d9 |
This file contains functions, which are used to fill the 'fops', 'cbk'
|
|
Packit |
b2c0d9 |
structures in the xlator structures, if they are not written. Here, all the
|
|
Packit |
b2c0d9 |
function calls are plainly forwarded to the first child of the xlator, and
|
|
Packit |
b2c0d9 |
all the *_cbk function does plain STACK_UNWIND of the frame, and returns.
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
This function also implements *_resume () functions, which does same
|
|
Packit |
b2c0d9 |
operation as a fop().
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
All the functions are plain enough to understand.
|
|
Packit |
b2c0d9 |
*/
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
#ifndef _CONFIG_H
|
|
Packit |
b2c0d9 |
#define _CONFIG_H
|
|
Packit |
b2c0d9 |
#include "config.h"
|
|
Packit |
b2c0d9 |
#endif
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
#include "glusterfs/xlator.h"
|
|
Packit |
b2c0d9 |
#include "glusterfs/defaults.h"
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
#pragma generate
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
struct xlator_fops _default_fops = {
|
|
Packit |
b2c0d9 |
.create = default_create,
|
|
Packit |
b2c0d9 |
.open = default_open,
|
|
Packit |
b2c0d9 |
.stat = default_stat,
|
|
Packit |
b2c0d9 |
.readlink = default_readlink,
|
|
Packit |
b2c0d9 |
.mknod = default_mknod,
|
|
Packit |
b2c0d9 |
.mkdir = default_mkdir,
|
|
Packit |
b2c0d9 |
.unlink = default_unlink,
|
|
Packit |
b2c0d9 |
.rmdir = default_rmdir,
|
|
Packit |
b2c0d9 |
.symlink = default_symlink,
|
|
Packit |
b2c0d9 |
.rename = default_rename,
|
|
Packit |
b2c0d9 |
.link = default_link,
|
|
Packit |
b2c0d9 |
.truncate = default_truncate,
|
|
Packit |
b2c0d9 |
.readv = default_readv,
|
|
Packit |
b2c0d9 |
.writev = default_writev,
|
|
Packit |
b2c0d9 |
.statfs = default_statfs,
|
|
Packit |
b2c0d9 |
.flush = default_flush,
|
|
Packit |
b2c0d9 |
.fsync = default_fsync,
|
|
Packit |
b2c0d9 |
.setxattr = default_setxattr,
|
|
Packit |
b2c0d9 |
.getxattr = default_getxattr,
|
|
Packit |
b2c0d9 |
.fsetxattr = default_fsetxattr,
|
|
Packit |
b2c0d9 |
.fgetxattr = default_fgetxattr,
|
|
Packit |
b2c0d9 |
.removexattr = default_removexattr,
|
|
Packit |
b2c0d9 |
.fremovexattr = default_fremovexattr,
|
|
Packit |
b2c0d9 |
.opendir = default_opendir,
|
|
Packit |
b2c0d9 |
.readdir = default_readdir,
|
|
Packit |
b2c0d9 |
.readdirp = default_readdirp,
|
|
Packit |
b2c0d9 |
.fsyncdir = default_fsyncdir,
|
|
Packit |
b2c0d9 |
.access = default_access,
|
|
Packit |
b2c0d9 |
.ftruncate = default_ftruncate,
|
|
Packit |
b2c0d9 |
.fstat = default_fstat,
|
|
Packit |
b2c0d9 |
.lk = default_lk,
|
|
Packit |
b2c0d9 |
.inodelk = default_inodelk,
|
|
Packit |
b2c0d9 |
.finodelk = default_finodelk,
|
|
Packit |
b2c0d9 |
.entrylk = default_entrylk,
|
|
Packit |
b2c0d9 |
.fentrylk = default_fentrylk,
|
|
Packit |
b2c0d9 |
.lookup = default_lookup,
|
|
Packit |
b2c0d9 |
.rchecksum = default_rchecksum,
|
|
Packit |
b2c0d9 |
.xattrop = default_xattrop,
|
|
Packit |
b2c0d9 |
.fxattrop = default_fxattrop,
|
|
Packit |
b2c0d9 |
.setattr = default_setattr,
|
|
Packit |
b2c0d9 |
.fsetattr = default_fsetattr,
|
|
Packit |
b2c0d9 |
.fallocate = default_fallocate,
|
|
Packit |
b2c0d9 |
.discard = default_discard,
|
|
Packit |
b2c0d9 |
.zerofill = default_zerofill,
|
|
Packit |
b2c0d9 |
.ipc = default_ipc,
|
|
Packit |
b2c0d9 |
.seek = default_seek,
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
.getspec = default_getspec,
|
|
Packit |
b2c0d9 |
.getactivelk = default_getactivelk,
|
|
Packit |
b2c0d9 |
.setactivelk = default_setactivelk,
|
|
Packit |
b2c0d9 |
.put = default_put,
|
|
Packit |
b2c0d9 |
.icreate = default_icreate,
|
|
Packit |
b2c0d9 |
.namelink = default_namelink,
|
|
Packit |
b2c0d9 |
.copy_file_range = default_copy_file_range,
|
|
Packit |
b2c0d9 |
};
|
|
Packit |
b2c0d9 |
struct xlator_fops *default_fops = &_default_fops;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
/*
|
|
Packit |
b2c0d9 |
* Remaining functions don't follow the fop calling conventions, so they're
|
|
Packit |
b2c0d9 |
* not generated.
|
|
Packit |
b2c0d9 |
*/
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
int32_t
|
|
Packit |
b2c0d9 |
default_forget(xlator_t *this, inode_t *inode)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
gf_log_callingfn(this->name, GF_LOG_DEBUG,
|
|
Packit |
b2c0d9 |
"xlator does not "
|
|
Packit |
b2c0d9 |
"implement forget_cbk");
|
|
Packit |
b2c0d9 |
return 0;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
int32_t
|
|
Packit |
b2c0d9 |
default_releasedir(xlator_t *this, fd_t *fd)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
gf_log_callingfn(this->name, GF_LOG_DEBUG,
|
|
Packit |
b2c0d9 |
"xlator does not "
|
|
Packit |
b2c0d9 |
"implement releasedir_cbk");
|
|
Packit |
b2c0d9 |
return 0;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
int32_t
|
|
Packit |
b2c0d9 |
default_release(xlator_t *this, fd_t *fd)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
gf_log_callingfn(this->name, GF_LOG_DEBUG,
|
|
Packit |
b2c0d9 |
"xlator does not "
|
|
Packit |
b2c0d9 |
"implement release_cbk");
|
|
Packit |
b2c0d9 |
return 0;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
/* notify */
|
|
Packit |
b2c0d9 |
int
|
|
Packit |
b2c0d9 |
default_notify(xlator_t *this, int32_t event, void *data, ...)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
GF_UNUSED int ret = 0;
|
|
Packit |
b2c0d9 |
xlator_t *victim = data;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
switch (event) {
|
|
Packit |
b2c0d9 |
case GF_EVENT_PARENT_UP:
|
|
Packit |
b2c0d9 |
case GF_EVENT_PARENT_DOWN: {
|
|
Packit |
b2c0d9 |
xlator_list_t *list = this->children;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (list) {
|
|
Packit |
b2c0d9 |
if (victim && victim->cleanup_starting)
|
|
Packit |
b2c0d9 |
xlator_notify(list->xlator, event, victim);
|
|
Packit |
b2c0d9 |
else
|
|
Packit |
b2c0d9 |
xlator_notify(list->xlator, event, this);
|
|
Packit |
b2c0d9 |
list = list->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
} break;
|
|
Packit |
b2c0d9 |
case GF_EVENT_CHILD_CONNECTING:
|
|
Packit |
b2c0d9 |
case GF_EVENT_CHILD_DOWN:
|
|
Packit |
b2c0d9 |
case GF_EVENT_CHILD_UP:
|
|
Packit |
b2c0d9 |
case GF_EVENT_AUTH_FAILED: {
|
|
Packit |
b2c0d9 |
xlator_list_t *parent = this->parents;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
/*
|
|
Packit |
b2c0d9 |
* Handle case of CHILD_* & AUTH_FAILED event specially, send
|
|
Packit |
b2c0d9 |
* it to fuse.
|
|
Packit |
b2c0d9 |
*/
|
|
Packit |
b2c0d9 |
if (!parent && this->ctx && this->ctx->master) {
|
|
Packit |
b2c0d9 |
xlator_notify(this->ctx->master, event, this->graph, NULL);
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (parent) {
|
|
Packit |
b2c0d9 |
if (parent->xlator->init_succeeded)
|
|
Packit |
b2c0d9 |
xlator_notify(parent->xlator, event, this, NULL);
|
|
Packit |
b2c0d9 |
parent = parent->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
} break;
|
|
Packit |
b2c0d9 |
case GF_EVENT_UPCALL: {
|
|
Packit |
b2c0d9 |
xlator_list_t *parent = this->parents;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
if (!parent && this->ctx && this->ctx->master)
|
|
Packit |
b2c0d9 |
xlator_notify(this->ctx->master, event, data, NULL);
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (parent) {
|
|
Packit |
b2c0d9 |
if (parent->xlator->init_succeeded)
|
|
Packit |
b2c0d9 |
xlator_notify(parent->xlator, event, data, NULL);
|
|
Packit |
b2c0d9 |
parent = parent->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
} break;
|
|
Packit |
b2c0d9 |
case GF_EVENT_CHILD_PING: {
|
|
Packit |
b2c0d9 |
xlator_list_t *parent = this->parents;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (parent) {
|
|
Packit |
b2c0d9 |
if (parent->xlator->init_succeeded)
|
|
Packit |
b2c0d9 |
XLATOR_NOTIFY(ret, parent->xlator, event, this, data);
|
|
Packit |
b2c0d9 |
parent = parent->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
} break;
|
|
Packit |
b2c0d9 |
case GF_EVENT_CLEANUP: {
|
|
Packit |
b2c0d9 |
xlator_list_t *list = this->children;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (list) {
|
|
Packit |
b2c0d9 |
xlator_notify(list->xlator, event, this);
|
|
Packit |
b2c0d9 |
list = list->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
} break;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
default: {
|
|
Packit |
b2c0d9 |
xlator_list_t *parent = this->parents;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
while (parent) {
|
|
Packit |
b2c0d9 |
if (parent->xlator->init_succeeded)
|
|
Packit |
b2c0d9 |
xlator_notify(parent->xlator, event, this, NULL);
|
|
Packit |
b2c0d9 |
parent = parent->next;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
/*
|
|
Packit |
b2c0d9 |
* Apparently our picky-about-everything else coding standard allows
|
|
Packit |
b2c0d9 |
* adjacent same-indendation-level close braces. Clearly it has
|
|
Packit |
b2c0d9 |
* nothing to do with readability.
|
|
Packit |
b2c0d9 |
*/
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
return 0;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
int32_t
|
|
Packit |
b2c0d9 |
default_mem_acct_init(xlator_t *this)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
int ret = -1;
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
ret = xlator_mem_acct_init(this, gf_common_mt_end);
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
return ret;
|
|
Packit |
b2c0d9 |
}
|
|
Packit |
b2c0d9 |
|
|
Packit |
b2c0d9 |
void
|
|
Packit |
b2c0d9 |
default_fini(xlator_t *this)
|
|
Packit |
b2c0d9 |
{
|
|
Packit |
b2c0d9 |
if (this && this->private)
|
|
Packit |
b2c0d9 |
GF_FREE(this->private);
|
|
Packit |
b2c0d9 |
}
|