fsclient.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452
  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/sched.h>
  13. #include <linux/circ_buf.h>
  14. #include "internal.h"
  15. #include "afs_fs.h"
  16. /*
  17. * decode an AFSFid block
  18. */
  19. static void xdr_decode_AFSFid(const __be32 **_bp, struct afs_fid *fid)
  20. {
  21. const __be32 *bp = *_bp;
  22. fid->vid = ntohl(*bp++);
  23. fid->vnode = ntohl(*bp++);
  24. fid->unique = ntohl(*bp++);
  25. *_bp = bp;
  26. }
  27. /*
  28. * decode an AFSFetchStatus block
  29. */
  30. static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
  31. struct afs_file_status *status,
  32. struct afs_vnode *vnode,
  33. afs_dataversion_t *store_version)
  34. {
  35. afs_dataversion_t expected_version;
  36. const __be32 *bp = *_bp;
  37. umode_t mode;
  38. u64 data_version, size;
  39. u32 changed = 0; /* becomes non-zero if ctime-type changes seen */
  40. #define EXTRACT(DST) \
  41. do { \
  42. u32 x = ntohl(*bp++); \
  43. changed |= DST - x; \
  44. DST = x; \
  45. } while (0)
  46. status->if_version = ntohl(*bp++);
  47. EXTRACT(status->type);
  48. EXTRACT(status->nlink);
  49. size = ntohl(*bp++);
  50. data_version = ntohl(*bp++);
  51. EXTRACT(status->author);
  52. EXTRACT(status->owner);
  53. EXTRACT(status->caller_access); /* call ticket dependent */
  54. EXTRACT(status->anon_access);
  55. EXTRACT(status->mode);
  56. EXTRACT(status->parent.vnode);
  57. EXTRACT(status->parent.unique);
  58. bp++; /* seg size */
  59. status->mtime_client = ntohl(*bp++);
  60. status->mtime_server = ntohl(*bp++);
  61. EXTRACT(status->group);
  62. bp++; /* sync counter */
  63. data_version |= (u64) ntohl(*bp++) << 32;
  64. bp++; /* lock count */
  65. size |= (u64) ntohl(*bp++) << 32;
  66. bp++; /* spare 4 */
  67. *_bp = bp;
  68. if (size != status->size) {
  69. status->size = size;
  70. changed |= true;
  71. }
  72. status->mode &= S_IALLUGO;
  73. _debug("vnode time %lx, %lx",
  74. status->mtime_client, status->mtime_server);
  75. if (vnode) {
  76. status->parent.vid = vnode->fid.vid;
  77. if (changed && !test_bit(AFS_VNODE_UNSET, &vnode->flags)) {
  78. _debug("vnode changed");
  79. i_size_write(&vnode->vfs_inode, size);
  80. vnode->vfs_inode.i_uid = status->owner;
  81. vnode->vfs_inode.i_gid = status->group;
  82. vnode->vfs_inode.i_version = vnode->fid.unique;
  83. vnode->vfs_inode.i_nlink = status->nlink;
  84. mode = vnode->vfs_inode.i_mode;
  85. mode &= ~S_IALLUGO;
  86. mode |= status->mode;
  87. barrier();
  88. vnode->vfs_inode.i_mode = mode;
  89. }
  90. vnode->vfs_inode.i_ctime.tv_sec = status->mtime_server;
  91. vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime;
  92. vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime;
  93. }
  94. expected_version = status->data_version;
  95. if (store_version)
  96. expected_version = *store_version;
  97. if (expected_version != data_version) {
  98. status->data_version = data_version;
  99. if (vnode && !test_bit(AFS_VNODE_UNSET, &vnode->flags)) {
  100. _debug("vnode modified %llx on {%x:%u}",
  101. (unsigned long long) data_version,
  102. vnode->fid.vid, vnode->fid.vnode);
  103. set_bit(AFS_VNODE_MODIFIED, &vnode->flags);
  104. set_bit(AFS_VNODE_ZAP_DATA, &vnode->flags);
  105. }
  106. } else if (store_version) {
  107. status->data_version = data_version;
  108. }
  109. }
  110. /*
  111. * decode an AFSCallBack block
  112. */
  113. static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode)
  114. {
  115. const __be32 *bp = *_bp;
  116. vnode->cb_version = ntohl(*bp++);
  117. vnode->cb_expiry = ntohl(*bp++);
  118. vnode->cb_type = ntohl(*bp++);
  119. vnode->cb_expires = vnode->cb_expiry + get_seconds();
  120. *_bp = bp;
  121. }
  122. static void xdr_decode_AFSCallBack_raw(const __be32 **_bp,
  123. struct afs_callback *cb)
  124. {
  125. const __be32 *bp = *_bp;
  126. cb->version = ntohl(*bp++);
  127. cb->expiry = ntohl(*bp++);
  128. cb->type = ntohl(*bp++);
  129. *_bp = bp;
  130. }
  131. /*
  132. * decode an AFSVolSync block
  133. */
  134. static void xdr_decode_AFSVolSync(const __be32 **_bp,
  135. struct afs_volsync *volsync)
  136. {
  137. const __be32 *bp = *_bp;
  138. volsync->creation = ntohl(*bp++);
  139. bp++; /* spare2 */
  140. bp++; /* spare3 */
  141. bp++; /* spare4 */
  142. bp++; /* spare5 */
  143. bp++; /* spare6 */
  144. *_bp = bp;
  145. }
  146. /*
  147. * encode the requested attributes into an AFSStoreStatus block
  148. */
  149. static void xdr_encode_AFS_StoreStatus(__be32 **_bp, struct iattr *attr)
  150. {
  151. __be32 *bp = *_bp;
  152. u32 mask = 0, mtime = 0, owner = 0, group = 0, mode = 0;
  153. mask = 0;
  154. if (attr->ia_valid & ATTR_MTIME) {
  155. mask |= AFS_SET_MTIME;
  156. mtime = attr->ia_mtime.tv_sec;
  157. }
  158. if (attr->ia_valid & ATTR_UID) {
  159. mask |= AFS_SET_OWNER;
  160. owner = attr->ia_uid;
  161. }
  162. if (attr->ia_valid & ATTR_GID) {
  163. mask |= AFS_SET_GROUP;
  164. group = attr->ia_gid;
  165. }
  166. if (attr->ia_valid & ATTR_MODE) {
  167. mask |= AFS_SET_MODE;
  168. mode = attr->ia_mode & S_IALLUGO;
  169. }
  170. *bp++ = htonl(mask);
  171. *bp++ = htonl(mtime);
  172. *bp++ = htonl(owner);
  173. *bp++ = htonl(group);
  174. *bp++ = htonl(mode);
  175. *bp++ = 0; /* segment size */
  176. *_bp = bp;
  177. }
  178. /*
  179. * deliver reply data to an FS.FetchStatus
  180. */
  181. static int afs_deliver_fs_fetch_status(struct afs_call *call,
  182. struct sk_buff *skb, bool last)
  183. {
  184. struct afs_vnode *vnode = call->reply;
  185. const __be32 *bp;
  186. _enter(",,%u", last);
  187. afs_transfer_reply(call, skb);
  188. if (!last)
  189. return 0;
  190. if (call->reply_size != call->reply_max)
  191. return -EBADMSG;
  192. /* unmarshall the reply once we've received all of it */
  193. bp = call->buffer;
  194. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  195. xdr_decode_AFSCallBack(&bp, vnode);
  196. if (call->reply2)
  197. xdr_decode_AFSVolSync(&bp, call->reply2);
  198. _leave(" = 0 [done]");
  199. return 0;
  200. }
  201. /*
  202. * FS.FetchStatus operation type
  203. */
  204. static const struct afs_call_type afs_RXFSFetchStatus = {
  205. .name = "FS.FetchStatus",
  206. .deliver = afs_deliver_fs_fetch_status,
  207. .abort_to_error = afs_abort_to_error,
  208. .destructor = afs_flat_call_destructor,
  209. };
  210. /*
  211. * fetch the status information for a file
  212. */
  213. int afs_fs_fetch_file_status(struct afs_server *server,
  214. struct key *key,
  215. struct afs_vnode *vnode,
  216. struct afs_volsync *volsync,
  217. const struct afs_wait_mode *wait_mode)
  218. {
  219. struct afs_call *call;
  220. __be32 *bp;
  221. _enter(",%x,{%x:%u},,",
  222. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  223. call = afs_alloc_flat_call(&afs_RXFSFetchStatus, 16, (21 + 3 + 6) * 4);
  224. if (!call)
  225. return -ENOMEM;
  226. call->key = key;
  227. call->reply = vnode;
  228. call->reply2 = volsync;
  229. call->service_id = FS_SERVICE;
  230. call->port = htons(AFS_FS_PORT);
  231. /* marshall the parameters */
  232. bp = call->request;
  233. bp[0] = htonl(FSFETCHSTATUS);
  234. bp[1] = htonl(vnode->fid.vid);
  235. bp[2] = htonl(vnode->fid.vnode);
  236. bp[3] = htonl(vnode->fid.unique);
  237. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  238. }
  239. /*
  240. * deliver reply data to an FS.FetchData
  241. */
  242. static int afs_deliver_fs_fetch_data(struct afs_call *call,
  243. struct sk_buff *skb, bool last)
  244. {
  245. struct afs_vnode *vnode = call->reply;
  246. const __be32 *bp;
  247. struct page *page;
  248. void *buffer;
  249. int ret;
  250. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  251. switch (call->unmarshall) {
  252. case 0:
  253. call->offset = 0;
  254. call->unmarshall++;
  255. if (call->operation_ID != FSFETCHDATA64) {
  256. call->unmarshall++;
  257. goto no_msw;
  258. }
  259. /* extract the upper part of the returned data length of an
  260. * FSFETCHDATA64 op (which should always be 0 using this
  261. * client) */
  262. case 1:
  263. _debug("extract data length (MSW)");
  264. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  265. switch (ret) {
  266. case 0: break;
  267. case -EAGAIN: return 0;
  268. default: return ret;
  269. }
  270. call->count = ntohl(call->tmp);
  271. _debug("DATA length MSW: %u", call->count);
  272. if (call->count > 0)
  273. return -EBADMSG;
  274. call->offset = 0;
  275. call->unmarshall++;
  276. no_msw:
  277. /* extract the returned data length */
  278. case 2:
  279. _debug("extract data length");
  280. ret = afs_extract_data(call, skb, last, &call->tmp, 4);
  281. switch (ret) {
  282. case 0: break;
  283. case -EAGAIN: return 0;
  284. default: return ret;
  285. }
  286. call->count = ntohl(call->tmp);
  287. _debug("DATA length: %u", call->count);
  288. if (call->count > PAGE_SIZE)
  289. return -EBADMSG;
  290. call->offset = 0;
  291. call->unmarshall++;
  292. /* extract the returned data */
  293. case 3:
  294. _debug("extract data");
  295. if (call->count > 0) {
  296. page = call->reply3;
  297. buffer = kmap_atomic(page, KM_USER0);
  298. ret = afs_extract_data(call, skb, last, buffer,
  299. call->count);
  300. kunmap_atomic(buffer, KM_USER0);
  301. switch (ret) {
  302. case 0: break;
  303. case -EAGAIN: return 0;
  304. default: return ret;
  305. }
  306. }
  307. call->offset = 0;
  308. call->unmarshall++;
  309. /* extract the metadata */
  310. case 4:
  311. ret = afs_extract_data(call, skb, last, call->buffer,
  312. (21 + 3 + 6) * 4);
  313. switch (ret) {
  314. case 0: break;
  315. case -EAGAIN: return 0;
  316. default: return ret;
  317. }
  318. bp = call->buffer;
  319. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  320. xdr_decode_AFSCallBack(&bp, vnode);
  321. if (call->reply2)
  322. xdr_decode_AFSVolSync(&bp, call->reply2);
  323. call->offset = 0;
  324. call->unmarshall++;
  325. case 5:
  326. _debug("trailer");
  327. if (skb->len != 0)
  328. return -EBADMSG;
  329. break;
  330. }
  331. if (!last)
  332. return 0;
  333. if (call->count < PAGE_SIZE) {
  334. _debug("clear");
  335. page = call->reply3;
  336. buffer = kmap_atomic(page, KM_USER0);
  337. memset(buffer + call->count, 0, PAGE_SIZE - call->count);
  338. kunmap_atomic(buffer, KM_USER0);
  339. }
  340. _leave(" = 0 [done]");
  341. return 0;
  342. }
  343. /*
  344. * FS.FetchData operation type
  345. */
  346. static const struct afs_call_type afs_RXFSFetchData = {
  347. .name = "FS.FetchData",
  348. .deliver = afs_deliver_fs_fetch_data,
  349. .abort_to_error = afs_abort_to_error,
  350. .destructor = afs_flat_call_destructor,
  351. };
  352. static const struct afs_call_type afs_RXFSFetchData64 = {
  353. .name = "FS.FetchData64",
  354. .deliver = afs_deliver_fs_fetch_data,
  355. .abort_to_error = afs_abort_to_error,
  356. .destructor = afs_flat_call_destructor,
  357. };
  358. /*
  359. * fetch data from a very large file
  360. */
  361. static int afs_fs_fetch_data64(struct afs_server *server,
  362. struct key *key,
  363. struct afs_vnode *vnode,
  364. off_t offset, size_t length,
  365. struct page *buffer,
  366. const struct afs_wait_mode *wait_mode)
  367. {
  368. struct afs_call *call;
  369. __be32 *bp;
  370. _enter("");
  371. ASSERTCMP(length, <, ULONG_MAX);
  372. call = afs_alloc_flat_call(&afs_RXFSFetchData64, 32, (21 + 3 + 6) * 4);
  373. if (!call)
  374. return -ENOMEM;
  375. call->key = key;
  376. call->reply = vnode;
  377. call->reply2 = NULL; /* volsync */
  378. call->reply3 = buffer;
  379. call->service_id = FS_SERVICE;
  380. call->port = htons(AFS_FS_PORT);
  381. call->operation_ID = FSFETCHDATA64;
  382. /* marshall the parameters */
  383. bp = call->request;
  384. bp[0] = htonl(FSFETCHDATA64);
  385. bp[1] = htonl(vnode->fid.vid);
  386. bp[2] = htonl(vnode->fid.vnode);
  387. bp[3] = htonl(vnode->fid.unique);
  388. bp[4] = htonl(upper_32_bits(offset));
  389. bp[5] = htonl((u32) offset);
  390. bp[6] = 0;
  391. bp[7] = htonl((u32) length);
  392. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  393. }
  394. /*
  395. * fetch data from a file
  396. */
  397. int afs_fs_fetch_data(struct afs_server *server,
  398. struct key *key,
  399. struct afs_vnode *vnode,
  400. off_t offset, size_t length,
  401. struct page *buffer,
  402. const struct afs_wait_mode *wait_mode)
  403. {
  404. struct afs_call *call;
  405. __be32 *bp;
  406. if (upper_32_bits(offset) || upper_32_bits(offset + length))
  407. return afs_fs_fetch_data64(server, key, vnode, offset, length,
  408. buffer, wait_mode);
  409. _enter("");
  410. call = afs_alloc_flat_call(&afs_RXFSFetchData, 24, (21 + 3 + 6) * 4);
  411. if (!call)
  412. return -ENOMEM;
  413. call->key = key;
  414. call->reply = vnode;
  415. call->reply2 = NULL; /* volsync */
  416. call->reply3 = buffer;
  417. call->service_id = FS_SERVICE;
  418. call->port = htons(AFS_FS_PORT);
  419. call->operation_ID = FSFETCHDATA;
  420. /* marshall the parameters */
  421. bp = call->request;
  422. bp[0] = htonl(FSFETCHDATA);
  423. bp[1] = htonl(vnode->fid.vid);
  424. bp[2] = htonl(vnode->fid.vnode);
  425. bp[3] = htonl(vnode->fid.unique);
  426. bp[4] = htonl(offset);
  427. bp[5] = htonl(length);
  428. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  429. }
  430. /*
  431. * deliver reply data to an FS.GiveUpCallBacks
  432. */
  433. static int afs_deliver_fs_give_up_callbacks(struct afs_call *call,
  434. struct sk_buff *skb, bool last)
  435. {
  436. _enter(",{%u},%d", skb->len, last);
  437. if (skb->len > 0)
  438. return -EBADMSG; /* shouldn't be any reply data */
  439. return 0;
  440. }
  441. /*
  442. * FS.GiveUpCallBacks operation type
  443. */
  444. static const struct afs_call_type afs_RXFSGiveUpCallBacks = {
  445. .name = "FS.GiveUpCallBacks",
  446. .deliver = afs_deliver_fs_give_up_callbacks,
  447. .abort_to_error = afs_abort_to_error,
  448. .destructor = afs_flat_call_destructor,
  449. };
  450. /*
  451. * give up a set of callbacks
  452. * - the callbacks are held in the server->cb_break ring
  453. */
  454. int afs_fs_give_up_callbacks(struct afs_server *server,
  455. const struct afs_wait_mode *wait_mode)
  456. {
  457. struct afs_call *call;
  458. size_t ncallbacks;
  459. __be32 *bp, *tp;
  460. int loop;
  461. ncallbacks = CIRC_CNT(server->cb_break_head, server->cb_break_tail,
  462. ARRAY_SIZE(server->cb_break));
  463. _enter("{%zu},", ncallbacks);
  464. if (ncallbacks == 0)
  465. return 0;
  466. if (ncallbacks > AFSCBMAX)
  467. ncallbacks = AFSCBMAX;
  468. _debug("break %zu callbacks", ncallbacks);
  469. call = afs_alloc_flat_call(&afs_RXFSGiveUpCallBacks,
  470. 12 + ncallbacks * 6 * 4, 0);
  471. if (!call)
  472. return -ENOMEM;
  473. call->service_id = FS_SERVICE;
  474. call->port = htons(AFS_FS_PORT);
  475. /* marshall the parameters */
  476. bp = call->request;
  477. tp = bp + 2 + ncallbacks * 3;
  478. *bp++ = htonl(FSGIVEUPCALLBACKS);
  479. *bp++ = htonl(ncallbacks);
  480. *tp++ = htonl(ncallbacks);
  481. atomic_sub(ncallbacks, &server->cb_break_n);
  482. for (loop = ncallbacks; loop > 0; loop--) {
  483. struct afs_callback *cb =
  484. &server->cb_break[server->cb_break_tail];
  485. *bp++ = htonl(cb->fid.vid);
  486. *bp++ = htonl(cb->fid.vnode);
  487. *bp++ = htonl(cb->fid.unique);
  488. *tp++ = htonl(cb->version);
  489. *tp++ = htonl(cb->expiry);
  490. *tp++ = htonl(cb->type);
  491. smp_mb();
  492. server->cb_break_tail =
  493. (server->cb_break_tail + 1) &
  494. (ARRAY_SIZE(server->cb_break) - 1);
  495. }
  496. ASSERT(ncallbacks > 0);
  497. wake_up_nr(&server->cb_break_waitq, ncallbacks);
  498. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  499. }
  500. /*
  501. * deliver reply data to an FS.CreateFile or an FS.MakeDir
  502. */
  503. static int afs_deliver_fs_create_vnode(struct afs_call *call,
  504. struct sk_buff *skb, bool last)
  505. {
  506. struct afs_vnode *vnode = call->reply;
  507. const __be32 *bp;
  508. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  509. afs_transfer_reply(call, skb);
  510. if (!last)
  511. return 0;
  512. if (call->reply_size != call->reply_max)
  513. return -EBADMSG;
  514. /* unmarshall the reply once we've received all of it */
  515. bp = call->buffer;
  516. xdr_decode_AFSFid(&bp, call->reply2);
  517. xdr_decode_AFSFetchStatus(&bp, call->reply3, NULL, NULL);
  518. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  519. xdr_decode_AFSCallBack_raw(&bp, call->reply4);
  520. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  521. _leave(" = 0 [done]");
  522. return 0;
  523. }
  524. /*
  525. * FS.CreateFile and FS.MakeDir operation type
  526. */
  527. static const struct afs_call_type afs_RXFSCreateXXXX = {
  528. .name = "FS.CreateXXXX",
  529. .deliver = afs_deliver_fs_create_vnode,
  530. .abort_to_error = afs_abort_to_error,
  531. .destructor = afs_flat_call_destructor,
  532. };
  533. /*
  534. * create a file or make a directory
  535. */
  536. int afs_fs_create(struct afs_server *server,
  537. struct key *key,
  538. struct afs_vnode *vnode,
  539. const char *name,
  540. umode_t mode,
  541. struct afs_fid *newfid,
  542. struct afs_file_status *newstatus,
  543. struct afs_callback *newcb,
  544. const struct afs_wait_mode *wait_mode)
  545. {
  546. struct afs_call *call;
  547. size_t namesz, reqsz, padsz;
  548. __be32 *bp;
  549. _enter("");
  550. namesz = strlen(name);
  551. padsz = (4 - (namesz & 3)) & 3;
  552. reqsz = (5 * 4) + namesz + padsz + (6 * 4);
  553. call = afs_alloc_flat_call(&afs_RXFSCreateXXXX, reqsz,
  554. (3 + 21 + 21 + 3 + 6) * 4);
  555. if (!call)
  556. return -ENOMEM;
  557. call->key = key;
  558. call->reply = vnode;
  559. call->reply2 = newfid;
  560. call->reply3 = newstatus;
  561. call->reply4 = newcb;
  562. call->service_id = FS_SERVICE;
  563. call->port = htons(AFS_FS_PORT);
  564. /* marshall the parameters */
  565. bp = call->request;
  566. *bp++ = htonl(S_ISDIR(mode) ? FSMAKEDIR : FSCREATEFILE);
  567. *bp++ = htonl(vnode->fid.vid);
  568. *bp++ = htonl(vnode->fid.vnode);
  569. *bp++ = htonl(vnode->fid.unique);
  570. *bp++ = htonl(namesz);
  571. memcpy(bp, name, namesz);
  572. bp = (void *) bp + namesz;
  573. if (padsz > 0) {
  574. memset(bp, 0, padsz);
  575. bp = (void *) bp + padsz;
  576. }
  577. *bp++ = htonl(AFS_SET_MODE);
  578. *bp++ = 0; /* mtime */
  579. *bp++ = 0; /* owner */
  580. *bp++ = 0; /* group */
  581. *bp++ = htonl(mode & S_IALLUGO); /* unix mode */
  582. *bp++ = 0; /* segment size */
  583. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  584. }
  585. /*
  586. * deliver reply data to an FS.RemoveFile or FS.RemoveDir
  587. */
  588. static int afs_deliver_fs_remove(struct afs_call *call,
  589. struct sk_buff *skb, bool last)
  590. {
  591. struct afs_vnode *vnode = call->reply;
  592. const __be32 *bp;
  593. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  594. afs_transfer_reply(call, skb);
  595. if (!last)
  596. return 0;
  597. if (call->reply_size != call->reply_max)
  598. return -EBADMSG;
  599. /* unmarshall the reply once we've received all of it */
  600. bp = call->buffer;
  601. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  602. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  603. _leave(" = 0 [done]");
  604. return 0;
  605. }
  606. /*
  607. * FS.RemoveDir/FS.RemoveFile operation type
  608. */
  609. static const struct afs_call_type afs_RXFSRemoveXXXX = {
  610. .name = "FS.RemoveXXXX",
  611. .deliver = afs_deliver_fs_remove,
  612. .abort_to_error = afs_abort_to_error,
  613. .destructor = afs_flat_call_destructor,
  614. };
  615. /*
  616. * remove a file or directory
  617. */
  618. int afs_fs_remove(struct afs_server *server,
  619. struct key *key,
  620. struct afs_vnode *vnode,
  621. const char *name,
  622. bool isdir,
  623. const struct afs_wait_mode *wait_mode)
  624. {
  625. struct afs_call *call;
  626. size_t namesz, reqsz, padsz;
  627. __be32 *bp;
  628. _enter("");
  629. namesz = strlen(name);
  630. padsz = (4 - (namesz & 3)) & 3;
  631. reqsz = (5 * 4) + namesz + padsz;
  632. call = afs_alloc_flat_call(&afs_RXFSRemoveXXXX, reqsz, (21 + 6) * 4);
  633. if (!call)
  634. return -ENOMEM;
  635. call->key = key;
  636. call->reply = vnode;
  637. call->service_id = FS_SERVICE;
  638. call->port = htons(AFS_FS_PORT);
  639. /* marshall the parameters */
  640. bp = call->request;
  641. *bp++ = htonl(isdir ? FSREMOVEDIR : FSREMOVEFILE);
  642. *bp++ = htonl(vnode->fid.vid);
  643. *bp++ = htonl(vnode->fid.vnode);
  644. *bp++ = htonl(vnode->fid.unique);
  645. *bp++ = htonl(namesz);
  646. memcpy(bp, name, namesz);
  647. bp = (void *) bp + namesz;
  648. if (padsz > 0) {
  649. memset(bp, 0, padsz);
  650. bp = (void *) bp + padsz;
  651. }
  652. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  653. }
  654. /*
  655. * deliver reply data to an FS.Link
  656. */
  657. static int afs_deliver_fs_link(struct afs_call *call,
  658. struct sk_buff *skb, bool last)
  659. {
  660. struct afs_vnode *dvnode = call->reply, *vnode = call->reply2;
  661. const __be32 *bp;
  662. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  663. afs_transfer_reply(call, skb);
  664. if (!last)
  665. return 0;
  666. if (call->reply_size != call->reply_max)
  667. return -EBADMSG;
  668. /* unmarshall the reply once we've received all of it */
  669. bp = call->buffer;
  670. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  671. xdr_decode_AFSFetchStatus(&bp, &dvnode->status, dvnode, NULL);
  672. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  673. _leave(" = 0 [done]");
  674. return 0;
  675. }
  676. /*
  677. * FS.Link operation type
  678. */
  679. static const struct afs_call_type afs_RXFSLink = {
  680. .name = "FS.Link",
  681. .deliver = afs_deliver_fs_link,
  682. .abort_to_error = afs_abort_to_error,
  683. .destructor = afs_flat_call_destructor,
  684. };
  685. /*
  686. * make a hard link
  687. */
  688. int afs_fs_link(struct afs_server *server,
  689. struct key *key,
  690. struct afs_vnode *dvnode,
  691. struct afs_vnode *vnode,
  692. const char *name,
  693. const struct afs_wait_mode *wait_mode)
  694. {
  695. struct afs_call *call;
  696. size_t namesz, reqsz, padsz;
  697. __be32 *bp;
  698. _enter("");
  699. namesz = strlen(name);
  700. padsz = (4 - (namesz & 3)) & 3;
  701. reqsz = (5 * 4) + namesz + padsz + (3 * 4);
  702. call = afs_alloc_flat_call(&afs_RXFSLink, reqsz, (21 + 21 + 6) * 4);
  703. if (!call)
  704. return -ENOMEM;
  705. call->key = key;
  706. call->reply = dvnode;
  707. call->reply2 = vnode;
  708. call->service_id = FS_SERVICE;
  709. call->port = htons(AFS_FS_PORT);
  710. /* marshall the parameters */
  711. bp = call->request;
  712. *bp++ = htonl(FSLINK);
  713. *bp++ = htonl(dvnode->fid.vid);
  714. *bp++ = htonl(dvnode->fid.vnode);
  715. *bp++ = htonl(dvnode->fid.unique);
  716. *bp++ = htonl(namesz);
  717. memcpy(bp, name, namesz);
  718. bp = (void *) bp + namesz;
  719. if (padsz > 0) {
  720. memset(bp, 0, padsz);
  721. bp = (void *) bp + padsz;
  722. }
  723. *bp++ = htonl(vnode->fid.vid);
  724. *bp++ = htonl(vnode->fid.vnode);
  725. *bp++ = htonl(vnode->fid.unique);
  726. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  727. }
  728. /*
  729. * deliver reply data to an FS.Symlink
  730. */
  731. static int afs_deliver_fs_symlink(struct afs_call *call,
  732. struct sk_buff *skb, bool last)
  733. {
  734. struct afs_vnode *vnode = call->reply;
  735. const __be32 *bp;
  736. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  737. afs_transfer_reply(call, skb);
  738. if (!last)
  739. return 0;
  740. if (call->reply_size != call->reply_max)
  741. return -EBADMSG;
  742. /* unmarshall the reply once we've received all of it */
  743. bp = call->buffer;
  744. xdr_decode_AFSFid(&bp, call->reply2);
  745. xdr_decode_AFSFetchStatus(&bp, call->reply3, NULL, NULL);
  746. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, NULL);
  747. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  748. _leave(" = 0 [done]");
  749. return 0;
  750. }
  751. /*
  752. * FS.Symlink operation type
  753. */
  754. static const struct afs_call_type afs_RXFSSymlink = {
  755. .name = "FS.Symlink",
  756. .deliver = afs_deliver_fs_symlink,
  757. .abort_to_error = afs_abort_to_error,
  758. .destructor = afs_flat_call_destructor,
  759. };
  760. /*
  761. * create a symbolic link
  762. */
  763. int afs_fs_symlink(struct afs_server *server,
  764. struct key *key,
  765. struct afs_vnode *vnode,
  766. const char *name,
  767. const char *contents,
  768. struct afs_fid *newfid,
  769. struct afs_file_status *newstatus,
  770. const struct afs_wait_mode *wait_mode)
  771. {
  772. struct afs_call *call;
  773. size_t namesz, reqsz, padsz, c_namesz, c_padsz;
  774. __be32 *bp;
  775. _enter("");
  776. namesz = strlen(name);
  777. padsz = (4 - (namesz & 3)) & 3;
  778. c_namesz = strlen(contents);
  779. c_padsz = (4 - (c_namesz & 3)) & 3;
  780. reqsz = (6 * 4) + namesz + padsz + c_namesz + c_padsz + (6 * 4);
  781. call = afs_alloc_flat_call(&afs_RXFSSymlink, reqsz,
  782. (3 + 21 + 21 + 6) * 4);
  783. if (!call)
  784. return -ENOMEM;
  785. call->key = key;
  786. call->reply = vnode;
  787. call->reply2 = newfid;
  788. call->reply3 = newstatus;
  789. call->service_id = FS_SERVICE;
  790. call->port = htons(AFS_FS_PORT);
  791. /* marshall the parameters */
  792. bp = call->request;
  793. *bp++ = htonl(FSSYMLINK);
  794. *bp++ = htonl(vnode->fid.vid);
  795. *bp++ = htonl(vnode->fid.vnode);
  796. *bp++ = htonl(vnode->fid.unique);
  797. *bp++ = htonl(namesz);
  798. memcpy(bp, name, namesz);
  799. bp = (void *) bp + namesz;
  800. if (padsz > 0) {
  801. memset(bp, 0, padsz);
  802. bp = (void *) bp + padsz;
  803. }
  804. *bp++ = htonl(c_namesz);
  805. memcpy(bp, contents, c_namesz);
  806. bp = (void *) bp + c_namesz;
  807. if (c_padsz > 0) {
  808. memset(bp, 0, c_padsz);
  809. bp = (void *) bp + c_padsz;
  810. }
  811. *bp++ = htonl(AFS_SET_MODE);
  812. *bp++ = 0; /* mtime */
  813. *bp++ = 0; /* owner */
  814. *bp++ = 0; /* group */
  815. *bp++ = htonl(S_IRWXUGO); /* unix mode */
  816. *bp++ = 0; /* segment size */
  817. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  818. }
  819. /*
  820. * deliver reply data to an FS.Rename
  821. */
  822. static int afs_deliver_fs_rename(struct afs_call *call,
  823. struct sk_buff *skb, bool last)
  824. {
  825. struct afs_vnode *orig_dvnode = call->reply, *new_dvnode = call->reply2;
  826. const __be32 *bp;
  827. _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
  828. afs_transfer_reply(call, skb);
  829. if (!last)
  830. return 0;
  831. if (call->reply_size != call->reply_max)
  832. return -EBADMSG;
  833. /* unmarshall the reply once we've received all of it */
  834. bp = call->buffer;
  835. xdr_decode_AFSFetchStatus(&bp, &orig_dvnode->status, orig_dvnode, NULL);
  836. if (new_dvnode != orig_dvnode)
  837. xdr_decode_AFSFetchStatus(&bp, &new_dvnode->status, new_dvnode,
  838. NULL);
  839. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  840. _leave(" = 0 [done]");
  841. return 0;
  842. }
  843. /*
  844. * FS.Rename operation type
  845. */
  846. static const struct afs_call_type afs_RXFSRename = {
  847. .name = "FS.Rename",
  848. .deliver = afs_deliver_fs_rename,
  849. .abort_to_error = afs_abort_to_error,
  850. .destructor = afs_flat_call_destructor,
  851. };
  852. /*
  853. * create a symbolic link
  854. */
  855. int afs_fs_rename(struct afs_server *server,
  856. struct key *key,
  857. struct afs_vnode *orig_dvnode,
  858. const char *orig_name,
  859. struct afs_vnode *new_dvnode,
  860. const char *new_name,
  861. const struct afs_wait_mode *wait_mode)
  862. {
  863. struct afs_call *call;
  864. size_t reqsz, o_namesz, o_padsz, n_namesz, n_padsz;
  865. __be32 *bp;
  866. _enter("");
  867. o_namesz = strlen(orig_name);
  868. o_padsz = (4 - (o_namesz & 3)) & 3;
  869. n_namesz = strlen(new_name);
  870. n_padsz = (4 - (n_namesz & 3)) & 3;
  871. reqsz = (4 * 4) +
  872. 4 + o_namesz + o_padsz +
  873. (3 * 4) +
  874. 4 + n_namesz + n_padsz;
  875. call = afs_alloc_flat_call(&afs_RXFSRename, reqsz, (21 + 21 + 6) * 4);
  876. if (!call)
  877. return -ENOMEM;
  878. call->key = key;
  879. call->reply = orig_dvnode;
  880. call->reply2 = new_dvnode;
  881. call->service_id = FS_SERVICE;
  882. call->port = htons(AFS_FS_PORT);
  883. /* marshall the parameters */
  884. bp = call->request;
  885. *bp++ = htonl(FSRENAME);
  886. *bp++ = htonl(orig_dvnode->fid.vid);
  887. *bp++ = htonl(orig_dvnode->fid.vnode);
  888. *bp++ = htonl(orig_dvnode->fid.unique);
  889. *bp++ = htonl(o_namesz);
  890. memcpy(bp, orig_name, o_namesz);
  891. bp = (void *) bp + o_namesz;
  892. if (o_padsz > 0) {
  893. memset(bp, 0, o_padsz);
  894. bp = (void *) bp + o_padsz;
  895. }
  896. *bp++ = htonl(new_dvnode->fid.vid);
  897. *bp++ = htonl(new_dvnode->fid.vnode);
  898. *bp++ = htonl(new_dvnode->fid.unique);
  899. *bp++ = htonl(n_namesz);
  900. memcpy(bp, new_name, n_namesz);
  901. bp = (void *) bp + n_namesz;
  902. if (n_padsz > 0) {
  903. memset(bp, 0, n_padsz);
  904. bp = (void *) bp + n_padsz;
  905. }
  906. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  907. }
  908. /*
  909. * deliver reply data to an FS.StoreData
  910. */
  911. static int afs_deliver_fs_store_data(struct afs_call *call,
  912. struct sk_buff *skb, bool last)
  913. {
  914. struct afs_vnode *vnode = call->reply;
  915. const __be32 *bp;
  916. _enter(",,%u", last);
  917. afs_transfer_reply(call, skb);
  918. if (!last) {
  919. _leave(" = 0 [more]");
  920. return 0;
  921. }
  922. if (call->reply_size != call->reply_max) {
  923. _leave(" = -EBADMSG [%u != %u]",
  924. call->reply_size, call->reply_max);
  925. return -EBADMSG;
  926. }
  927. /* unmarshall the reply once we've received all of it */
  928. bp = call->buffer;
  929. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode,
  930. &call->store_version);
  931. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  932. afs_pages_written_back(vnode, call);
  933. _leave(" = 0 [done]");
  934. return 0;
  935. }
  936. /*
  937. * FS.StoreData operation type
  938. */
  939. static const struct afs_call_type afs_RXFSStoreData = {
  940. .name = "FS.StoreData",
  941. .deliver = afs_deliver_fs_store_data,
  942. .abort_to_error = afs_abort_to_error,
  943. .destructor = afs_flat_call_destructor,
  944. };
  945. static const struct afs_call_type afs_RXFSStoreData64 = {
  946. .name = "FS.StoreData64",
  947. .deliver = afs_deliver_fs_store_data,
  948. .abort_to_error = afs_abort_to_error,
  949. .destructor = afs_flat_call_destructor,
  950. };
  951. /*
  952. * store a set of pages to a very large file
  953. */
  954. static int afs_fs_store_data64(struct afs_server *server,
  955. struct afs_writeback *wb,
  956. pgoff_t first, pgoff_t last,
  957. unsigned offset, unsigned to,
  958. loff_t size, loff_t pos, loff_t i_size,
  959. const struct afs_wait_mode *wait_mode)
  960. {
  961. struct afs_vnode *vnode = wb->vnode;
  962. struct afs_call *call;
  963. __be32 *bp;
  964. _enter(",%x,{%x:%u},,",
  965. key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);
  966. call = afs_alloc_flat_call(&afs_RXFSStoreData64,
  967. (4 + 6 + 3 * 2) * 4,
  968. (21 + 6) * 4);
  969. if (!call)
  970. return -ENOMEM;
  971. call->wb = wb;
  972. call->key = wb->key;
  973. call->reply = vnode;
  974. call->service_id = FS_SERVICE;
  975. call->port = htons(AFS_FS_PORT);
  976. call->mapping = vnode->vfs_inode.i_mapping;
  977. call->first = first;
  978. call->last = last;
  979. call->first_offset = offset;
  980. call->last_to = to;
  981. call->send_pages = true;
  982. call->store_version = vnode->status.data_version + 1;
  983. /* marshall the parameters */
  984. bp = call->request;
  985. *bp++ = htonl(FSSTOREDATA64);
  986. *bp++ = htonl(vnode->fid.vid);
  987. *bp++ = htonl(vnode->fid.vnode);
  988. *bp++ = htonl(vnode->fid.unique);
  989. *bp++ = 0; /* mask */
  990. *bp++ = 0; /* mtime */
  991. *bp++ = 0; /* owner */
  992. *bp++ = 0; /* group */
  993. *bp++ = 0; /* unix mode */
  994. *bp++ = 0; /* segment size */
  995. *bp++ = htonl(pos >> 32);
  996. *bp++ = htonl((u32) pos);
  997. *bp++ = htonl(size >> 32);
  998. *bp++ = htonl((u32) size);
  999. *bp++ = htonl(i_size >> 32);
  1000. *bp++ = htonl((u32) i_size);
  1001. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1002. }
  1003. /*
  1004. * store a set of pages
  1005. */
  1006. int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb,
  1007. pgoff_t first, pgoff_t last,
  1008. unsigned offset, unsigned to,
  1009. const struct afs_wait_mode *wait_mode)
  1010. {
  1011. struct afs_vnode *vnode = wb->vnode;
  1012. struct afs_call *call;
  1013. loff_t size, pos, i_size;
  1014. __be32 *bp;
  1015. _enter(",%x,{%x:%u},,",
  1016. key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode);
  1017. size = to - offset;
  1018. if (first != last)
  1019. size += (loff_t)(last - first) << PAGE_SHIFT;
  1020. pos = (loff_t)first << PAGE_SHIFT;
  1021. pos += offset;
  1022. i_size = i_size_read(&vnode->vfs_inode);
  1023. if (pos + size > i_size)
  1024. i_size = size + pos;
  1025. _debug("size %llx, at %llx, i_size %llx",
  1026. (unsigned long long) size, (unsigned long long) pos,
  1027. (unsigned long long) i_size);
  1028. if (pos >> 32 || i_size >> 32 || size >> 32 || (pos + size) >> 32)
  1029. return afs_fs_store_data64(server, wb, first, last, offset, to,
  1030. size, pos, i_size, wait_mode);
  1031. call = afs_alloc_flat_call(&afs_RXFSStoreData,
  1032. (4 + 6 + 3) * 4,
  1033. (21 + 6) * 4);
  1034. if (!call)
  1035. return -ENOMEM;
  1036. call->wb = wb;
  1037. call->key = wb->key;
  1038. call->reply = vnode;
  1039. call->service_id = FS_SERVICE;
  1040. call->port = htons(AFS_FS_PORT);
  1041. call->mapping = vnode->vfs_inode.i_mapping;
  1042. call->first = first;
  1043. call->last = last;
  1044. call->first_offset = offset;
  1045. call->last_to = to;
  1046. call->send_pages = true;
  1047. call->store_version = vnode->status.data_version + 1;
  1048. /* marshall the parameters */
  1049. bp = call->request;
  1050. *bp++ = htonl(FSSTOREDATA);
  1051. *bp++ = htonl(vnode->fid.vid);
  1052. *bp++ = htonl(vnode->fid.vnode);
  1053. *bp++ = htonl(vnode->fid.unique);
  1054. *bp++ = 0; /* mask */
  1055. *bp++ = 0; /* mtime */
  1056. *bp++ = 0; /* owner */
  1057. *bp++ = 0; /* group */
  1058. *bp++ = 0; /* unix mode */
  1059. *bp++ = 0; /* segment size */
  1060. *bp++ = htonl(pos);
  1061. *bp++ = htonl(size);
  1062. *bp++ = htonl(i_size);
  1063. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1064. }
  1065. /*
  1066. * deliver reply data to an FS.StoreStatus
  1067. */
  1068. static int afs_deliver_fs_store_status(struct afs_call *call,
  1069. struct sk_buff *skb, bool last)
  1070. {
  1071. afs_dataversion_t *store_version;
  1072. struct afs_vnode *vnode = call->reply;
  1073. const __be32 *bp;
  1074. _enter(",,%u", last);
  1075. afs_transfer_reply(call, skb);
  1076. if (!last) {
  1077. _leave(" = 0 [more]");
  1078. return 0;
  1079. }
  1080. if (call->reply_size != call->reply_max) {
  1081. _leave(" = -EBADMSG [%u != %u]",
  1082. call->reply_size, call->reply_max);
  1083. return -EBADMSG;
  1084. }
  1085. /* unmarshall the reply once we've received all of it */
  1086. store_version = NULL;
  1087. if (call->operation_ID == FSSTOREDATA)
  1088. store_version = &call->store_version;
  1089. bp = call->buffer;
  1090. xdr_decode_AFSFetchStatus(&bp, &vnode->status, vnode, store_version);
  1091. /* xdr_decode_AFSVolSync(&bp, call->replyX); */
  1092. _leave(" = 0 [done]");
  1093. return 0;
  1094. }
  1095. /*
  1096. * FS.StoreStatus operation type
  1097. */
  1098. static const struct afs_call_type afs_RXFSStoreStatus = {
  1099. .name = "FS.StoreStatus",
  1100. .deliver = afs_deliver_fs_store_status,
  1101. .abort_to_error = afs_abort_to_error,
  1102. .destructor = afs_flat_call_destructor,
  1103. };
  1104. static const struct afs_call_type afs_RXFSStoreData_as_Status = {
  1105. .name = "FS.StoreData",
  1106. .deliver = afs_deliver_fs_store_status,
  1107. .abort_to_error = afs_abort_to_error,
  1108. .destructor = afs_flat_call_destructor,
  1109. };
  1110. static const struct afs_call_type afs_RXFSStoreData64_as_Status = {
  1111. .name = "FS.StoreData64",
  1112. .deliver = afs_deliver_fs_store_status,
  1113. .abort_to_error = afs_abort_to_error,
  1114. .destructor = afs_flat_call_destructor,
  1115. };
  1116. /*
  1117. * set the attributes on a very large file, using FS.StoreData rather than
  1118. * FS.StoreStatus so as to alter the file size also
  1119. */
  1120. static int afs_fs_setattr_size64(struct afs_server *server, struct key *key,
  1121. struct afs_vnode *vnode, struct iattr *attr,
  1122. const struct afs_wait_mode *wait_mode)
  1123. {
  1124. struct afs_call *call;
  1125. __be32 *bp;
  1126. _enter(",%x,{%x:%u},,",
  1127. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1128. ASSERT(attr->ia_valid & ATTR_SIZE);
  1129. call = afs_alloc_flat_call(&afs_RXFSStoreData64_as_Status,
  1130. (4 + 6 + 3 * 2) * 4,
  1131. (21 + 6) * 4);
  1132. if (!call)
  1133. return -ENOMEM;
  1134. call->key = key;
  1135. call->reply = vnode;
  1136. call->service_id = FS_SERVICE;
  1137. call->port = htons(AFS_FS_PORT);
  1138. call->store_version = vnode->status.data_version + 1;
  1139. call->operation_ID = FSSTOREDATA;
  1140. /* marshall the parameters */
  1141. bp = call->request;
  1142. *bp++ = htonl(FSSTOREDATA64);
  1143. *bp++ = htonl(vnode->fid.vid);
  1144. *bp++ = htonl(vnode->fid.vnode);
  1145. *bp++ = htonl(vnode->fid.unique);
  1146. xdr_encode_AFS_StoreStatus(&bp, attr);
  1147. *bp++ = 0; /* position of start of write */
  1148. *bp++ = 0;
  1149. *bp++ = 0; /* size of write */
  1150. *bp++ = 0;
  1151. *bp++ = htonl(attr->ia_size >> 32); /* new file length */
  1152. *bp++ = htonl((u32) attr->ia_size);
  1153. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1154. }
  1155. /*
  1156. * set the attributes on a file, using FS.StoreData rather than FS.StoreStatus
  1157. * so as to alter the file size also
  1158. */
  1159. static int afs_fs_setattr_size(struct afs_server *server, struct key *key,
  1160. struct afs_vnode *vnode, struct iattr *attr,
  1161. const struct afs_wait_mode *wait_mode)
  1162. {
  1163. struct afs_call *call;
  1164. __be32 *bp;
  1165. _enter(",%x,{%x:%u},,",
  1166. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1167. ASSERT(attr->ia_valid & ATTR_SIZE);
  1168. if (attr->ia_size >> 32)
  1169. return afs_fs_setattr_size64(server, key, vnode, attr,
  1170. wait_mode);
  1171. call = afs_alloc_flat_call(&afs_RXFSStoreData_as_Status,
  1172. (4 + 6 + 3) * 4,
  1173. (21 + 6) * 4);
  1174. if (!call)
  1175. return -ENOMEM;
  1176. call->key = key;
  1177. call->reply = vnode;
  1178. call->service_id = FS_SERVICE;
  1179. call->port = htons(AFS_FS_PORT);
  1180. call->store_version = vnode->status.data_version + 1;
  1181. call->operation_ID = FSSTOREDATA;
  1182. /* marshall the parameters */
  1183. bp = call->request;
  1184. *bp++ = htonl(FSSTOREDATA);
  1185. *bp++ = htonl(vnode->fid.vid);
  1186. *bp++ = htonl(vnode->fid.vnode);
  1187. *bp++ = htonl(vnode->fid.unique);
  1188. xdr_encode_AFS_StoreStatus(&bp, attr);
  1189. *bp++ = 0; /* position of start of write */
  1190. *bp++ = 0; /* size of write */
  1191. *bp++ = htonl(attr->ia_size); /* new file length */
  1192. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1193. }
  1194. /*
  1195. * set the attributes on a file, using FS.StoreData if there's a change in file
  1196. * size, and FS.StoreStatus otherwise
  1197. */
  1198. int afs_fs_setattr(struct afs_server *server, struct key *key,
  1199. struct afs_vnode *vnode, struct iattr *attr,
  1200. const struct afs_wait_mode *wait_mode)
  1201. {
  1202. struct afs_call *call;
  1203. __be32 *bp;
  1204. if (attr->ia_valid & ATTR_SIZE)
  1205. return afs_fs_setattr_size(server, key, vnode, attr,
  1206. wait_mode);
  1207. _enter(",%x,{%x:%u},,",
  1208. key_serial(key), vnode->fid.vid, vnode->fid.vnode);
  1209. call = afs_alloc_flat_call(&afs_RXFSStoreStatus,
  1210. (4 + 6) * 4,
  1211. (21 + 6) * 4);
  1212. if (!call)
  1213. return -ENOMEM;
  1214. call->key = key;
  1215. call->reply = vnode;
  1216. call->service_id = FS_SERVICE;
  1217. call->port = htons(AFS_FS_PORT);
  1218. call->operation_ID = FSSTORESTATUS;
  1219. /* marshall the parameters */
  1220. bp = call->request;
  1221. *bp++ = htonl(FSSTORESTATUS);
  1222. *bp++ = htonl(vnode->fid.vid);
  1223. *bp++ = htonl(vnode->fid.vnode);
  1224. *bp++ = htonl(vnode->fid.unique);
  1225. xdr_encode_AFS_StoreStatus(&bp, attr);
  1226. return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
  1227. }