Blame libglusterfs/src/defaults-tmpl.c

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
}