#include <linux/lustre_smfs.h>
#include "smfs_internal.h"
+#if 0
#define KML_BUF_REC_INIT(buffer, pbuf, len) \
do { \
pbuf = buffer + sizeof(int); \
pbuf = buffer + length; \
} while (0)
-
static int smfs_llog_process_rec_cb(struct llog_handle *handle,
struct llog_rec_hdr *rec, void *data)
{
exit:
RETURN(rc);
}
-
+#endif
+#if 0
+/* 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)
iattr->ia_size = inode->i_size;
}
+#if 0
static inline int unpack_rec_data(char **p_buffer, int *size,
char *in_data, char *args_data)
{
RETURN(rc);
}
+#endif
int smfs_rec_unpack(struct smfs_proc_args *args, char *record,
char **pbuf, int *opcode)
{
- int offset = *(int *)(record);
- char *tmp = record + offset + sizeof(int);
+ //int offset = *(int *)(record);
+ //char *tmp = record + offset + sizeof(int);
- *opcode = *(int *)tmp;
- *pbuf = tmp + sizeof(*opcode);
+ *opcode = *(int *)record;
+ *pbuf = record + sizeof(*opcode);
return 0;
}
-EXPORT_SYMBOL(smfs_rec_unpack);
+EXPORT_SYMBOL(smfs_rec_unpack); /* cmobd/cm_reint.c */
int smfs_write_extents(struct inode *dir, struct dentry *dentry,
unsigned long from, unsigned long num)
{
- return smfs_post_rec_write(dir, dentry, &from, &num);
-}
-EXPORT_SYMBOL(smfs_write_extents);
-
-int smfs_rec_setattr(struct inode *dir, struct dentry *dentry,
- struct iattr *attr)
-{
- return smfs_post_rec_setattr(dir, dentry, attr, NULL);
-}
-EXPORT_SYMBOL(smfs_rec_setattr);
-
-int smfs_rec_md(struct inode *inode, void *lmm, int lmm_size)
-{
- char *set_lmm = NULL;
- int rc = 0;
- ENTRY;
-
- if (!SMFS_DO_REC(S2SMI(inode->i_sb)))
- RETURN(0);
-
- if (lmm) {
- OBD_ALLOC(set_lmm, lmm_size + sizeof(lmm_size));
- if (!set_lmm)
- RETURN(-ENOMEM);
- memcpy(set_lmm, &lmm_size, sizeof(lmm_size));
- memcpy(set_lmm + sizeof(lmm_size), lmm, lmm_size);
- rc = smfs_post_rec_setattr(inode, NULL, NULL, set_lmm);
- if (rc) {
- CERROR("Error: Record md for inode %lu rc=%d\n",
- inode->i_ino, rc);
- }
- }
- if (set_lmm)
- OBD_FREE(set_lmm, lmm_size + sizeof(lmm_size));
- RETURN(rc);
+ //smfs_post_rec_write(dir, dentry, &from, &num);
+ return 0;
}
-EXPORT_SYMBOL(smfs_rec_md);
-
+#if 0
int smfs_rec_precreate(struct dentry *dentry, int *num, struct obdo *oa)
{
return smfs_post_rec_create(dentry->d_inode, dentry, num, oa);
}
-EXPORT_SYMBOL(smfs_rec_precreate);
int smfs_process_rec(struct super_block *sb,
int count, char *dir, int flags)
RETURN(namelen);
}
-static inline int log_it(char *buffer, void *data, int length)
-{
- memcpy(buffer, &length, sizeof(int));
- memcpy(buffer + sizeof(int), data, length);
- return (sizeof(int) + length);
-}
-
static int smfs_pack_rec (char *buffer, struct dentry *dentry,
struct inode *dir, void *data1,
void *data2, int op)
return pack_func(buffer, dentry, dir, data1, data2, op);
}
-int smfs_post_rec_create(struct inode *dir, struct dentry *dentry,
- void *data1, void *data2)
-{
- struct smfs_super_info *sinfo;
- char *buffer = NULL, *pbuf;
- int rc = 0, length = 0, buf_len = 0;
- ENTRY;
-
- sinfo = S2SMI(dentry->d_inode->i_sb);
- if (!sinfo)
- RETURN(-EINVAL);
-
- OBD_ALLOC(buffer, PAGE_SIZE);
- if (!buffer)
- GOTO(exit, rc = -ENOMEM);
-
- buf_len = PAGE_SIZE;
- KML_BUF_REC_INIT(buffer, pbuf, buf_len);
- rc = smfs_log_path(dir->i_sb, dentry, pbuf, buf_len);
- if (rc < 0)
- GOTO(exit, rc);
- length = rc;
- KML_BUF_REC_END(buffer, length, pbuf);
-
- rc = smfs_pack_rec(pbuf, dentry, dir,
- data1, data2, REINT_CREATE);
- if (rc <= 0)
- GOTO(exit, rc);
- else
- length += rc;
- rc = smfs_llog_add_rec(sinfo, (void*)buffer, length);
-exit:
- if (buffer)
- OBD_FREE(buffer, PAGE_SIZE);
-
- RETURN(rc);
-}
-
-static int smfs_post_rec_link(struct inode *dir, struct dentry *dentry,
- void *data1, void *data2)
-{
- struct dentry *new_dentry = (struct dentry *)data1;
- int rc = 0, length = 0, buf_len = 0;
- char *buffer = NULL, *pbuf = NULL;
- struct smfs_super_info *sinfo;
- ENTRY;
-
- sinfo = S2SMI(dir->i_sb);
- if (!sinfo)
- RETURN(-EINVAL);
- OBD_ALLOC(buffer, PAGE_SIZE);
- if (!buffer)
- GOTO(exit, rc = -ENOMEM);
-
- buf_len = PAGE_SIZE;
- KML_BUF_REC_INIT(buffer, pbuf, buf_len);
-
- rc = smfs_log_path(dir->i_sb, dentry, pbuf, buf_len);
- if (rc < 0)
- GOTO(exit, rc);
-
- length = rc;
- KML_BUF_REC_END(buffer, length, pbuf);
-
- rc = smfs_pack_rec(pbuf, dentry, dir, dentry,
- new_dentry, REINT_LINK);
- if (rc <= 0)
- GOTO(exit, rc);
-
- length += rc;
- rc = smfs_llog_add_rec(sinfo, (void *)buffer, length);
-exit:
- if (buffer)
- OBD_FREE(buffer, PAGE_SIZE);
-
- RETURN(rc);
-}
-
-static int smfs_post_rec_unlink(struct inode *dir, struct dentry *dentry,
- void *data1, void *data2)
-{
- struct smfs_super_info *sinfo;
- int mode = *((int*)data1);
- char *buffer = NULL, *pbuf = NULL;
- int length = 0, rc = 0, buf_len = 0;
- ENTRY;
-
- sinfo = S2SMI(dentry->d_inode->i_sb);
- if (!sinfo)
- RETURN(-EINVAL);
-
- OBD_ALLOC(buffer, PAGE_SIZE);
- if (!buffer)
- GOTO(exit, rc = -ENOMEM);
-
- buf_len = PAGE_SIZE;
- KML_BUF_REC_INIT(buffer, pbuf, buf_len);
- rc = smfs_log_path(dir->i_sb, dentry, pbuf, buf_len);
- if (rc < 0)
- GOTO(exit, rc);
-
- length = rc;
- KML_BUF_REC_END(buffer, length, pbuf);
- rc = smfs_pack_rec(pbuf, dentry, dir,
- &mode, NULL, REINT_UNLINK);
- if (rc <= 0)
- GOTO(exit, rc);
- else
- length += rc;
-
- rc = smfs_llog_add_rec(sinfo, (void*)buffer, length);
-exit:
- if (buffer)
- OBD_FREE(buffer, PAGE_SIZE);
-
- RETURN(rc);
-}
-
-static int smfs_post_rec_rename(struct inode *dir, struct dentry *dentry,
- void *data1, void *data2)
-{
- struct smfs_super_info *sinfo;
- struct inode *new_dir = (struct inode *)data1;
- struct dentry *new_dentry = (struct dentry *)data2;
- char *buffer = NULL, *pbuf = NULL;
- int rc = 0, length = 0, buf_len = 0;
- ENTRY;
-
- sinfo = S2SMI(dir->i_sb);
- if (!sinfo)
- RETURN(-EINVAL);
-
- OBD_ALLOC(buffer, PAGE_SIZE);
- if (!buffer)
- GOTO(exit, rc = -ENOMEM);
-
- buf_len = PAGE_SIZE;
- KML_BUF_REC_INIT(buffer, pbuf, buf_len);
- rc = smfs_log_path(dir->i_sb, dentry, pbuf, buf_len);
- if (rc < 0)
- GOTO(exit, rc);
-
- pbuf += rc;
- length += rc;
- buf_len -= rc;
-
- /* record new_dentry path. */
- rc = smfs_log_path(dir->i_sb, new_dentry, pbuf, buf_len);
- if (rc < 0)
- GOTO(exit, rc);
-
- length += rc;
- KML_BUF_REC_END(buffer, length, pbuf);
-
- rc = smfs_pack_rec(pbuf, dentry, dir,
- new_dir, new_dentry, REINT_RENAME);
- if (rc <= 0)
- GOTO(exit, rc);
- length += rc;
-
- rc = smfs_llog_add_rec(sinfo, (void*)buffer, length);
-exit:
- if (buffer)
- OBD_FREE(buffer, PAGE_SIZE);
- RETURN(rc);
-}
-
static int smfs_insert_extents_ea(struct inode *inode, size_t from, loff_t num)
{
struct fsfilt_operations *fsfilt = S2SMI(inode->i_sb)->sm_fsfilt;
if (SMFS_INODE_OVER_WRITE(inode))
RETURN(rc);
/*FIXME later, the blocks needed in journal here will be recalculated*/
- handle = smfs_trans_start(inode, FSFILT_OP_SETATTR, NULL);
+ handle = smfs_trans_start(inode, FSFILT_OP_SETATTR);
if (IS_ERR(handle)) {
CERROR("smfs_set_dirty_flag:no space for transaction\n");
RETURN(-ENOSPC);
RETURN(rc);
}
-int smfs_post_rec_setattr(struct inode *inode, struct dentry *dentry,
- void *data1, void *data2)
-{
- struct smfs_super_info *sinfo;
- struct iattr *attr = (struct iattr *)data1;
- char *buffer = NULL, *pbuf;
- int rc = 0, length = 0, buf_len = 0;
+static int all_blocks_present_ea(struct inode *inode)
+{
+ int rc = 0;
ENTRY;
+ RETURN(rc);
+}
+#endif
- sinfo = S2SMI(inode->i_sb);
- if (!sinfo)
- RETURN(-EINVAL);
+/* new plugin API */
+#if 0
+static int kml_pack_path (char **buf, struct dentry * dentry)
+{
+ char *pbuf;
+ int length = 0, rc = 0;
+
+ OBD_ALLOC(*buf, PAGE_SIZE);
+ if (*buf == NULL)
+ return -ENOMEM;
+
+ length = PAGE_SIZE;
+ KML_BUF_REC_INIT(*buf, pbuf, length);
+ rc = smfs_log_path(dentry->d_sb, dentry, pbuf, length);
+ if (rc < 0) {
+ return rc;
+ }
+
+ length = rc;
+ KML_BUF_REC_END(*buf, length, pbuf);
+
+ return length;
+}
+#endif
+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);
+ struct smfs_super_info *smb = S2SMI(inode->i_sb);
+ char *buffer = NULL;
+ int rc = 0, length = 0;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (buffer == NULL)
+ return -ENOMEM;
+
+ /*
+ rc = kml_pack_path(&buffer, msg->dentry);
+ if (rc < 0)
+ goto exit;
+
+ length = rc;
+ pbuf = buffer + length;
+ */
+ rc = priv->pack_fn(REINT_CREATE, buffer, msg->dentry, inode,
+ NULL, NULL);
+ if (rc <= 0)
+ GOTO(exit, rc);
+
+ length += rc;
+ rc = smfs_llog_add_rec(smb, (void*)buffer, length);
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
+
+ RETURN(rc);
+}
+
+static int kml_link(struct inode *inode, void *arg, struct kml_priv *priv)
+{
+ struct hook_link_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (!buffer)
+ GOTO(exit, rc = -ENOMEM);
+
+ rc = priv->pack_fn(REINT_LINK, buffer, msg->dentry, inode,
+ msg->dentry, msg->new_dentry);
+ if (rc <= 0)
+ GOTO(exit, rc);
+
+ length += rc;
+ rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void *)buffer, length);
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
+
+ RETURN(rc);
+}
+
+static int kml_unlink(struct inode * inode, void *arg, struct kml_priv * priv)
+{
+ struct hook_unlink_msg * msg = arg;
+ char *buffer = NULL;
+ int length = 0, rc = 0;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (!buffer)
+ GOTO(exit, rc = -ENOMEM);
+
+ rc = priv->pack_fn(REINT_UNLINK, buffer, msg->dentry, inode,
+ &msg->mode, NULL);
+ if (rc <= 0)
+ GOTO(exit, rc);
+
+ length += rc;
+ rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void*)buffer, length);
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
+
+ RETURN(rc);
+}
+
+static int kml_symlink(struct inode *inode, void *arg, struct kml_priv *priv)
+{
+ struct smfs_super_info *smb = S2SMI(inode->i_sb);
+ struct hook_symlink_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
+ ENTRY;
OBD_ALLOC(buffer, PAGE_SIZE);
if (!buffer)
GOTO(exit, rc = -ENOMEM);
- buf_len = PAGE_SIZE;
- KML_BUF_REC_INIT(buffer, pbuf, buf_len);
- rc = smfs_log_path(inode->i_sb, dentry, pbuf, buf_len);
- if (rc < 0)
+ rc = priv->pack_fn(REINT_CREATE, buffer, msg->dentry, inode,
+ msg->symname, &msg->tgt_len);
+ if (rc <= 0)
GOTO(exit, rc);
- length = rc;
- KML_BUF_REC_END(buffer, length, pbuf);
+ length += rc;
+ rc = smfs_llog_add_rec(smb, (void*)buffer, length);
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
- rc = smfs_pack_rec(pbuf, dentry, inode,
- data1, data2, REINT_SETATTR);
+ RETURN(rc);
+}
+
+static int kml_rename(struct inode *inode, void *arg, struct kml_priv *priv)
+{
+ struct hook_rename_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (!buffer)
+ GOTO(exit, rc = -ENOMEM);
+
+ rc = priv->pack_fn(REINT_RENAME, buffer, msg->dentry, inode,
+ msg->new_dir, msg->new_dentry);
if (rc <= 0)
GOTO(exit, rc);
- else
- length += rc;
+ length += rc;
+
+ rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void*)buffer, length);
+exit:
+ if (buffer)
+ OBD_FREE(buffer, PAGE_SIZE);
+ RETURN(rc);
+}
+
+static int kml_setattr(struct inode *inode, void *arg, struct kml_priv *priv)
+{
+ struct hook_setattr_msg *msg = arg;
+ int rc = 0, length = 0;
+ char *buffer = NULL;
+ ENTRY;
+
+ OBD_ALLOC(buffer, PAGE_SIZE);
+ if (!buffer)
+ GOTO(exit, rc = -ENOMEM);
- rc = smfs_llog_add_rec(sinfo, (void*)buffer, length);
+ rc = priv->pack_fn(REINT_SETATTR, buffer, msg->dentry, inode,
+ msg->attr, NULL);
+ 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,
smfs_set_dirty_flags(inode, SMFS_DIRTY_WRITE);
}
}
+ */
exit:
if (buffer)
OBD_FREE(buffer, PAGE_SIZE);
RETURN(rc);
}
-
-static int all_blocks_present_ea(struct inode *inode)
-{
- int rc = 0;
- ENTRY;
- RETURN(rc);
-}
-
-int smfs_post_rec_write(struct inode *dir, struct dentry *dentry, void *data1,
- void *data2)
+/*
+static int kml_write(struct inode * inode, void *arg, struct kml_priv * priv)
{
+ struct hook_write_msg * msg = arg;
+ //return smfs_post_rec_write(inode, msg->dentry, &msg->count, &msg->pos);
struct smfs_super_info *sinfo;
char *buffer = NULL, *pbuf;
int rc = 0, length = 0, buf_len = 0;
if (dentry->d_inode->i_size == 0) {
smfs_set_dirty_flags(dentry->d_inode, SMFS_OVER_WRITE);
} else {
- /*insert extent EA*/
+ //insert extent EA
loff_t off = *((loff_t*)data1);
size_t count = *((size_t*)data2);
OBD_FREE(buffer, PAGE_SIZE);
RETURN(rc);
}
+*/
-/* new plugin API */
-struct kml_priv {
- struct dentry * kml_llog_dir;
-};
-
-static int kml_create(struct inode * inode, void *arg)
-{
- struct hook_msg * msg = arg;
- return smfs_post_rec_create(inode, msg->dentry, NULL, NULL);
-}
-
-static int kml_link(struct inode * inode, void *arg)
-{
- struct hook_link_msg * msg = arg;
- return smfs_post_rec_link(inode, msg->dentry, msg->new_dentry, NULL);
-}
-
-static int kml_unlink(struct inode * inode, void *arg)
-{
- struct hook_unlink_msg * msg = arg;
- return smfs_post_rec_unlink(inode, msg->dentry, &msg->mode, NULL);
-}
-
-static int kml_symlink(struct inode * inode, void *arg)
-{
- struct hook_symlink_msg * msg = arg;
- return smfs_post_rec_create(inode, msg->dentry, &msg->tgt_len,
- msg->symname);
-}
-
-static int kml_rename(struct inode * inode, void *arg)
-{
- struct hook_rename_msg * msg = arg;
- return smfs_post_rec_rename(inode, msg->dentry, msg->new_dir,
- msg->new_dentry);
-}
-
-static int kml_setattr(struct inode * inode, void *arg)
-{
- struct hook_setattr_msg * msg = arg;
- return smfs_post_rec_setattr(inode, msg->dentry, msg->attr, NULL);
-}
-
-static int kml_write(struct inode * inode, void *arg)
-{
- struct hook_write_msg * msg = arg;
- return smfs_post_rec_write(inode, msg->dentry, &msg->count, &msg->pos);
-}
-
-typedef int (*post_kml_op)(struct inode * inode, void *msg);
+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_MKNOD] kml_create,
[HOOK_RENAME] kml_rename,
[HOOK_SETATTR] kml_setattr,
- [HOOK_WRITE] kml_write,
+ [HOOK_WRITE] NULL,
[HOOK_READDIR] NULL,
};
int rc = 0;
ENTRY;
- CDEBUG(D_INODE,"KML: inode %lu, code: %u\n", inode->i_ino, code);
+
//KML don't handle failed ops
if (ret)
RETURN(0);
if (smfs_kml_post[code]) {
- rc = smfs_kml_post[code](inode, msg);
+ CDEBUG(D_INODE,"KML: inode %lu, code: %u\n", inode->i_ino, code);
+ rc = smfs_kml_post[code](inode, msg, priv);
}
RETURN(rc);
/* Helpers */
static int smfs_exit_kml(struct super_block *sb, void * arg, struct kml_priv * priv)
{
+ struct smfs_plugin * plg = NULL;
ENTRY;
- smfs_deregister_plugin(sb, SMFS_PLG_KML);
-
+ 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 size;
- ENTRY;
-
- size = 20;//LDISKFS_INDEX_EXTRA_TRANS_BLOCKS+LDISKFS_DATA_TRANS_BLOCKS;
+ //TODO: pass fs opcode and see if kml can participate or not
+ //one record in log per operation
+ size = 1;
- RETURN(size);
+ return size;
}
+extern int mds_rec_pack(int, char*, struct dentry*, struct inode*, void*, void*);
+
static int smfs_start_kml(struct super_block *sb, void *arg,
struct kml_priv * kml_p)
{
int rc = 0;
struct smfs_super_info * smb = S2SMI(sb);
struct llog_ctxt **ctxt = &smb->smsi_kml_log;
+ struct obd_device *obd = arg;
ENTRY;
//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);
+ }
+
+ kml_p->pack_fn = mds_rec_pack;
+
//this will do OBD_ALLOC() for ctxt
rc = llog_catalog_setup(ctxt, KML_LOG_NAME, smb->smsi_exp,
smb->smsi_ctxt, smb->sm_fsfilt,
RETURN(rc);
}
- (*ctxt)->llog_proc_cb = smfs_llog_process_rec_cb;
+ (*ctxt)->llog_proc_cb = NULL;//smfs_llog_process_rec_cb;
SMFS_SET(smb->plg_flags, SMFS_PLG_KML);
void * arg, void * priv)
{
int rc = 0;
- ENTRY;
+
if (smfs_kml_helpers[code])
rc = smfs_kml_helpers[code](sb, arg, (struct kml_priv *) priv);
- RETURN(rc);
+ return rc;
}
int smfs_init_kml(struct super_block *sb)
{
int rc = 0;
- struct smfs_super_info *smb = S2SMI(sb);
- 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 kml_priv * priv = NULL;
+ struct smfs_plugin * plg = NULL;
ENTRY;
-
- rc = ost_rec_pack_init(smb);
- if (rc)
- return rc;
- rc = mds_rec_pack_init(smb);
- if (rc)
- return rc;
+ 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;
+
+ OBD_ALLOC(priv, sizeof(*priv));
+ if (!priv) {
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ plg->plg_private = priv;
- rc = smfs_register_plugin(sb, &plg);
+ 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);
}