nfs42proc.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
  4. */
  5. #include <linux/fs.h>
  6. #include <linux/sunrpc/addr.h>
  7. #include <linux/sunrpc/sched.h>
  8. #include <linux/nfs.h>
  9. #include <linux/nfs3.h>
  10. #include <linux/nfs4.h>
  11. #include <linux/nfs_xdr.h>
  12. #include <linux/nfs_fs.h>
  13. #include "nfs4_fs.h"
  14. #include "nfs42.h"
  15. #include "iostat.h"
  16. #include "pnfs.h"
  17. #include "nfs4session.h"
  18. #include "internal.h"
  19. #include "delegation.h"
  20. #include "nfs4trace.h"
  21. #define NFSDBG_FACILITY NFSDBG_PROC
  22. static int nfs42_do_offload_cancel_async(struct file *dst, nfs4_stateid *std);
  23. static int nfs42_proc_offload_status(struct file *file, nfs4_stateid *stateid,
  24. u64 *copied);
  25. static void nfs42_set_netaddr(struct file *filep, struct nfs42_netaddr *naddr)
  26. {
  27. struct nfs_client *clp = (NFS_SERVER(file_inode(filep)))->nfs_client;
  28. unsigned short port = 2049;
  29. rcu_read_lock();
  30. naddr->netid_len = scnprintf(naddr->netid,
  31. sizeof(naddr->netid), "%s",
  32. rpc_peeraddr2str(clp->cl_rpcclient,
  33. RPC_DISPLAY_NETID));
  34. naddr->addr_len = scnprintf(naddr->addr,
  35. sizeof(naddr->addr),
  36. "%s.%u.%u",
  37. rpc_peeraddr2str(clp->cl_rpcclient,
  38. RPC_DISPLAY_ADDR),
  39. port >> 8, port & 255);
  40. rcu_read_unlock();
  41. }
  42. static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
  43. struct nfs_lock_context *lock, loff_t offset, loff_t len)
  44. {
  45. struct inode *inode = file_inode(filep);
  46. struct nfs_server *server = NFS_SERVER(inode);
  47. u32 bitmask[NFS_BITMASK_SZ];
  48. struct nfs42_falloc_args args = {
  49. .falloc_fh = NFS_FH(inode),
  50. .falloc_offset = offset,
  51. .falloc_length = len,
  52. .falloc_bitmask = bitmask,
  53. };
  54. struct nfs42_falloc_res res = {
  55. .falloc_server = server,
  56. };
  57. int status;
  58. msg->rpc_argp = &args;
  59. msg->rpc_resp = &res;
  60. status = nfs4_set_rw_stateid(&args.falloc_stateid, lock->open_context,
  61. lock, FMODE_WRITE);
  62. if (status) {
  63. if (status == -EAGAIN)
  64. status = -NFS4ERR_BAD_STATEID;
  65. return status;
  66. }
  67. nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask, inode,
  68. NFS_INO_INVALID_BLOCKS);
  69. res.falloc_fattr = nfs_alloc_fattr();
  70. if (!res.falloc_fattr)
  71. return -ENOMEM;
  72. status = nfs4_call_sync(server->client, server, msg,
  73. &args.seq_args, &res.seq_res, 0);
  74. if (status == 0) {
  75. if (nfs_should_remove_suid(inode)) {
  76. spin_lock(&inode->i_lock);
  77. nfs_set_cache_invalid(inode,
  78. NFS_INO_REVAL_FORCED | NFS_INO_INVALID_MODE);
  79. spin_unlock(&inode->i_lock);
  80. }
  81. status = nfs_post_op_update_inode_force_wcc(inode,
  82. res.falloc_fattr);
  83. }
  84. if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_ALLOCATE])
  85. trace_nfs4_fallocate(inode, &args, status);
  86. else
  87. trace_nfs4_deallocate(inode, &args, status);
  88. kfree(res.falloc_fattr);
  89. return status;
  90. }
  91. static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
  92. loff_t offset, loff_t len)
  93. {
  94. struct inode *inode = file_inode(filep);
  95. struct nfs_server *server = NFS_SERVER(inode);
  96. struct nfs4_exception exception = { };
  97. struct nfs_lock_context *lock;
  98. int err;
  99. lock = nfs_get_lock_context(nfs_file_open_context(filep));
  100. if (IS_ERR(lock))
  101. return PTR_ERR(lock);
  102. exception.inode = inode;
  103. exception.state = lock->open_context->state;
  104. err = nfs_sync_inode(inode);
  105. if (err)
  106. goto out;
  107. do {
  108. err = _nfs42_proc_fallocate(msg, filep, lock, offset, len);
  109. if (err == -ENOTSUPP) {
  110. err = -EOPNOTSUPP;
  111. break;
  112. }
  113. err = nfs4_handle_exception(server, err, &exception);
  114. } while (exception.retry);
  115. out:
  116. nfs_put_lock_context(lock);
  117. return err;
  118. }
  119. int nfs42_proc_allocate(struct file *filep, loff_t offset, loff_t len)
  120. {
  121. struct rpc_message msg = {
  122. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ALLOCATE],
  123. };
  124. struct inode *inode = file_inode(filep);
  125. loff_t oldsize;
  126. int err;
  127. if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE))
  128. return -EOPNOTSUPP;
  129. err = nfs_start_io_write(inode);
  130. if (err)
  131. return err;
  132. oldsize = i_size_read(inode);
  133. err = nfs42_proc_fallocate(&msg, filep, offset, len);
  134. if (err == 0)
  135. nfs_truncate_last_folio(inode->i_mapping, oldsize,
  136. offset + len);
  137. else if (err == -EOPNOTSUPP)
  138. NFS_SERVER(inode)->caps &= ~(NFS_CAP_ALLOCATE |
  139. NFS_CAP_ZERO_RANGE);
  140. nfs_end_io_write(inode);
  141. return err;
  142. }
  143. int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len)
  144. {
  145. struct rpc_message msg = {
  146. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DEALLOCATE],
  147. };
  148. struct inode *inode = file_inode(filep);
  149. int err;
  150. if (!nfs_server_capable(inode, NFS_CAP_DEALLOCATE))
  151. return -EOPNOTSUPP;
  152. err = nfs_start_io_write(inode);
  153. if (err)
  154. return err;
  155. err = nfs42_proc_fallocate(&msg, filep, offset, len);
  156. if (err == 0)
  157. truncate_pagecache_range(inode, offset, (offset + len) -1);
  158. if (err == -EOPNOTSUPP)
  159. NFS_SERVER(inode)->caps &= ~(NFS_CAP_DEALLOCATE |
  160. NFS_CAP_ZERO_RANGE);
  161. nfs_end_io_write(inode);
  162. return err;
  163. }
  164. int nfs42_proc_zero_range(struct file *filep, loff_t offset, loff_t len)
  165. {
  166. struct rpc_message msg = {
  167. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ZERO_RANGE],
  168. };
  169. struct inode *inode = file_inode(filep);
  170. loff_t oldsize;
  171. int err;
  172. if (!nfs_server_capable(inode, NFS_CAP_ZERO_RANGE))
  173. return -EOPNOTSUPP;
  174. err = nfs_start_io_write(inode);
  175. if (err)
  176. return err;
  177. oldsize = i_size_read(inode);
  178. err = nfs42_proc_fallocate(&msg, filep, offset, len);
  179. if (err == 0) {
  180. nfs_truncate_last_folio(inode->i_mapping, oldsize,
  181. offset + len);
  182. truncate_pagecache_range(inode, offset, (offset + len) -1);
  183. } else if (err == -EOPNOTSUPP)
  184. NFS_SERVER(inode)->caps &= ~NFS_CAP_ZERO_RANGE;
  185. nfs_end_io_write(inode);
  186. return err;
  187. }
  188. static void nfs4_copy_dequeue_callback(struct nfs_server *dst_server,
  189. struct nfs_server *src_server,
  190. struct nfs4_copy_state *copy)
  191. {
  192. spin_lock(&dst_server->nfs_client->cl_lock);
  193. list_del_init(&copy->copies);
  194. spin_unlock(&dst_server->nfs_client->cl_lock);
  195. if (dst_server != src_server) {
  196. spin_lock(&src_server->nfs_client->cl_lock);
  197. list_del_init(&copy->src_copies);
  198. spin_unlock(&src_server->nfs_client->cl_lock);
  199. }
  200. }
  201. static int handle_async_copy(struct nfs42_copy_res *res,
  202. struct nfs_server *dst_server,
  203. struct nfs_server *src_server,
  204. struct file *src,
  205. struct file *dst,
  206. nfs4_stateid *src_stateid,
  207. bool *restart)
  208. {
  209. struct nfs4_copy_state *copy, *tmp_copy = NULL, *iter;
  210. struct nfs_open_context *dst_ctx = nfs_file_open_context(dst);
  211. struct nfs_open_context *src_ctx = nfs_file_open_context(src);
  212. struct nfs_client *clp = dst_server->nfs_client;
  213. unsigned long timeout = 3 * HZ;
  214. int status = NFS4_OK;
  215. u64 copied;
  216. copy = kzalloc_obj(struct nfs4_copy_state);
  217. if (!copy)
  218. return -ENOMEM;
  219. spin_lock(&dst_server->nfs_client->cl_lock);
  220. list_for_each_entry(iter,
  221. &dst_server->nfs_client->pending_cb_stateids,
  222. copies) {
  223. if (memcmp(&res->write_res.stateid, &iter->stateid,
  224. NFS4_STATEID_SIZE))
  225. continue;
  226. tmp_copy = iter;
  227. list_del(&iter->copies);
  228. break;
  229. }
  230. if (tmp_copy) {
  231. spin_unlock(&dst_server->nfs_client->cl_lock);
  232. kfree(copy);
  233. copy = tmp_copy;
  234. goto out;
  235. }
  236. memcpy(&copy->stateid, &res->write_res.stateid, NFS4_STATEID_SIZE);
  237. init_completion(&copy->completion);
  238. copy->parent_dst_state = dst_ctx->state;
  239. copy->parent_src_state = src_ctx->state;
  240. list_add_tail(&copy->copies, &dst_server->ss_copies);
  241. spin_unlock(&dst_server->nfs_client->cl_lock);
  242. if (dst_server != src_server) {
  243. spin_lock(&src_server->nfs_client->cl_lock);
  244. list_add_tail(&copy->src_copies, &src_server->ss_src_copies);
  245. spin_unlock(&src_server->nfs_client->cl_lock);
  246. }
  247. wait:
  248. status = wait_for_completion_interruptible_timeout(&copy->completion,
  249. timeout);
  250. if (!status)
  251. goto timeout;
  252. nfs4_copy_dequeue_callback(dst_server, src_server, copy);
  253. if (status == -ERESTARTSYS) {
  254. goto out_cancel;
  255. } else if (copy->flags || copy->error == NFS4ERR_PARTNER_NO_AUTH) {
  256. status = -EAGAIN;
  257. *restart = true;
  258. goto out_cancel;
  259. }
  260. out:
  261. res->write_res.count = copy->count;
  262. /* Copy out the updated write verifier provided by CB_OFFLOAD. */
  263. memcpy(&res->write_res.verifier, &copy->verf, sizeof(copy->verf));
  264. status = -copy->error;
  265. out_free:
  266. kfree(copy);
  267. return status;
  268. out_cancel:
  269. nfs42_do_offload_cancel_async(dst, &copy->stateid);
  270. if (!nfs42_files_from_same_server(src, dst))
  271. nfs42_do_offload_cancel_async(src, src_stateid);
  272. goto out_free;
  273. timeout:
  274. timeout <<= 1;
  275. if (timeout > (clp->cl_lease_time >> 1))
  276. timeout = clp->cl_lease_time >> 1;
  277. status = nfs42_proc_offload_status(dst, &copy->stateid, &copied);
  278. if (status == -EINPROGRESS)
  279. goto wait;
  280. nfs4_copy_dequeue_callback(dst_server, src_server, copy);
  281. switch (status) {
  282. case 0:
  283. /* The server recognized the copy stateid, so it hasn't
  284. * rebooted. Don't overwrite the verifier returned in the
  285. * COPY result. */
  286. res->write_res.count = copied;
  287. goto out_free;
  288. case -EREMOTEIO:
  289. /* COPY operation failed on the server. */
  290. status = -EOPNOTSUPP;
  291. res->write_res.count = copied;
  292. goto out_free;
  293. case -EBADF:
  294. /* Server did not recognize the copy stateid. It has
  295. * probably restarted and lost the plot. */
  296. res->write_res.count = 0;
  297. status = -EOPNOTSUPP;
  298. break;
  299. case -EOPNOTSUPP:
  300. /* RFC 7862 REQUIREs server to support OFFLOAD_STATUS when
  301. * it has signed up for an async COPY, so server is not
  302. * spec-compliant. */
  303. res->write_res.count = 0;
  304. }
  305. goto out_free;
  306. }
  307. static int process_copy_commit(struct file *dst, loff_t pos_dst,
  308. struct nfs42_copy_res *res)
  309. {
  310. struct nfs_commitres cres;
  311. int status = -ENOMEM;
  312. cres.verf = kzalloc_obj(struct nfs_writeverf);
  313. if (!cres.verf)
  314. goto out;
  315. status = nfs4_proc_commit(dst, pos_dst, res->write_res.count, &cres);
  316. if (status)
  317. goto out_free;
  318. if (nfs_write_verifier_cmp(&res->write_res.verifier.verifier,
  319. &cres.verf->verifier)) {
  320. dprintk("commit verf differs from copy verf\n");
  321. status = -EAGAIN;
  322. }
  323. out_free:
  324. kfree(cres.verf);
  325. out:
  326. return status;
  327. }
  328. /**
  329. * nfs42_copy_dest_done - perform inode cache updates after clone/copy offload
  330. * @file: pointer to destination file
  331. * @pos: destination offset
  332. * @len: copy length
  333. * @oldsize: length of the file prior to clone/copy
  334. *
  335. * Punch a hole in the inode page cache, so that the NFS client will
  336. * know to retrieve new data.
  337. * Update the file size if necessary, and then mark the inode as having
  338. * invalid cached values for change attribute, ctime, mtime and space used.
  339. */
  340. static void nfs42_copy_dest_done(struct file *file, loff_t pos, loff_t len,
  341. loff_t oldsize)
  342. {
  343. struct inode *inode = file_inode(file);
  344. struct address_space *mapping = file->f_mapping;
  345. loff_t newsize = pos + len;
  346. loff_t end = newsize - 1;
  347. nfs_truncate_last_folio(mapping, oldsize, pos);
  348. WARN_ON_ONCE(invalidate_inode_pages2_range(mapping, pos >> PAGE_SHIFT,
  349. end >> PAGE_SHIFT));
  350. spin_lock(&inode->i_lock);
  351. if (newsize > i_size_read(inode))
  352. i_size_write(inode, newsize);
  353. nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE |
  354. NFS_INO_INVALID_CTIME |
  355. NFS_INO_INVALID_MTIME |
  356. NFS_INO_INVALID_BLOCKS);
  357. spin_unlock(&inode->i_lock);
  358. }
  359. static ssize_t _nfs42_proc_copy(struct file *src,
  360. struct nfs_lock_context *src_lock,
  361. struct file *dst,
  362. struct nfs_lock_context *dst_lock,
  363. struct nfs42_copy_args *args,
  364. struct nfs42_copy_res *res,
  365. struct nl4_server *nss,
  366. nfs4_stateid *cnr_stateid,
  367. bool *restart)
  368. {
  369. struct rpc_message msg = {
  370. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY],
  371. .rpc_argp = args,
  372. .rpc_resp = res,
  373. };
  374. struct inode *dst_inode = file_inode(dst);
  375. struct inode *src_inode = file_inode(src);
  376. struct nfs_server *dst_server = NFS_SERVER(dst_inode);
  377. struct nfs_server *src_server = NFS_SERVER(src_inode);
  378. loff_t pos_src = args->src_pos;
  379. loff_t pos_dst = args->dst_pos;
  380. loff_t oldsize_dst;
  381. size_t count = args->count;
  382. ssize_t status;
  383. if (nss) {
  384. args->cp_src = nss;
  385. nfs4_stateid_copy(&args->src_stateid, cnr_stateid);
  386. } else {
  387. status = nfs4_set_rw_stateid(&args->src_stateid,
  388. src_lock->open_context, src_lock, FMODE_READ);
  389. if (status) {
  390. if (status == -EAGAIN)
  391. status = -NFS4ERR_BAD_STATEID;
  392. return status;
  393. }
  394. }
  395. status = nfs_filemap_write_and_wait_range(src->f_mapping,
  396. pos_src, pos_src + (loff_t)count - 1);
  397. if (status)
  398. return status;
  399. status = nfs4_set_rw_stateid(&args->dst_stateid, dst_lock->open_context,
  400. dst_lock, FMODE_WRITE);
  401. if (status) {
  402. if (status == -EAGAIN)
  403. status = -NFS4ERR_BAD_STATEID;
  404. return status;
  405. }
  406. nfs_file_block_o_direct(NFS_I(dst_inode));
  407. status = nfs_sync_inode(dst_inode);
  408. if (status)
  409. return status;
  410. res->commit_res.verf = NULL;
  411. if (args->sync) {
  412. res->commit_res.verf =
  413. kzalloc_obj(struct nfs_writeverf);
  414. if (!res->commit_res.verf)
  415. return -ENOMEM;
  416. }
  417. set_bit(NFS_CLNT_SRC_SSC_COPY_STATE,
  418. &src_lock->open_context->state->flags);
  419. set_bit(NFS_CLNT_DST_SSC_COPY_STATE,
  420. &dst_lock->open_context->state->flags);
  421. oldsize_dst = i_size_read(dst_inode);
  422. status = nfs4_call_sync(dst_server->client, dst_server, &msg,
  423. &args->seq_args, &res->seq_res, 0);
  424. trace_nfs4_copy(src_inode, dst_inode, args, res, nss, status);
  425. if (status == -ENOTSUPP)
  426. dst_server->caps &= ~NFS_CAP_COPY;
  427. if (status)
  428. goto out;
  429. if (args->sync &&
  430. nfs_write_verifier_cmp(&res->write_res.verifier.verifier,
  431. &res->commit_res.verf->verifier)) {
  432. status = -EAGAIN;
  433. goto out;
  434. }
  435. if (!res->synchronous) {
  436. status = handle_async_copy(res, dst_server, src_server, src,
  437. dst, &args->src_stateid, restart);
  438. if (status)
  439. goto out;
  440. }
  441. if ((!res->synchronous || !args->sync) &&
  442. res->write_res.verifier.committed != NFS_FILE_SYNC) {
  443. status = process_copy_commit(dst, pos_dst, res);
  444. if (status)
  445. goto out;
  446. }
  447. nfs42_copy_dest_done(dst, pos_dst, res->write_res.count, oldsize_dst);
  448. nfs_invalidate_atime(src_inode);
  449. status = res->write_res.count;
  450. out:
  451. if (args->sync)
  452. kfree(res->commit_res.verf);
  453. return status;
  454. }
  455. ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
  456. struct file *dst, loff_t pos_dst, size_t count,
  457. struct nl4_server *nss,
  458. nfs4_stateid *cnr_stateid, bool sync)
  459. {
  460. struct nfs_server *server = NFS_SERVER(file_inode(dst));
  461. struct nfs_lock_context *src_lock;
  462. struct nfs_lock_context *dst_lock;
  463. struct nfs42_copy_args args = {
  464. .src_fh = NFS_FH(file_inode(src)),
  465. .src_pos = pos_src,
  466. .dst_fh = NFS_FH(file_inode(dst)),
  467. .dst_pos = pos_dst,
  468. .count = count,
  469. .sync = sync,
  470. };
  471. struct nfs42_copy_res res;
  472. struct nfs4_exception src_exception = {
  473. .inode = file_inode(src),
  474. .stateid = &args.src_stateid,
  475. };
  476. struct nfs4_exception dst_exception = {
  477. .inode = file_inode(dst),
  478. .stateid = &args.dst_stateid,
  479. };
  480. ssize_t err, err2;
  481. bool restart = false;
  482. src_lock = nfs_get_lock_context(nfs_file_open_context(src));
  483. if (IS_ERR(src_lock))
  484. return PTR_ERR(src_lock);
  485. src_exception.state = src_lock->open_context->state;
  486. dst_lock = nfs_get_lock_context(nfs_file_open_context(dst));
  487. if (IS_ERR(dst_lock)) {
  488. err = PTR_ERR(dst_lock);
  489. goto out_put_src_lock;
  490. }
  491. dst_exception.state = dst_lock->open_context->state;
  492. do {
  493. inode_lock(file_inode(dst));
  494. err = _nfs42_proc_copy(src, src_lock,
  495. dst, dst_lock,
  496. &args, &res,
  497. nss, cnr_stateid, &restart);
  498. inode_unlock(file_inode(dst));
  499. if (err >= 0)
  500. break;
  501. if ((err == -ENOTSUPP ||
  502. err == -NFS4ERR_OFFLOAD_DENIED) &&
  503. nfs42_files_from_same_server(src, dst)) {
  504. err = -EOPNOTSUPP;
  505. break;
  506. } else if (err == -EAGAIN) {
  507. if (!restart) {
  508. dst_exception.retry = 1;
  509. continue;
  510. }
  511. break;
  512. } else if (err == -NFS4ERR_OFFLOAD_NO_REQS &&
  513. args.sync != res.synchronous) {
  514. args.sync = res.synchronous;
  515. dst_exception.retry = 1;
  516. continue;
  517. } else if ((err == -ESTALE ||
  518. err == -NFS4ERR_OFFLOAD_DENIED ||
  519. err == -ENOTSUPP) &&
  520. !nfs42_files_from_same_server(src, dst)) {
  521. nfs42_do_offload_cancel_async(src, &args.src_stateid);
  522. err = -EOPNOTSUPP;
  523. break;
  524. }
  525. err2 = nfs4_handle_exception(server, err, &src_exception);
  526. err = nfs4_handle_exception(server, err, &dst_exception);
  527. if (!err)
  528. err = err2;
  529. } while (src_exception.retry || dst_exception.retry);
  530. nfs_put_lock_context(dst_lock);
  531. out_put_src_lock:
  532. nfs_put_lock_context(src_lock);
  533. return err;
  534. }
  535. struct nfs42_offload_data {
  536. struct nfs_server *seq_server;
  537. struct nfs42_offload_status_args args;
  538. struct nfs42_offload_status_res res;
  539. };
  540. static void nfs42_offload_prepare(struct rpc_task *task, void *calldata)
  541. {
  542. struct nfs42_offload_data *data = calldata;
  543. nfs4_setup_sequence(data->seq_server->nfs_client,
  544. &data->args.osa_seq_args,
  545. &data->res.osr_seq_res, task);
  546. }
  547. static void nfs42_offload_cancel_done(struct rpc_task *task, void *calldata)
  548. {
  549. struct nfs42_offload_data *data = calldata;
  550. trace_nfs4_offload_cancel(&data->args, task->tk_status);
  551. nfs41_sequence_done(task, &data->res.osr_seq_res);
  552. if (task->tk_status &&
  553. nfs4_async_handle_error(task, data->seq_server, NULL,
  554. NULL) == -EAGAIN)
  555. rpc_restart_call_prepare(task);
  556. }
  557. static void nfs42_offload_release(void *data)
  558. {
  559. kfree(data);
  560. }
  561. static const struct rpc_call_ops nfs42_offload_cancel_ops = {
  562. .rpc_call_prepare = nfs42_offload_prepare,
  563. .rpc_call_done = nfs42_offload_cancel_done,
  564. .rpc_release = nfs42_offload_release,
  565. };
  566. static int nfs42_do_offload_cancel_async(struct file *dst,
  567. nfs4_stateid *stateid)
  568. {
  569. struct nfs_server *dst_server = NFS_SERVER(file_inode(dst));
  570. struct nfs42_offload_data *data = NULL;
  571. struct nfs_open_context *ctx = nfs_file_open_context(dst);
  572. struct rpc_task *task;
  573. struct rpc_message msg = {
  574. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OFFLOAD_CANCEL],
  575. .rpc_cred = ctx->cred,
  576. };
  577. struct rpc_task_setup task_setup_data = {
  578. .rpc_client = dst_server->client,
  579. .rpc_message = &msg,
  580. .callback_ops = &nfs42_offload_cancel_ops,
  581. .workqueue = nfsiod_workqueue,
  582. .flags = RPC_TASK_ASYNC | RPC_TASK_MOVEABLE,
  583. };
  584. int status;
  585. if (!(dst_server->caps & NFS_CAP_OFFLOAD_CANCEL))
  586. return -EOPNOTSUPP;
  587. data = kzalloc_obj(struct nfs42_offload_data);
  588. if (data == NULL)
  589. return -ENOMEM;
  590. data->seq_server = dst_server;
  591. data->args.osa_src_fh = NFS_FH(file_inode(dst));
  592. memcpy(&data->args.osa_stateid, stateid,
  593. sizeof(data->args.osa_stateid));
  594. msg.rpc_argp = &data->args;
  595. msg.rpc_resp = &data->res;
  596. task_setup_data.callback_data = data;
  597. nfs4_init_sequence(dst_server->nfs_client, &data->args.osa_seq_args,
  598. &data->res.osr_seq_res, 1, 0);
  599. task = rpc_run_task(&task_setup_data);
  600. if (IS_ERR(task))
  601. return PTR_ERR(task);
  602. status = rpc_wait_for_completion_task(task);
  603. if (status == -ENOTSUPP)
  604. dst_server->caps &= ~NFS_CAP_OFFLOAD_CANCEL;
  605. rpc_put_task(task);
  606. return status;
  607. }
  608. static int
  609. _nfs42_proc_offload_status(struct nfs_server *server, struct file *file,
  610. struct nfs42_offload_data *data)
  611. {
  612. struct nfs_open_context *ctx = nfs_file_open_context(file);
  613. struct rpc_message msg = {
  614. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OFFLOAD_STATUS],
  615. .rpc_argp = &data->args,
  616. .rpc_resp = &data->res,
  617. .rpc_cred = ctx->cred,
  618. };
  619. int status;
  620. status = nfs4_call_sync(server->client, server, &msg,
  621. &data->args.osa_seq_args,
  622. &data->res.osr_seq_res, 1);
  623. trace_nfs4_offload_status(&data->args, status);
  624. switch (status) {
  625. case 0:
  626. break;
  627. case -NFS4ERR_ADMIN_REVOKED:
  628. case -NFS4ERR_BAD_STATEID:
  629. case -NFS4ERR_OLD_STATEID:
  630. /*
  631. * Server does not recognize the COPY stateid. CB_OFFLOAD
  632. * could have purged it, or server might have rebooted.
  633. * Since COPY stateids don't have an associated inode,
  634. * avoid triggering state recovery.
  635. */
  636. status = -EBADF;
  637. break;
  638. case -NFS4ERR_NOTSUPP:
  639. case -ENOTSUPP:
  640. case -EOPNOTSUPP:
  641. server->caps &= ~NFS_CAP_OFFLOAD_STATUS;
  642. status = -EOPNOTSUPP;
  643. break;
  644. }
  645. return status;
  646. }
  647. /**
  648. * nfs42_proc_offload_status - Poll completion status of an async copy operation
  649. * @dst: handle of file being copied into
  650. * @stateid: copy stateid (from async COPY result)
  651. * @copied: OUT: number of bytes copied so far
  652. *
  653. * Return values:
  654. * %0: Server returned an NFS4_OK completion status
  655. * %-EINPROGRESS: Server returned no completion status
  656. * %-EREMOTEIO: Server returned an error completion status
  657. * %-EBADF: Server did not recognize the copy stateid
  658. * %-EOPNOTSUPP: Server does not support OFFLOAD_STATUS
  659. * %-ERESTARTSYS: Wait interrupted by signal
  660. *
  661. * Other negative errnos indicate the client could not complete the
  662. * request.
  663. */
  664. static int
  665. nfs42_proc_offload_status(struct file *dst, nfs4_stateid *stateid, u64 *copied)
  666. {
  667. struct inode *inode = file_inode(dst);
  668. struct nfs_server *server = NFS_SERVER(inode);
  669. struct nfs4_exception exception = {
  670. .inode = inode,
  671. };
  672. struct nfs42_offload_data *data;
  673. int status;
  674. if (!(server->caps & NFS_CAP_OFFLOAD_STATUS))
  675. return -EOPNOTSUPP;
  676. data = kzalloc_obj(*data);
  677. if (!data)
  678. return -ENOMEM;
  679. data->seq_server = server;
  680. data->args.osa_src_fh = NFS_FH(inode);
  681. memcpy(&data->args.osa_stateid, stateid,
  682. sizeof(data->args.osa_stateid));
  683. exception.stateid = &data->args.osa_stateid;
  684. do {
  685. status = _nfs42_proc_offload_status(server, dst, data);
  686. if (status == -EOPNOTSUPP)
  687. goto out;
  688. status = nfs4_handle_exception(server, status, &exception);
  689. } while (exception.retry);
  690. if (status)
  691. goto out;
  692. *copied = data->res.osr_count;
  693. if (!data->res.complete_count)
  694. status = -EINPROGRESS;
  695. else if (data->res.osr_complete != NFS_OK)
  696. status = -EREMOTEIO;
  697. out:
  698. kfree(data);
  699. return status;
  700. }
  701. static int _nfs42_proc_copy_notify(struct file *src, struct file *dst,
  702. struct nfs42_copy_notify_args *args,
  703. struct nfs42_copy_notify_res *res)
  704. {
  705. struct nfs_server *src_server = NFS_SERVER(file_inode(src));
  706. struct rpc_message msg = {
  707. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY_NOTIFY],
  708. .rpc_argp = args,
  709. .rpc_resp = res,
  710. };
  711. int status;
  712. struct nfs_open_context *ctx;
  713. struct nfs_lock_context *l_ctx;
  714. ctx = get_nfs_open_context(nfs_file_open_context(src));
  715. l_ctx = nfs_get_lock_context(ctx);
  716. if (IS_ERR(l_ctx)) {
  717. status = PTR_ERR(l_ctx);
  718. goto out;
  719. }
  720. status = nfs4_set_rw_stateid(&args->cna_src_stateid, ctx, l_ctx,
  721. FMODE_READ);
  722. nfs_put_lock_context(l_ctx);
  723. if (status) {
  724. if (status == -EAGAIN)
  725. status = -NFS4ERR_BAD_STATEID;
  726. goto out;
  727. }
  728. status = nfs4_call_sync(src_server->client, src_server, &msg,
  729. &args->cna_seq_args, &res->cnr_seq_res, 0);
  730. trace_nfs4_copy_notify(file_inode(src), args, res, status);
  731. if (status == -ENOTSUPP)
  732. src_server->caps &= ~NFS_CAP_COPY_NOTIFY;
  733. out:
  734. put_nfs_open_context(nfs_file_open_context(src));
  735. return status;
  736. }
  737. int nfs42_proc_copy_notify(struct file *src, struct file *dst,
  738. struct nfs42_copy_notify_res *res)
  739. {
  740. struct nfs_server *src_server = NFS_SERVER(file_inode(src));
  741. struct nfs42_copy_notify_args *args;
  742. struct nfs4_exception exception = {
  743. .inode = file_inode(src),
  744. };
  745. int status;
  746. if (!(src_server->caps & NFS_CAP_COPY_NOTIFY))
  747. return -EOPNOTSUPP;
  748. args = kzalloc_obj(struct nfs42_copy_notify_args);
  749. if (args == NULL)
  750. return -ENOMEM;
  751. args->cna_src_fh = NFS_FH(file_inode(src)),
  752. args->cna_dst.nl4_type = NL4_NETADDR;
  753. nfs42_set_netaddr(dst, &args->cna_dst.u.nl4_addr);
  754. exception.stateid = &args->cna_src_stateid;
  755. do {
  756. status = _nfs42_proc_copy_notify(src, dst, args, res);
  757. if (status == -ENOTSUPP) {
  758. status = -EOPNOTSUPP;
  759. goto out;
  760. }
  761. status = nfs4_handle_exception(src_server, status, &exception);
  762. } while (exception.retry);
  763. out:
  764. kfree(args);
  765. return status;
  766. }
  767. static loff_t _nfs42_proc_llseek(struct file *filep,
  768. struct nfs_lock_context *lock, loff_t offset, int whence)
  769. {
  770. struct inode *inode = file_inode(filep);
  771. struct nfs42_seek_args args = {
  772. .sa_fh = NFS_FH(inode),
  773. .sa_offset = offset,
  774. .sa_what = (whence == SEEK_HOLE) ?
  775. NFS4_CONTENT_HOLE : NFS4_CONTENT_DATA,
  776. };
  777. struct nfs42_seek_res res;
  778. struct rpc_message msg = {
  779. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEEK],
  780. .rpc_argp = &args,
  781. .rpc_resp = &res,
  782. };
  783. struct nfs_server *server = NFS_SERVER(inode);
  784. int status;
  785. if (!nfs_server_capable(inode, NFS_CAP_SEEK))
  786. return -ENOTSUPP;
  787. status = nfs4_set_rw_stateid(&args.sa_stateid, lock->open_context,
  788. lock, FMODE_READ);
  789. if (status) {
  790. if (status == -EAGAIN)
  791. status = -NFS4ERR_BAD_STATEID;
  792. return status;
  793. }
  794. status = nfs_filemap_write_and_wait_range(inode->i_mapping,
  795. offset, LLONG_MAX);
  796. if (status)
  797. return status;
  798. status = nfs4_call_sync(server->client, server, &msg,
  799. &args.seq_args, &res.seq_res, 0);
  800. trace_nfs4_llseek(inode, &args, &res, status);
  801. if (status == -ENOTSUPP)
  802. server->caps &= ~NFS_CAP_SEEK;
  803. if (status)
  804. return status;
  805. if (whence == SEEK_DATA && res.sr_eof)
  806. return -NFS4ERR_NXIO;
  807. else
  808. return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes);
  809. }
  810. loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence)
  811. {
  812. struct nfs_server *server = NFS_SERVER(file_inode(filep));
  813. struct nfs4_exception exception = { };
  814. struct nfs_lock_context *lock;
  815. loff_t err;
  816. lock = nfs_get_lock_context(nfs_file_open_context(filep));
  817. if (IS_ERR(lock))
  818. return PTR_ERR(lock);
  819. exception.inode = file_inode(filep);
  820. exception.state = lock->open_context->state;
  821. do {
  822. err = _nfs42_proc_llseek(filep, lock, offset, whence);
  823. if (err >= 0)
  824. break;
  825. if (err == -ENOTSUPP) {
  826. err = -EOPNOTSUPP;
  827. break;
  828. }
  829. err = nfs4_handle_exception(server, err, &exception);
  830. } while (exception.retry);
  831. nfs_put_lock_context(lock);
  832. return err;
  833. }
  834. static void
  835. nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata)
  836. {
  837. struct nfs42_layoutstat_data *data = calldata;
  838. struct inode *inode = data->inode;
  839. struct nfs_server *server = NFS_SERVER(inode);
  840. struct pnfs_layout_hdr *lo;
  841. spin_lock(&inode->i_lock);
  842. lo = NFS_I(inode)->layout;
  843. if (!pnfs_layout_is_valid(lo)) {
  844. spin_unlock(&inode->i_lock);
  845. rpc_exit(task, 0);
  846. return;
  847. }
  848. nfs4_stateid_copy(&data->args.stateid, &lo->plh_stateid);
  849. spin_unlock(&inode->i_lock);
  850. nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
  851. &data->res.seq_res, task);
  852. }
  853. static void
  854. nfs42_layoutstat_done(struct rpc_task *task, void *calldata)
  855. {
  856. struct nfs42_layoutstat_data *data = calldata;
  857. struct inode *inode = data->inode;
  858. struct pnfs_layout_hdr *lo;
  859. if (!nfs4_sequence_done(task, &data->res.seq_res))
  860. return;
  861. switch (task->tk_status) {
  862. case 0:
  863. return;
  864. case -NFS4ERR_BADHANDLE:
  865. case -ESTALE:
  866. pnfs_destroy_layout(NFS_I(inode));
  867. break;
  868. case -NFS4ERR_EXPIRED:
  869. case -NFS4ERR_ADMIN_REVOKED:
  870. case -NFS4ERR_DELEG_REVOKED:
  871. case -NFS4ERR_STALE_STATEID:
  872. case -NFS4ERR_BAD_STATEID:
  873. spin_lock(&inode->i_lock);
  874. lo = NFS_I(inode)->layout;
  875. if (pnfs_layout_is_valid(lo) &&
  876. nfs4_stateid_match(&data->args.stateid,
  877. &lo->plh_stateid)) {
  878. LIST_HEAD(head);
  879. /*
  880. * Mark the bad layout state as invalid, then retry
  881. * with the current stateid.
  882. */
  883. pnfs_mark_layout_stateid_invalid(lo, &head);
  884. spin_unlock(&inode->i_lock);
  885. pnfs_free_lseg_list(&head);
  886. nfs_commit_inode(inode, 0);
  887. } else
  888. spin_unlock(&inode->i_lock);
  889. break;
  890. case -NFS4ERR_OLD_STATEID:
  891. spin_lock(&inode->i_lock);
  892. lo = NFS_I(inode)->layout;
  893. if (pnfs_layout_is_valid(lo) &&
  894. nfs4_stateid_match_other(&data->args.stateid,
  895. &lo->plh_stateid)) {
  896. /* Do we need to delay before resending? */
  897. if (!nfs4_stateid_is_newer(&lo->plh_stateid,
  898. &data->args.stateid))
  899. rpc_delay(task, HZ);
  900. rpc_restart_call_prepare(task);
  901. }
  902. spin_unlock(&inode->i_lock);
  903. break;
  904. case -ENOTSUPP:
  905. case -EOPNOTSUPP:
  906. NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTSTATS;
  907. }
  908. trace_nfs4_layoutstats(inode, &data->args.stateid, task->tk_status);
  909. }
  910. static void
  911. nfs42_layoutstat_release(void *calldata)
  912. {
  913. struct nfs42_layoutstat_data *data = calldata;
  914. struct nfs42_layoutstat_devinfo *devinfo = data->args.devinfo;
  915. int i;
  916. for (i = 0; i < data->args.num_dev; i++) {
  917. if (devinfo[i].ld_private.ops && devinfo[i].ld_private.ops->free)
  918. devinfo[i].ld_private.ops->free(&devinfo[i].ld_private);
  919. }
  920. pnfs_put_layout_hdr(NFS_I(data->args.inode)->layout);
  921. smp_mb__before_atomic();
  922. clear_bit(NFS_INO_LAYOUTSTATS, &NFS_I(data->args.inode)->flags);
  923. smp_mb__after_atomic();
  924. nfs_iput_and_deactive(data->inode);
  925. kfree(data->args.devinfo);
  926. kfree(data);
  927. }
  928. static const struct rpc_call_ops nfs42_layoutstat_ops = {
  929. .rpc_call_prepare = nfs42_layoutstat_prepare,
  930. .rpc_call_done = nfs42_layoutstat_done,
  931. .rpc_release = nfs42_layoutstat_release,
  932. };
  933. int nfs42_proc_layoutstats_generic(struct nfs_server *server,
  934. struct nfs42_layoutstat_data *data)
  935. {
  936. struct rpc_message msg = {
  937. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTSTATS],
  938. .rpc_argp = &data->args,
  939. .rpc_resp = &data->res,
  940. };
  941. struct rpc_task_setup task_setup = {
  942. .rpc_client = server->client,
  943. .rpc_message = &msg,
  944. .callback_ops = &nfs42_layoutstat_ops,
  945. .callback_data = data,
  946. .flags = RPC_TASK_ASYNC | RPC_TASK_MOVEABLE,
  947. };
  948. struct rpc_task *task;
  949. data->inode = nfs_igrab_and_active(data->args.inode);
  950. if (!data->inode) {
  951. nfs42_layoutstat_release(data);
  952. return -EAGAIN;
  953. }
  954. nfs4_init_sequence(server->nfs_client, &data->args.seq_args,
  955. &data->res.seq_res, 0, 0);
  956. task = rpc_run_task(&task_setup);
  957. if (IS_ERR(task))
  958. return PTR_ERR(task);
  959. rpc_put_task(task);
  960. return 0;
  961. }
  962. static struct nfs42_layouterror_data *
  963. nfs42_alloc_layouterror_data(struct pnfs_layout_segment *lseg, gfp_t gfp_flags)
  964. {
  965. struct nfs42_layouterror_data *data;
  966. struct inode *inode = lseg->pls_layout->plh_inode;
  967. data = kzalloc_obj(*data, gfp_flags);
  968. if (data) {
  969. data->args.inode = data->inode = nfs_igrab_and_active(inode);
  970. if (data->inode) {
  971. data->lseg = pnfs_get_lseg(lseg);
  972. if (data->lseg)
  973. return data;
  974. nfs_iput_and_deactive(data->inode);
  975. }
  976. kfree(data);
  977. }
  978. return NULL;
  979. }
  980. static void
  981. nfs42_free_layouterror_data(struct nfs42_layouterror_data *data)
  982. {
  983. pnfs_put_lseg(data->lseg);
  984. nfs_iput_and_deactive(data->inode);
  985. kfree(data);
  986. }
  987. static void
  988. nfs42_layouterror_prepare(struct rpc_task *task, void *calldata)
  989. {
  990. struct nfs42_layouterror_data *data = calldata;
  991. struct inode *inode = data->inode;
  992. struct nfs_server *server = NFS_SERVER(inode);
  993. struct pnfs_layout_hdr *lo = data->lseg->pls_layout;
  994. unsigned i;
  995. spin_lock(&inode->i_lock);
  996. if (!pnfs_layout_is_valid(lo)) {
  997. spin_unlock(&inode->i_lock);
  998. rpc_exit(task, 0);
  999. return;
  1000. }
  1001. for (i = 0; i < data->args.num_errors; i++)
  1002. nfs4_stateid_copy(&data->args.errors[i].stateid,
  1003. &lo->plh_stateid);
  1004. spin_unlock(&inode->i_lock);
  1005. nfs4_setup_sequence(server->nfs_client, &data->args.seq_args,
  1006. &data->res.seq_res, task);
  1007. }
  1008. static void
  1009. nfs42_layouterror_done(struct rpc_task *task, void *calldata)
  1010. {
  1011. struct nfs42_layouterror_data *data = calldata;
  1012. struct inode *inode = data->inode;
  1013. struct pnfs_layout_hdr *lo = data->lseg->pls_layout;
  1014. if (!nfs4_sequence_done(task, &data->res.seq_res))
  1015. return;
  1016. switch (task->tk_status) {
  1017. case 0:
  1018. return;
  1019. case -NFS4ERR_BADHANDLE:
  1020. case -ESTALE:
  1021. pnfs_destroy_layout(NFS_I(inode));
  1022. break;
  1023. case -NFS4ERR_EXPIRED:
  1024. case -NFS4ERR_ADMIN_REVOKED:
  1025. case -NFS4ERR_DELEG_REVOKED:
  1026. case -NFS4ERR_STALE_STATEID:
  1027. case -NFS4ERR_BAD_STATEID:
  1028. spin_lock(&inode->i_lock);
  1029. if (pnfs_layout_is_valid(lo) &&
  1030. nfs4_stateid_match(&data->args.errors[0].stateid,
  1031. &lo->plh_stateid)) {
  1032. LIST_HEAD(head);
  1033. /*
  1034. * Mark the bad layout state as invalid, then retry
  1035. * with the current stateid.
  1036. */
  1037. pnfs_mark_layout_stateid_invalid(lo, &head);
  1038. spin_unlock(&inode->i_lock);
  1039. pnfs_free_lseg_list(&head);
  1040. nfs_commit_inode(inode, 0);
  1041. } else
  1042. spin_unlock(&inode->i_lock);
  1043. break;
  1044. case -NFS4ERR_OLD_STATEID:
  1045. spin_lock(&inode->i_lock);
  1046. if (pnfs_layout_is_valid(lo) &&
  1047. nfs4_stateid_match_other(&data->args.errors[0].stateid,
  1048. &lo->plh_stateid)) {
  1049. /* Do we need to delay before resending? */
  1050. if (!nfs4_stateid_is_newer(&lo->plh_stateid,
  1051. &data->args.errors[0].stateid))
  1052. rpc_delay(task, HZ);
  1053. rpc_restart_call_prepare(task);
  1054. }
  1055. spin_unlock(&inode->i_lock);
  1056. break;
  1057. case -ENOTSUPP:
  1058. case -EOPNOTSUPP:
  1059. NFS_SERVER(inode)->caps &= ~NFS_CAP_LAYOUTERROR;
  1060. }
  1061. trace_nfs4_layouterror(inode, &data->args.errors[0].stateid,
  1062. task->tk_status);
  1063. }
  1064. static void
  1065. nfs42_layouterror_release(void *calldata)
  1066. {
  1067. struct nfs42_layouterror_data *data = calldata;
  1068. nfs42_free_layouterror_data(data);
  1069. }
  1070. static const struct rpc_call_ops nfs42_layouterror_ops = {
  1071. .rpc_call_prepare = nfs42_layouterror_prepare,
  1072. .rpc_call_done = nfs42_layouterror_done,
  1073. .rpc_release = nfs42_layouterror_release,
  1074. };
  1075. int nfs42_proc_layouterror(struct pnfs_layout_segment *lseg,
  1076. const struct nfs42_layout_error *errors, size_t n)
  1077. {
  1078. struct inode *inode = lseg->pls_layout->plh_inode;
  1079. struct nfs_server *server = NFS_SERVER(inode);
  1080. struct nfs42_layouterror_data *data;
  1081. struct rpc_task *task;
  1082. struct rpc_message msg = {
  1083. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTERROR],
  1084. };
  1085. struct rpc_task_setup task_setup = {
  1086. .rpc_message = &msg,
  1087. .callback_ops = &nfs42_layouterror_ops,
  1088. .flags = RPC_TASK_ASYNC | RPC_TASK_MOVEABLE,
  1089. };
  1090. unsigned int i;
  1091. if (!nfs_server_capable(inode, NFS_CAP_LAYOUTERROR))
  1092. return -EOPNOTSUPP;
  1093. if (n > NFS42_LAYOUTERROR_MAX)
  1094. return -EINVAL;
  1095. data = nfs42_alloc_layouterror_data(lseg, nfs_io_gfp_mask());
  1096. if (!data)
  1097. return -ENOMEM;
  1098. for (i = 0; i < n; i++) {
  1099. data->args.errors[i] = errors[i];
  1100. data->args.num_errors++;
  1101. data->res.num_errors++;
  1102. }
  1103. msg.rpc_argp = &data->args;
  1104. msg.rpc_resp = &data->res;
  1105. task_setup.callback_data = data;
  1106. task_setup.rpc_client = server->client;
  1107. nfs4_init_sequence(server->nfs_client, &data->args.seq_args,
  1108. &data->res.seq_res, 0, 0);
  1109. task = rpc_run_task(&task_setup);
  1110. if (IS_ERR(task))
  1111. return PTR_ERR(task);
  1112. rpc_put_task(task);
  1113. return 0;
  1114. }
  1115. EXPORT_SYMBOL_GPL(nfs42_proc_layouterror);
  1116. static int _nfs42_proc_clone(struct rpc_message *msg, struct file *src_f,
  1117. struct file *dst_f, struct nfs_lock_context *src_lock,
  1118. struct nfs_lock_context *dst_lock, loff_t src_offset,
  1119. loff_t dst_offset, loff_t count)
  1120. {
  1121. struct inode *src_inode = file_inode(src_f);
  1122. struct inode *dst_inode = file_inode(dst_f);
  1123. struct nfs_server *server = NFS_SERVER(dst_inode);
  1124. __u32 dst_bitmask[NFS_BITMASK_SZ];
  1125. struct nfs42_clone_args args = {
  1126. .src_fh = NFS_FH(src_inode),
  1127. .dst_fh = NFS_FH(dst_inode),
  1128. .src_offset = src_offset,
  1129. .dst_offset = dst_offset,
  1130. .count = count,
  1131. .dst_bitmask = dst_bitmask,
  1132. };
  1133. struct nfs42_clone_res res = {
  1134. .server = server,
  1135. };
  1136. loff_t oldsize_dst = i_size_read(dst_inode);
  1137. int status;
  1138. msg->rpc_argp = &args;
  1139. msg->rpc_resp = &res;
  1140. status = nfs4_set_rw_stateid(&args.src_stateid, src_lock->open_context,
  1141. src_lock, FMODE_READ);
  1142. if (status) {
  1143. if (status == -EAGAIN)
  1144. status = -NFS4ERR_BAD_STATEID;
  1145. return status;
  1146. }
  1147. status = nfs4_set_rw_stateid(&args.dst_stateid, dst_lock->open_context,
  1148. dst_lock, FMODE_WRITE);
  1149. if (status) {
  1150. if (status == -EAGAIN)
  1151. status = -NFS4ERR_BAD_STATEID;
  1152. return status;
  1153. }
  1154. res.dst_fattr = nfs_alloc_fattr();
  1155. if (!res.dst_fattr)
  1156. return -ENOMEM;
  1157. nfs4_bitmask_set(dst_bitmask, server->cache_consistency_bitmask,
  1158. dst_inode, NFS_INO_INVALID_BLOCKS);
  1159. status = nfs4_call_sync(server->client, server, msg,
  1160. &args.seq_args, &res.seq_res, 0);
  1161. trace_nfs4_clone(src_inode, dst_inode, &args, status);
  1162. if (status == 0) {
  1163. /* a zero-length count means clone to EOF in src */
  1164. if (count == 0 && res.dst_fattr->valid & NFS_ATTR_FATTR_SIZE)
  1165. count = nfs_size_to_loff_t(res.dst_fattr->size) - dst_offset;
  1166. nfs42_copy_dest_done(dst_f, dst_offset, count, oldsize_dst);
  1167. status = nfs_post_op_update_inode(dst_inode, res.dst_fattr);
  1168. }
  1169. kfree(res.dst_fattr);
  1170. return status;
  1171. }
  1172. int nfs42_proc_clone(struct file *src_f, struct file *dst_f,
  1173. loff_t src_offset, loff_t dst_offset, loff_t count)
  1174. {
  1175. struct rpc_message msg = {
  1176. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLONE],
  1177. };
  1178. struct inode *inode = file_inode(src_f);
  1179. struct nfs_server *server = NFS_SERVER(file_inode(src_f));
  1180. struct nfs_lock_context *src_lock;
  1181. struct nfs_lock_context *dst_lock;
  1182. struct nfs4_exception src_exception = { };
  1183. struct nfs4_exception dst_exception = { };
  1184. int err, err2;
  1185. if (!nfs_server_capable(inode, NFS_CAP_CLONE))
  1186. return -EOPNOTSUPP;
  1187. src_lock = nfs_get_lock_context(nfs_file_open_context(src_f));
  1188. if (IS_ERR(src_lock))
  1189. return PTR_ERR(src_lock);
  1190. src_exception.inode = file_inode(src_f);
  1191. src_exception.state = src_lock->open_context->state;
  1192. dst_lock = nfs_get_lock_context(nfs_file_open_context(dst_f));
  1193. if (IS_ERR(dst_lock)) {
  1194. err = PTR_ERR(dst_lock);
  1195. goto out_put_src_lock;
  1196. }
  1197. dst_exception.inode = file_inode(dst_f);
  1198. dst_exception.state = dst_lock->open_context->state;
  1199. do {
  1200. err = _nfs42_proc_clone(&msg, src_f, dst_f, src_lock, dst_lock,
  1201. src_offset, dst_offset, count);
  1202. if (err == -ENOTSUPP || err == -EOPNOTSUPP) {
  1203. NFS_SERVER(inode)->caps &= ~NFS_CAP_CLONE;
  1204. err = -EOPNOTSUPP;
  1205. break;
  1206. }
  1207. err2 = nfs4_handle_exception(server, err, &src_exception);
  1208. err = nfs4_handle_exception(server, err, &dst_exception);
  1209. if (!err)
  1210. err = err2;
  1211. } while (src_exception.retry || dst_exception.retry);
  1212. nfs_put_lock_context(dst_lock);
  1213. out_put_src_lock:
  1214. nfs_put_lock_context(src_lock);
  1215. return err;
  1216. }
  1217. #define NFS4XATTR_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
  1218. static int _nfs42_proc_removexattr(struct inode *inode, const char *name)
  1219. {
  1220. struct nfs_server *server = NFS_SERVER(inode);
  1221. struct nfs42_removexattrargs args = {
  1222. .fh = NFS_FH(inode),
  1223. .xattr_name = name,
  1224. };
  1225. struct nfs42_removexattrres res;
  1226. struct rpc_message msg = {
  1227. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVEXATTR],
  1228. .rpc_argp = &args,
  1229. .rpc_resp = &res,
  1230. };
  1231. int ret;
  1232. unsigned long timestamp = jiffies;
  1233. ret = nfs4_call_sync(server->client, server, &msg, &args.seq_args,
  1234. &res.seq_res, 1);
  1235. trace_nfs4_removexattr(inode, name, ret);
  1236. if (!ret)
  1237. nfs4_update_changeattr(inode, &res.cinfo, timestamp, 0);
  1238. return ret;
  1239. }
  1240. static int _nfs42_proc_setxattr(struct inode *inode, const char *name,
  1241. const void *buf, size_t buflen, int flags)
  1242. {
  1243. struct nfs_server *server = NFS_SERVER(inode);
  1244. __u32 bitmask[NFS_BITMASK_SZ];
  1245. struct page *pages[NFS4XATTR_MAXPAGES];
  1246. struct nfs42_setxattrargs arg = {
  1247. .fh = NFS_FH(inode),
  1248. .bitmask = bitmask,
  1249. .xattr_pages = pages,
  1250. .xattr_len = buflen,
  1251. .xattr_name = name,
  1252. .xattr_flags = flags,
  1253. };
  1254. struct nfs42_setxattrres res = {
  1255. .server = server,
  1256. };
  1257. struct rpc_message msg = {
  1258. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETXATTR],
  1259. .rpc_argp = &arg,
  1260. .rpc_resp = &res,
  1261. };
  1262. int ret, np;
  1263. unsigned long timestamp = jiffies;
  1264. if (buflen > server->sxasize)
  1265. return -ERANGE;
  1266. res.fattr = nfs_alloc_fattr();
  1267. if (!res.fattr)
  1268. return -ENOMEM;
  1269. if (buflen > 0) {
  1270. np = nfs4_buf_to_pages_noslab(buf, buflen, arg.xattr_pages);
  1271. if (np < 0) {
  1272. ret = np;
  1273. goto out;
  1274. }
  1275. } else
  1276. np = 0;
  1277. nfs4_bitmask_set(bitmask, server->cache_consistency_bitmask,
  1278. inode, NFS_INO_INVALID_CHANGE);
  1279. ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
  1280. &res.seq_res, 1);
  1281. trace_nfs4_setxattr(inode, name, ret);
  1282. for (; np > 0; np--)
  1283. put_page(pages[np - 1]);
  1284. if (!ret) {
  1285. nfs4_update_changeattr(inode, &res.cinfo, timestamp, 0);
  1286. ret = nfs_post_op_update_inode(inode, res.fattr);
  1287. }
  1288. out:
  1289. kfree(res.fattr);
  1290. return ret;
  1291. }
  1292. static ssize_t _nfs42_proc_getxattr(struct inode *inode, const char *name,
  1293. void *buf, size_t buflen, struct page **pages,
  1294. size_t plen)
  1295. {
  1296. struct nfs_server *server = NFS_SERVER(inode);
  1297. struct nfs42_getxattrargs arg = {
  1298. .fh = NFS_FH(inode),
  1299. .xattr_name = name,
  1300. };
  1301. struct nfs42_getxattrres res;
  1302. struct rpc_message msg = {
  1303. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETXATTR],
  1304. .rpc_argp = &arg,
  1305. .rpc_resp = &res,
  1306. };
  1307. ssize_t ret;
  1308. arg.xattr_len = plen;
  1309. arg.xattr_pages = pages;
  1310. ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
  1311. &res.seq_res, 0);
  1312. trace_nfs4_getxattr(inode, name, ret);
  1313. if (ret < 0)
  1314. return ret;
  1315. /*
  1316. * Normally, the caching is done one layer up, but for successful
  1317. * RPCS, always cache the result here, even if the caller was
  1318. * just querying the length, or if the reply was too big for
  1319. * the caller. This avoids a second RPC in the case of the
  1320. * common query-alloc-retrieve cycle for xattrs.
  1321. *
  1322. * Note that xattr_len is always capped to XATTR_SIZE_MAX.
  1323. */
  1324. nfs4_xattr_cache_add(inode, name, NULL, pages, res.xattr_len);
  1325. if (buflen) {
  1326. if (res.xattr_len > buflen)
  1327. return -ERANGE;
  1328. _copy_from_pages(buf, pages, 0, res.xattr_len);
  1329. }
  1330. return res.xattr_len;
  1331. }
  1332. static ssize_t _nfs42_proc_listxattrs(struct inode *inode, void *buf,
  1333. size_t buflen, u64 *cookiep, bool *eofp)
  1334. {
  1335. struct nfs_server *server = NFS_SERVER(inode);
  1336. struct page **pages;
  1337. struct nfs42_listxattrsargs arg = {
  1338. .fh = NFS_FH(inode),
  1339. .cookie = *cookiep,
  1340. };
  1341. struct nfs42_listxattrsres res = {
  1342. .eof = false,
  1343. .xattr_buf = buf,
  1344. .xattr_len = buflen,
  1345. };
  1346. struct rpc_message msg = {
  1347. .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LISTXATTRS],
  1348. .rpc_argp = &arg,
  1349. .rpc_resp = &res,
  1350. };
  1351. u32 xdrlen;
  1352. int ret, np, i;
  1353. ret = -ENOMEM;
  1354. res.scratch = folio_alloc(GFP_KERNEL, 0);
  1355. if (!res.scratch)
  1356. goto out;
  1357. xdrlen = nfs42_listxattr_xdrsize(buflen);
  1358. if (xdrlen > server->lxasize)
  1359. xdrlen = server->lxasize;
  1360. np = xdrlen / PAGE_SIZE + 1;
  1361. pages = kzalloc_objs(struct page *, np);
  1362. if (!pages)
  1363. goto out_free_scratch;
  1364. for (i = 0; i < np; i++) {
  1365. pages[i] = alloc_page(GFP_KERNEL);
  1366. if (!pages[i])
  1367. goto out_free_pages;
  1368. }
  1369. arg.xattr_pages = pages;
  1370. arg.count = xdrlen;
  1371. ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
  1372. &res.seq_res, 0);
  1373. trace_nfs4_listxattr(inode, ret);
  1374. if (ret >= 0) {
  1375. ret = res.copied;
  1376. *cookiep = res.cookie;
  1377. *eofp = res.eof;
  1378. }
  1379. out_free_pages:
  1380. while (--np >= 0) {
  1381. if (pages[np])
  1382. __free_page(pages[np]);
  1383. }
  1384. kfree(pages);
  1385. out_free_scratch:
  1386. folio_put(res.scratch);
  1387. out:
  1388. return ret;
  1389. }
  1390. ssize_t nfs42_proc_getxattr(struct inode *inode, const char *name,
  1391. void *buf, size_t buflen)
  1392. {
  1393. struct nfs4_exception exception = { };
  1394. ssize_t err, np, i;
  1395. struct page **pages;
  1396. np = nfs_page_array_len(0, buflen ?: XATTR_SIZE_MAX);
  1397. pages = kmalloc_objs(*pages, np);
  1398. if (!pages)
  1399. return -ENOMEM;
  1400. for (i = 0; i < np; i++) {
  1401. pages[i] = alloc_page(GFP_KERNEL);
  1402. if (!pages[i]) {
  1403. err = -ENOMEM;
  1404. goto out;
  1405. }
  1406. }
  1407. /*
  1408. * The GETXATTR op has no length field in the call, and the
  1409. * xattr data is at the end of the reply.
  1410. *
  1411. * There is no downside in using the page-aligned length. It will
  1412. * allow receiving and caching xattrs that are too large for the
  1413. * caller but still fit in the page-rounded value.
  1414. */
  1415. do {
  1416. err = _nfs42_proc_getxattr(inode, name, buf, buflen,
  1417. pages, np * PAGE_SIZE);
  1418. if (err >= 0)
  1419. break;
  1420. err = nfs4_handle_exception(NFS_SERVER(inode), err,
  1421. &exception);
  1422. } while (exception.retry);
  1423. out:
  1424. while (--i >= 0)
  1425. __free_page(pages[i]);
  1426. kfree(pages);
  1427. return err;
  1428. }
  1429. int nfs42_proc_setxattr(struct inode *inode, const char *name,
  1430. const void *buf, size_t buflen, int flags)
  1431. {
  1432. struct nfs4_exception exception = { };
  1433. int err;
  1434. do {
  1435. err = _nfs42_proc_setxattr(inode, name, buf, buflen, flags);
  1436. if (!err)
  1437. break;
  1438. err = nfs4_handle_exception(NFS_SERVER(inode), err,
  1439. &exception);
  1440. } while (exception.retry);
  1441. return err;
  1442. }
  1443. ssize_t nfs42_proc_listxattrs(struct inode *inode, void *buf,
  1444. size_t buflen, u64 *cookiep, bool *eofp)
  1445. {
  1446. struct nfs4_exception exception = { };
  1447. ssize_t err;
  1448. do {
  1449. err = _nfs42_proc_listxattrs(inode, buf, buflen,
  1450. cookiep, eofp);
  1451. if (err >= 0)
  1452. break;
  1453. err = nfs4_handle_exception(NFS_SERVER(inode), err,
  1454. &exception);
  1455. } while (exception.retry);
  1456. return err;
  1457. }
  1458. int nfs42_proc_removexattr(struct inode *inode, const char *name)
  1459. {
  1460. struct nfs4_exception exception = { };
  1461. int err;
  1462. do {
  1463. err = _nfs42_proc_removexattr(inode, name);
  1464. if (!err)
  1465. break;
  1466. err = nfs4_handle_exception(NFS_SERVER(inode), err,
  1467. &exception);
  1468. } while (exception.retry);
  1469. return err;
  1470. }