#include <linux/lustre_mds.h>
#include <linux/lustre_debug.h>
#include <linux/lustre_smfs.h>
+#include <linux/lustre_snap.h>
#include "smfs_internal.h"
+static struct super_block *smfs_get_sb_by_path(char *path, int len)
+{
+ struct super_block *sb;
+ struct nameidata nd;
+
+ ENTRY;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+ if (path_init(path, LOOKUP_FOLLOW, &nd)) {
+ int error = 0;
+ error = path_walk(path, &nd);
+ if (error) {
+ path_release(&nd);
+ RETURN(NULL);
+ }
+ } else {
+ RETURN(NULL);
+ }
+#else
+ if (path_lookup(path, LOOKUP_FOLLOW, &nd))
+ RETURN(NULL);
+
+#endif
+ /* FIXME-WANGDI: add some check code here. */
+ sb = nd.dentry->d_sb;
+ path_release(&nd);
+ RETURN(sb);
+}
struct smfs_control_device smfs_dev;
{
struct obd_ioctl_data *data = NULL;
struct super_block *sb = NULL;
- char *buf = NULL, *dir = NULL;
- int err = 0, len = 0, count = 0, do_kml = 0;
+ char *buf = NULL;
+ int err = 0, len = 0;
if (obd_ioctl_getdata(&buf, &len, (void *)arg)) {
CERROR("OBD ioctl: data error\n");
data = (struct obd_ioctl_data *)buf;
switch (cmd) {
- case IOC_SMFS_START:
- case IOC_SMFS_STOP:
- case IOC_SMFS_REINT:
- case IOC_SMFS_UNDO:{
- char *name;
+ case OBD_IOC_SMFS_SNAP_ADD:{
+ char *name, *snapshot_name;
if (!data->ioc_inllen1 || !data->ioc_inlbuf1) {
CERROR("No mountpoint passed!\n");
GOTO(out, err = -EINVAL);
}
+ if (!data->ioc_inllen2 || !data->ioc_inlbuf2) {
+ CERROR("No snapshotname passed!\n");
+ GOTO(out, err = -EINVAL);
+ }
name = (char*) data->ioc_inlbuf1;
sb = smfs_get_sb_by_path(name, data->ioc_inllen1);
if (!sb) {
CERROR("can not find superblock at %s\n", buf);
GOTO(out, err = -EINVAL);
}
- /*get cmd count*/
- if (data->ioc_inllen2 && data->ioc_inlbuf2) {
- dir = (char *)data->ioc_inlbuf2;
- }
- if (data->ioc_plen1)
- count = *((int*)data->ioc_pbuf1);
- if (data->ioc_plen2)
- do_kml = *((int*)data->ioc_pbuf2);
+ snapshot_name = (char *)data->ioc_inlbuf2;
+#ifdef CONFIG_SNAPFS
+ err = smfs_add_snap_item(sb, name, snapshot_name);
+#endif
break;
}
default: {
GOTO(out, err = -EINVAL);
}
}
-
- switch (cmd) {
- case IOC_SMFS_START:
- err = smfs_start_rec(sb, NULL);
- break;
- case IOC_SMFS_STOP:
- err = smfs_stop_rec(sb);
- break;
- case IOC_SMFS_REINT:
- case IOC_SMFS_UNDO: {
- int flags = 0;
- if (cmd == IOC_SMFS_REINT)
- SET_REC_OP_FLAGS(flags, SMFS_REINT_REC);
- else
- SET_REC_OP_FLAGS(flags, SMFS_UNDO_REC);
- if (count == 0)
- SET_REC_COUNT_FLAGS(flags, SMFS_REC_ALL);
- if (do_kml)
- SET_REC_WRITE_KML_FLAGS(flags, SMFS_WRITE_KML);
- err = smfs_process_rec(sb, count, dir, flags);
- break;
- }
- }
out:
if (buf)
obd_ioctl_freedata(buf, len);
RETURN(err);
}
-
+#define SMFS_MINOR 250
static int smfs_psdev_ioctl(struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long arg)
{
if (!inode)
RETURN(-EINVAL);
dev = MINOR(inode->i_rdev);
- if (dev != SMFS_PSDEV_MINOR)
+ if (dev != SMFS_MINOR)
RETURN(-ENODEV);
RETURN(0);
if (!inode)
RETURN(-EINVAL);
dev = MINOR(inode->i_rdev);
- if (dev != SMFS_PSDEV_MINOR)
+ if (dev != SMFS_MINOR)
RETURN(-ENODEV);
RETURN(0);
/* declare character device */
static struct file_operations smfscontrol_fops = {
- ioctl: smfs_psdev_ioctl, /* ioctl */
- open: smfs_psdev_open, /* open */
- release: smfs_psdev_release, /* release */
+ .owner = THIS_MODULE,
+ .ioctl = smfs_psdev_ioctl, /* ioctl */
+ .open = smfs_psdev_open, /* open */
+ .release = smfs_psdev_release, /* release */
};
-
-#define SMFS_MINOR 250
static struct miscdevice smfscontrol_dev = {
minor: SMFS_MINOR,
name: "smfscontrol",