1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 1992 Rick Sladkey
8 #include <linux/file.h>
9 #include <linux/falloc.h>
10 #include <linux/mount.h>
11 #include <linux/nfs_fs.h>
12 #include <linux/nfs_ssc.h>
13 #include "delegation.h"
21 #ifdef CONFIG_NFS_V4_2
25 #define NFSDBG_FACILITY NFSDBG_FILE
28 nfs4_file_open(struct inode
*inode
, struct file
*filp
)
30 struct nfs_open_context
*ctx
;
31 struct dentry
*dentry
= file_dentry(filp
);
32 struct dentry
*parent
= NULL
;
34 unsigned openflags
= filp
->f_flags
;
39 * If no cached dentry exists or if it's negative, NFSv4 handled the
40 * opens in ->lookup() or ->create().
42 * We only get this far for a cached positive dentry. We skipped
43 * revalidation, so handle it here by dropping the dentry and returning
44 * -EOPENSTALE. The VFS will retry the lookup/create/open.
47 dprintk("NFS: open file(%pd2)\n", dentry
);
49 err
= nfs_check_flags(openflags
);
53 if ((openflags
& O_ACCMODE
) == 3)
54 return nfs_open(inode
, filp
);
56 /* We can't create new files here */
57 openflags
&= ~(O_CREAT
|O_EXCL
);
59 parent
= dget_parent(dentry
);
60 dir
= d_inode(parent
);
62 ctx
= alloc_nfs_open_context(file_dentry(filp
), filp
->f_mode
, filp
);
67 attr
.ia_valid
= ATTR_OPEN
;
68 if (openflags
& O_TRUNC
) {
69 attr
.ia_valid
|= ATTR_SIZE
;
71 filemap_write_and_wait(inode
->i_mapping
);
74 inode
= NFS_PROTO(dir
)->open_context(dir
, ctx
, openflags
, &attr
, NULL
);
88 if (inode
!= d_inode(dentry
))
91 nfs_file_set_open_context(filp
, ctx
);
92 nfs_fscache_open_file(inode
, filp
);
96 put_nfs_open_context(ctx
);
108 * Flush all dirty pages, and check for write errors.
111 nfs4_file_flush(struct file
*file
, fl_owner_t id
)
113 struct inode
*inode
= file_inode(file
);
116 dprintk("NFS: flush(%pD2)\n", file
);
118 nfs_inc_stats(inode
, NFSIOS_VFSFLUSH
);
119 if ((file
->f_mode
& FMODE_WRITE
) == 0)
123 * If we're holding a write delegation, then check if we're required
124 * to flush the i/o on close. If not, then just start the i/o now.
126 if (!nfs4_delegation_flush_on_close(inode
))
127 return filemap_fdatawrite(file
->f_mapping
);
129 /* Flush writes to the server and return any errors */
130 since
= filemap_sample_wb_err(file
->f_mapping
);
132 return filemap_check_wb_err(file
->f_mapping
, since
);
135 #ifdef CONFIG_NFS_V4_2
136 static ssize_t
__nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
137 struct file
*file_out
, loff_t pos_out
,
138 size_t count
, unsigned int flags
)
140 struct nfs42_copy_notify_res
*cn_resp
= NULL
;
141 struct nl4_server
*nss
= NULL
;
142 nfs4_stateid
*cnrs
= NULL
;
146 /* Only offload copy if superblock is the same */
147 if (file_in
->f_op
!= &nfs4_file_operations
)
149 if (!nfs_server_capable(file_inode(file_out
), NFS_CAP_COPY
) ||
150 !nfs_server_capable(file_inode(file_in
), NFS_CAP_COPY
))
152 if (file_inode(file_in
) == file_inode(file_out
))
154 /* if the copy size if smaller than 2 RPC payloads, make it
157 if (count
<= 2 * NFS_SERVER(file_inode(file_in
))->rsize
)
160 if (!nfs42_files_from_same_server(file_in
, file_out
)) {
161 /* for inter copy, if copy size if smaller than 12 RPC
162 * payloads, fallback to traditional copy. There are
163 * 14 RPCs during an NFSv4.x mount between source/dest
167 count
<= 14 * NFS_SERVER(file_inode(file_in
))->rsize
)
169 cn_resp
= kzalloc(sizeof(struct nfs42_copy_notify_res
),
171 if (unlikely(cn_resp
== NULL
))
174 ret
= nfs42_proc_copy_notify(file_in
, file_out
, cn_resp
);
179 nss
= &cn_resp
->cnr_src
;
180 cnrs
= &cn_resp
->cnr_stateid
;
182 ret
= nfs42_proc_copy(file_in
, pos_in
, file_out
, pos_out
, count
,
185 if (!nfs42_files_from_same_server(file_in
, file_out
))
192 static ssize_t
nfs4_copy_file_range(struct file
*file_in
, loff_t pos_in
,
193 struct file
*file_out
, loff_t pos_out
,
194 size_t count
, unsigned int flags
)
198 ret
= __nfs4_copy_file_range(file_in
, pos_in
, file_out
, pos_out
, count
,
200 if (ret
== -EOPNOTSUPP
|| ret
== -EXDEV
)
201 ret
= generic_copy_file_range(file_in
, pos_in
, file_out
,
202 pos_out
, count
, flags
);
206 static loff_t
nfs4_file_llseek(struct file
*filep
, loff_t offset
, int whence
)
213 ret
= nfs42_proc_llseek(filep
, offset
, whence
);
214 if (ret
!= -ENOTSUPP
)
218 return nfs_file_llseek(filep
, offset
, whence
);
222 static long nfs42_fallocate(struct file
*filep
, int mode
, loff_t offset
, loff_t len
)
224 struct inode
*inode
= file_inode(filep
);
227 if (!S_ISREG(inode
->i_mode
))
230 if ((mode
!= 0) && (mode
!= (FALLOC_FL_PUNCH_HOLE
| FALLOC_FL_KEEP_SIZE
)))
233 ret
= inode_newsize_ok(inode
, offset
+ len
);
237 if (mode
& FALLOC_FL_PUNCH_HOLE
)
238 return nfs42_proc_deallocate(filep
, offset
, len
);
239 return nfs42_proc_allocate(filep
, offset
, len
);
242 static loff_t
nfs42_remap_file_range(struct file
*src_file
, loff_t src_off
,
243 struct file
*dst_file
, loff_t dst_off
, loff_t count
,
244 unsigned int remap_flags
)
246 struct inode
*dst_inode
= file_inode(dst_file
);
247 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
248 struct inode
*src_inode
= file_inode(src_file
);
249 unsigned int bs
= server
->clone_blksize
;
250 bool same_inode
= false;
253 /* NFS does not support deduplication. */
254 if (remap_flags
& REMAP_FILE_DEDUP
)
257 if (remap_flags
& ~REMAP_FILE_ADVISORY
)
260 if (IS_SWAPFILE(dst_inode
) || IS_SWAPFILE(src_inode
))
263 /* check alignment w.r.t. clone_blksize */
266 if (!IS_ALIGNED(src_off
, bs
) || !IS_ALIGNED(dst_off
, bs
))
268 if (!IS_ALIGNED(count
, bs
) && i_size_read(src_inode
) != (src_off
+ count
))
272 if (src_inode
== dst_inode
)
275 /* XXX: do we lock at all? what if server needs CB_RECALL_LAYOUT? */
277 inode_lock(src_inode
);
278 } else if (dst_inode
< src_inode
) {
279 inode_lock_nested(dst_inode
, I_MUTEX_PARENT
);
280 inode_lock_nested(src_inode
, I_MUTEX_CHILD
);
282 inode_lock_nested(src_inode
, I_MUTEX_PARENT
);
283 inode_lock_nested(dst_inode
, I_MUTEX_CHILD
);
286 /* flush all pending writes on both src and dst so that server
287 * has the latest data */
288 ret
= nfs_sync_inode(src_inode
);
291 ret
= nfs_sync_inode(dst_inode
);
295 ret
= nfs42_proc_clone(src_file
, dst_file
, src_off
, dst_off
, count
);
297 /* truncate inode page cache of the dst range so that future reads can fetch
298 * new data from server */
300 truncate_inode_pages_range(&dst_inode
->i_data
, dst_off
, dst_off
+ count
- 1);
304 inode_unlock(src_inode
);
305 } else if (dst_inode
< src_inode
) {
306 inode_unlock(src_inode
);
307 inode_unlock(dst_inode
);
309 inode_unlock(dst_inode
);
310 inode_unlock(src_inode
);
313 return ret
< 0 ? ret
: count
;
316 static int read_name_gen
= 1;
317 #define SSC_READ_NAME_BODY "ssc_read_%d"
319 static struct file
*__nfs42_ssc_open(struct vfsmount
*ss_mnt
,
320 struct nfs_fh
*src_fh
, nfs4_stateid
*stateid
)
322 struct nfs_fattr fattr
;
323 struct file
*filep
, *res
;
324 struct nfs_server
*server
;
325 struct inode
*r_ino
= NULL
;
326 struct nfs_open_context
*ctx
;
327 struct nfs4_state_owner
*sp
;
328 char *read_name
= NULL
;
331 server
= NFS_SERVER(ss_mnt
->mnt_root
->d_inode
);
333 nfs_fattr_init(&fattr
);
335 status
= nfs4_proc_getattr(server
, src_fh
, &fattr
, NULL
, NULL
);
337 res
= ERR_PTR(status
);
341 res
= ERR_PTR(-ENOMEM
);
342 len
= strlen(SSC_READ_NAME_BODY
) + 16;
343 read_name
= kzalloc(len
, GFP_NOFS
);
344 if (read_name
== NULL
)
346 snprintf(read_name
, len
, SSC_READ_NAME_BODY
, read_name_gen
++);
348 r_ino
= nfs_fhget(ss_mnt
->mnt_root
->d_inode
->i_sb
, src_fh
, &fattr
,
351 res
= ERR_CAST(r_ino
);
355 filep
= alloc_file_pseudo(r_ino
, ss_mnt
, read_name
, FMODE_READ
,
358 res
= ERR_CAST(filep
);
361 filep
->f_mode
|= FMODE_READ
;
363 ctx
= alloc_nfs_open_context(filep
->f_path
.dentry
, filep
->f_mode
,
370 res
= ERR_PTR(-EINVAL
);
371 sp
= nfs4_get_state_owner(server
, ctx
->cred
, GFP_KERNEL
);
375 ctx
->state
= nfs4_get_open_state(r_ino
, sp
);
376 if (ctx
->state
== NULL
)
379 set_bit(NFS_SRV_SSC_COPY_STATE
, &ctx
->state
->flags
);
380 memcpy(&ctx
->state
->open_stateid
.other
, &stateid
->other
,
381 NFS4_STATEID_OTHER_SIZE
);
382 update_open_stateid(ctx
->state
, stateid
, NULL
, filep
->f_mode
);
383 set_bit(NFS_OPEN_STATE
, &ctx
->state
->flags
);
385 nfs_file_set_open_context(filep
, ctx
);
386 put_nfs_open_context(ctx
);
388 file_ra_state_init(&filep
->f_ra
, filep
->f_mapping
->host
->i_mapping
);
395 nfs4_put_state_owner(sp
);
397 put_nfs_open_context(ctx
);
403 static void __nfs42_ssc_close(struct file
*filep
)
405 struct nfs_open_context
*ctx
= nfs_file_open_context(filep
);
407 ctx
->state
->flags
= 0;
410 static const struct nfs4_ssc_client_ops nfs4_ssc_clnt_ops_tbl
= {
411 .sco_open
= __nfs42_ssc_open
,
412 .sco_close
= __nfs42_ssc_close
,
416 * nfs42_ssc_register_ops - Wrapper to register NFS_V4 ops in nfs_common
421 void nfs42_ssc_register_ops(void)
423 nfs42_ssc_register(&nfs4_ssc_clnt_ops_tbl
);
427 * nfs42_ssc_unregister_ops - wrapper to un-register NFS_V4 ops in nfs_common
432 void nfs42_ssc_unregister_ops(void)
434 nfs42_ssc_unregister(&nfs4_ssc_clnt_ops_tbl
);
436 #endif /* CONFIG_NFS_V4_2 */
438 const struct file_operations nfs4_file_operations
= {
439 .read_iter
= nfs_file_read
,
440 .write_iter
= nfs_file_write
,
441 .mmap
= nfs_file_mmap
,
442 .open
= nfs4_file_open
,
443 .flush
= nfs4_file_flush
,
444 .release
= nfs_file_release
,
445 .fsync
= nfs_file_fsync
,
448 .splice_read
= generic_file_splice_read
,
449 .splice_write
= iter_file_splice_write
,
450 .check_flags
= nfs_check_flags
,
451 .setlease
= simple_nosetlease
,
452 #ifdef CONFIG_NFS_V4_2
453 .copy_file_range
= nfs4_copy_file_range
,
454 .llseek
= nfs4_file_llseek
,
455 .fallocate
= nfs42_fallocate
,
456 .remap_file_range
= nfs42_remap_file_range
,
458 .llseek
= nfs_file_llseek
,