17
17
#include "internal.h"
18
18
#include "afs_fs.h"
19
19
#include "xdr_fs.h"
20
+ #include "protocol_yfs.h"
20
21
21
22
static const struct afs_fid afs_zero_fid ;
22
23
@@ -312,14 +313,18 @@ static void xdr_decode_AFSVolSync(const __be32 **_bp,
312
313
struct afs_volsync * volsync )
313
314
{
314
315
const __be32 * bp = * _bp ;
316
+ u32 creation ;
315
317
316
- volsync -> creation = ntohl (* bp ++ );
318
+ creation = ntohl (* bp ++ );
317
319
bp ++ ; /* spare2 */
318
320
bp ++ ; /* spare3 */
319
321
bp ++ ; /* spare4 */
320
322
bp ++ ; /* spare5 */
321
323
bp ++ ; /* spare6 */
322
324
* _bp = bp ;
325
+
326
+ if (volsync )
327
+ volsync -> creation = creation ;
323
328
}
324
329
325
330
/*
@@ -380,6 +385,8 @@ static void xdr_decode_AFSFetchVolumeStatus(const __be32 **_bp,
380
385
vs -> blocks_in_use = ntohl (* bp ++ );
381
386
vs -> part_blocks_avail = ntohl (* bp ++ );
382
387
vs -> part_max_blocks = ntohl (* bp ++ );
388
+ vs -> vol_copy_date = 0 ;
389
+ vs -> vol_backup_date = 0 ;
383
390
* _bp = bp ;
384
391
}
385
392
@@ -405,8 +412,7 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call)
405
412
if (ret < 0 )
406
413
return ret ;
407
414
xdr_decode_AFSCallBack (call , vnode , & bp );
408
- if (call -> reply [1 ])
409
- xdr_decode_AFSVolSync (& bp , call -> reply [1 ]);
415
+ xdr_decode_AFSVolSync (& bp , call -> reply [1 ]);
410
416
411
417
_leave (" = 0 [done]" );
412
418
return 0 ;
@@ -433,6 +439,9 @@ int afs_fs_fetch_file_status(struct afs_fs_cursor *fc, struct afs_volsync *volsy
433
439
struct afs_net * net = afs_v2net (vnode );
434
440
__be32 * bp ;
435
441
442
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
443
+ return yfs_fs_fetch_file_status (fc , volsync , new_inode );
444
+
436
445
_enter (",%x,{%llx:%llu},," ,
437
446
key_serial (fc -> key ), vnode -> fid .vid , vnode -> fid .vnode );
438
447
@@ -567,8 +576,7 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call)
567
576
if (ret < 0 )
568
577
return ret ;
569
578
xdr_decode_AFSCallBack (call , vnode , & bp );
570
- if (call -> reply [1 ])
571
- xdr_decode_AFSVolSync (& bp , call -> reply [1 ]);
579
+ xdr_decode_AFSVolSync (& bp , call -> reply [1 ]);
572
580
573
581
call -> unmarshall ++ ;
574
582
@@ -665,6 +673,9 @@ int afs_fs_fetch_data(struct afs_fs_cursor *fc, struct afs_read *req)
665
673
struct afs_net * net = afs_v2net (vnode );
666
674
__be32 * bp ;
667
675
676
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
677
+ return yfs_fs_fetch_data (fc , req );
678
+
668
679
if (upper_32_bits (req -> pos ) ||
669
680
upper_32_bits (req -> len ) ||
670
681
upper_32_bits (req -> pos + req -> len ))
@@ -765,6 +776,15 @@ int afs_fs_create(struct afs_fs_cursor *fc,
765
776
size_t namesz , reqsz , padsz ;
766
777
__be32 * bp ;
767
778
779
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags )){
780
+ if (S_ISDIR (mode ))
781
+ return yfs_fs_make_dir (fc , name , mode , current_data_version ,
782
+ newfid , newstatus , newcb );
783
+ else
784
+ return yfs_fs_create_file (fc , name , mode , current_data_version ,
785
+ newfid , newstatus , newcb );
786
+ }
787
+
768
788
_enter ("" );
769
789
770
790
namesz = strlen (name );
@@ -857,15 +877,18 @@ static const struct afs_call_type afs_RXFSRemoveDir = {
857
877
/*
858
878
* remove a file or directory
859
879
*/
860
- int afs_fs_remove (struct afs_fs_cursor * fc , const char * name , bool isdir ,
861
- u64 current_data_version )
880
+ int afs_fs_remove (struct afs_fs_cursor * fc , struct afs_vnode * vnode ,
881
+ const char * name , bool isdir , u64 current_data_version )
862
882
{
863
- struct afs_vnode * vnode = fc -> vnode ;
883
+ struct afs_vnode * dvnode = fc -> vnode ;
864
884
struct afs_call * call ;
865
- struct afs_net * net = afs_v2net (vnode );
885
+ struct afs_net * net = afs_v2net (dvnode );
866
886
size_t namesz , reqsz , padsz ;
867
887
__be32 * bp ;
868
888
889
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
890
+ return yfs_fs_remove (fc , vnode , name , isdir , current_data_version );
891
+
869
892
_enter ("" );
870
893
871
894
namesz = strlen (name );
@@ -879,15 +902,16 @@ int afs_fs_remove(struct afs_fs_cursor *fc, const char *name, bool isdir,
879
902
return - ENOMEM ;
880
903
881
904
call -> key = fc -> key ;
882
- call -> reply [0 ] = vnode ;
905
+ call -> reply [0 ] = dvnode ;
906
+ call -> reply [1 ] = vnode ;
883
907
call -> expected_version = current_data_version + 1 ;
884
908
885
909
/* marshall the parameters */
886
910
bp = call -> request ;
887
911
* bp ++ = htonl (isdir ? FSREMOVEDIR : FSREMOVEFILE );
888
- * bp ++ = htonl (vnode -> fid .vid );
889
- * bp ++ = htonl (vnode -> fid .vnode );
890
- * bp ++ = htonl (vnode -> fid .unique );
912
+ * bp ++ = htonl (dvnode -> fid .vid );
913
+ * bp ++ = htonl (dvnode -> fid .vnode );
914
+ * bp ++ = htonl (dvnode -> fid .unique );
891
915
* bp ++ = htonl (namesz );
892
916
memcpy (bp , name , namesz );
893
917
bp = (void * ) bp + namesz ;
@@ -897,7 +921,7 @@ int afs_fs_remove(struct afs_fs_cursor *fc, const char *name, bool isdir,
897
921
}
898
922
899
923
afs_use_fs_server (call , fc -> cbi );
900
- trace_afs_make_fs_call (call , & vnode -> fid );
924
+ trace_afs_make_fs_call (call , & dvnode -> fid );
901
925
return afs_make_call (& fc -> ac , call , GFP_NOFS , false);
902
926
}
903
927
@@ -953,6 +977,9 @@ int afs_fs_link(struct afs_fs_cursor *fc, struct afs_vnode *vnode,
953
977
size_t namesz , reqsz , padsz ;
954
978
__be32 * bp ;
955
979
980
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
981
+ return yfs_fs_link (fc , vnode , name , current_data_version );
982
+
956
983
_enter ("" );
957
984
958
985
namesz = strlen (name );
@@ -1047,6 +1074,10 @@ int afs_fs_symlink(struct afs_fs_cursor *fc,
1047
1074
size_t namesz , reqsz , padsz , c_namesz , c_padsz ;
1048
1075
__be32 * bp ;
1049
1076
1077
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1078
+ return yfs_fs_symlink (fc , name , contents , current_data_version ,
1079
+ newfid , newstatus );
1080
+
1050
1081
_enter ("" );
1051
1082
1052
1083
namesz = strlen (name );
@@ -1159,6 +1190,12 @@ int afs_fs_rename(struct afs_fs_cursor *fc,
1159
1190
size_t reqsz , o_namesz , o_padsz , n_namesz , n_padsz ;
1160
1191
__be32 * bp ;
1161
1192
1193
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1194
+ return yfs_fs_rename (fc , orig_name ,
1195
+ new_dvnode , new_name ,
1196
+ current_orig_data_version ,
1197
+ current_new_data_version );
1198
+
1162
1199
_enter ("" );
1163
1200
1164
1201
o_namesz = strlen (orig_name );
@@ -1329,6 +1366,9 @@ int afs_fs_store_data(struct afs_fs_cursor *fc, struct address_space *mapping,
1329
1366
loff_t size , pos , i_size ;
1330
1367
__be32 * bp ;
1331
1368
1369
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1370
+ return yfs_fs_store_data (fc , mapping , first , last , offset , to );
1371
+
1332
1372
_enter (",%x,{%llx:%llu},," ,
1333
1373
key_serial (fc -> key ), vnode -> fid .vid , vnode -> fid .vnode );
1334
1374
@@ -1544,6 +1584,9 @@ int afs_fs_setattr(struct afs_fs_cursor *fc, struct iattr *attr)
1544
1584
struct afs_net * net = afs_v2net (vnode );
1545
1585
__be32 * bp ;
1546
1586
1587
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1588
+ return yfs_fs_setattr (fc , attr );
1589
+
1547
1590
if (attr -> ia_valid & ATTR_SIZE )
1548
1591
return afs_fs_setattr_size (fc , attr );
1549
1592
@@ -1728,6 +1771,9 @@ int afs_fs_get_volume_status(struct afs_fs_cursor *fc,
1728
1771
__be32 * bp ;
1729
1772
void * tmpbuf ;
1730
1773
1774
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1775
+ return yfs_fs_get_volume_status (fc , vs );
1776
+
1731
1777
_enter ("" );
1732
1778
1733
1779
tmpbuf = kmalloc (AFSOPAQUEMAX , GFP_KERNEL );
@@ -1817,6 +1863,9 @@ int afs_fs_set_lock(struct afs_fs_cursor *fc, afs_lock_type_t type)
1817
1863
struct afs_net * net = afs_v2net (vnode );
1818
1864
__be32 * bp ;
1819
1865
1866
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1867
+ return yfs_fs_set_lock (fc , type );
1868
+
1820
1869
_enter ("" );
1821
1870
1822
1871
call = afs_alloc_flat_call (net , & afs_RXFSSetLock , 5 * 4 , 6 * 4 );
@@ -1849,6 +1898,9 @@ int afs_fs_extend_lock(struct afs_fs_cursor *fc)
1849
1898
struct afs_net * net = afs_v2net (vnode );
1850
1899
__be32 * bp ;
1851
1900
1901
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1902
+ return yfs_fs_extend_lock (fc );
1903
+
1852
1904
_enter ("" );
1853
1905
1854
1906
call = afs_alloc_flat_call (net , & afs_RXFSExtendLock , 4 * 4 , 6 * 4 );
@@ -1880,6 +1932,9 @@ int afs_fs_release_lock(struct afs_fs_cursor *fc)
1880
1932
struct afs_net * net = afs_v2net (vnode );
1881
1933
__be32 * bp ;
1882
1934
1935
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
1936
+ return yfs_fs_release_lock (fc );
1937
+
1883
1938
_enter ("" );
1884
1939
1885
1940
call = afs_alloc_flat_call (net , & afs_RXFSReleaseLock , 4 * 4 , 6 * 4 );
@@ -1951,6 +2006,7 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net,
1951
2006
*/
1952
2007
static int afs_deliver_fs_get_capabilities (struct afs_call * call )
1953
2008
{
2009
+ struct afs_server * server = call -> reply [0 ];
1954
2010
u32 count ;
1955
2011
int ret ;
1956
2012
@@ -1986,6 +2042,11 @@ static int afs_deliver_fs_get_capabilities(struct afs_call *call)
1986
2042
break ;
1987
2043
}
1988
2044
2045
+ if (call -> service_id == YFS_FS_SERVICE )
2046
+ set_bit (AFS_SERVER_FL_IS_YFS , & server -> flags );
2047
+ else
2048
+ clear_bit (AFS_SERVER_FL_IS_YFS , & server -> flags );
2049
+
1989
2050
_leave (" = 0 [done]" );
1990
2051
return 0 ;
1991
2052
}
@@ -2019,6 +2080,8 @@ int afs_fs_get_capabilities(struct afs_net *net,
2019
2080
return - ENOMEM ;
2020
2081
2021
2082
call -> key = key ;
2083
+ call -> reply [0 ] = server ;
2084
+ call -> upgrade = true;
2022
2085
2023
2086
/* marshall the parameters */
2024
2087
bp = call -> request ;
@@ -2054,8 +2117,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
2054
2117
if (ret < 0 )
2055
2118
return ret ;
2056
2119
xdr_decode_AFSCallBack_raw (call , & bp , callback );
2057
- if (volsync )
2058
- xdr_decode_AFSVolSync (& bp , volsync );
2120
+ xdr_decode_AFSVolSync (& bp , volsync );
2059
2121
2060
2122
_leave (" = 0 [done]" );
2061
2123
return 0 ;
@@ -2084,6 +2146,9 @@ int afs_fs_fetch_status(struct afs_fs_cursor *fc,
2084
2146
struct afs_call * call ;
2085
2147
__be32 * bp ;
2086
2148
2149
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
2150
+ return yfs_fs_fetch_status (fc , net , fid , status , callback , volsync );
2151
+
2087
2152
_enter (",%x,{%llx:%llu},," ,
2088
2153
key_serial (fc -> key ), fid -> vid , fid -> vnode );
2089
2154
@@ -2218,8 +2283,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
2218
2283
return ret ;
2219
2284
2220
2285
bp = call -> buffer ;
2221
- if (call -> reply [3 ])
2222
- xdr_decode_AFSVolSync (& bp , call -> reply [3 ]);
2286
+ xdr_decode_AFSVolSync (& bp , call -> reply [3 ]);
2223
2287
2224
2288
call -> unmarshall ++ ;
2225
2289
@@ -2256,6 +2320,10 @@ int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc,
2256
2320
__be32 * bp ;
2257
2321
int i ;
2258
2322
2323
+ if (test_bit (AFS_SERVER_FL_IS_YFS , & fc -> cbi -> server -> flags ))
2324
+ return yfs_fs_inline_bulk_status (fc , net , fids , statuses , callbacks ,
2325
+ nr_fids , volsync );
2326
+
2259
2327
_enter (",%x,{%llx:%llu},%u" ,
2260
2328
key_serial (fc -> key ), fids [0 ].vid , fids [1 ].vnode , nr_fids );
2261
2329
0 commit comments