fsclient.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834
  1. /* AFS File Server client stubs
  2. *
  3. * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/init.h>
  12. #include <linux/slab.h>
  13. #include <linux/sched.h>
  14. #include <linux/circ_buf.h>
  15. #include "internal.h"
  16. #include "afs_fs.h"
  17. /*
  18. * decode an AFSFid block
  19. */
  20. static void xdr_decode_AFSFid(const __be32 **_bp, struct afs_fid *fid)
  21. {
  22. const __be32 *bp = *_bp;
  23. fid->vid = ntohl(*bp++);
  24. fid->vnode = ntohl(*bp++);
  25. fid->unique = ntohl(*bp++);
  26. *_bp = bp;
  27. }
  28. /*
  29. * decode an AFSFetchStatus block
  30. */
  31. static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
  32. struct afs_file_status *status,
  33. struct afs_vnode *vnode,
  34. afs_dataversion_t *store_version)
  35. {
  36. afs_dataversion_t expected_version;
  37. const __be32 *bp = *_bp;
  38. umode_t mode;
  39. u64 data_version, size;
  40. u32 changed = 0; /* becomes non-zero if ctime-type changes seen */
  41. kuid_t owner;
  42. kgid_t group;
  43. #define EXTRACT(DST) \
  44. do { \
  45. u32 x = ntohl(*bp++); \
  46. changed |= DST - x; \
  47. DST = x; \
  48. } while (0)
  49. status->if_version = ntohl(*bp++);
  50. EXTRACT(status->type);
  51. EXTRACT(status->nlink);
  52. size = ntohl(*bp++);
  53. data_version = ntohl(*bp++);
  54. EXTRACT(status->author);
  55. owner = make_kuid(&init_user_ns, ntohl(*bp++));
  56. changed |= !uid_eq(owner, status->owner);
  57. status->owner = owner;
  58. EXTRACT(status->caller_access); /* call ticket dependent */
  59. EXTRACT(status->anon_access);
  60. EXTRACT(status->mode);
  61. EXTRACT(status->parent.vnode);
  62. EXTRACT(status->parent.unique);
  63. bp++; /* seg size */
  64. status->mtime_client = ntohl(*bp++);
  65. status->mtime_server = ntohl(*bp++);
  66. group = make_kgid(&init_user_ns, ntohl(*bp++));
  67. changed |= !gid_eq(group, status->group);
  68. status->group = group;
  69. bp++; /* sync counter */
  70. data_version |= (u64) ntohl(*bp++) << 32;
  71. EXTRACT(status->lock_count);
  72. size |= (u64) ntohl(*bp++) << 32;
  73. bp++; /* spare 4 */
  74. *_bp = bp;
  75. if (size != status->size) {
  76. status->size = size;
  77. changed |= true;
  78. }
  79. status->mode &= S_IALLUGO;
  80. _debug("vnode time %lx, %lx",
  81. status->mtime_client, status->mtime_server);
  82. if (vnode) {
  83. status->parent.vid = vnode->fid.vid;
  84. if (changed && !test_bit(AFS_VNODE_UNSET, &vnode->flags)) {
  85. _debug("vnode changed");
  86. i_size_write(&vnode->vfs_inode, size);
  87. vnode->vfs_inode.i_uid = status->owner;
  88. vnode->vfs_inode.i_gid = status->group;
  89. vnode->vfs_inode.i_generation = vnode->fid.unique;
  90. set_nlink(&vnode->vfs_inode, status->nlink);
  91. mode = vnode->vfs_inode.i_mode;
  92. mode &= ~S_IALLUGO;
  93. mode |= status->mode;
  94. barrier();
  95. vnode->vfs_inode.i_mode = mode;
  96. }
  97. vnode->vfs_inode.i_ctime.tv_sec = status->mtime_server;
  98. vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime;
  99. vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime;
  100. vnode->vfs_inode.i_version = data_version;
  101. }
  102. expected_version = status->data_version;
  103. if (store_version)
  104. expected_version = *store_version;
  105. if (expected_version != data_version) {
  106. status->data_version = data_version;
  107. if (vnode && !test_bit(AFS_VNODE_UNSET, &vnode->flags)) {
  108. _debug("vnode modified %llx on {%x:%u}",
  109. (unsigned long long) data_version,
  110. vnode->fid.vid, vnode->fid.vnode);
  111. set_bit(AFS_VNODE_MODIFIED, &vnode->flags);
  112. set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags);
  113. }
  114. } else if (store_version) {
  115. status->data_version = data_version;
  116. }
  117. }
  118. /*
  119. * decode an AFSCallBack block
  120. */
  121. static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode)
  122. {
  123. const __be32 *bp = *_bp;
  124. vnode->cb_version = ntohl(*bp++);
  125. vnode->cb_expiry = ntohl(*bp++);
  126. vnode->cb_type = ntohl(*bp++);
  127. vnode->cb_expires = vnode->cb_expiry + get_seconds();
  128. *_bp = bp;
  129. }
  130. static void xdr_decode_AFSCallBack_raw(const __be32 **_bp,
  131. struct afs_callback *cb)
  132. {
  133. const __be32 *bp = *_bp;
  134. cb->version = ntohl(*bp++);
  135. cb->expiry = ntohl(*bp++);
  136. cb->type = ntohl(*bp++);
  137. *_bp = bp;
  138. }
  139. /*
  140. * decode an AFSVolSync block
  141. */
  142. static void xdr_decode_AFSVolSync(const __be32 **_bp,
  143. struct afs_volsync *volsync)
  144. {
  145. const __be32 *bp = *_bp;
  146. volsync->creation = ntohl(*bp++);
  147. bp++; /* spare2 */
  148. bp++; /* spare3 */
  149. bp++; /* spare4 */
  150. bp++; /* spare5 */
  151. bp++; /* spare6 */
  152. *_bp = bp;
  153. }
  154. /*
  155. * encode the requested attributes into an AFSStoreStatus block
  156. */
  157. static void xdr_encode_AFS_StoreStatus(__be32 **_bp, struct iattr *attr)
  158. {
  159. __be32 *bp = *_bp;
  160. u32 mask = 0, mtime = 0, owner = 0, group = 0, mode = 0;
  161. mask = 0;
  162. if (attr->ia_valid & ATTR_MTIME) {
  163. mask |= AFS_SET_MTIME;
  164. mtime = attr->ia_mtime.tv_sec;
  165. }
  166. if (attr->ia_valid & ATTR_UID) {
  167. mask |= AFS_SET_OWNER;
  168. owner = from_kuid(&init_user_ns, attr->ia_uid);
  169. }
  170. if (attr->ia_valid & ATTR_GID) {
  171. mask |= AFS_SET_GROUP;
  172. group = from_kgid(&init_user_ns, attr->ia_gid);
  173. }
  174. if (attr->ia_valid & ATTR_MODE) {
  175. mask |= AFS_SET_MODE;
  176. mode = attr->ia_mode & S_IALLUGO;
  177. }
  178. *bp++ = htonl(mask);
  179. *bp++ = htonl(mtime);
  180. *bp++ = htonl(owner);
  181. *bp++ = htonl(group);
  182. *bp++ = htonl(mode);
  183. *bp++ = 0; /* segment size */
  184. *_bp = bp;
  185. }
  186. /*
  187. * decode an AFSFetchVolumeStatus block
  188. */
  189. static void xdr_decode_AFSFetchVolumeStatus(const __be32 **_bp,
  190. struct afs_volume_status *vs)
  191. {
  192. const __be32 *bp = *_bp;
  193. vs->vid = ntohl(*bp++);
  194. vs->parent_id = ntohl(*bp++);
  195. vs->online = ntohl(*bp++);
  196. vs->in_service = ntohl(*bp++);
  197. vs->blessed = ntohl(*bp++);
  198. vs->needs_salvage = ntohl(*bp++);
  199. vs->type = ntohl(*bp++);
  200. vs->min_quota = ntohl(*bp++);
  201. vs->max_quota = ntohl(*bp++);
  202. vs->blocks_in_use = ntohl(*bp++);
  203. vs->part_blocks_avail = ntohl(*bp++);
  204. vs->part_max_blocks = ntohl(*bp++);
  205. *_bp = bp;
  206. }
  207. /*
  208. * deliver reply data to an FS.FetchStatus
  209. */
  210. static int afs_deliver_fs_fetch_status(struct afs_call *call,
  211. struct sk_buff *skb, bool last)
  212. {
  213. struct afs_vnode *vnode = call->reply;
  214. const __be32 *bp;
  215. int ret;
  216. _enter(",,%u", last);
  217. ret = afs_transfer_reply(call, skb, last);
  218. if (ret < 0)
  219. return ret;
  220. /* unmarshall the reply once we've received all of it */
  221. bp = call->buffer;
  222. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  223. xdr_decode_AFSCallBack(&bp, vnode);
  224. if (call->reply2)
  225. xdr_decode_AFSVolSync(&bp, call->reply2);
  226. _leave(" = 0 [done]");
  227. return 0;
  228. }
  229. /*
  230. * FS.FetchStatus operation type
  231. */
  232. static const struct afs_call_type afs_RXFSFetchStatus = {
  233. .name = "FS.FetchStatus",
  234. .deliver = afs_deliver_fs_fetch_status,
  235. .abort_to_error = afs_abort_to_error,
  236. .destructor = afs_flat_call_destructor,
  237. };
  238. /*
  239. * fetch the status information for a file
  240. */
  241. int afs_fs_fetch_file_status(struct afs_server *server,
  242. struct key *key,
  243. struct afs_vnode *vnode,
  244. struct afs_volsync *volsync,
  245. const struct afs_wait_mode *wait_mode)
  246. {
  247. struct afs_call *call;
  248. __be32 *bp;
  249. _enter(",%x,{%x:%u},,",
  250. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  251. call = afs_alloc_flat_call(&afs_RXFSFetchStatus, 16, (21 + 3 + 6) * 4);
  252. if (!call)
  253. return -ENOMEM;
  254. call->key = key;
  255. call->reply = vnode;
  256. call->reply2 = volsync;
  257. call->service_id = FS_SERVICE;
  258. call->port = htons(AFS_FS_PORT);
  259. /* marshall the parameters */
  260. bp = call->request;
  261. bp[0] = htonl(FSFETCHSTATUS);
  262. bp[1] = htonl(vnode->fid.vid);
  263. bp[2] = htonl(vnode->fid.vnode);
  264. bp[3] = htonl(vnode->fid.unique);
  265. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  266. }
  267. /*
  268. * deliver reply data to an FS.FetchData
  269. */
  270. static int afs_deliver_fs_fetch_data(struct afs_call *call,
  271. struct sk_buff *skb, bool last)
  272. {
  273. struct afs_vnode *vnode = call->reply;
  274. const __be32 *bp;
  275. struct page *page;
  276. void *buffer;
  277. int ret;
  278. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  279. switch (call->unmarshall) {
  280. case 0:
  281. call->offset = 0;
  282. call->unmarshall++;
  283. if (call->operation_ID != FSFETCHDATA64) {
  284. call->unmarshall++;
  285. goto no_msw;
  286. }
  287. /* extract the upper part of the returned data length of an
  288. * FSFETCHDATA64 op (which should always be 0 using this
  289. * client) */
  290. case 1:
  291. _debug("extract data length (MSW)");
  292. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  293. if (ret < 0)
  294. return ret;
  295. call->count = ntohl(call->tmp);
  296. _debug("DATA length MSW: %u", call->count);
  297. if (call->count > 0)
  298. return -EBADMSG;
  299. call->offset = 0;
  300. call->unmarshall++;
  301. no_msw:
  302. /* extract the returned data length */
  303. case 2:
  304. _debug("extract data length");
  305. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  306. if (ret < 0)
  307. return ret;
  308. call->count = ntohl(call->tmp);
  309. _debug("DATA length: %u", call->count);
  310. if (call->count > PAGE_SIZE)
  311. return -EBADMSG;
  312. call->offset = 0;
  313. call->unmarshall++;
  314. /* extract the returned data */
  315. case 3:
  316. _debug("extract data");
  317. if (call->count > 0) {
  318. page = call->reply3;
  319. buffer = kmap_atomic(page);
  320. ret = afs_extract_data(call, skb, last, buffer,
  321. call->count);
  322. kunmap_atomic(buffer);
  323. if (ret < 0)
  324. return ret;
  325. }
  326. call->offset = 0;
  327. call->unmarshall++;
  328. /* extract the metadata */
  329. case 4:
  330. ret = afs_extract_data(call, skb, last, call->buffer,
  331. (21 + 3 + 6) * 4);
  332. if (ret < 0)
  333. return ret;
  334. bp = call->buffer;
  335. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  336. xdr_decode_AFSCallBack(&bp, vnode);
  337. if (call->reply2)
  338. xdr_decode_AFSVolSync(&bp, call->reply2);
  339. call->offset = 0;
  340. call->unmarshall++;
  341. case 5:
  342. ret = afs_data_complete(call, skb, last);
  343. if (ret < 0)
  344. return ret;
  345. break;
  346. }
  347. if (call->count < PAGE_SIZE) {
  348. _debug("clear");
  349. page = call->reply3;
  350. buffer = kmap_atomic(page);
  351. memset(buffer + call->count, 0, PAGE_SIZE - call->count);
  352. kunmap_atomic(buffer);
  353. }
  354. _leave(" = 0 [done]");
  355. return 0;
  356. }
  357. /*
  358. * FS.FetchData operation type
  359. */
  360. static const struct afs_call_type afs_RXFSFetchData = {
  361. .name = "FS.FetchData",
  362. .deliver = afs_deliver_fs_fetch_data,
  363. .abort_to_error = afs_abort_to_error,
  364. .destructor = afs_flat_call_destructor,
  365. };
  366. static const struct afs_call_type afs_RXFSFetchData64 = {
  367. .name = "FS.FetchData64",
  368. .deliver = afs_deliver_fs_fetch_data,
  369. .abort_to_error = afs_abort_to_error,
  370. .destructor = afs_flat_call_destructor,
  371. };
  372. /*
  373. * fetch data from a very large file
  374. */
  375. static int afs_fs_fetch_data64(struct afs_server *server,
  376. struct key *key,
  377. struct afs_vnode *vnode,
  378. off_t offset, size_t length,
  379. struct page *buffer,
  380. const struct afs_wait_mode *wait_mode)
  381. {
  382. struct afs_call *call;
  383. __be32 *bp;
  384. _enter("");
  385. ASSERTCMP(length, <, ULONG_MAX);
  386. call = afs_alloc_flat_call(&afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
  387. if (!call)
  388. return -ENOMEM;
  389. call->key = key;
  390. call->reply = vnode;
  391. call->reply2 = NULL; /* volsync */
  392. call->reply3 = buffer;
  393. call->service_id = FS_SERVICE;
  394. call->port = htons(AFS_FS_PORT);
  395. call->operation_ID = FSFETCHDATA64;
  396. /* marshall the parameters */
  397. bp = call->request;
  398. bp[0] = htonl(FSFETCHDATA64);
  399. bp[1] = htonl(vnode->fid.vid);
  400. bp[2] = htonl(vnode->fid.vnode);
  401. bp[3] = htonl(vnode->fid.unique);
  402. bp[4] = htonl(upper_32_bits(offset));
  403. bp[5] = htonl((u32) offset);
  404. bp[6] = 0;
  405. bp[7] = htonl((u32) length);
  406. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  407. }
  408. /*
  409. * fetch data from a file
  410. */
  411. int afs_fs_fetch_data(struct afs_server *server,
  412. struct key *key,
  413. struct afs_vnode *vnode,
  414. off_t offset, size_t length,
  415. struct page *buffer,
  416. const struct afs_wait_mode *wait_mode)
  417. {
  418. struct afs_call *call;
  419. __be32 *bp;
  420. if (upper_32_bits(offset) || upper_32_bits(offset + length))
  421. return afs_fs_fetch_data64(server, key, vnode, offset, length,
  422. buffer, wait_mode);
  423. _enter("");
  424. call = afs_alloc_flat_call(&afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
  425. if (!call)
  426. return -ENOMEM;
  427. call->key = key;
  428. call->reply = vnode;
  429. call->reply2 = NULL; /* volsync */
  430. call->reply3 = buffer;
  431. call->service_id = FS_SERVICE;
  432. call->port = htons(AFS_FS_PORT);
  433. call->operation_ID = FSFETCHDATA;
  434. /* marshall the parameters */
  435. bp = call->request;
  436. bp[0] = htonl(FSFETCHDATA);
  437. bp[1] = htonl(vnode->fid.vid);
  438. bp[2] = htonl(vnode->fid.vnode);
  439. bp[3] = htonl(vnode->fid.unique);
  440. bp[4] = htonl(offset);
  441. bp[5] = htonl(length);
  442. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  443. }
  444. /*
  445. * deliver reply data to an FS.GiveUpCallBacks
  446. */
  447. static int afs_deliver_fs_give_up_callbacks(struct afs_call *call,
  448. struct sk_buff *skb, bool last)
  449. {
  450. _enter(",{%u},%d", skb->len, last);
  451. /* shouldn't be any reply data */
  452. return afs_data_complete(call, skb, last);
  453. }
  454. /*
  455. * FS.GiveUpCallBacks operation type
  456. */
  457. static const struct afs_call_type afs_RXFSGiveUpCallBacks = {
  458. .name = "FS.GiveUpCallBacks",
  459. .deliver = afs_deliver_fs_give_up_callbacks,
  460. .abort_to_error = afs_abort_to_error,
  461. .destructor = afs_flat_call_destructor,
  462. };
  463. /*
  464. * give up a set of callbacks
  465. * - the callbacks are held in the server->cb_break ring
  466. */
  467. int afs_fs_give_up_callbacks(struct afs_server *server,
  468. const struct afs_wait_mode *wait_mode)
  469. {
  470. struct afs_call *call;
  471. size_t ncallbacks;
  472. __be32 *bp, *tp;
  473. int loop;
  474. ncallbacks = CIRC_CNT(server->cb_break_head, server->cb_break_tail,
  475. ARRAY_SIZE(server->cb_break));
  476. _enter("{%zu},", ncallbacks);
  477. if (ncallbacks == 0)
  478. return 0;
  479. if (ncallbacks > AFSCBMAX)
  480. ncallbacks = AFSCBMAX;
  481. _debug("break %zu callbacks", ncallbacks);
  482. call = afs_alloc_flat_call(&afs_RXFSGiveUpCallBacks,
  483. 12 + ncallbacks * 6 * 4, 0);
  484. if (!call)
  485. return -ENOMEM;
  486. call->service_id = FS_SERVICE;
  487. call->port = htons(AFS_FS_PORT);
  488. /* marshall the parameters */
  489. bp = call->request;
  490. tp = bp + 2 + ncallbacks * 3;
  491. *bp++ = htonl(FSGIVEUPCALLBACKS);
  492. *bp++ = htonl(ncallbacks);
  493. *tp++ = htonl(ncallbacks);
  494. atomic_sub(ncallbacks, &server->cb_break_n);
  495. for (loop = ncallbacks; loop > 0; loop--) {
  496. struct afs_callback *cb =
  497. &server->cb_break[server->cb_break_tail];
  498. *bp++ = htonl(cb->fid.vid);
  499. *bp++ = htonl(cb->fid.vnode);
  500. *bp++ = htonl(cb->fid.unique);
  501. *tp++ = htonl(cb->version);
  502. *tp++ = htonl(cb->expiry);
  503. *tp++ = htonl(cb->type);
  504. smp_mb();
  505. server->cb_break_tail =
  506. (server->cb_break_tail + 1) &
  507. (ARRAY_SIZE(server->cb_break) - 1);
  508. }
  509. ASSERT(ncallbacks > 0);
  510. wake_up_nr(&server->cb_break_waitq, ncallbacks);
  511. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  512. }
  513. /*
  514. * deliver reply data to an FS.CreateFile or an FS.MakeDir
  515. */
  516. static int afs_deliver_fs_create_vnode(struct afs_call *call,
  517. struct sk_buff *skb, bool last)
  518. {
  519. struct afs_vnode *vnode = call->reply;
  520. const __be32 *bp;
  521. int ret;
  522. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  523. ret = afs_transfer_reply(call, skb, last);
  524. if (ret < 0)
  525. return ret;
  526. /* unmarshall the reply once we've received all of it */
  527. bp = call->buffer;
  528. xdr_decode_AFSFid(&bp, call->reply2);
  529. xdr_decode_AFSFetchStatus(&bp, call->reply3, NULL, NULL);
  530. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  531. xdr_decode_AFSCallBack_raw(&bp, call->reply4);
  532. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  533. _leave(" = 0 [done]");
  534. return 0;
  535. }
  536. /*
  537. * FS.CreateFile and FS.MakeDir operation type
  538. */
  539. static const struct afs_call_type afs_RXFSCreateXXXX = {
  540. .name = "FS.CreateXXXX",
  541. .deliver = afs_deliver_fs_create_vnode,
  542. .abort_to_error = afs_abort_to_error,
  543. .destructor = afs_flat_call_destructor,
  544. };
  545. /*
  546. * create a file or make a directory
  547. */
  548. int afs_fs_create(struct afs_server *server,
  549. struct key *key,
  550. struct afs_vnode *vnode,
  551. const char *name,
  552. umode_t mode,
  553. struct afs_fid *newfid,
  554. struct afs_file_status *newstatus,
  555. struct afs_callback *newcb,
  556. const struct afs_wait_mode *wait_mode)
  557. {
  558. struct afs_call *call;
  559. size_t namesz, reqsz, padsz;
  560. __be32 *bp;
  561. _enter("");
  562. namesz = strlen(name);
  563. padsz = (4 - (namesz & 3)) & 3;
  564. reqsz = (5 * 4) + namesz + padsz + (6 * 4);
  565. call = afs_alloc_flat_call(&afs_RXFSCreateXXXX, reqsz,
  566. (3 + 21 + 21 + 3 + 6) * 4);
  567. if (!call)
  568. return -ENOMEM;
  569. call->key = key;
  570. call->reply = vnode;
  571. call->reply2 = newfid;
  572. call->reply3 = newstatus;
  573. call->reply4 = newcb;
  574. call->service_id = FS_SERVICE;
  575. call->port = htons(AFS_FS_PORT);
  576. /* marshall the parameters */
  577. bp = call->request;
  578. *bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE);
  579. *bp++ = htonl(vnode->fid.vid);
  580. *bp++ = htonl(vnode->fid.vnode);
  581. *bp++ = htonl(vnode->fid.unique);
  582. *bp++ = htonl(namesz);
  583. memcpy(bp, name, namesz);
  584. bp = (void *) bp + namesz;
  585. if (padsz > 0) {
  586. memset(bp, 0, padsz);
  587. bp = (void *) bp + padsz;
  588. }
  589. *bp++ = htonl(AFS_SET_MODE);
  590. *bp++ = 0; /* mtime */
  591. *bp++ = 0; /* owner */
  592. *bp++ = 0; /* group */
  593. *bp++ = htonl(mode & S_IALLUGO); /* unix mode */
  594. *bp++ = 0; /* segment size */
  595. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  596. }
  597. /*
  598. * deliver reply data to an FS.RemoveFile or FS.RemoveDir
  599. */
  600. static int afs_deliver_fs_remove(struct afs_call *call,
  601. struct sk_buff *skb, bool last)
  602. {
  603. struct afs_vnode *vnode = call->reply;
  604. const __be32 *bp;
  605. int ret;
  606. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  607. ret = afs_transfer_reply(call, skb, last);
  608. if (ret < 0)
  609. return ret;
  610. /* unmarshall the reply once we've received all of it */
  611. bp = call->buffer;
  612. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  613. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  614. _leave(" = 0 [done]");
  615. return 0;
  616. }
  617. /*
  618. * FS.RemoveDir/FS.RemoveFile operation type
  619. */
  620. static const struct afs_call_type afs_RXFSRemoveXXXX = {
  621. .name = "FS.RemoveXXXX",
  622. .deliver = afs_deliver_fs_remove,
  623. .abort_to_error = afs_abort_to_error,
  624. .destructor = afs_flat_call_destructor,
  625. };
  626. /*
  627. * remove a file or directory
  628. */
  629. int afs_fs_remove(struct afs_server *server,
  630. struct key *key,
  631. struct afs_vnode *vnode,
  632. const char *name,
  633. bool isdir,
  634. const struct afs_wait_mode *wait_mode)
  635. {
  636. struct afs_call *call;
  637. size_t namesz, reqsz, padsz;
  638. __be32 *bp;
  639. _enter("");
  640. namesz = strlen(name);
  641. padsz = (4 - (namesz & 3)) & 3;
  642. reqsz = (5 * 4) + namesz + padsz;
  643. call = afs_alloc_flat_call(&afs_RXFSRemoveXXXX, reqsz, (21 + 6) * 4);
  644. if (!call)
  645. return -ENOMEM;
  646. call->key = key;
  647. call->reply = vnode;
  648. call->service_id = FS_SERVICE;
  649. call->port = htons(AFS_FS_PORT);
  650. /* marshall the parameters */
  651. bp = call->request;
  652. *bp++ = htonl(isdir ? FSREMOVEDIR : FSREMOVEFILE);
  653. *bp++ = htonl(vnode->fid.vid);
  654. *bp++ = htonl(vnode->fid.vnode);
  655. *bp++ = htonl(vnode->fid.unique);
  656. *bp++ = htonl(namesz);
  657. memcpy(bp, name, namesz);
  658. bp = (void *) bp + namesz;
  659. if (padsz > 0) {
  660. memset(bp, 0, padsz);
  661. bp = (void *) bp + padsz;
  662. }
  663. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  664. }
  665. /*
  666. * deliver reply data to an FS.Link
  667. */
  668. static int afs_deliver_fs_link(struct afs_call *call,
  669. struct sk_buff *skb, bool last)
  670. {
  671. struct afs_vnode *dvnode = call->reply, *vnode = call->reply2;
  672. const __be32 *bp;
  673. int ret;
  674. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  675. ret = afs_transfer_reply(call, skb, last);
  676. if (ret < 0)
  677. return ret;
  678. /* unmarshall the reply once we've received all of it */
  679. bp = call->buffer;
  680. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  681. xdr_decode_AFSFetchStatus(&bp, &dvnode->status, dvnode, NULL);
  682. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  683. _leave(" = 0 [done]");
  684. return 0;
  685. }
  686. /*
  687. * FS.Link operation type
  688. */
  689. static const struct afs_call_type afs_RXFSLink = {
  690. .name = "FS.Link",
  691. .deliver = afs_deliver_fs_link,
  692. .abort_to_error = afs_abort_to_error,
  693. .destructor = afs_flat_call_destructor,
  694. };
  695. /*
  696. * make a hard link
  697. */
  698. int afs_fs_link(struct afs_server *server,
  699. struct key *key,
  700. struct afs_vnode *dvnode,
  701. struct afs_vnode *vnode,
  702. const char *name,
  703. const struct afs_wait_mode *wait_mode)
  704. {
  705. struct afs_call *call;
  706. size_t namesz, reqsz, padsz;
  707. __be32 *bp;
  708. _enter("");
  709. namesz = strlen(name);
  710. padsz = (4 - (namesz & 3)) & 3;
  711. reqsz = (5 * 4) + namesz + padsz + (3 * 4);
  712. call = afs_alloc_flat_call(&afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);
  713. if (!call)
  714. return -ENOMEM;
  715. call->key = key;
  716. call->reply = dvnode;
  717. call->reply2 = vnode;
  718. call->service_id = FS_SERVICE;
  719. call->port = htons(AFS_FS_PORT);
  720. /* marshall the parameters */
  721. bp = call->request;
  722. *bp++ = htonl(FSLINK);
  723. *bp++ = htonl(dvnode->fid.vid);
  724. *bp++ = htonl(dvnode->fid.vnode);
  725. *bp++ = htonl(dvnode->fid.unique);
  726. *bp++ = htonl(namesz);
  727. memcpy(bp, name, namesz);
  728. bp = (void *) bp + namesz;
  729. if (padsz > 0) {
  730. memset(bp, 0, padsz);
  731. bp = (void *) bp + padsz;
  732. }
  733. *bp++ = htonl(vnode->fid.vid);
  734. *bp++ = htonl(vnode->fid.vnode);
  735. *bp++ = htonl(vnode->fid.unique);
  736. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  737. }
  738. /*
  739. * deliver reply data to an FS.Symlink
  740. */
  741. static int afs_deliver_fs_symlink(struct afs_call *call,
  742. struct sk_buff *skb, bool last)
  743. {
  744. struct afs_vnode *vnode = call->reply;
  745. const __be32 *bp;
  746. int ret;
  747. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  748. ret = afs_transfer_reply(call, skb, last);
  749. if (ret < 0)
  750. return ret;
  751. /* unmarshall the reply once we've received all of it */
  752. bp = call->buffer;
  753. xdr_decode_AFSFid(&bp, call->reply2);
  754. xdr_decode_AFSFetchStatus(&bp, call->reply3, NULL, NULL);
  755. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  756. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  757. _leave(" = 0 [done]");
  758. return 0;
  759. }
  760. /*
  761. * FS.Symlink operation type
  762. */
  763. static const struct afs_call_type afs_RXFSSymlink = {
  764. .name = "FS.Symlink",
  765. .deliver = afs_deliver_fs_symlink,
  766. .abort_to_error = afs_abort_to_error,
  767. .destructor = afs_flat_call_destructor,
  768. };
  769. /*
  770. * create a symbolic link
  771. */
  772. int afs_fs_symlink(struct afs_server *server,
  773. struct key *key,
  774. struct afs_vnode *vnode,
  775. const char *name,
  776. const char *contents,
  777. struct afs_fid *newfid,
  778. struct afs_file_status *newstatus,
  779. const struct afs_wait_mode *wait_mode)
  780. {
  781. struct afs_call *call;
  782. size_t namesz, reqsz, padsz, c_namesz, c_padsz;
  783. __be32 *bp;
  784. _enter("");
  785. namesz = strlen(name);
  786. padsz = (4 - (namesz & 3)) & 3;
  787. c_namesz = strlen(contents);
  788. c_padsz = (4 - (c_namesz & 3)) & 3;
  789. reqsz = (6 * 4) + namesz + padsz + c_namesz + c_padsz + (6 * 4);
  790. call = afs_alloc_flat_call(&afs_RXFSSymlink, reqsz,
  791. (3 + 21 + 21 + 6) * 4);
  792. if (!call)
  793. return -ENOMEM;
  794. call->key = key;
  795. call->reply = vnode;
  796. call->reply2 = newfid;
  797. call->reply3 = newstatus;
  798. call->service_id = FS_SERVICE;
  799. call->port = htons(AFS_FS_PORT);
  800. /* marshall the parameters */
  801. bp = call->request;
  802. *bp++ = htonl(FSSYMLINK);
  803. *bp++ = htonl(vnode->fid.vid);
  804. *bp++ = htonl(vnode->fid.vnode);
  805. *bp++ = htonl(vnode->fid.unique);
  806. *bp++ = htonl(namesz);
  807. memcpy(bp, name, namesz);
  808. bp = (void *) bp + namesz;
  809. if (padsz > 0) {
  810. memset(bp, 0, padsz);
  811. bp = (void *) bp + padsz;
  812. }
  813. *bp++ = htonl(c_namesz);
  814. memcpy(bp, contents, c_namesz);
  815. bp = (void *) bp + c_namesz;
  816. if (c_padsz > 0) {
  817. memset(bp, 0, c_padsz);
  818. bp = (void *) bp + c_padsz;
  819. }
  820. *bp++ = htonl(AFS_SET_MODE);
  821. *bp++ = 0; /* mtime */
  822. *bp++ = 0; /* owner */
  823. *bp++ = 0; /* group */
  824. *bp++ = htonl(S_IRWXUGO); /* unix mode */
  825. *bp++ = 0; /* segment size */
  826. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  827. }
  828. /*
  829. * deliver reply data to an FS.Rename
  830. */
  831. static int afs_deliver_fs_rename(struct afs_call *call,
  832. struct sk_buff *skb, bool last)
  833. {
  834. struct afs_vnode *orig_dvnode = call->reply, *new_dvnode = call->reply2;
  835. const __be32 *bp;
  836. int ret;
  837. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  838. ret = afs_transfer_reply(call, skb, last);
  839. if (ret < 0)
  840. return ret;
  841. /* unmarshall the reply once we've received all of it */
  842. bp = call->buffer;
  843. xdr_decode_AFSFetchStatus(&bp, &orig_dvnode->status, orig_dvnode, NULL);
  844. if (new_dvnode != orig_dvnode)
  845. xdr_decode_AFSFetchStatus(&bp, &new_dvnode->status, new_dvnode,
  846. NULL);
  847. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  848. _leave(" = 0 [done]");
  849. return 0;
  850. }
  851. /*
  852. * FS.Rename operation type
  853. */
  854. static const struct afs_call_type afs_RXFSRename = {
  855. .name = "FS.Rename",
  856. .deliver = afs_deliver_fs_rename,
  857. .abort_to_error = afs_abort_to_error,
  858. .destructor = afs_flat_call_destructor,
  859. };
  860. /*
  861. * create a symbolic link
  862. */
  863. int afs_fs_rename(struct afs_server *server,
  864. struct key *key,
  865. struct afs_vnode *orig_dvnode,
  866. const char *orig_name,
  867. struct afs_vnode *new_dvnode,
  868. const char *new_name,
  869. const struct afs_wait_mode *wait_mode)
  870. {
  871. struct afs_call *call;
  872. size_t reqsz, o_namesz, o_padsz, n_namesz, n_padsz;
  873. __be32 *bp;
  874. _enter("");
  875. o_namesz = strlen(orig_name);
  876. o_padsz = (4 - (o_namesz & 3)) & 3;
  877. n_namesz = strlen(new_name);
  878. n_padsz = (4 - (n_namesz & 3)) & 3;
  879. reqsz = (4 * 4) +
  880. 4 + o_namesz + o_padsz +
  881. (3 * 4) +
  882. 4 + n_namesz + n_padsz;
  883. call = afs_alloc_flat_call(&afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);
  884. if (!call)
  885. return -ENOMEM;
  886. call->key = key;
  887. call->reply = orig_dvnode;
  888. call->reply2 = new_dvnode;
  889. call->service_id = FS_SERVICE;
  890. call->port = htons(AFS_FS_PORT);
  891. /* marshall the parameters */
  892. bp = call->request;
  893. *bp++ = htonl(FSRENAME);
  894. *bp++ = htonl(orig_dvnode->fid.vid);
  895. *bp++ = htonl(orig_dvnode->fid.vnode);
  896. *bp++ = htonl(orig_dvnode->fid.unique);
  897. *bp++ = htonl(o_namesz);
  898. memcpy(bp, orig_name, o_namesz);
  899. bp = (void *) bp + o_namesz;
  900. if (o_padsz > 0) {
  901. memset(bp, 0, o_padsz);
  902. bp = (void *) bp + o_padsz;
  903. }
  904. *bp++ = htonl(new_dvnode->fid.vid);
  905. *bp++ = htonl(new_dvnode->fid.vnode);
  906. *bp++ = htonl(new_dvnode->fid.unique);
  907. *bp++ = htonl(n_namesz);
  908. memcpy(bp, new_name, n_namesz);
  909. bp = (void *) bp + n_namesz;
  910. if (n_padsz > 0) {
  911. memset(bp, 0, n_padsz);
  912. bp = (void *) bp + n_padsz;
  913. }
  914. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  915. }
  916. /*
  917. * deliver reply data to an FS.StoreData
  918. */
  919. static int afs_deliver_fs_store_data(struct afs_call *call,
  920. struct sk_buff *skb, bool last)
  921. {
  922. struct afs_vnode *vnode = call->reply;
  923. const __be32 *bp;
  924. int ret;
  925. _enter(",,%u", last);
  926. ret = afs_transfer_reply(call, skb, last);
  927. if (ret < 0)
  928. return ret;
  929. /* unmarshall the reply once we've received all of it */
  930. bp = call->buffer;
  931. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode,
  932. &call->store_version);
  933. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  934. afs_pages_written_back(vnode, call);
  935. _leave(" = 0 [done]");
  936. return 0;
  937. }
  938. /*
  939. * FS.StoreData operation type
  940. */
  941. static const struct afs_call_type afs_RXFSStoreData = {
  942. .name = "FS.StoreData",
  943. .deliver = afs_deliver_fs_store_data,
  944. .abort_to_error = afs_abort_to_error,
  945. .destructor = afs_flat_call_destructor,
  946. };
  947. static const struct afs_call_type afs_RXFSStoreData64 = {
  948. .name = "FS.StoreData64",
  949. .deliver = afs_deliver_fs_store_data,
  950. .abort_to_error = afs_abort_to_error,
  951. .destructor = afs_flat_call_destructor,
  952. };
  953. /*
  954. * store a set of pages to a very large file
  955. */
  956. static int afs_fs_store_data64(struct afs_server *server,
  957. struct afs_writeback *wb,
  958. pgoff_t first, pgoff_t last,
  959. unsigned offset, unsigned to,
  960. loff_t size, loff_t pos, loff_t i_size,
  961. const struct afs_wait_mode *wait_mode)
  962. {
  963. struct afs_vnode *vnode = wb->vnode;
  964. struct afs_call *call;
  965. __be32 *bp;
  966. _enter(",%x,{%x:%u},,",
  967. key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);
  968. call = afs_alloc_flat_call(&afs_RXFSStoreData64,
  969. (4 + 6 + 3 * 2) * 4,
  970. (21 + 6) * 4);
  971. if (!call)
  972. return -ENOMEM;
  973. call->wb = wb;
  974. call->key = wb->key;
  975. call->reply = vnode;
  976. call->service_id = FS_SERVICE;
  977. call->port = htons(AFS_FS_PORT);
  978. call->mapping = vnode->vfs_inode.i_mapping;
  979. call->first = first;
  980. call->last = last;
  981. call->first_offset = offset;
  982. call->last_to = to;
  983. call->send_pages = true;
  984. call->store_version = vnode->status.data_version + 1;
  985. /* marshall the parameters */
  986. bp = call->request;
  987. *bp++ = htonl(FSSTOREDATA64);
  988. *bp++ = htonl(vnode->fid.vid);
  989. *bp++ = htonl(vnode->fid.vnode);
  990. *bp++ = htonl(vnode->fid.unique);
  991. *bp++ = 0; /* mask */
  992. *bp++ = 0; /* mtime */
  993. *bp++ = 0; /* owner */
  994. *bp++ = 0; /* group */
  995. *bp++ = 0; /* unix mode */
  996. *bp++ = 0; /* segment size */
  997. *bp++ = htonl(pos >> 32);
  998. *bp++ = htonl((u32) pos);
  999. *bp++ = htonl(size >> 32);
  1000. *bp++ = htonl((u32) size);
  1001. *bp++ = htonl(i_size >> 32);
  1002. *bp++ = htonl((u32) i_size);
  1003. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1004. }
  1005. /*
  1006. * store a set of pages
  1007. */
  1008. int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,
  1009. pgoff_t first, pgoff_t last,
  1010. unsigned offset, unsigned to,
  1011. const struct afs_wait_mode *wait_mode)
  1012. {
  1013. struct afs_vnode *vnode = wb->vnode;
  1014. struct afs_call *call;
  1015. loff_t size, pos, i_size;
  1016. __be32 *bp;
  1017. _enter(",%x,{%x:%u},,",
  1018. key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);
  1019. size = to - offset;
  1020. if (first != last)
  1021. size += (loff_t)(last - first) << PAGE_SHIFT;
  1022. pos = (loff_t)first << PAGE_SHIFT;
  1023. pos += offset;
  1024. i_size = i_size_read(&vnode->vfs_inode);
  1025. if (pos + size > i_size)
  1026. i_size = size + pos;
  1027. _debug("size %llx, at %llx, i_size %llx",
  1028. (unsigned long long) size, (unsigned long long) pos,
  1029. (unsigned long long) i_size);
  1030. if (pos >> 32 || i_size >> 32 || size >> 32 || (pos + size) >> 32)
  1031. return afs_fs_store_data64(server, wb, first, last, offset, to,
  1032. size, pos, i_size, wait_mode);
  1033. call = afs_alloc_flat_call(&afs_RXFSStoreData,
  1034. (4 + 6 + 3) * 4,
  1035. (21 + 6) * 4);
  1036. if (!call)
  1037. return -ENOMEM;
  1038. call->wb = wb;
  1039. call->key = wb->key;
  1040. call->reply = vnode;
  1041. call->service_id = FS_SERVICE;
  1042. call->port = htons(AFS_FS_PORT);
  1043. call->mapping = vnode->vfs_inode.i_mapping;
  1044. call->first = first;
  1045. call->last = last;
  1046. call->first_offset = offset;
  1047. call->last_to = to;
  1048. call->send_pages = true;
  1049. call->store_version = vnode->status.data_version + 1;
  1050. /* marshall the parameters */
  1051. bp = call->request;
  1052. *bp++ = htonl(FSSTOREDATA);
  1053. *bp++ = htonl(vnode->fid.vid);
  1054. *bp++ = htonl(vnode->fid.vnode);
  1055. *bp++ = htonl(vnode->fid.unique);
  1056. *bp++ = 0; /* mask */
  1057. *bp++ = 0; /* mtime */
  1058. *bp++ = 0; /* owner */
  1059. *bp++ = 0; /* group */
  1060. *bp++ = 0; /* unix mode */
  1061. *bp++ = 0; /* segment size */
  1062. *bp++ = htonl(pos);
  1063. *bp++ = htonl(size);
  1064. *bp++ = htonl(i_size);
  1065. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1066. }
  1067. /*
  1068. * deliver reply data to an FS.StoreStatus
  1069. */
  1070. static int afs_deliver_fs_store_status(struct afs_call *call,
  1071. struct sk_buff *skb, bool last)
  1072. {
  1073. afs_dataversion_t *store_version;
  1074. struct afs_vnode *vnode = call->reply;
  1075. const __be32 *bp;
  1076. int ret;
  1077. _enter(",,%u", last);
  1078. ret = afs_transfer_reply(call, skb, last);
  1079. if (ret < 0)
  1080. return ret;
  1081. /* unmarshall the reply once we've received all of it */
  1082. store_version = NULL;
  1083. if (call->operation_ID == FSSTOREDATA)
  1084. store_version = &call->store_version;
  1085. bp = call->buffer;
  1086. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, store_version);
  1087. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  1088. _leave(" = 0 [done]");
  1089. return 0;
  1090. }
  1091. /*
  1092. * FS.StoreStatus operation type
  1093. */
  1094. static const struct afs_call_type afs_RXFSStoreStatus = {
  1095. .name = "FS.StoreStatus",
  1096. .deliver = afs_deliver_fs_store_status,
  1097. .abort_to_error = afs_abort_to_error,
  1098. .destructor = afs_flat_call_destructor,
  1099. };
  1100. static const struct afs_call_type afs_RXFSStoreData_as_Status = {
  1101. .name = "FS.StoreData",
  1102. .deliver = afs_deliver_fs_store_status,
  1103. .abort_to_error = afs_abort_to_error,
  1104. .destructor = afs_flat_call_destructor,
  1105. };
  1106. static const struct afs_call_type afs_RXFSStoreData64_as_Status = {
  1107. .name = "FS.StoreData64",
  1108. .deliver = afs_deliver_fs_store_status,
  1109. .abort_to_error = afs_abort_to_error,
  1110. .destructor = afs_flat_call_destructor,
  1111. };
  1112. /*
  1113. * set the attributes on a very large file, using FS.StoreData rather than
  1114. * FS.StoreStatus so as to alter the file size also
  1115. */
  1116. static int afs_fs_setattr_size64(struct afs_server *server, struct key *key,
  1117. struct afs_vnode *vnode, struct iattr *attr,
  1118. const struct afs_wait_mode *wait_mode)
  1119. {
  1120. struct afs_call *call;
  1121. __be32 *bp;
  1122. _enter(",%x,{%x:%u},,",
  1123. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1124. ASSERT(attr->ia_valid & ATTR_SIZE);
  1125. call = afs_alloc_flat_call(&afs_RXFSStoreData64_as_Status,
  1126. (4 + 6 + 3 * 2) * 4,
  1127. (21 + 6) * 4);
  1128. if (!call)
  1129. return -ENOMEM;
  1130. call->key = key;
  1131. call->reply = vnode;
  1132. call->service_id = FS_SERVICE;
  1133. call->port = htons(AFS_FS_PORT);
  1134. call->store_version = vnode->status.data_version + 1;
  1135. call->operation_ID = FSSTOREDATA;
  1136. /* marshall the parameters */
  1137. bp = call->request;
  1138. *bp++ = htonl(FSSTOREDATA64);
  1139. *bp++ = htonl(vnode->fid.vid);
  1140. *bp++ = htonl(vnode->fid.vnode);
  1141. *bp++ = htonl(vnode->fid.unique);
  1142. xdr_encode_AFS_StoreStatus(&bp, attr);
  1143. *bp++ = 0; /* position of start of write */
  1144. *bp++ = 0;
  1145. *bp++ = 0; /* size of write */
  1146. *bp++ = 0;
  1147. *bp++ = htonl(attr->ia_size >> 32); /* new file length */
  1148. *bp++ = htonl((u32) attr->ia_size);
  1149. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1150. }
  1151. /*
  1152. * set the attributes on a file, using FS.StoreData rather than FS.StoreStatus
  1153. * so as to alter the file size also
  1154. */
  1155. static int afs_fs_setattr_size(struct afs_server *server, struct key *key,
  1156. struct afs_vnode *vnode, struct iattr *attr,
  1157. const struct afs_wait_mode *wait_mode)
  1158. {
  1159. struct afs_call *call;
  1160. __be32 *bp;
  1161. _enter(",%x,{%x:%u},,",
  1162. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1163. ASSERT(attr->ia_valid & ATTR_SIZE);
  1164. if (attr->ia_size >> 32)
  1165. return afs_fs_setattr_size64(server, key, vnode, attr,
  1166. wait_mode);
  1167. call = afs_alloc_flat_call(&afs_RXFSStoreData_as_Status,
  1168. (4 + 6 + 3) * 4,
  1169. (21 + 6) * 4);
  1170. if (!call)
  1171. return -ENOMEM;
  1172. call->key = key;
  1173. call->reply = vnode;
  1174. call->service_id = FS_SERVICE;
  1175. call->port = htons(AFS_FS_PORT);
  1176. call->store_version = vnode->status.data_version + 1;
  1177. call->operation_ID = FSSTOREDATA;
  1178. /* marshall the parameters */
  1179. bp = call->request;
  1180. *bp++ = htonl(FSSTOREDATA);
  1181. *bp++ = htonl(vnode->fid.vid);
  1182. *bp++ = htonl(vnode->fid.vnode);
  1183. *bp++ = htonl(vnode->fid.unique);
  1184. xdr_encode_AFS_StoreStatus(&bp, attr);
  1185. *bp++ = 0; /* position of start of write */
  1186. *bp++ = 0; /* size of write */
  1187. *bp++ = htonl(attr->ia_size); /* new file length */
  1188. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1189. }
  1190. /*
  1191. * set the attributes on a file, using FS.StoreData if there's a change in file
  1192. * size, and FS.StoreStatus otherwise
  1193. */
  1194. int afs_fs_setattr(struct afs_server *server, struct key *key,
  1195. struct afs_vnode *vnode, struct iattr *attr,
  1196. const struct afs_wait_mode *wait_mode)
  1197. {
  1198. struct afs_call *call;
  1199. __be32 *bp;
  1200. if (attr->ia_valid & ATTR_SIZE)
  1201. return afs_fs_setattr_size(server, key, vnode, attr,
  1202. wait_mode);
  1203. _enter(",%x,{%x:%u},,",
  1204. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1205. call = afs_alloc_flat_call(&afs_RXFSStoreStatus,
  1206. (4 + 6) * 4,
  1207. (21 + 6) * 4);
  1208. if (!call)
  1209. return -ENOMEM;
  1210. call->key = key;
  1211. call->reply = vnode;
  1212. call->service_id = FS_SERVICE;
  1213. call->port = htons(AFS_FS_PORT);
  1214. call->operation_ID = FSSTORESTATUS;
  1215. /* marshall the parameters */
  1216. bp = call->request;
  1217. *bp++ = htonl(FSSTORESTATUS);
  1218. *bp++ = htonl(vnode->fid.vid);
  1219. *bp++ = htonl(vnode->fid.vnode);
  1220. *bp++ = htonl(vnode->fid.unique);
  1221. xdr_encode_AFS_StoreStatus(&bp, attr);
  1222. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1223. }
  1224. /*
  1225. * deliver reply data to an FS.GetVolumeStatus
  1226. */
  1227. static int afs_deliver_fs_get_volume_status(struct afs_call *call,
  1228. struct sk_buff *skb, bool last)
  1229. {
  1230. const __be32 *bp;
  1231. char *p;
  1232. int ret;
  1233. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  1234. switch (call->unmarshall) {
  1235. case 0:
  1236. call->offset = 0;
  1237. call->unmarshall++;
  1238. /* extract the returned status record */
  1239. case 1:
  1240. _debug("extract status");
  1241. ret = afs_extract_data(call, skb, last, call->buffer,
  1242. 12 * 4);
  1243. if (ret < 0)
  1244. return ret;
  1245. bp = call->buffer;
  1246. xdr_decode_AFSFetchVolumeStatus(&bp, call->reply2);
  1247. call->offset = 0;
  1248. call->unmarshall++;
  1249. /* extract the volume name length */
  1250. case 2:
  1251. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  1252. if (ret < 0)
  1253. return ret;
  1254. call->count = ntohl(call->tmp);
  1255. _debug("volname length: %u", call->count);
  1256. if (call->count >= AFSNAMEMAX)
  1257. return -EBADMSG;
  1258. call->offset = 0;
  1259. call->unmarshall++;
  1260. /* extract the volume name */
  1261. case 3:
  1262. _debug("extract volname");
  1263. if (call->count > 0) {
  1264. ret = afs_extract_data(call, skb, last, call->reply3,
  1265. call->count);
  1266. if (ret < 0)
  1267. return ret;
  1268. }
  1269. p = call->reply3;
  1270. p[call->count] = 0;
  1271. _debug("volname '%s'", p);
  1272. call->offset = 0;
  1273. call->unmarshall++;
  1274. /* extract the volume name padding */
  1275. if ((call->count & 3) == 0) {
  1276. call->unmarshall++;
  1277. goto no_volname_padding;
  1278. }
  1279. call->count = 4 - (call->count & 3);
  1280. case 4:
  1281. ret = afs_extract_data(call, skb, last, call->buffer,
  1282. call->count);
  1283. if (ret < 0)
  1284. return ret;
  1285. call->offset = 0;
  1286. call->unmarshall++;
  1287. no_volname_padding:
  1288. /* extract the offline message length */
  1289. case 5:
  1290. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  1291. if (ret < 0)
  1292. return ret;
  1293. call->count = ntohl(call->tmp);
  1294. _debug("offline msg length: %u", call->count);
  1295. if (call->count >= AFSNAMEMAX)
  1296. return -EBADMSG;
  1297. call->offset = 0;
  1298. call->unmarshall++;
  1299. /* extract the offline message */
  1300. case 6:
  1301. _debug("extract offline");
  1302. if (call->count > 0) {
  1303. ret = afs_extract_data(call, skb, last, call->reply3,
  1304. call->count);
  1305. if (ret < 0)
  1306. return ret;
  1307. }
  1308. p = call->reply3;
  1309. p[call->count] = 0;
  1310. _debug("offline '%s'", p);
  1311. call->offset = 0;
  1312. call->unmarshall++;
  1313. /* extract the offline message padding */
  1314. if ((call->count & 3) == 0) {
  1315. call->unmarshall++;
  1316. goto no_offline_padding;
  1317. }
  1318. call->count = 4 - (call->count & 3);
  1319. case 7:
  1320. ret = afs_extract_data(call, skb, last, call->buffer,
  1321. call->count);
  1322. if (ret < 0)
  1323. return ret;
  1324. call->offset = 0;
  1325. call->unmarshall++;
  1326. no_offline_padding:
  1327. /* extract the message of the day length */
  1328. case 8:
  1329. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  1330. if (ret < 0)
  1331. return ret;
  1332. call->count = ntohl(call->tmp);
  1333. _debug("motd length: %u", call->count);
  1334. if (call->count >= AFSNAMEMAX)
  1335. return -EBADMSG;
  1336. call->offset = 0;
  1337. call->unmarshall++;
  1338. /* extract the message of the day */
  1339. case 9:
  1340. _debug("extract motd");
  1341. if (call->count > 0) {
  1342. ret = afs_extract_data(call, skb, last, call->reply3,
  1343. call->count);
  1344. if (ret < 0)
  1345. return ret;
  1346. }
  1347. p = call->reply3;
  1348. p[call->count] = 0;
  1349. _debug("motd '%s'", p);
  1350. call->offset = 0;
  1351. call->unmarshall++;
  1352. /* extract the message of the day padding */
  1353. if ((call->count & 3) == 0) {
  1354. call->unmarshall++;
  1355. goto no_motd_padding;
  1356. }
  1357. call->count = 4 - (call->count & 3);
  1358. case 10:
  1359. ret = afs_extract_data(call, skb, last, call->buffer,
  1360. call->count);
  1361. if (ret < 0)
  1362. return ret;
  1363. call->offset = 0;
  1364. call->unmarshall++;
  1365. no_motd_padding:
  1366. case 11:
  1367. ret = afs_data_complete(call, skb, last);
  1368. if (ret < 0)
  1369. return ret;
  1370. break;
  1371. }
  1372. _leave(" = 0 [done]");
  1373. return 0;
  1374. }
  1375. /*
  1376. * destroy an FS.GetVolumeStatus call
  1377. */
  1378. static void afs_get_volume_status_call_destructor(struct afs_call *call)
  1379. {
  1380. kfree(call->reply3);
  1381. call->reply3 = NULL;
  1382. afs_flat_call_destructor(call);
  1383. }
  1384. /*
  1385. * FS.GetVolumeStatus operation type
  1386. */
  1387. static const struct afs_call_type afs_RXFSGetVolumeStatus = {
  1388. .name = "FS.GetVolumeStatus",
  1389. .deliver = afs_deliver_fs_get_volume_status,
  1390. .abort_to_error = afs_abort_to_error,
  1391. .destructor = afs_get_volume_status_call_destructor,
  1392. };
  1393. /*
  1394. * fetch the status of a volume
  1395. */
  1396. int afs_fs_get_volume_status(struct afs_server *server,
  1397. struct key *key,
  1398. struct afs_vnode *vnode,
  1399. struct afs_volume_status *vs,
  1400. const struct afs_wait_mode *wait_mode)
  1401. {
  1402. struct afs_call *call;
  1403. __be32 *bp;
  1404. void *tmpbuf;
  1405. _enter("");
  1406. tmpbuf = kmalloc(AFSOPAQUEMAX, GFP_KERNEL);
  1407. if (!tmpbuf)
  1408. return -ENOMEM;
  1409. call = afs_alloc_flat_call(&afs_RXFSGetVolumeStatus, 2 * 4, 12 * 4);
  1410. if (!call) {
  1411. kfree(tmpbuf);
  1412. return -ENOMEM;
  1413. }
  1414. call->key = key;
  1415. call->reply = vnode;
  1416. call->reply2 = vs;
  1417. call->reply3 = tmpbuf;
  1418. call->service_id = FS_SERVICE;
  1419. call->port = htons(AFS_FS_PORT);
  1420. /* marshall the parameters */
  1421. bp = call->request;
  1422. bp[0] = htonl(FSGETVOLUMESTATUS);
  1423. bp[1] = htonl(vnode->fid.vid);
  1424. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1425. }
  1426. /*
  1427. * deliver reply data to an FS.SetLock, FS.ExtendLock or FS.ReleaseLock
  1428. */
  1429. static int afs_deliver_fs_xxxx_lock(struct afs_call *call,
  1430. struct sk_buff *skb, bool last)
  1431. {
  1432. const __be32 *bp;
  1433. int ret;
  1434. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  1435. ret = afs_transfer_reply(call, skb, last);
  1436. if (ret < 0)
  1437. return ret;
  1438. /* unmarshall the reply once we've received all of it */
  1439. bp = call->buffer;
  1440. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  1441. _leave(" = 0 [done]");
  1442. return 0;
  1443. }
  1444. /*
  1445. * FS.SetLock operation type
  1446. */
  1447. static const struct afs_call_type afs_RXFSSetLock = {
  1448. .name = "FS.SetLock",
  1449. .deliver = afs_deliver_fs_xxxx_lock,
  1450. .abort_to_error = afs_abort_to_error,
  1451. .destructor = afs_flat_call_destructor,
  1452. };
  1453. /*
  1454. * FS.ExtendLock operation type
  1455. */
  1456. static const struct afs_call_type afs_RXFSExtendLock = {
  1457. .name = "FS.ExtendLock",
  1458. .deliver = afs_deliver_fs_xxxx_lock,
  1459. .abort_to_error = afs_abort_to_error,
  1460. .destructor = afs_flat_call_destructor,
  1461. };
  1462. /*
  1463. * FS.ReleaseLock operation type
  1464. */
  1465. static const struct afs_call_type afs_RXFSReleaseLock = {
  1466. .name = "FS.ReleaseLock",
  1467. .deliver = afs_deliver_fs_xxxx_lock,
  1468. .abort_to_error = afs_abort_to_error,
  1469. .destructor = afs_flat_call_destructor,
  1470. };
  1471. /*
  1472. * get a lock on a file
  1473. */
  1474. int afs_fs_set_lock(struct afs_server *server,
  1475. struct key *key,
  1476. struct afs_vnode *vnode,
  1477. afs_lock_type_t type,
  1478. const struct afs_wait_mode *wait_mode)
  1479. {
  1480. struct afs_call *call;
  1481. __be32 *bp;
  1482. _enter("");
  1483. call = afs_alloc_flat_call(&afs_RXFSSetLock, 5 * 4, 6 * 4);
  1484. if (!call)
  1485. return -ENOMEM;
  1486. call->key = key;
  1487. call->reply = vnode;
  1488. call->service_id = FS_SERVICE;
  1489. call->port = htons(AFS_FS_PORT);
  1490. /* marshall the parameters */
  1491. bp = call->request;
  1492. *bp++ = htonl(FSSETLOCK);
  1493. *bp++ = htonl(vnode->fid.vid);
  1494. *bp++ = htonl(vnode->fid.vnode);
  1495. *bp++ = htonl(vnode->fid.unique);
  1496. *bp++ = htonl(type);
  1497. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1498. }
  1499. /*
  1500. * extend a lock on a file
  1501. */
  1502. int afs_fs_extend_lock(struct afs_server *server,
  1503. struct key *key,
  1504. struct afs_vnode *vnode,
  1505. const struct afs_wait_mode *wait_mode)
  1506. {
  1507. struct afs_call *call;
  1508. __be32 *bp;
  1509. _enter("");
  1510. call = afs_alloc_flat_call(&afs_RXFSExtendLock, 4 * 4, 6 * 4);
  1511. if (!call)
  1512. return -ENOMEM;
  1513. call->key = key;
  1514. call->reply = vnode;
  1515. call->service_id = FS_SERVICE;
  1516. call->port = htons(AFS_FS_PORT);
  1517. /* marshall the parameters */
  1518. bp = call->request;
  1519. *bp++ = htonl(FSEXTENDLOCK);
  1520. *bp++ = htonl(vnode->fid.vid);
  1521. *bp++ = htonl(vnode->fid.vnode);
  1522. *bp++ = htonl(vnode->fid.unique);
  1523. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1524. }
  1525. /*
  1526. * release a lock on a file
  1527. */
  1528. int afs_fs_release_lock(struct afs_server *server,
  1529. struct key *key,
  1530. struct afs_vnode *vnode,
  1531. const struct afs_wait_mode *wait_mode)
  1532. {
  1533. struct afs_call *call;
  1534. __be32 *bp;
  1535. _enter("");
  1536. call = afs_alloc_flat_call(&afs_RXFSReleaseLock, 4 * 4, 6 * 4);
  1537. if (!call)
  1538. return -ENOMEM;
  1539. call->key = key;
  1540. call->reply = vnode;
  1541. call->service_id = FS_SERVICE;
  1542. call->port = htons(AFS_FS_PORT);
  1543. /* marshall the parameters */
  1544. bp = call->request;
  1545. *bp++ = htonl(FSRELEASELOCK);
  1546. *bp++ = htonl(vnode->fid.vid);
  1547. *bp++ = htonl(vnode->fid.vnode);
  1548. *bp++ = htonl(vnode->fid.unique);
  1549. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1550. }