int (*o_setattr)(struct obd_conn *, obdattr *oa);
int (*o_getattr)(struct obd_conn *, obdattr *oa);
int (*o_statfs)(struct obd_conn *, struct statfs *statfs);
- int (*o_create)(struct obd_conn *, int prealloc_ino, int *er);
+ int (*o_create)(struct obd_conn *, int prealloc_obj, objid *id);
int (*o_destroy)(struct obd_conn *, obdattr *oa);
- int (*o_read)(struct obd_conn *, obdattr *ino, char *buf, unsigned long *count, loff_t offset);
+ int (*o_read)(struct obd_conn *, obdattr *oa, char *buf, unsigned long *count, loff_t offset);
int (*o_read2)(struct obd_conn *, obdattr *oa, char *buf, unsigned long *count, loff_t offset);
int (*o_write)(struct obd_conn *, obdattr *oa, char *buf, unsigned long *count, loff_t offset);
- int (*o_brw)(int rw, struct obd_conn * conn, obdattr *obj, struct page *page, int create);
+ int (*o_brw)(int rw, struct obd_conn * conn, obdattr *oa, struct page *page, int create);
int (*o_preallocate)(struct obd_conn *, unsigned long *req, long inodes[32]);
- int (*o_get_info)(struct obd_conn *, int keylen, void *key, int *vallen, void **val);
- int (*o_set_info)(struct obd_conn *, int keylen, void *key, int vallen, void *val);
- int (*o_migrate)(struct obd_conn *, obdattr *src, obdattr *dst);
- int (*o_copy)(struct obd_conn *dev, obdattr *source, obdattr *target);
+ int (*o_get_info)(struct obd_conn *, int keylen, void *key, int *vallen, void **val);
+ int (*o_set_info)(struct obd_conn *, int keylen, void *key, int vallen, void *val);
+ int (*o_migrate)(struct obd_conn *, obdattr *dst, obdattr *src);
+ int (*o_copy)(struct obd_conn *dev, obdattr *dst, obdattr *src);
int (*o_iocontrol)(int cmd, struct obd_conn *, int len, void *karg, void *uarg);
int (*o_iterate)(struct obd_conn *, int (*)(objid, void *), objid, void *);
struct ioc_mv_s {
unsigned int conn_id;
objid src;
- objid tgt;
+ objid dst;
};
struct oic_rw_s {
static int obd_class_ioctl (struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long arg)
{
- int err, i_ino, dev;
struct obd_device *obddev;
struct obd_conn conn;
+ int err, dev;
long int cli_id; /* connect, disconnect */
if (!inode)
/* have we attached a type to this device */
if ( !obddev->obd_type ) {
CDEBUG(D_IOCTL, "OBD Device %d has no type.\n", dev);
- return -EINVAL;
+ return -ENODEV;
}
/* get main structure */
/* have we attached a type to this device */
if ( !obddev->obd_type ) {
CDEBUG(D_IOCTL, "OBD Device %d has no type.\n", dev);
- return -EINVAL;
+ return -ENODEV;
}
/* get main structure */
int part_datalen;
void *part_data;
} input;
- obdattr *srcoa, *tgtoa;
+ obdattr *src, *dst;
if ( (!(obddev->obd_flags & OBD_SET_UP)) ||
(!(obddev->obd_flags & OBD_ATTACHED))) {
return -EOPNOTSUPP;
/* do the partition */
- CDEBUG(D_IOCTL, "Copy %d, type %s src %ld tgt %ld\n", dev,
- obddev->obd_type->typ_name, mvdata.src, mvdata.tgt);
+ CDEBUG(D_IOCTL, "Copy %d, type %s dst %ld src %ld\n", dev,
+ obddev->obd_type->typ_name, mvdata.dst, mvdata.src);
conn.oc_id = mvdata.conn_id;
- srcoa = obd_oa_fromid(&conn, mvdata.src);
- if ( !srcoa )
+ src = obd_oa_fromid(&conn, mvdata.src);
+ if ( !src )
return -ENOENT;
- tgtoa = obd_oa_fromid(&conn, mvdata.tgt);
- if ( ! tgtoa ) {
- obd_free_oa(srcoa);
+ dst = obd_oa_fromid(&conn, mvdata.dst);
+ if ( ! dst ) {
+ obd_free_oa(src);
return -ENOENT;
}
- err = OBP(obddev, copy)(&conn, srcoa, tgtoa);
+ err = OBP(obddev, copy)(&conn, dst, src);
- obd_free_oa(srcoa);
- obd_free_oa(tgtoa);
+ obd_free_oa(src);
+ obd_free_oa(dst);
return err;
}
case OBD_IOC_MIGR: {
int part_datalen;
void *part_data;
} input;
- obdattr *srcoa, *tgtoa;
+ obdattr *src, *dst;
if ( (!(obddev->obd_flags & OBD_SET_UP)) ||
(!(obddev->obd_flags & OBD_ATTACHED))) {
return -EOPNOTSUPP;
/* do the partition */
- CDEBUG(D_IOCTL, "Migrate %d, type %s conn %d src %ld tgt %ld\n",
+ CDEBUG(D_IOCTL, "Migrate %d, type %s conn %d src %ld dst %ld\n",
dev, obddev->obd_type->typ_name, mvdata.conn_id,
- mvdata.src, mvdata.tgt);
+ mvdata.src, mvdata.dst);
- if ( ! (srcoa = obd_empty_oa()) )
+ if ( ! (src = obd_empty_oa()) )
return -ENOMEM;
- if ( ! (tgtoa = obd_empty_oa()) ) {
- obd_free_oa(srcoa);
+ if ( ! (dst = obd_empty_oa()) ) {
+ obd_free_oa(src);
return -ENOMEM;
}
- srcoa->i_ino = mvdata.src;
- tgtoa->i_ino = mvdata.tgt;
+ src->i_ino = mvdata.src;
+ dst->i_ino = mvdata.dst;
conn.oc_id = mvdata.conn_id;
- err = OBP(obddev, migrate)(&conn, tgtoa, srcoa);
+ err = OBP(obddev, migrate)(&conn, dst, src);
- obd_free_oa(srcoa);
- obd_free_oa(tgtoa);
+ obd_free_oa(src);
+ obd_free_oa(dst);
return err;
}
if (!obddev->obd_type) {
CDEBUG(D_IOCTL, "OBD Device %d has no type.\n", dev);
EXIT;
- return -EINVAL;
+ return -ENODEV;
}
if ( !obddev->obd_type->typ_refcnt ) {
if ( !OBT(obddev) || !OBP(obddev, connect) )
return -EOPNOTSUPP;
- if (OBP(obddev, connect)(&conn))
- return -EINVAL;
+ err = OBP(obddev, connect)(&conn);
+ if ( err )
+ return err;
return copy_to_user((int *)arg, &conn.oc_id,
sizeof(int));
/* frees data structures */
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
get_user(cli_id, (int *) arg);
conn.oc_id = cli_id;
* superblock that it needs. */
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
if (!obddev->u.ext2.ext2_sb || !obddev->u.ext2.ext2_sb->s_dev) {
CDEBUG(D_IOCTL, "fatal: device not initialized.\n");
}
case OBD_IOC_CREATE: {
struct oic_create_s foo;
+ objid id;
if ( copy_from_user(&foo, (const void *)arg, sizeof(foo)) )
return -EFAULT;
if ( !OBT(obddev) || !OBP(obddev, create) )
return -EOPNOTSUPP;
- i_ino = OBP(obddev, create)(&conn, foo.prealloc, &err);
+ err = OBP(obddev, create)(&conn, foo.prealloc, &id);
if (err) {
CDEBUG(D_IOCTL, "create: obd_inode_new failure\n");
/* 0 is the only error value */
- return put_user(0, (int *) arg);
+ put_user(0, (int *) arg);
+ return err;
}
- return put_user(i_ino, (int *) arg);
+ return put_user(id, (int *) arg);
}
case OBD_IOC_DESTROY: {
struct destroy_s {
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
copy_from_user(&destroy, (int *)arg, sizeof(struct destroy_s));
if ( !OBT(obddev) || !OBP(obddev, destroy) )
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
err = copy_from_user(&foo, (int *)arg, sizeof(foo));
if (err)
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
err = copy_from_user(&prealloc, (int *)arg, sizeof(prealloc));
if (err)
/* has this minor been registered? */
if (!obddev->obd_type)
- return -EINVAL;
+ return -ENODEV;
tmp = (void *)arg + sizeof(unsigned int);
get_user(conn_id, (int *) arg);
my %commands =
('device' => {func => "Device", doc => "device <dev>: open another OBD device"},
'create' => {func => "Create", doc => "create: creates a new inode"},
- 'attach' => {func => "Attach", doc => "attach { ext2_obd | snap_obd snapdev snapidx tableno | scsi_obd adapter bus tid lun" },
+ 'attach' => {func => "Attach", doc => "attach { ext2_obd | snap_obd snapdev snapidx tableno | scsi_obd adapter bus tid lun }" },
'detach' => {func => "Detach", doc => "detach this device"},
'testext2iterator' => {func => "TestExt2Iterator", doc => "test ext2 iterator function"},
'snapset' => {func => "SnapSetTable", doc => "snapset <tableno> <file>: set the table (created with snaptable) as table #tableno" },
sub Copy {
my $err = 0;
my $srcid = shift;
- my $tgtid = shift;
- my $data = pack("III", $::client_id, $srcid, $tgtid);
+ my $dstid = shift;
+
+ # Note: _copy IOCTL takes parameters as dst, src.
+ # Copy function takes parameters as src, dst.
+ my $data = pack("III", $::client_id, $dstid, $srcid);
my $datalen = 12;
my $packed = pack("ip", $datalen, $data);
sub Migrate {
my $err = 0;
my $srcid = shift;
- my $tgtid = shift;
- my $data = pack("III", $::client_id, $srcid, $tgtid);
+ my $dstid = shift;
+
+ # Note: _migr IOCTL takes parameters as dst, src.
+ # Migrate function takes parameters as src, dst.
+ my $data = pack("III", $::client_id, $dstid, $srcid);
my $datalen = 12;
my $packed = pack("ip", $datalen, $data);
struct page *page;
struct ext2_dir_entry_2 * de;
int err = -EIO;
- ino_t ino;
+ objid id;
ENTRY;
/*
* N.B. Several error exits in ext2_new_inode don't set err.
*/
- ino = iops(dir)->o_create(iid(dir), 0, &err);
+ err = iops(dir)->o_create(iid(dir), 0, &id);
if ( err )
return err;
- err = -EIO;
- inode = iget(dir->i_sb, ino);
+ inode = iget(dir->i_sb, (ino_t)id);
if (!inode || !list_empty(&inode->i_dentry)) {
- CDEBUG(D_INODE, "No inode, ino %ld\n", ino);
+ CDEBUG(D_INODE, "No inode, ino %ld\n", id);
EXIT;
- return err;
+ return -EIO;
}
inode->i_op = &obdfs_file_inode_operations;
struct inode * inode;
struct page *page;
struct ext2_dir_entry_2 * de;
- int err = -EIO;
+ int err;
- ino_t ino;
+ objid id;
ENTRY;
/*
* N.B. Several error exits in ext2_new_inode don't set err.
*/
- ino = iops(dir)->o_create(iid(dir), 0, &err);
- if ( ino == -1 )
- return -1;
- inode = iget(dir->i_sb, ino);
- if (!inode)
+ err = iops(dir)->o_create(iid(dir), 0, &id);
+ if ( err )
return err;
+ inode = iget(dir->i_sb, (ino_t)id);
+ if (!inode)
+ return -EIO;
inode->i_uid = current->fsuid;
init_special_inode(inode, mode, rdev);
struct page *page, *inode_page;
struct ext2_dir_entry_2 * de;
int err;
- ino_t ino;
+ objid id;
ENTRY;
if (dir->i_nlink >= EXT2_LINK_MAX)
goto out;
- err = -EIO;
- ino = iops(dir)->o_create(iid(dir), 0, &err);
- if ( ino == -1 )
- return -1;
- inode = iget(dir->i_sb, ino);
- if (!inode)
+ err = iops(dir)->o_create(iid(dir), 0, &id);
+ if ( err )
return err;
+ inode = iget(dir->i_sb, (ino_t)id);
+ if (!inode)
+ return -EIO;
inode->i_op = &obdfs_dir_inode_operations;
char * link;
int i, l, err = -EIO;
char c;
- ino_t ino;
+ objid id;
ENTRY;
/*
* N.B. Several error exits in ext2_new_inode don't set err.
*/
- ino = iops(dir)->o_create(iid(dir), 0, &err);
- if ( ino == -1 ) {
+ err = iops(dir)->o_create(iid(dir), 0, &id);
+ if ( err ) {
EXIT;
- return -1;
+ return err;
}
- inode = iget(dir->i_sb, ino);
+ inode = iget(dir->i_sb, (ino_t)id);
if (!inode) {
EXIT;
return err;