u_iops->mknod = filter_iops->mknod;
if (cache_iops->permission && filter_iops->permission)
u_iops->permission = filter_iops->permission;
+ if (cache_iops->setattr && filter_iops->setattr)
+ u_iops->setattr = filter_iops->setattr;
+ if (cache_iops->setxattr && filter_iops->setxattr)
+ u_iops->setxattr = filter_iops->setxattr;
+ if (cache_iops->removexattr && filter_iops->removexattr)
+ u_iops->removexattr = filter_iops->removexattr;
+
}
/* copy dir fops */
if (filter_iops) {
if (filter_iops->revalidate)
u_iops->revalidate = filter_iops->revalidate;
+ if (filter_iops->removexattr)
+ u_iops->removexattr = filter_iops->removexattr;
+ if (filter_iops->setxattr)
+ u_iops->setxattr = filter_iops->setxattr;
+ if (filter_iops->setattr)
+ u_iops->setattr = filter_iops->setattr;
}
if (filter_fops) {
if (filter_fops->read)
u_iops->readlink = filter_iops->readlink;
if (cache_iops->follow_link && filter_iops->follow_link)
u_iops->follow_link = filter_iops->follow_link;
+ if (cache_iops->getxattr && filter_iops->getxattr)
+ u_iops->getxattr = filter_iops->getxattr;
+ if (cache_iops->listxattr && filter_iops->listxattr)
+ u_iops->listxattr = filter_iops->listxattr;
+
}
EXIT;
}
}
return 0;
}
-
-int snap_dev_open(int argc, char **argv)
+static int open_snap_device(char *name)
{
struct snap_mnt *snaplist;
- char *dev_name;
- int rc;
-
- if (argc != 2) {
- fprintf(stderr, "The argument count is not right \n");
- return CMD_HELP;
- }
-
- dev_name = argv[1];
-
+ int rc;
get_snaplist();
list_for_each_entry(snaplist, &snap_list, snap_mnt_list) {
- if (!strcmp(&snaplist->device.name[0], dev_name)) {
+ if (!strcmp(&snaplist->device.name[0], name)) {
rc = open_device(&snaplist->device.name[0],
snaplist->device.dev);
release_snap_list();
}
}
release_snap_list();
- fprintf(stderr, "%s are not snapdevice\n", dev_name);
+ fprintf(stderr, "%s are not snapdevice\n", name);
return (-EINVAL);
}
+int snap_dev_open(int argc, char **argv)
+{
+ char *dev_name;
+ int rc;
+
+ if (argc != 2) {
+ fprintf(stderr, "The argument count is not right \n");
+ return CMD_HELP;
+ }
+
+ dev_name = argv[1];
+ rc = open_snap_device(dev_name);
+ if (rc)
+ fprintf(stderr, "%s are not snapdevice\n", dev_name);
+ return (rc);
+}
int snap_dev_list(int argc, char **argv)
{
struct snap_mnt *snaplist;
}
int snap_snap_list(int argc, char **argv)
{
+ char *dev_name = NULL;
int i, rc = 0;
if (argc != 1 && argc != 2) {
return CMD_HELP;
}
if (open_device_table.count == 0) {
- fprintf(stderr, "Please open a snapdevice first\n");
- return (-EINVAL);
+ if (argc == 2) {
+ dev_name = argv[1];
+ }
+ if (dev_name) {
+ rc = open_snap_device(dev_name);
+ }
+ if (!dev_name || rc) {
+ fprintf(stderr, "Please open a snapdevice first\n");
+ return (-EINVAL);
+ }
}
-
for (i = 0; i < open_device_table.count; i++) {
struct ioc_snap_tbl_data *snap_ioc_data;
}
return rc;
}
-int snap_snap_add(int argc, char **argv)
+int snap_snap_del(int argc, char **argv)
{
+ char *dev_name = NULL, *snap_name = NULL;
int rc = 0, i;
if (argc != 3 && argc !=2) {
fprintf(stderr, "The argument count is not right \n");
return CMD_HELP;
}
+ if (open_device_table.count == 0) {
+ if (argc == 3) {
+ dev_name = argv[1];
+ } else if (argc == 4) {
+ dev_name = argv[2];
+ }
+ if (dev_name) {
+ rc = open_snap_device(dev_name);
+ }
+ if (!dev_name || rc) {
+ fprintf(stderr, "Please open a snapdevice first\n");
+ return (-EINVAL);
+ }
+ }
+ for (i = 0; i < open_device_table.count; i++) {
+ struct ioc_snap_tbl_data *snap_ioc_data;
+
+ IOC_INIT(snap_ioc_data);
+
+ snap_ioc_data->count = 1;
+ snap_ioc_data->dev = open_device_table.device[i].dev;
+
+ if (argc == 3) {
+ snap_ioc_data->no = atoi(argv[1]);
+ if (!snap_name)
+ snap_name = argv[2];
+ } else {
+ snap_ioc_data->no = 0;
+ if (!snap_name)
+ snap_name = argv[1];
+ }
+ memcpy(snap_ioc_data->snaps[0].name,
+ snap_name, strlen(snap_name));
+
+ snap_ioc_data->snaps[0].time = time(NULL);
+
+ IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap));
+ if ((rc = ioctl(open_device_table.device[i].fd,
+ IOC_SNAP_DELETE, buf))) {
+ fprintf(stderr, "del %s failed \n", snap_name);
+ } else {
+ fprintf(stderr, "del %s success\n", snap_name);
+ }
+ }
+ return rc;
+}
+int snap_snap_add(int argc, char **argv)
+{
+ char *dev_name = NULL, *snap_name = NULL;
+ int rc = 0, i;
+
+ if (argc != 3 && argc !=2 && argc !=4) {
+ fprintf(stderr, "The argument count is not right \n");
+ return CMD_HELP;
+ }
if (open_device_table.count == 0) {
- fprintf(stderr, "Please open a snapdevice first\n");
- return (-EINVAL);
+ if (argc == 3) {
+ dev_name = argv[1];
+ snap_name = argv[2];
+ } else if (argc == 4) {
+ dev_name = argv[2];
+ snap_name = argv[3];
+ }
+ if (dev_name) {
+ rc = open_snap_device(dev_name);
+ }
+ if (!dev_name || rc) {
+ fprintf(stderr, "Please open a snapdevice first\n");
+ return (-EINVAL);
+ }
}
for (i = 0; i < open_device_table.count; i++) {
struct ioc_snap_tbl_data *snap_ioc_data;
if (argc == 3) {
snap_ioc_data->no = atoi(argv[1]);
- memcpy(snap_ioc_data->snaps[0].name,
- argv[2], strlen(argv[2]));
+ if (!snap_name)
+ snap_name = argv[2];
} else {
snap_ioc_data->no = 0;
- memcpy(snap_ioc_data->snaps[0].name,
- argv[1], strlen(argv[1]));
+ if (!snap_name)
+ snap_name = argv[1];
}
+ memcpy(snap_ioc_data->snaps[0].name,
+ snap_name, strlen(snap_name));
snap_ioc_data->snaps[0].time = time(NULL);
IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap));
if ((rc = ioctl(open_device_table.device[i].fd,
IOC_SNAP_ADD, buf))) {
- fprintf(stderr, "add %s failed \n", argv[1]);
+ fprintf(stderr, "add %s failed \n", snap_name);
} else {
- fprintf(stderr, "add %s success\n", argv[1]);
+ fprintf(stderr, "add %s success\n", snap_name);
}
}
return rc;