@@ -243,7 +243,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
243243 struct file * dst ,
244244 struct nfs_lock_context * dst_lock ,
245245 struct nfs42_copy_args * args ,
246- struct nfs42_copy_res * res )
246+ struct nfs42_copy_res * res ,
247+ struct nl4_server * nss ,
248+ nfs4_stateid * cnr_stateid )
247249{
248250 struct rpc_message msg = {
249251 .rpc_proc = & nfs4_procedures [NFSPROC4_CLNT_COPY ],
@@ -257,11 +259,15 @@ static ssize_t _nfs42_proc_copy(struct file *src,
257259 size_t count = args -> count ;
258260 ssize_t status ;
259261
260- status = nfs4_set_rw_stateid (& args -> src_stateid , src_lock -> open_context ,
261- src_lock , FMODE_READ );
262- if (status )
263- return status ;
264-
262+ if (nss ) {
263+ args -> cp_src = nss ;
264+ nfs4_stateid_copy (& args -> src_stateid , cnr_stateid );
265+ } else {
266+ status = nfs4_set_rw_stateid (& args -> src_stateid ,
267+ src_lock -> open_context , src_lock , FMODE_READ );
268+ if (status )
269+ return status ;
270+ }
265271 status = nfs_filemap_write_and_wait_range (file_inode (src )-> i_mapping ,
266272 pos_src , pos_src + (loff_t )count - 1 );
267273 if (status )
@@ -325,8 +331,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
325331}
326332
327333ssize_t nfs42_proc_copy (struct file * src , loff_t pos_src ,
328- struct file * dst , loff_t pos_dst ,
329- size_t count )
334+ struct file * dst , loff_t pos_dst , size_t count ,
335+ struct nl4_server * nss ,
336+ nfs4_stateid * cnr_stateid )
330337{
331338 struct nfs_server * server = NFS_SERVER (file_inode (dst ));
332339 struct nfs_lock_context * src_lock ;
@@ -368,7 +375,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
368375 inode_lock (file_inode (dst ));
369376 err = _nfs42_proc_copy (src , src_lock ,
370377 dst , dst_lock ,
371- & args , & res );
378+ & args , & res ,
379+ nss , cnr_stateid );
372380 inode_unlock (file_inode (dst ));
373381
374382 if (err >= 0 )
0 commit comments