#include <linux/lustre_smfs.h>
#include "smfs_internal.h"
+#if 0
#define KML_BUF_REC_INIT(buffer, pbuf, len) \
do { \
pbuf = buffer + sizeof(int); \
RETURN(rc);
}
+/* not used curently */
static smfs_pack_rec_func smfs_get_rec_pack_type(struct super_block *sb)
{
int idx = 0;
idx = GET_REC_PACK_TYPE_INDEX(smsi->smsi_flags);
return smsi->smsi_pack_rec[idx];
}
+#endif
static inline void
copy_inode_attr(struct iattr *iattr, struct inode *inode)
int smfs_write_extents(struct inode *dir, struct dentry *dentry,
unsigned long from, unsigned long num)
{
- return 0;//smfs_post_rec_write(dir, dentry, &from, &num);
+ //smfs_post_rec_write(dir, dentry, &from, &num);
+ return 0;
}
#if 0
int smfs_rec_precreate(struct dentry *dentry, int *num, struct obdo *oa)
}
RETURN(rc);
}
-#endif
-#if 0
-/*smfs_path is gotten from intermezzo*/
-static char* smfs_path(struct dentry *dentry, struct dentry *root, char *buffer,
+/* smfs_path is gotten from intermezzo */
+static char *smfs_path(struct dentry *dentry, struct dentry *root, char *buffer,
int buflen)
{
char * end = buffer + buflen;
rc = fsfilt->fs_remove_extents_ea(inode, 0, 0xffffffff);
RETURN(rc);
}
+
static int smfs_init_extents_ea(struct inode *inode)
{
struct fsfilt_operations *fsfilt = S2SMI(inode->i_sb)->sm_fsfilt;
RETURN(rc);
}
+
static int smfs_set_dirty_flags(struct inode *inode, int flags)
{
struct fsfilt_operations *fsfilt = S2SMI(inode->i_sb)->sm_fsfilt;
return length;
}
#endif
-static int kml_create(struct inode * inode, void *arg, struct kml_priv * priv)
+
+static int kml_create(struct inode *inode, void *arg,
+ struct kml_priv *priv)
{
struct hook_msg * msg = arg;
//return smfs_post_rec_create(inode, msg->dentry, NULL, NULL);
RETURN(rc);
}
-static int kml_link(struct inode * inode, void *arg, struct kml_priv * priv)
+static int kml_link(struct inode *inode, void *arg, struct kml_priv *priv)
{
- struct hook_link_msg * msg = arg;
- int rc = 0, length = 0, buf_len = 0;
- char *buffer = NULL, *pbuf = NULL;
- struct smfs_super_info *smb;
+ struct hook_link_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
ENTRY;
OBD_ALLOC(buffer, PAGE_SIZE);
RETURN(rc);
}
-static int kml_symlink(struct inode * inode, void *arg, struct kml_priv * priv)
+static int kml_symlink(struct inode *inode, void *arg, struct kml_priv *priv)
{
- struct hook_symlink_msg * msg = arg;
struct smfs_super_info *smb = S2SMI(inode->i_sb);
- char *buffer = NULL, *pbuf;
+ struct hook_symlink_msg *msg = arg;
int rc = 0, length = 0;
+ char *buffer = NULL;
ENTRY;
OBD_ALLOC(buffer, PAGE_SIZE);
RETURN(rc);
}
-static int kml_rename(struct inode * inode, void *arg, struct kml_priv * priv)
+static int kml_rename(struct inode *inode, void *arg, struct kml_priv *priv)
{
- struct hook_rename_msg * msg = arg;
- char *buffer = NULL, *pbuf = NULL;
- int rc = 0, length = 0, buf_len = 0;
+ struct hook_rename_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
ENTRY;
OBD_ALLOC(buffer, PAGE_SIZE);
RETURN(rc);
}
-static int kml_setattr(struct inode * inode, void *arg, struct kml_priv * priv)
+static int kml_setattr(struct inode *inode, void *arg, struct kml_priv *priv)
{
- struct hook_setattr_msg * msg = arg;
- char *buffer = NULL, *pbuf;
- int rc = 0, length = 0, buf_len = 0;
+ struct hook_attr_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
ENTRY;
OBD_ALLOC(buffer, PAGE_SIZE);
GOTO(exit, rc);
length += rc;
- rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void*)buffer, length);
+ rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void *)buffer, length);
/*
if (!rc) {
if (attr && attr->ia_valid & ATTR_SIZE) {
OBD_FREE(buffer, PAGE_SIZE);
RETURN(rc);
}
+
+static int kml_setxattr(struct inode *inode, void *arg, struct kml_priv *priv)
+{
+ struct hook_xattr_msg *msg = arg;
+ struct kml_buffer kbuf;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (!buffer)
+ GOTO(exit, rc = -ENOMEM);
+
+ kbuf.buf = msg->buffer;
+ kbuf.buf_size = msg->buffer_size;
+
+ rc = priv->pack_fn(REINT_SETXATTR, buffer, NULL, inode,
+ msg->name, &kbuf);
+ if (rc <= 0)
+ GOTO(exit, rc);
+
+ length += rc;
+ rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void *)buffer, length);
+ /*
+ if (!rc) {
+ if (attr && attr->ia_valid & ATTR_SIZE) {
+ smfs_remove_extents_ea(inode, attr->ia_size,
+ 0xffffffff);
+ if (attr->ia_size == 0)
+ smfs_set_dirty_flags(inode, SMFS_OVER_WRITE);
+ else
+ smfs_set_dirty_flags(inode, SMFS_DIRTY_WRITE);
+ }
+ }
+ */
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
+ RETURN(rc);
+}
+
/*
static int kml_write(struct inode * inode, void *arg, struct kml_priv * priv)
{
}
*/
-typedef int (*post_kml_op)(struct inode * inode, void *msg, struct kml_priv * priv);
+typedef int (*post_kml_op)(struct inode *inode, void *msg,
+ struct kml_priv *priv);
+
static post_kml_op smfs_kml_post[HOOK_MAX] = {
[HOOK_CREATE] kml_create,
[HOOK_LOOKUP] NULL,
[HOOK_SETATTR] kml_setattr,
[HOOK_WRITE] NULL,
[HOOK_READDIR] NULL,
+ [HOOK_F_SETXATTR] kml_setxattr,
};
-static int smfs_kml_post_op(int code, struct inode * inode,
+static int smfs_kml_post_op(hook_op code, struct inode * inode,
void * msg, int ret, void * priv)
{
int rc = 0;
ENTRY;
-
+
+ //check if inode has flag for KML
+ if (!SMFS_IS(I2SMI(inode)->smi_flags, SMFS_PLG_KML))
+ RETURN(0);
+
//KML don't handle failed ops
if (ret)
RETURN(0);
-
+
if (smfs_kml_post[code]) {
- CDEBUG(D_INODE,"KML: inode %lu, code: %u\n", inode->i_ino, code);
+ CDEBUG(D_INODE,"KML: inode %lu, code: %u\n",
+ inode->i_ino, code);
rc = smfs_kml_post[code](inode, msg, priv);
}
}
/* Helpers */
-static int smfs_exit_kml(struct super_block *sb, void * arg, struct kml_priv * priv)
-{
- ENTRY;
-
- smfs_deregister_plugin(sb, SMFS_PLG_KML);
- OBD_FREE(priv, sizeof(*priv));
-
- EXIT;
- return 0;
-}
-
static int smfs_trans_kml (struct super_block *sb, void *arg,
struct kml_priv * priv)
{
- int size;
-
- //TODO: pass fs opcode and see if kml can participate or not
- //one record in log per operation
- size = 1;
+ int size = 1;
+ ENTRY;
- return size;
-}
+ /* FIXME-MIKE: pass fs opcode and see if kml can participate or not one
+ * record in log per operation size = 1 */
-extern int mds_rec_pack(int, char*, struct dentry*, struct inode*, void*, void*);
+ RETURN(size);
+}
static int smfs_start_kml(struct super_block *sb, void *arg,
- struct kml_priv * kml_p)
+ struct kml_priv *kml_p)
{
- int rc = 0;
- struct smfs_super_info * smb = S2SMI(sb);
+ struct smfs_super_info *smb = S2SMI(sb);
struct llog_ctxt **ctxt = &smb->smsi_kml_log;
struct obd_device *obd = arg;
-
+ int rc = 0;
ENTRY;
- //is plugin already activated
+
+ /* is plugin already activated */
if (SMFS_IS(smb->plg_flags, SMFS_PLG_KML))
RETURN(0);
-
+
if (obd && obd->obd_type && obd->obd_type->typ_name) {
- if (strcmp(obd->obd_type->typ_name, "mds"))
- RETURN(0);
+ if (!strcmp(obd->obd_type->typ_name, OBD_MDS_DEVICENAME)) {
+ kml_p->pack_fn = mds_rec_pack;
+ } else if (!strcmp(obd->obd_type->typ_name, OBD_FILTER_DEVICENAME)) {
+ kml_p->pack_fn = ost_rec_pack;
+ } else {
+ CWARN("unexpected device type: %s\n", obd->obd_type->typ_name);
+ }
}
-
- kml_p->pack_fn = mds_rec_pack;
-
- //this will do OBD_ALLOC() for ctxt
+
+ LASSERT(kml_p->pack_fn != NULL);
+
+ /* this will do OBD_ALLOC() for ctxt */
rc = llog_catalog_setup(ctxt, KML_LOG_NAME, smb->smsi_exp,
smb->smsi_ctxt, smb->sm_fsfilt,
- smb->smsi_logs_dir,
- smb->smsi_objects_dir);
-
+ smb->smsi_logs_dir, smb->smsi_objects_dir);
if (rc) {
- CERROR("Failed to initialize kml log list catalog %d\n", rc);
+ CERROR("failed to initialize kml log list catalog %d\n", rc);
RETURN(rc);
}
- (*ctxt)->llog_proc_cb = smfs_llog_process_rec_cb;
+ /* connect KML ctxt to obd */
+ if (obd && smb->smsi_kml_log) {
+ smb->smsi_kml_log->loc_idx = LLOG_REINT_ORIG_CTXT;
+ smb->smsi_kml_log->loc_obd = obd;
+ smb->smsi_kml_log->loc_llogs = &obd->obd_llogs;
+ obd->obd_llogs.llog_ctxt[LLOG_REINT_ORIG_CTXT] = smb->smsi_kml_log;
+ }
SMFS_SET(smb->plg_flags, SMFS_PLG_KML);
-
RETURN(0);
}
{
struct smfs_super_info * smb = S2SMI(sb);
struct llog_ctxt *ctxt = smb->smsi_kml_log;
+ struct obd_device * obd = ctxt->loc_obd;
ENTRY;
if (!SMFS_IS(smb->plg_flags, SMFS_PLG_KML))
SMFS_CLEAR(smb->plg_flags, SMFS_PLG_KML);
llog_catalog_cleanup(ctxt);
+ obd->obd_llogs.llog_ctxt[LLOG_REINT_ORIG_CTXT] = NULL;
OBD_FREE(ctxt, sizeof(*ctxt));
RETURN(0);
typedef int (*kml_helper)(struct super_block * sb, void *msg, struct kml_priv *);
static kml_helper smfs_kml_helpers[PLG_HELPER_MAX] = {
- [PLG_EXIT] smfs_exit_kml,
[PLG_START] smfs_start_kml,
[PLG_STOP] smfs_stop_kml,
[PLG_TRANS_SIZE] smfs_trans_kml,
return rc;
}
+static int smfs_exit_kml(struct super_block *sb, void * arg)
+{
+ struct smfs_plugin * plg = NULL;
+ struct kml_priv * priv = arg;
+ ENTRY;
+
+ plg = smfs_deregister_plugin(sb, SMFS_PLG_KML);
+ if (plg)
+ OBD_FREE(plg, sizeof(*plg));
+ else
+ CERROR("Cannot find KLM plugin while unregistering\n");
+
+ if (priv)
+ OBD_FREE(priv, sizeof(*priv));
+
+ EXIT;
+ return 0;
+}
+
int smfs_init_kml(struct super_block *sb)
{
int rc = 0;
struct kml_priv * priv = NULL;
- struct smfs_plugin plg = {
- .plg_type = SMFS_PLG_KML,
- .plg_pre_op = NULL,
- .plg_post_op = &smfs_kml_post_op,
- .plg_helper = &smfs_kml_help_op,
- .plg_private = NULL,
- };
-
+ struct smfs_plugin * plg = NULL;
ENTRY;
-
+
+ OBD_ALLOC(plg, sizeof(*plg));
+ if (!plg) {
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ plg->plg_type = SMFS_PLG_KML;
+ plg->plg_pre_op = NULL;
+ plg->plg_post_op = smfs_kml_post_op;
+ plg->plg_helper = smfs_kml_help_op;
+ plg->plg_exit = smfs_exit_kml;
+
OBD_ALLOC(priv, sizeof(*priv));
if (!priv) {
- RETURN(-ENOMEM);
+ rc = -ENOMEM;
+ goto exit;
}
- plg.plg_private = priv;
- /*
- rc = ost_rec_pack_init(smb);
- if (rc)
- return rc;
-
- rc = mds_rec_pack_init(smb);
- if (rc)
- return rc;
- */
- rc = smfs_register_plugin(sb, &plg);
+ plg->plg_private = priv;
+
+ rc = smfs_register_plugin(sb, plg);
+ if (!rc)
+ RETURN(0);
+exit:
+ if (priv)
+ OBD_FREE(priv, sizeof(*priv));
+ if (plg)
+ OBD_FREE(plg, sizeof(*plg));
+
RETURN(rc);
}