X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fobdcontrol;h=8bdfd02bb6324fd267c9a4c47a29b6d77f02ed95;hb=d2af72e46de8b349dc7356e2acdae375b257f6d0;hp=a399b7ee26e6b37915158a5567bc0ae1066815f8;hpb=f94ced5f79da783e38717813a58716906d0269f2;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/obdcontrol b/lustre/obdclass/obdcontrol index a399b7e..8bdfd02 100755 --- a/lustre/obdclass/obdcontrol +++ b/lustre/obdclass/obdcontrol @@ -61,6 +61,13 @@ eval 'sub OBD_IOC_COPY () { &_IOC(3, ord(\'f\'), 22, 4);}' unless defined(&OBD_IOC_COPY); eval 'sub OBD_IOC_MIGR () { &_IOC(3, ord(\'f\'), 23, 4);}' unless defined(&OBD_IOC_MIGR); +eval 'sub OBD_SNAP_SETTABLE () { &_IOC(3, ord(\'f\'), 40, 4);}' unless + defined(&OBD_SNAP_SETTABLE); +eval 'sub OBD_SNAP_PRINTTABLE () { &_IOC(3, ord(\'f\'), 41, 4);}' unless + defined(&OBD_SNAP_PRINTTABLE); + +eval 'sub OBD_EXT2_RUNIT () { &_IOC(3, ord(\'f\'), 61, 4);}' unless + defined(&OBD_EXT2_RUNIT); eval 'sub ATTR_MODE () {1;}' unless defined(&ATTR_MODE); eval 'sub ATTR_UID () {2;}' unless defined(&ATTR_UID); @@ -95,7 +102,12 @@ my %commands = 'create' => {func => "Create", doc => "create: creates a new inode"}, 'attach' => {func => "Attach", doc => "attach type [adapter bus tid lun]"}, 'detach' => {func => "Detach", doc => "detach this device"}, - 'snapattach' => {func => "SnapAttach", doc => "snapattach snapno snapcount time1 index1 .... timek indexk"}, + 'snapattach' => {func => "SnapAttach", doc => "snapattach snapno table"}, + 'snapset' => {func => "SnapSetTable", doc => "snapset tableno file" }, + 'snapprint' => {func => "SnapPrint", doc => "snapprint tableno"}, + + 'testiterator' => {func => "TestIterator", doc => ""}, + 'snaptable' => {func => "SnapShotTable", doc => "snaptable: build a snapshot table (interactive)"}, 'copy' => {func => "Copy", doc => "copy srcid tgtid"}, 'migrate' => {func => "Migrate", doc => "migrate srcid tgtid"}, @@ -260,7 +272,7 @@ sub Attach { $datalen = 4 * 4; } - my $packed = pack("ipip", length($type), $type, $datalen, $data); + my $packed = pack("Lipip", $::client_id, length($type), $type, $datalen, $data); my $rc = ioctl(DEV_OBD, &OBD_IOC_ATTACH, $packed); @@ -288,11 +300,60 @@ sub Detach { } -sub SnapAttach { + +sub TestIterator { + my $err = 0; + my $type = "ext2_obd"; + + $data = pack("i", 4711); + $datalen = 4; + + my $len = length($type); + my $cl = length($data); + my $add = pack("p", $data); + print "type $type (len $len), datalen $datalen ($cl)\n"; + my $packed = pack("Lipip", $::client_id, length($type), $type, $datalen, $data); + + my $rc = ioctl(DEV_OBD, &OBD_EXT2_RUNIT, $packed); + + if (!defined $rc) { + print STDERR "ioctl failed: $!\n"; + } elsif ($rc eq "0 but true") { + print "Finished (success)\n"; + } else { + print "ioctl returned error code $rc.\n"; + } +} + +sub SnapPrint { my $err = 0; my $type = "snap_obd"; - my $snapdev = shift; - my $snapno = shift; + my $snaptableno = shift; + + $data = pack("i", $snaptableno); + $datalen = 4; + + my $len = length($type); + my $cl = length($data); + my $add = pack("p", $data); + print "type $type (len $len), datalen $datalen ($cl)\n"; + my $packed = pack("Lipip", $::client_id, length($type), $type, $datalen, $data); + + my $rc = ioctl(DEV_OBD, &OBD_SNAP_PRINTTABLE, $packed); + + if (!defined $rc) { + print STDERR "ioctl failed: $!\n"; + } elsif ($rc eq "0 but true") { + print "Finished (success)\n"; + } else { + print "ioctl returned error code $rc.\n"; + } +} + +sub SnapSetTable { + my $err = 0; + my $type = "snap_obd"; + my $snaptableno = shift; my $file = shift; my $snapcount; my $table = {}; @@ -307,8 +368,13 @@ sub SnapAttach { $snapcount = keys %{$table}; print "Snapcount $snapcount\n"; - $data = pack("iii", $snapdev, $snapno, $snapcount); - $datalen = 3 * 4; + + if ( ! defined $table->{0} ) { + print "No current snapshot in table! First make one\n"; + return ; + } + $data = pack("ii", $snaptableno, $snapcount); + $datalen = 2 * 4; foreach my $time (sort keys %{$table}) { $data .= pack("Ii", $time, $table->{$time}); $datalen += 8; @@ -318,8 +384,43 @@ sub SnapAttach { my $cl = length($data); my $add = pack("p", $data); print "type $type (len $len), datalen $datalen ($cl)\n"; - printf "Addr of data %x\n", $add; - my $packed = pack("ipip", length($type), $type, $datalen, $data); + my $packed = pack("Lipip", $::client_id, length($type), $type, $datalen, $data); + + my $rc = ioctl(DEV_OBD, &OBD_SNAP_SETTABLE, $packed); + + if (!defined $rc) { + print STDERR "ioctl failed: $!\n"; + } elsif ($rc eq "0 but true") { + print "Finished (success)\n"; + } else { + print "ioctl returned error code $rc.\n"; + } +} + + +sub SnapAttach { + my $err = 0; + my $type = "snap_obd"; + my $snapdev = shift; + my $snapno = shift; + my $tableno = shift; + my $snapcount; + my $data; + my $datalen = 0; + +# if ( ! -f $file ) { +# print "No such file $file\n"; +# } + +# $table = ReadSnapShotTable($file); + $data = pack("iii", $snapdev, $snapno, $tableno); + $datalen = 3 * 4; + + my $len = length($type); + my $cl = length($data); + my $add = pack("p", $data); + print "type $type (len $len), datalen $datalen ($cl)\n"; + my $packed = pack("Lipip", $::client_id, length($type), $type, $datalen, $data); my $rc = ioctl(DEV_OBD, &OBD_IOC_ATTACH, $packed); @@ -350,11 +451,19 @@ sub SnapShotTable { goto again; add: - my $idx = &readl("enter new index: "); - my $time = &readl("enter time (hit RET for \"now\"): "); + my $idx = &readl("enter index where you want this snapshot: "); + my $time = &readl("enter time or 'now' or 'current': "); my $oldtime = SnapFindTimeFromIdx($idx, $table); - delete $table->{$oldtime} if defined $oldtime; - $time = time unless $time; + if (defined $oldtime) { + print "This already exists, first clean up\n"; + goto again; + } + + if ( $time eq 'now' ) { + $time = time; + } elsif ( $time eq 'current' ) { + $time = 0; + } $table->{$time} = $idx; goto again; @@ -389,6 +498,9 @@ sub PrintSnapShotTable { foreach $time ( sort keys %{$table} ) { my $stime = localtime($time); + if ( ! $time ) { + $stime = "current"; + } printf "Time: %s -- Index %d\n", $stime, $table->{$time}; } } @@ -404,6 +516,9 @@ sub ReadSnapShotTable { $table->{$time} = $index; } close FH; + + PrintSnapShotTable($table); + return $table; }