1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
6 #ifndef LINUX_NFSD_VFS_H
7 #define LINUX_NFSD_VFS_H
10 #include <linux/posix_acl.h>
15 * Flags for nfsd_permission
17 #define NFSD_MAY_NOP 0
18 #define NFSD_MAY_EXEC 0x001 /* == MAY_EXEC */
19 #define NFSD_MAY_WRITE 0x002 /* == MAY_WRITE */
20 #define NFSD_MAY_READ 0x004 /* == MAY_READ */
21 #define NFSD_MAY_SATTR 0x008
22 #define NFSD_MAY_TRUNC 0x010
23 #define NFSD_MAY_LOCK 0x020
24 #define NFSD_MAY_MASK 0x03f
26 /* extra hints to permission and open routines: */
27 #define NFSD_MAY_OWNER_OVERRIDE 0x040
28 #define NFSD_MAY_LOCAL_ACCESS 0x080 /* for device special files */
29 #define NFSD_MAY_BYPASS_GSS_ON_ROOT 0x100
30 #define NFSD_MAY_NOT_BREAK_LEASE 0x200
31 #define NFSD_MAY_BYPASS_GSS 0x400
32 #define NFSD_MAY_READ_IF_EXEC 0x800
34 #define NFSD_MAY_64BIT_COOKIE 0x1000 /* 64 bit readdir cookies for >= NFSv3 */
36 #define NFSD_MAY_LOCALIO 0x2000 /* for tracing, reflects when localio used */
38 #define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
39 #define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
44 * Callback function for readdir
46 typedef int (*nfsd_filldir_t
)(void *, const char *, int, loff_t
, u64
, unsigned);
50 struct iattr
*na_iattr
; /* input */
51 struct xdr_netobj
*na_seclabel
; /* input */
52 struct posix_acl
*na_pacl
; /* input */
53 struct posix_acl
*na_dpacl
; /* input */
55 int na_labelerr
; /* output */
56 int na_aclerr
; /* output */
59 static inline void nfsd_attrs_free(struct nfsd_attrs
*attrs
)
61 posix_acl_release(attrs
->na_pacl
);
62 posix_acl_release(attrs
->na_dpacl
);
65 static inline bool nfsd_attrs_valid(struct nfsd_attrs
*attrs
)
67 struct iattr
*iap
= attrs
->na_iattr
;
69 return (iap
->ia_valid
|| (attrs
->na_seclabel
&&
70 attrs
->na_seclabel
->len
));
73 __be32
nfserrno (int errno
);
74 int nfsd_cross_mnt(struct svc_rqst
*rqstp
, struct dentry
**dpp
,
75 struct svc_export
**expp
);
76 __be32
nfsd_lookup(struct svc_rqst
*, struct svc_fh
*,
77 const char *, unsigned int, struct svc_fh
*);
78 __be32
nfsd_lookup_dentry(struct svc_rqst
*, struct svc_fh
*,
79 const char *, unsigned int,
80 struct svc_export
**, struct dentry
**);
81 __be32
nfsd_setattr(struct svc_rqst
*, struct svc_fh
*,
82 struct nfsd_attrs
*, const struct timespec64
*);
83 int nfsd_mountpoint(struct dentry
*, struct svc_export
*);
85 __be32
nfsd4_vfs_fallocate(struct svc_rqst
*, struct svc_fh
*,
86 struct file
*, loff_t
, loff_t
, int);
87 __be32
nfsd4_clone_file_range(struct svc_rqst
*rqstp
,
88 struct nfsd_file
*nf_src
, u64 src_pos
,
89 struct nfsd_file
*nf_dst
, u64 dst_pos
,
90 u64 count
, bool sync
);
91 #endif /* CONFIG_NFSD_V4 */
92 __be32
nfsd_create_locked(struct svc_rqst
*, struct svc_fh
*,
93 struct nfsd_attrs
*attrs
, int type
, dev_t rdev
,
95 __be32
nfsd_create(struct svc_rqst
*, struct svc_fh
*,
96 char *name
, int len
, struct nfsd_attrs
*attrs
,
97 int type
, dev_t rdev
, struct svc_fh
*res
);
98 __be32
nfsd_access(struct svc_rqst
*, struct svc_fh
*, u32
*, u32
*);
99 __be32
nfsd_create_setattr(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
100 struct svc_fh
*resfhp
, struct nfsd_attrs
*iap
);
101 __be32
nfsd_commit(struct svc_rqst
*rqst
, struct svc_fh
*fhp
,
102 struct nfsd_file
*nf
, u64 offset
, u32 count
,
104 #ifdef CONFIG_NFSD_V4
105 __be32
nfsd_getxattr(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
106 char *name
, void **bufp
, int *lenp
);
107 __be32
nfsd_listxattr(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
108 char **bufp
, int *lenp
);
109 __be32
nfsd_removexattr(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
111 __be32
nfsd_setxattr(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
112 char *name
, void *buf
, u32 len
, u32 flags
);
114 int nfsd_open_break_lease(struct inode
*, int);
115 __be32
nfsd_open(struct svc_rqst
*, struct svc_fh
*, umode_t
,
116 int, struct file
**);
117 int nfsd_open_verified(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
118 int may_flags
, struct file
**filp
);
119 __be32
nfsd_splice_read(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
120 struct file
*file
, loff_t offset
,
121 unsigned long *count
,
123 __be32
nfsd_iter_read(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
124 struct file
*file
, loff_t offset
,
125 unsigned long *count
, unsigned int base
,
127 bool nfsd_read_splice_ok(struct svc_rqst
*rqstp
);
128 __be32
nfsd_read(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
129 loff_t offset
, unsigned long *count
,
131 __be32
nfsd_write(struct svc_rqst
*, struct svc_fh
*, loff_t
,
132 struct kvec
*, int, unsigned long *,
133 int stable
, __be32
*verf
);
134 __be32
nfsd_vfs_write(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
135 struct nfsd_file
*nf
, loff_t offset
,
136 struct kvec
*vec
, int vlen
, unsigned long *cnt
,
137 int stable
, __be32
*verf
);
138 __be32
nfsd_readlink(struct svc_rqst
*, struct svc_fh
*,
140 __be32
nfsd_symlink(struct svc_rqst
*, struct svc_fh
*,
141 char *name
, int len
, char *path
,
142 struct nfsd_attrs
*attrs
,
144 __be32
nfsd_link(struct svc_rqst
*, struct svc_fh
*,
145 char *, int, struct svc_fh
*);
146 ssize_t
nfsd_copy_file_range(struct file
*, u64
,
147 struct file
*, u64
, u64
);
148 __be32
nfsd_rename(struct svc_rqst
*,
149 struct svc_fh
*, char *, int,
150 struct svc_fh
*, char *, int);
151 __be32
nfsd_unlink(struct svc_rqst
*, struct svc_fh
*, int type
,
152 char *name
, int len
);
153 __be32
nfsd_readdir(struct svc_rqst
*, struct svc_fh
*,
154 loff_t
*, struct readdir_cd
*, nfsd_filldir_t
);
155 __be32
nfsd_statfs(struct svc_rqst
*, struct svc_fh
*,
156 struct kstatfs
*, int access
);
158 __be32
nfsd_permission(struct svc_cred
*cred
, struct svc_export
*exp
,
159 struct dentry
*dentry
, int acc
);
161 void nfsd_filp_close(struct file
*fp
);
163 static inline int fh_want_write(struct svc_fh
*fh
)
167 if (fh
->fh_want_write
)
169 ret
= mnt_want_write(fh
->fh_export
->ex_path
.mnt
);
171 fh
->fh_want_write
= true;
175 static inline void fh_drop_write(struct svc_fh
*fh
)
177 if (fh
->fh_want_write
) {
178 fh
->fh_want_write
= false;
179 mnt_drop_write(fh
->fh_export
->ex_path
.mnt
);
183 static inline __be32
fh_getattr(const struct svc_fh
*fh
, struct kstat
*stat
)
185 u32 request_mask
= STATX_BASIC_STATS
;
186 struct path p
= {.mnt
= fh
->fh_export
->ex_path
.mnt
,
187 .dentry
= fh
->fh_dentry
};
189 if (fh
->fh_maxsize
== NFS4_FHSIZE
)
190 request_mask
|= (STATX_BTIME
| STATX_CHANGE_COOKIE
);
192 return nfserrno(vfs_getattr(&p
, stat
, request_mask
,
193 AT_STATX_SYNC_AS_STAT
));
196 #endif /* LINUX_NFSD_VFS_H */