knfsd: nfsd: make all exp_finding functions return -errno's on err
[safe/jmp/linux-2.6] / fs / nfsd / vfs.c
1 #define MSNFS   /* HACK HACK */
2 /*
3  * linux/fs/nfsd/vfs.c
4  *
5  * File operations used by nfsd. Some of these have been ripped from
6  * other parts of the kernel because they weren't exported, others
7  * are partial duplicates with added or changed functionality.
8  *
9  * Note that several functions dget() the dentry upon which they want
10  * to act, most notably those that create directory entries. Response
11  * dentry's are dput()'d if necessary in the release callback.
12  * So if you notice code paths that apparently fail to dput() the
13  * dentry, don't worry--they have been taken care of.
14  *
15  * Copyright (C) 1995-1999 Olaf Kirch <okir@monad.swb.de>
16  * Zerocpy NFS support (C) 2002 Hirokazu Takahashi <taka@valinux.co.jp>
17  */
18
19 #include <linux/string.h>
20 #include <linux/time.h>
21 #include <linux/errno.h>
22 #include <linux/fs.h>
23 #include <linux/file.h>
24 #include <linux/mount.h>
25 #include <linux/major.h>
26 #include <linux/splice.h>
27 #include <linux/proc_fs.h>
28 #include <linux/stat.h>
29 #include <linux/fcntl.h>
30 #include <linux/net.h>
31 #include <linux/unistd.h>
32 #include <linux/slab.h>
33 #include <linux/pagemap.h>
34 #include <linux/in.h>
35 #include <linux/module.h>
36 #include <linux/namei.h>
37 #include <linux/vfs.h>
38 #include <linux/delay.h>
39 #include <linux/sunrpc/svc.h>
40 #include <linux/nfsd/nfsd.h>
41 #ifdef CONFIG_NFSD_V3
42 #include <linux/nfs3.h>
43 #include <linux/nfsd/xdr3.h>
44 #endif /* CONFIG_NFSD_V3 */
45 #include <linux/nfsd/nfsfh.h>
46 #include <linux/quotaops.h>
47 #include <linux/fsnotify.h>
48 #include <linux/posix_acl.h>
49 #include <linux/posix_acl_xattr.h>
50 #include <linux/xattr.h>
51 #ifdef CONFIG_NFSD_V4
52 #include <linux/nfs4.h>
53 #include <linux/nfs4_acl.h>
54 #include <linux/nfsd_idmap.h>
55 #include <linux/security.h>
56 #endif /* CONFIG_NFSD_V4 */
57 #include <linux/jhash.h>
58
59 #include <asm/uaccess.h>
60
61 #define NFSDDBG_FACILITY                NFSDDBG_FILEOP
62
63
64 /* We must ignore files (but only files) which might have mandatory
65  * locks on them because there is no way to know if the accesser has
66  * the lock.
67  */
68 #define IS_ISMNDLK(i)   (S_ISREG((i)->i_mode) && MANDATORY_LOCK(i))
69
70 /*
71  * This is a cache of readahead params that help us choose the proper
72  * readahead strategy. Initially, we set all readahead parameters to 0
73  * and let the VFS handle things.
74  * If you increase the number of cached files very much, you'll need to
75  * add a hash table here.
76  */
77 struct raparms {
78         struct raparms          *p_next;
79         unsigned int            p_count;
80         ino_t                   p_ino;
81         dev_t                   p_dev;
82         int                     p_set;
83         struct file_ra_state    p_ra;
84         unsigned int            p_hindex;
85 };
86
87 struct raparm_hbucket {
88         struct raparms          *pb_head;
89         spinlock_t              pb_lock;
90 } ____cacheline_aligned_in_smp;
91
92 static struct raparms *         raparml;
93 #define RAPARM_HASH_BITS        4
94 #define RAPARM_HASH_SIZE        (1<<RAPARM_HASH_BITS)
95 #define RAPARM_HASH_MASK        (RAPARM_HASH_SIZE-1)
96 static struct raparm_hbucket    raparm_hash[RAPARM_HASH_SIZE];
97
98 /* 
99  * Called from nfsd_lookup and encode_dirent. Check if we have crossed 
100  * a mount point.
101  * Returns -EAGAIN or -ETIMEDOUT leaving *dpp and *expp unchanged,
102  *  or nfs_ok having possibly changed *dpp and *expp
103  */
104 int
105 nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp, 
106                         struct svc_export **expp)
107 {
108         struct svc_export *exp = *expp, *exp2 = NULL;
109         struct dentry *dentry = *dpp;
110         struct vfsmount *mnt = mntget(exp->ex_mnt);
111         struct dentry *mounts = dget(dentry);
112         int err = 0;
113
114         while (follow_down(&mnt,&mounts)&&d_mountpoint(mounts));
115
116         exp2 = exp_get_by_name(exp->ex_client, mnt, mounts, &rqstp->rq_chandle);
117         if (IS_ERR(exp2)) {
118                 err = PTR_ERR(exp2);
119                 dput(mounts);
120                 mntput(mnt);
121                 goto out;
122         }
123         if (exp2 && ((exp->ex_flags & NFSEXP_CROSSMOUNT) || EX_NOHIDE(exp2))) {
124                 /* successfully crossed mount point */
125                 exp_put(exp);
126                 *expp = exp2;
127                 dput(dentry);
128                 *dpp = mounts;
129         } else {
130                 if (exp2) exp_put(exp2);
131                 dput(mounts);
132         }
133         mntput(mnt);
134 out:
135         return err;
136 }
137
138 /*
139  * Look up one component of a pathname.
140  * N.B. After this call _both_ fhp and resfh need an fh_put
141  *
142  * If the lookup would cross a mountpoint, and the mounted filesystem
143  * is exported to the client with NFSEXP_NOHIDE, then the lookup is
144  * accepted as it stands and the mounted directory is
145  * returned. Otherwise the covered directory is returned.
146  * NOTE: this mountpoint crossing is not supported properly by all
147  *   clients and is explicitly disallowed for NFSv3
148  *      NeilBrown <neilb@cse.unsw.edu.au>
149  */
150 __be32
151 nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
152                                         int len, struct svc_fh *resfh)
153 {
154         struct svc_export       *exp;
155         struct dentry           *dparent;
156         struct dentry           *dentry;
157         __be32                  err;
158         int                     host_err;
159
160         dprintk("nfsd: nfsd_lookup(fh %s, %.*s)\n", SVCFH_fmt(fhp), len,name);
161
162         /* Obtain dentry and export. */
163         err = fh_verify(rqstp, fhp, S_IFDIR, MAY_EXEC);
164         if (err)
165                 return err;
166
167         dparent = fhp->fh_dentry;
168         exp  = fhp->fh_export;
169         exp_get(exp);
170
171         err = nfserr_acces;
172
173         /* Lookup the name, but don't follow links */
174         if (isdotent(name, len)) {
175                 if (len==1)
176                         dentry = dget(dparent);
177                 else if (dparent != exp->ex_dentry) {
178                         dentry = dget_parent(dparent);
179                 } else  if (!EX_NOHIDE(exp))
180                         dentry = dget(dparent); /* .. == . just like at / */
181                 else {
182                         /* checking mountpoint crossing is very different when stepping up */
183                         struct svc_export *exp2 = NULL;
184                         struct dentry *dp;
185                         struct vfsmount *mnt = mntget(exp->ex_mnt);
186                         dentry = dget(dparent);
187                         while(dentry == mnt->mnt_root && follow_up(&mnt, &dentry))
188                                 ;
189                         dp = dget_parent(dentry);
190                         dput(dentry);
191                         dentry = dp;
192
193                         exp2 = exp_parent(exp->ex_client, mnt, dentry,
194                                           &rqstp->rq_chandle);
195                         if (PTR_ERR(exp2) == -ENOENT) {
196                                 dput(dentry);
197                                 dentry = dget(dparent);
198                         } else if (IS_ERR(exp2)) {
199                                 host_err = PTR_ERR(exp2);
200                                 dput(dentry);
201                                 mntput(mnt);
202                                 goto out_nfserr;
203                         } else {
204                                 exp_put(exp);
205                                 exp = exp2;
206                         }
207                         mntput(mnt);
208                 }
209         } else {
210                 fh_lock(fhp);
211                 dentry = lookup_one_len(name, dparent, len);
212                 host_err = PTR_ERR(dentry);
213                 if (IS_ERR(dentry))
214                         goto out_nfserr;
215                 /*
216                  * check if we have crossed a mount point ...
217                  */
218                 if (d_mountpoint(dentry)) {
219                         if ((host_err = nfsd_cross_mnt(rqstp, &dentry, &exp))) {
220                                 dput(dentry);
221                                 goto out_nfserr;
222                         }
223                 }
224         }
225         /*
226          * Note: we compose the file handle now, but as the
227          * dentry may be negative, it may need to be updated.
228          */
229         err = fh_compose(resfh, exp, dentry, fhp);
230         if (!err && !dentry->d_inode)
231                 err = nfserr_noent;
232         dput(dentry);
233 out:
234         exp_put(exp);
235         return err;
236
237 out_nfserr:
238         err = nfserrno(host_err);
239         goto out;
240 }
241
242 /*
243  * Set various file attributes.
244  * N.B. After this call fhp needs an fh_put
245  */
246 __be32
247 nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
248              int check_guard, time_t guardtime)
249 {
250         struct dentry   *dentry;
251         struct inode    *inode;
252         int             accmode = MAY_SATTR;
253         int             ftype = 0;
254         int             imode;
255         __be32          err;
256         int             host_err;
257         int             size_change = 0;
258
259         if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE))
260                 accmode |= MAY_WRITE|MAY_OWNER_OVERRIDE;
261         if (iap->ia_valid & ATTR_SIZE)
262                 ftype = S_IFREG;
263
264         /* Get inode */
265         err = fh_verify(rqstp, fhp, ftype, accmode);
266         if (err)
267                 goto out;
268
269         dentry = fhp->fh_dentry;
270         inode = dentry->d_inode;
271
272         /* Ignore any mode updates on symlinks */
273         if (S_ISLNK(inode->i_mode))
274                 iap->ia_valid &= ~ATTR_MODE;
275
276         if (!iap->ia_valid)
277                 goto out;
278
279         /* NFSv2 does not differentiate between "set-[ac]time-to-now"
280          * which only requires access, and "set-[ac]time-to-X" which
281          * requires ownership.
282          * So if it looks like it might be "set both to the same time which
283          * is close to now", and if inode_change_ok fails, then we
284          * convert to "set to now" instead of "set to explicit time"
285          *
286          * We only call inode_change_ok as the last test as technically
287          * it is not an interface that we should be using.  It is only
288          * valid if the filesystem does not define it's own i_op->setattr.
289          */
290 #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET)
291 #define MAX_TOUCH_TIME_ERROR (30*60)
292         if ((iap->ia_valid & BOTH_TIME_SET) == BOTH_TIME_SET
293             && iap->ia_mtime.tv_sec == iap->ia_atime.tv_sec
294             ) {
295             /* Looks probable.  Now just make sure time is in the right ballpark.
296              * Solaris, at least, doesn't seem to care what the time request is.
297              * We require it be within 30 minutes of now.
298              */
299             time_t delta = iap->ia_atime.tv_sec - get_seconds();
300             if (delta<0) delta = -delta;
301             if (delta < MAX_TOUCH_TIME_ERROR &&
302                 inode_change_ok(inode, iap) != 0) {
303                 /* turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME
304                  * this will cause notify_change to set these times to "now"
305                  */
306                 iap->ia_valid &= ~BOTH_TIME_SET;
307             }
308         }
309             
310         /* The size case is special. It changes the file as well as the attributes.  */
311         if (iap->ia_valid & ATTR_SIZE) {
312                 if (iap->ia_size < inode->i_size) {
313                         err = nfsd_permission(fhp->fh_export, dentry, MAY_TRUNC|MAY_OWNER_OVERRIDE);
314                         if (err)
315                                 goto out;
316                 }
317
318                 /*
319                  * If we are changing the size of the file, then
320                  * we need to break all leases.
321                  */
322                 host_err = break_lease(inode, FMODE_WRITE | O_NONBLOCK);
323                 if (host_err == -EWOULDBLOCK)
324                         host_err = -ETIMEDOUT;
325                 if (host_err) /* ENOMEM or EWOULDBLOCK */
326                         goto out_nfserr;
327
328                 host_err = get_write_access(inode);
329                 if (host_err)
330                         goto out_nfserr;
331
332                 size_change = 1;
333                 host_err = locks_verify_truncate(inode, NULL, iap->ia_size);
334                 if (host_err) {
335                         put_write_access(inode);
336                         goto out_nfserr;
337                 }
338                 DQUOT_INIT(inode);
339         }
340
341         imode = inode->i_mode;
342         if (iap->ia_valid & ATTR_MODE) {
343                 iap->ia_mode &= S_IALLUGO;
344                 imode = iap->ia_mode |= (imode & ~S_IALLUGO);
345         }
346
347         /* Revoke setuid/setgid bit on chown/chgrp */
348         if ((iap->ia_valid & ATTR_UID) && iap->ia_uid != inode->i_uid)
349                 iap->ia_valid |= ATTR_KILL_SUID;
350         if ((iap->ia_valid & ATTR_GID) && iap->ia_gid != inode->i_gid)
351                 iap->ia_valid |= ATTR_KILL_SGID;
352
353         /* Change the attributes. */
354
355         iap->ia_valid |= ATTR_CTIME;
356
357         err = nfserr_notsync;
358         if (!check_guard || guardtime == inode->i_ctime.tv_sec) {
359                 fh_lock(fhp);
360                 host_err = notify_change(dentry, iap);
361                 err = nfserrno(host_err);
362                 fh_unlock(fhp);
363         }
364         if (size_change)
365                 put_write_access(inode);
366         if (!err)
367                 if (EX_ISSYNC(fhp->fh_export))
368                         write_inode_now(inode, 1);
369 out:
370         return err;
371
372 out_nfserr:
373         err = nfserrno(host_err);
374         goto out;
375 }
376
377 #if defined(CONFIG_NFSD_V2_ACL) || \
378     defined(CONFIG_NFSD_V3_ACL) || \
379     defined(CONFIG_NFSD_V4)
380 static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
381 {
382         ssize_t buflen;
383
384         buflen = vfs_getxattr(dentry, key, NULL, 0);
385         if (buflen <= 0)
386                 return buflen;
387
388         *buf = kmalloc(buflen, GFP_KERNEL);
389         if (!*buf)
390                 return -ENOMEM;
391
392         return vfs_getxattr(dentry, key, *buf, buflen);
393 }
394 #endif
395
396 #if defined(CONFIG_NFSD_V4)
397 static int
398 set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
399 {
400         int len;
401         size_t buflen;
402         char *buf = NULL;
403         int error = 0;
404
405         buflen = posix_acl_xattr_size(pacl->a_count);
406         buf = kmalloc(buflen, GFP_KERNEL);
407         error = -ENOMEM;
408         if (buf == NULL)
409                 goto out;
410
411         len = posix_acl_to_xattr(pacl, buf, buflen);
412         if (len < 0) {
413                 error = len;
414                 goto out;
415         }
416
417         error = vfs_setxattr(dentry, key, buf, len, 0);
418 out:
419         kfree(buf);
420         return error;
421 }
422
423 __be32
424 nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh *fhp,
425     struct nfs4_acl *acl)
426 {
427         __be32 error;
428         int host_error;
429         struct dentry *dentry;
430         struct inode *inode;
431         struct posix_acl *pacl = NULL, *dpacl = NULL;
432         unsigned int flags = 0;
433
434         /* Get inode */
435         error = fh_verify(rqstp, fhp, 0 /* S_IFREG */, MAY_SATTR);
436         if (error)
437                 return error;
438
439         dentry = fhp->fh_dentry;
440         inode = dentry->d_inode;
441         if (S_ISDIR(inode->i_mode))
442                 flags = NFS4_ACL_DIR;
443
444         host_error = nfs4_acl_nfsv4_to_posix(acl, &pacl, &dpacl, flags);
445         if (host_error == -EINVAL) {
446                 return nfserr_attrnotsupp;
447         } else if (host_error < 0)
448                 goto out_nfserr;
449
450         host_error = set_nfsv4_acl_one(dentry, pacl, POSIX_ACL_XATTR_ACCESS);
451         if (host_error < 0)
452                 goto out_release;
453
454         if (S_ISDIR(inode->i_mode))
455                 host_error = set_nfsv4_acl_one(dentry, dpacl, POSIX_ACL_XATTR_DEFAULT);
456
457 out_release:
458         posix_acl_release(pacl);
459         posix_acl_release(dpacl);
460 out_nfserr:
461         if (host_error == -EOPNOTSUPP)
462                 return nfserr_attrnotsupp;
463         else
464                 return nfserrno(host_error);
465 }
466
467 static struct posix_acl *
468 _get_posix_acl(struct dentry *dentry, char *key)
469 {
470         void *buf = NULL;
471         struct posix_acl *pacl = NULL;
472         int buflen;
473
474         buflen = nfsd_getxattr(dentry, key, &buf);
475         if (!buflen)
476                 buflen = -ENODATA;
477         if (buflen <= 0)
478                 return ERR_PTR(buflen);
479
480         pacl = posix_acl_from_xattr(buf, buflen);
481         kfree(buf);
482         return pacl;
483 }
484
485 int
486 nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_acl **acl)
487 {
488         struct inode *inode = dentry->d_inode;
489         int error = 0;
490         struct posix_acl *pacl = NULL, *dpacl = NULL;
491         unsigned int flags = 0;
492
493         pacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_ACCESS);
494         if (IS_ERR(pacl) && PTR_ERR(pacl) == -ENODATA)
495                 pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
496         if (IS_ERR(pacl)) {
497                 error = PTR_ERR(pacl);
498                 pacl = NULL;
499                 goto out;
500         }
501
502         if (S_ISDIR(inode->i_mode)) {
503                 dpacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_DEFAULT);
504                 if (IS_ERR(dpacl) && PTR_ERR(dpacl) == -ENODATA)
505                         dpacl = NULL;
506                 else if (IS_ERR(dpacl)) {
507                         error = PTR_ERR(dpacl);
508                         dpacl = NULL;
509                         goto out;
510                 }
511                 flags = NFS4_ACL_DIR;
512         }
513
514         *acl = nfs4_acl_posix_to_nfsv4(pacl, dpacl, flags);
515         if (IS_ERR(*acl)) {
516                 error = PTR_ERR(*acl);
517                 *acl = NULL;
518         }
519  out:
520         posix_acl_release(pacl);
521         posix_acl_release(dpacl);
522         return error;
523 }
524
525 #endif /* defined(CONFIG_NFS_V4) */
526
527 #ifdef CONFIG_NFSD_V3
528 /*
529  * Check server access rights to a file system object
530  */
531 struct accessmap {
532         u32             access;
533         int             how;
534 };
535 static struct accessmap nfs3_regaccess[] = {
536     {   NFS3_ACCESS_READ,       MAY_READ                        },
537     {   NFS3_ACCESS_EXECUTE,    MAY_EXEC                        },
538     {   NFS3_ACCESS_MODIFY,     MAY_WRITE|MAY_TRUNC             },
539     {   NFS3_ACCESS_EXTEND,     MAY_WRITE                       },
540
541     {   0,                      0                               }
542 };
543
544 static struct accessmap nfs3_diraccess[] = {
545     {   NFS3_ACCESS_READ,       MAY_READ                        },
546     {   NFS3_ACCESS_LOOKUP,     MAY_EXEC                        },
547     {   NFS3_ACCESS_MODIFY,     MAY_EXEC|MAY_WRITE|MAY_TRUNC    },
548     {   NFS3_ACCESS_EXTEND,     MAY_EXEC|MAY_WRITE              },
549     {   NFS3_ACCESS_DELETE,     MAY_REMOVE                      },
550
551     {   0,                      0                               }
552 };
553
554 static struct accessmap nfs3_anyaccess[] = {
555         /* Some clients - Solaris 2.6 at least, make an access call
556          * to the server to check for access for things like /dev/null
557          * (which really, the server doesn't care about).  So
558          * We provide simple access checking for them, looking
559          * mainly at mode bits, and we make sure to ignore read-only
560          * filesystem checks
561          */
562     {   NFS3_ACCESS_READ,       MAY_READ                        },
563     {   NFS3_ACCESS_EXECUTE,    MAY_EXEC                        },
564     {   NFS3_ACCESS_MODIFY,     MAY_WRITE|MAY_LOCAL_ACCESS      },
565     {   NFS3_ACCESS_EXTEND,     MAY_WRITE|MAY_LOCAL_ACCESS      },
566
567     {   0,                      0                               }
568 };
569
570 __be32
571 nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *supported)
572 {
573         struct accessmap        *map;
574         struct svc_export       *export;
575         struct dentry           *dentry;
576         u32                     query, result = 0, sresult = 0;
577         __be32                  error;
578
579         error = fh_verify(rqstp, fhp, 0, MAY_NOP);
580         if (error)
581                 goto out;
582
583         export = fhp->fh_export;
584         dentry = fhp->fh_dentry;
585
586         if (S_ISREG(dentry->d_inode->i_mode))
587                 map = nfs3_regaccess;
588         else if (S_ISDIR(dentry->d_inode->i_mode))
589                 map = nfs3_diraccess;
590         else
591                 map = nfs3_anyaccess;
592
593
594         query = *access;
595         for  (; map->access; map++) {
596                 if (map->access & query) {
597                         __be32 err2;
598
599                         sresult |= map->access;
600
601                         err2 = nfsd_permission(export, dentry, map->how);
602                         switch (err2) {
603                         case nfs_ok:
604                                 result |= map->access;
605                                 break;
606                                 
607                         /* the following error codes just mean the access was not allowed,
608                          * rather than an error occurred */
609                         case nfserr_rofs:
610                         case nfserr_acces:
611                         case nfserr_perm:
612                                 /* simply don't "or" in the access bit. */
613                                 break;
614                         default:
615                                 error = err2;
616                                 goto out;
617                         }
618                 }
619         }
620         *access = result;
621         if (supported)
622                 *supported = sresult;
623
624  out:
625         return error;
626 }
627 #endif /* CONFIG_NFSD_V3 */
628
629
630
631 /*
632  * Open an existing file or directory.
633  * The access argument indicates the type of open (read/write/lock)
634  * N.B. After this call fhp needs an fh_put
635  */
636 __be32
637 nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
638                         int access, struct file **filp)
639 {
640         struct dentry   *dentry;
641         struct inode    *inode;
642         int             flags = O_RDONLY|O_LARGEFILE;
643         __be32          err;
644         int             host_err;
645
646         /*
647          * If we get here, then the client has already done an "open",
648          * and (hopefully) checked permission - so allow OWNER_OVERRIDE
649          * in case a chmod has now revoked permission.
650          */
651         err = fh_verify(rqstp, fhp, type, access | MAY_OWNER_OVERRIDE);
652         if (err)
653                 goto out;
654
655         dentry = fhp->fh_dentry;
656         inode = dentry->d_inode;
657
658         /* Disallow write access to files with the append-only bit set
659          * or any access when mandatory locking enabled
660          */
661         err = nfserr_perm;
662         if (IS_APPEND(inode) && (access & MAY_WRITE))
663                 goto out;
664         if (IS_ISMNDLK(inode))
665                 goto out;
666
667         if (!inode->i_fop)
668                 goto out;
669
670         /*
671          * Check to see if there are any leases on this file.
672          * This may block while leases are broken.
673          */
674         host_err = break_lease(inode, O_NONBLOCK | ((access & MAY_WRITE) ? FMODE_WRITE : 0));
675         if (host_err == -EWOULDBLOCK)
676                 host_err = -ETIMEDOUT;
677         if (host_err) /* NOMEM or WOULDBLOCK */
678                 goto out_nfserr;
679
680         if (access & MAY_WRITE) {
681                 if (access & MAY_READ)
682                         flags = O_RDWR|O_LARGEFILE;
683                 else
684                         flags = O_WRONLY|O_LARGEFILE;
685
686                 DQUOT_INIT(inode);
687         }
688         *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_mnt), flags);
689         if (IS_ERR(*filp))
690                 host_err = PTR_ERR(*filp);
691 out_nfserr:
692         err = nfserrno(host_err);
693 out:
694         return err;
695 }
696
697 /*
698  * Close a file.
699  */
700 void
701 nfsd_close(struct file *filp)
702 {
703         fput(filp);
704 }
705
706 /*
707  * Sync a file
708  * As this calls fsync (not fdatasync) there is no need for a write_inode
709  * after it.
710  */
711 static inline int nfsd_dosync(struct file *filp, struct dentry *dp,
712                               const struct file_operations *fop)
713 {
714         struct inode *inode = dp->d_inode;
715         int (*fsync) (struct file *, struct dentry *, int);
716         int err;
717
718         err = filemap_fdatawrite(inode->i_mapping);
719         if (err == 0 && fop && (fsync = fop->fsync))
720                 err = fsync(filp, dp, 0);
721         if (err == 0)
722                 err = filemap_fdatawait(inode->i_mapping);
723
724         return err;
725 }
726         
727
728 static int
729 nfsd_sync(struct file *filp)
730 {
731         int err;
732         struct inode *inode = filp->f_path.dentry->d_inode;
733         dprintk("nfsd: sync file %s\n", filp->f_path.dentry->d_name.name);
734         mutex_lock(&inode->i_mutex);
735         err=nfsd_dosync(filp, filp->f_path.dentry, filp->f_op);
736         mutex_unlock(&inode->i_mutex);
737
738         return err;
739 }
740
741 int
742 nfsd_sync_dir(struct dentry *dp)
743 {
744         return nfsd_dosync(NULL, dp, dp->d_inode->i_fop);
745 }
746
747 /*
748  * Obtain the readahead parameters for the file
749  * specified by (dev, ino).
750  */
751
752 static inline struct raparms *
753 nfsd_get_raparms(dev_t dev, ino_t ino)
754 {
755         struct raparms  *ra, **rap, **frap = NULL;
756         int depth = 0;
757         unsigned int hash;
758         struct raparm_hbucket *rab;
759
760         hash = jhash_2words(dev, ino, 0xfeedbeef) & RAPARM_HASH_MASK;
761         rab = &raparm_hash[hash];
762
763         spin_lock(&rab->pb_lock);
764         for (rap = &rab->pb_head; (ra = *rap); rap = &ra->p_next) {
765                 if (ra->p_ino == ino && ra->p_dev == dev)
766                         goto found;
767                 depth++;
768                 if (ra->p_count == 0)
769                         frap = rap;
770         }
771         depth = nfsdstats.ra_size*11/10;
772         if (!frap) {    
773                 spin_unlock(&rab->pb_lock);
774                 return NULL;
775         }
776         rap = frap;
777         ra = *frap;
778         ra->p_dev = dev;
779         ra->p_ino = ino;
780         ra->p_set = 0;
781         ra->p_hindex = hash;
782 found:
783         if (rap != &rab->pb_head) {
784                 *rap = ra->p_next;
785                 ra->p_next   = rab->pb_head;
786                 rab->pb_head = ra;
787         }
788         ra->p_count++;
789         nfsdstats.ra_depth[depth*10/nfsdstats.ra_size]++;
790         spin_unlock(&rab->pb_lock);
791         return ra;
792 }
793
794 /*
795  * Grab and keep cached pages associated with a file in the svc_rqst
796  * so that they can be passed to the network sendmsg/sendpage routines
797  * directly. They will be released after the sending has completed.
798  */
799 static int
800 nfsd_splice_actor(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
801                   struct splice_desc *sd)
802 {
803         struct svc_rqst *rqstp = sd->u.data;
804         struct page **pp = rqstp->rq_respages + rqstp->rq_resused;
805         struct page *page = buf->page;
806         size_t size;
807         int ret;
808
809         ret = buf->ops->confirm(pipe, buf);
810         if (unlikely(ret))
811                 return ret;
812
813         size = sd->len;
814
815         if (rqstp->rq_res.page_len == 0) {
816                 get_page(page);
817                 put_page(*pp);
818                 *pp = page;
819                 rqstp->rq_resused++;
820                 rqstp->rq_res.page_base = buf->offset;
821                 rqstp->rq_res.page_len = size;
822         } else if (page != pp[-1]) {
823                 get_page(page);
824                 if (*pp)
825                         put_page(*pp);
826                 *pp = page;
827                 rqstp->rq_resused++;
828                 rqstp->rq_res.page_len += size;
829         } else
830                 rqstp->rq_res.page_len += size;
831
832         return size;
833 }
834
835 static int nfsd_direct_splice_actor(struct pipe_inode_info *pipe,
836                                     struct splice_desc *sd)
837 {
838         return __splice_from_pipe(pipe, sd, nfsd_splice_actor);
839 }
840
841 static __be32
842 nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
843               loff_t offset, struct kvec *vec, int vlen, unsigned long *count)
844 {
845         struct inode *inode;
846         struct raparms  *ra;
847         mm_segment_t    oldfs;
848         __be32          err;
849         int             host_err;
850
851         err = nfserr_perm;
852         inode = file->f_path.dentry->d_inode;
853 #ifdef MSNFS
854         if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
855                 (!lock_may_read(inode, offset, *count)))
856                 goto out;
857 #endif
858
859         /* Get readahead parameters */
860         ra = nfsd_get_raparms(inode->i_sb->s_dev, inode->i_ino);
861
862         if (ra && ra->p_set)
863                 file->f_ra = ra->p_ra;
864
865         if (file->f_op->splice_read && rqstp->rq_splice_ok) {
866                 struct splice_desc sd = {
867                         .len            = 0,
868                         .total_len      = *count,
869                         .pos            = offset,
870                         .u.data         = rqstp,
871                 };
872
873                 rqstp->rq_resused = 1;
874                 host_err = splice_direct_to_actor(file, &sd, nfsd_direct_splice_actor);
875         } else {
876                 oldfs = get_fs();
877                 set_fs(KERNEL_DS);
878                 host_err = vfs_readv(file, (struct iovec __user *)vec, vlen, &offset);
879                 set_fs(oldfs);
880         }
881
882         /* Write back readahead params */
883         if (ra) {
884                 struct raparm_hbucket *rab = &raparm_hash[ra->p_hindex];
885                 spin_lock(&rab->pb_lock);
886                 ra->p_ra = file->f_ra;
887                 ra->p_set = 1;
888                 ra->p_count--;
889                 spin_unlock(&rab->pb_lock);
890         }
891
892         if (host_err >= 0) {
893                 nfsdstats.io_read += host_err;
894                 *count = host_err;
895                 err = 0;
896                 fsnotify_access(file->f_path.dentry);
897         } else 
898                 err = nfserrno(host_err);
899 out:
900         return err;
901 }
902
903 static void kill_suid(struct dentry *dentry)
904 {
905         struct iattr    ia;
906         ia.ia_valid = ATTR_KILL_SUID | ATTR_KILL_SGID;
907
908         mutex_lock(&dentry->d_inode->i_mutex);
909         notify_change(dentry, &ia);
910         mutex_unlock(&dentry->d_inode->i_mutex);
911 }
912
913 static __be32
914 nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
915                                 loff_t offset, struct kvec *vec, int vlen,
916                                 unsigned long cnt, int *stablep)
917 {
918         struct svc_export       *exp;
919         struct dentry           *dentry;
920         struct inode            *inode;
921         mm_segment_t            oldfs;
922         __be32                  err = 0;
923         int                     host_err;
924         int                     stable = *stablep;
925
926 #ifdef MSNFS
927         err = nfserr_perm;
928
929         if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
930                 (!lock_may_write(file->f_path.dentry->d_inode, offset, cnt)))
931                 goto out;
932 #endif
933
934         dentry = file->f_path.dentry;
935         inode = dentry->d_inode;
936         exp   = fhp->fh_export;
937
938         /*
939          * Request sync writes if
940          *  -   the sync export option has been set, or
941          *  -   the client requested O_SYNC behavior (NFSv3 feature).
942          *  -   The file system doesn't support fsync().
943          * When gathered writes have been configured for this volume,
944          * flushing the data to disk is handled separately below.
945          */
946
947         if (file->f_op->fsync == 0) {/* COMMIT3 cannot work */
948                stable = 2;
949                *stablep = 2; /* FILE_SYNC */
950         }
951
952         if (!EX_ISSYNC(exp))
953                 stable = 0;
954         if (stable && !EX_WGATHER(exp))
955                 file->f_flags |= O_SYNC;
956
957         /* Write the data. */
958         oldfs = get_fs(); set_fs(KERNEL_DS);
959         host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
960         set_fs(oldfs);
961         if (host_err >= 0) {
962                 nfsdstats.io_write += cnt;
963                 fsnotify_modify(file->f_path.dentry);
964         }
965
966         /* clear setuid/setgid flag after write */
967         if (host_err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID)))
968                 kill_suid(dentry);
969
970         if (host_err >= 0 && stable) {
971                 static ino_t    last_ino;
972                 static dev_t    last_dev;
973
974                 /*
975                  * Gathered writes: If another process is currently
976                  * writing to the file, there's a high chance
977                  * this is another nfsd (triggered by a bulk write
978                  * from a client's biod). Rather than syncing the
979                  * file with each write request, we sleep for 10 msec.
980                  *
981                  * I don't know if this roughly approximates
982                  * C. Juszak's idea of gathered writes, but it's a
983                  * nice and simple solution (IMHO), and it seems to
984                  * work:-)
985                  */
986                 if (EX_WGATHER(exp)) {
987                         if (atomic_read(&inode->i_writecount) > 1
988                             || (last_ino == inode->i_ino && last_dev == inode->i_sb->s_dev)) {
989                                 dprintk("nfsd: write defer %d\n", current->pid);
990                                 msleep(10);
991                                 dprintk("nfsd: write resume %d\n", current->pid);
992                         }
993
994                         if (inode->i_state & I_DIRTY) {
995                                 dprintk("nfsd: write sync %d\n", current->pid);
996                                 host_err=nfsd_sync(file);
997                         }
998 #if 0
999                         wake_up(&inode->i_wait);
1000 #endif
1001                 }
1002                 last_ino = inode->i_ino;
1003                 last_dev = inode->i_sb->s_dev;
1004         }
1005
1006         dprintk("nfsd: write complete host_err=%d\n", host_err);
1007         if (host_err >= 0)
1008                 err = 0;
1009         else 
1010                 err = nfserrno(host_err);
1011 out:
1012         return err;
1013 }
1014
1015 /*
1016  * Read data from a file. count must contain the requested read count
1017  * on entry. On return, *count contains the number of bytes actually read.
1018  * N.B. After this call fhp needs an fh_put
1019  */
1020 __be32
1021 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
1022                 loff_t offset, struct kvec *vec, int vlen,
1023                 unsigned long *count)
1024 {
1025         __be32          err;
1026
1027         if (file) {
1028                 err = nfsd_permission(fhp->fh_export, fhp->fh_dentry,
1029                                 MAY_READ|MAY_OWNER_OVERRIDE);
1030                 if (err)
1031                         goto out;
1032                 err = nfsd_vfs_read(rqstp, fhp, file, offset, vec, vlen, count);
1033         } else {
1034                 err = nfsd_open(rqstp, fhp, S_IFREG, MAY_READ, &file);
1035                 if (err)
1036                         goto out;
1037                 err = nfsd_vfs_read(rqstp, fhp, file, offset, vec, vlen, count);
1038                 nfsd_close(file);
1039         }
1040 out:
1041         return err;
1042 }
1043
1044 /*
1045  * Write data to a file.
1046  * The stable flag requests synchronous writes.
1047  * N.B. After this call fhp needs an fh_put
1048  */
1049 __be32
1050 nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
1051                 loff_t offset, struct kvec *vec, int vlen, unsigned long cnt,
1052                 int *stablep)
1053 {
1054         __be32                  err = 0;
1055
1056         if (file) {
1057                 err = nfsd_permission(fhp->fh_export, fhp->fh_dentry,
1058                                 MAY_WRITE|MAY_OWNER_OVERRIDE);
1059                 if (err)
1060                         goto out;
1061                 err = nfsd_vfs_write(rqstp, fhp, file, offset, vec, vlen, cnt,
1062                                 stablep);
1063         } else {
1064                 err = nfsd_open(rqstp, fhp, S_IFREG, MAY_WRITE, &file);
1065                 if (err)
1066                         goto out;
1067
1068                 if (cnt)
1069                         err = nfsd_vfs_write(rqstp, fhp, file, offset, vec, vlen,
1070                                              cnt, stablep);
1071                 nfsd_close(file);
1072         }
1073 out:
1074         return err;
1075 }
1076
1077 #ifdef CONFIG_NFSD_V3
1078 /*
1079  * Commit all pending writes to stable storage.
1080  * Strictly speaking, we could sync just the indicated file region here,
1081  * but there's currently no way we can ask the VFS to do so.
1082  *
1083  * Unfortunately we cannot lock the file to make sure we return full WCC
1084  * data to the client, as locking happens lower down in the filesystem.
1085  */
1086 __be32
1087 nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
1088                loff_t offset, unsigned long count)
1089 {
1090         struct file     *file;
1091         __be32          err;
1092
1093         if ((u64)count > ~(u64)offset)
1094                 return nfserr_inval;
1095
1096         if ((err = nfsd_open(rqstp, fhp, S_IFREG, MAY_WRITE, &file)) != 0)
1097                 return err;
1098         if (EX_ISSYNC(fhp->fh_export)) {
1099                 if (file->f_op && file->f_op->fsync) {
1100                         err = nfserrno(nfsd_sync(file));
1101                 } else {
1102                         err = nfserr_notsupp;
1103                 }
1104         }
1105
1106         nfsd_close(file);
1107         return err;
1108 }
1109 #endif /* CONFIG_NFSD_V3 */
1110
1111 /*
1112  * Create a file (regular, directory, device, fifo); UNIX sockets 
1113  * not yet implemented.
1114  * If the response fh has been verified, the parent directory should
1115  * already be locked. Note that the parent directory is left locked.
1116  *
1117  * N.B. Every call to nfsd_create needs an fh_put for _both_ fhp and resfhp
1118  */
1119 __be32
1120 nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
1121                 char *fname, int flen, struct iattr *iap,
1122                 int type, dev_t rdev, struct svc_fh *resfhp)
1123 {
1124         struct dentry   *dentry, *dchild = NULL;
1125         struct inode    *dirp;
1126         __be32          err;
1127         int             host_err;
1128
1129         err = nfserr_perm;
1130         if (!flen)
1131                 goto out;
1132         err = nfserr_exist;
1133         if (isdotent(fname, flen))
1134                 goto out;
1135
1136         err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
1137         if (err)
1138                 goto out;
1139
1140         dentry = fhp->fh_dentry;
1141         dirp = dentry->d_inode;
1142
1143         err = nfserr_notdir;
1144         if(!dirp->i_op || !dirp->i_op->lookup)
1145                 goto out;
1146         /*
1147          * Check whether the response file handle has been verified yet.
1148          * If it has, the parent directory should already be locked.
1149          */
1150         if (!resfhp->fh_dentry) {
1151                 /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */
1152                 fh_lock_nested(fhp, I_MUTEX_PARENT);
1153                 dchild = lookup_one_len(fname, dentry, flen);
1154                 host_err = PTR_ERR(dchild);
1155                 if (IS_ERR(dchild))
1156                         goto out_nfserr;
1157                 err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
1158                 if (err)
1159                         goto out;
1160         } else {
1161                 /* called from nfsd_proc_create */
1162                 dchild = dget(resfhp->fh_dentry);
1163                 if (!fhp->fh_locked) {
1164                         /* not actually possible */
1165                         printk(KERN_ERR
1166                                 "nfsd_create: parent %s/%s not locked!\n",
1167                                 dentry->d_parent->d_name.name,
1168                                 dentry->d_name.name);
1169                         err = nfserr_io;
1170                         goto out;
1171                 }
1172         }
1173         /*
1174          * Make sure the child dentry is still negative ...
1175          */
1176         err = nfserr_exist;
1177         if (dchild->d_inode) {
1178                 dprintk("nfsd_create: dentry %s/%s not negative!\n",
1179                         dentry->d_name.name, dchild->d_name.name);
1180                 goto out; 
1181         }
1182
1183         if (!(iap->ia_valid & ATTR_MODE))
1184                 iap->ia_mode = 0;
1185         iap->ia_mode = (iap->ia_mode & S_IALLUGO) | type;
1186
1187         /*
1188          * Get the dir op function pointer.
1189          */
1190         err = 0;
1191         switch (type) {
1192         case S_IFREG:
1193                 host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
1194                 break;
1195         case S_IFDIR:
1196                 host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
1197                 break;
1198         case S_IFCHR:
1199         case S_IFBLK:
1200         case S_IFIFO:
1201         case S_IFSOCK:
1202                 host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
1203                 break;
1204         default:
1205                 printk("nfsd: bad file type %o in nfsd_create\n", type);
1206                 host_err = -EINVAL;
1207         }
1208         if (host_err < 0)
1209                 goto out_nfserr;
1210
1211         if (EX_ISSYNC(fhp->fh_export)) {
1212                 err = nfserrno(nfsd_sync_dir(dentry));
1213                 write_inode_now(dchild->d_inode, 1);
1214         }
1215
1216
1217         /* Set file attributes. Mode has already been set and
1218          * setting uid/gid works only for root. Irix appears to
1219          * send along the gid when it tries to implement setgid
1220          * directories via NFS.
1221          */
1222         if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID|ATTR_MODE)) != 0) {
1223                 __be32 err2 = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0);
1224                 if (err2)
1225                         err = err2;
1226         }
1227         /*
1228          * Update the file handle to get the new inode info.
1229          */
1230         if (!err)
1231                 err = fh_update(resfhp);
1232 out:
1233         if (dchild && !IS_ERR(dchild))
1234                 dput(dchild);
1235         return err;
1236
1237 out_nfserr:
1238         err = nfserrno(host_err);
1239         goto out;
1240 }
1241
1242 #ifdef CONFIG_NFSD_V3
1243 /*
1244  * NFSv3 version of nfsd_create
1245  */
1246 __be32
1247 nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
1248                 char *fname, int flen, struct iattr *iap,
1249                 struct svc_fh *resfhp, int createmode, u32 *verifier,
1250                 int *truncp, int *created)
1251 {
1252         struct dentry   *dentry, *dchild = NULL;
1253         struct inode    *dirp;
1254         __be32          err;
1255         int             host_err;
1256         __u32           v_mtime=0, v_atime=0;
1257
1258         err = nfserr_perm;
1259         if (!flen)
1260                 goto out;
1261         err = nfserr_exist;
1262         if (isdotent(fname, flen))
1263                 goto out;
1264         if (!(iap->ia_valid & ATTR_MODE))
1265                 iap->ia_mode = 0;
1266         err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
1267         if (err)
1268                 goto out;
1269
1270         dentry = fhp->fh_dentry;
1271         dirp = dentry->d_inode;
1272
1273         /* Get all the sanity checks out of the way before
1274          * we lock the parent. */
1275         err = nfserr_notdir;
1276         if(!dirp->i_op || !dirp->i_op->lookup)
1277                 goto out;
1278         fh_lock_nested(fhp, I_MUTEX_PARENT);
1279
1280         /*
1281          * Compose the response file handle.
1282          */
1283         dchild = lookup_one_len(fname, dentry, flen);
1284         host_err = PTR_ERR(dchild);
1285         if (IS_ERR(dchild))
1286                 goto out_nfserr;
1287
1288         err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
1289         if (err)
1290                 goto out;
1291
1292         if (createmode == NFS3_CREATE_EXCLUSIVE) {
1293                 /* solaris7 gets confused (bugid 4218508) if these have
1294                  * the high bit set, so just clear the high bits.
1295                  */
1296                 v_mtime = verifier[0]&0x7fffffff;
1297                 v_atime = verifier[1]&0x7fffffff;
1298         }
1299         
1300         if (dchild->d_inode) {
1301                 err = 0;
1302
1303                 switch (createmode) {
1304                 case NFS3_CREATE_UNCHECKED:
1305                         if (! S_ISREG(dchild->d_inode->i_mode))
1306                                 err = nfserr_exist;
1307                         else if (truncp) {
1308                                 /* in nfsv4, we need to treat this case a little
1309                                  * differently.  we don't want to truncate the
1310                                  * file now; this would be wrong if the OPEN
1311                                  * fails for some other reason.  furthermore,
1312                                  * if the size is nonzero, we should ignore it
1313                                  * according to spec!
1314                                  */
1315                                 *truncp = (iap->ia_valid & ATTR_SIZE) && !iap->ia_size;
1316                         }
1317                         else {
1318                                 iap->ia_valid &= ATTR_SIZE;
1319                                 goto set_attr;
1320                         }
1321                         break;
1322                 case NFS3_CREATE_EXCLUSIVE:
1323                         if (   dchild->d_inode->i_mtime.tv_sec == v_mtime
1324                             && dchild->d_inode->i_atime.tv_sec == v_atime
1325                             && dchild->d_inode->i_size  == 0 )
1326                                 break;
1327                          /* fallthru */
1328                 case NFS3_CREATE_GUARDED:
1329                         err = nfserr_exist;
1330                 }
1331                 goto out;
1332         }
1333
1334         host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
1335         if (host_err < 0)
1336                 goto out_nfserr;
1337         if (created)
1338                 *created = 1;
1339
1340         if (EX_ISSYNC(fhp->fh_export)) {
1341                 err = nfserrno(nfsd_sync_dir(dentry));
1342                 /* setattr will sync the child (or not) */
1343         }
1344
1345         if (createmode == NFS3_CREATE_EXCLUSIVE) {
1346                 /* Cram the verifier into atime/mtime */
1347                 iap->ia_valid = ATTR_MTIME|ATTR_ATIME
1348                         | ATTR_MTIME_SET|ATTR_ATIME_SET;
1349                 /* XXX someone who knows this better please fix it for nsec */ 
1350                 iap->ia_mtime.tv_sec = v_mtime;
1351                 iap->ia_atime.tv_sec = v_atime;
1352                 iap->ia_mtime.tv_nsec = 0;
1353                 iap->ia_atime.tv_nsec = 0;
1354         }
1355
1356         /* Set file attributes.
1357          * Irix appears to send along the gid when it tries to
1358          * implement setgid directories via NFS. Clear out all that cruft.
1359          */
1360  set_attr:
1361         if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID|ATTR_MODE)) != 0) {
1362                 __be32 err2 = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0);
1363                 if (err2)
1364                         err = err2;
1365         }
1366
1367         /*
1368          * Update the filehandle to get the new inode info.
1369          */
1370         if (!err)
1371                 err = fh_update(resfhp);
1372
1373  out:
1374         fh_unlock(fhp);
1375         if (dchild && !IS_ERR(dchild))
1376                 dput(dchild);
1377         return err;
1378  
1379  out_nfserr:
1380         err = nfserrno(host_err);
1381         goto out;
1382 }
1383 #endif /* CONFIG_NFSD_V3 */
1384
1385 /*
1386  * Read a symlink. On entry, *lenp must contain the maximum path length that
1387  * fits into the buffer. On return, it contains the true length.
1388  * N.B. After this call fhp needs an fh_put
1389  */
1390 __be32
1391 nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp)
1392 {
1393         struct dentry   *dentry;
1394         struct inode    *inode;
1395         mm_segment_t    oldfs;
1396         __be32          err;
1397         int             host_err;
1398
1399         err = fh_verify(rqstp, fhp, S_IFLNK, MAY_NOP);
1400         if (err)
1401                 goto out;
1402
1403         dentry = fhp->fh_dentry;
1404         inode = dentry->d_inode;
1405
1406         err = nfserr_inval;
1407         if (!inode->i_op || !inode->i_op->readlink)
1408                 goto out;
1409
1410         touch_atime(fhp->fh_export->ex_mnt, dentry);
1411         /* N.B. Why does this call need a get_fs()??
1412          * Remove the set_fs and watch the fireworks:-) --okir
1413          */
1414
1415         oldfs = get_fs(); set_fs(KERNEL_DS);
1416         host_err = inode->i_op->readlink(dentry, buf, *lenp);
1417         set_fs(oldfs);
1418
1419         if (host_err < 0)
1420                 goto out_nfserr;
1421         *lenp = host_err;
1422         err = 0;
1423 out:
1424         return err;
1425
1426 out_nfserr:
1427         err = nfserrno(host_err);
1428         goto out;
1429 }
1430
1431 /*
1432  * Create a symlink and look up its inode
1433  * N.B. After this call _both_ fhp and resfhp need an fh_put
1434  */
1435 __be32
1436 nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp,
1437                                 char *fname, int flen,
1438                                 char *path,  int plen,
1439                                 struct svc_fh *resfhp,
1440                                 struct iattr *iap)
1441 {
1442         struct dentry   *dentry, *dnew;
1443         __be32          err, cerr;
1444         int             host_err;
1445         umode_t         mode;
1446
1447         err = nfserr_noent;
1448         if (!flen || !plen)
1449                 goto out;
1450         err = nfserr_exist;
1451         if (isdotent(fname, flen))
1452                 goto out;
1453
1454         err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
1455         if (err)
1456                 goto out;
1457         fh_lock(fhp);
1458         dentry = fhp->fh_dentry;
1459         dnew = lookup_one_len(fname, dentry, flen);
1460         host_err = PTR_ERR(dnew);
1461         if (IS_ERR(dnew))
1462                 goto out_nfserr;
1463
1464         mode = S_IALLUGO;
1465         /* Only the MODE ATTRibute is even vaguely meaningful */
1466         if (iap && (iap->ia_valid & ATTR_MODE))
1467                 mode = iap->ia_mode & S_IALLUGO;
1468
1469         if (unlikely(path[plen] != 0)) {
1470                 char *path_alloced = kmalloc(plen+1, GFP_KERNEL);
1471                 if (path_alloced == NULL)
1472                         host_err = -ENOMEM;
1473                 else {
1474                         strncpy(path_alloced, path, plen);
1475                         path_alloced[plen] = 0;
1476                         host_err = vfs_symlink(dentry->d_inode, dnew, path_alloced, mode);
1477                         kfree(path_alloced);
1478                 }
1479         } else
1480                 host_err = vfs_symlink(dentry->d_inode, dnew, path, mode);
1481
1482         if (!host_err) {
1483                 if (EX_ISSYNC(fhp->fh_export))
1484                         host_err = nfsd_sync_dir(dentry);
1485         }
1486         err = nfserrno(host_err);
1487         fh_unlock(fhp);
1488
1489         cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
1490         dput(dnew);
1491         if (err==0) err = cerr;
1492 out:
1493         return err;
1494
1495 out_nfserr:
1496         err = nfserrno(host_err);
1497         goto out;
1498 }
1499
1500 /*
1501  * Create a hardlink
1502  * N.B. After this call _both_ ffhp and tfhp need an fh_put
1503  */
1504 __be32
1505 nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
1506                                 char *name, int len, struct svc_fh *tfhp)
1507 {
1508         struct dentry   *ddir, *dnew, *dold;
1509         struct inode    *dirp, *dest;
1510         __be32          err;
1511         int             host_err;
1512
1513         err = fh_verify(rqstp, ffhp, S_IFDIR, MAY_CREATE);
1514         if (err)
1515                 goto out;
1516         err = fh_verify(rqstp, tfhp, -S_IFDIR, MAY_NOP);
1517         if (err)
1518                 goto out;
1519
1520         err = nfserr_perm;
1521         if (!len)
1522                 goto out;
1523         err = nfserr_exist;
1524         if (isdotent(name, len))
1525                 goto out;
1526
1527         fh_lock_nested(ffhp, I_MUTEX_PARENT);
1528         ddir = ffhp->fh_dentry;
1529         dirp = ddir->d_inode;
1530
1531         dnew = lookup_one_len(name, ddir, len);
1532         host_err = PTR_ERR(dnew);
1533         if (IS_ERR(dnew))
1534                 goto out_nfserr;
1535
1536         dold = tfhp->fh_dentry;
1537         dest = dold->d_inode;
1538
1539         host_err = vfs_link(dold, dirp, dnew);
1540         if (!host_err) {
1541                 if (EX_ISSYNC(ffhp->fh_export)) {
1542                         err = nfserrno(nfsd_sync_dir(ddir));
1543                         write_inode_now(dest, 1);
1544                 }
1545                 err = 0;
1546         } else {
1547                 if (host_err == -EXDEV && rqstp->rq_vers == 2)
1548                         err = nfserr_acces;
1549                 else
1550                         err = nfserrno(host_err);
1551         }
1552
1553         dput(dnew);
1554 out_unlock:
1555         fh_unlock(ffhp);
1556 out:
1557         return err;
1558
1559 out_nfserr:
1560         err = nfserrno(host_err);
1561         goto out_unlock;
1562 }
1563
1564 /*
1565  * Rename a file
1566  * N.B. After this call _both_ ffhp and tfhp need an fh_put
1567  */
1568 __be32
1569 nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
1570                             struct svc_fh *tfhp, char *tname, int tlen)
1571 {
1572         struct dentry   *fdentry, *tdentry, *odentry, *ndentry, *trap;
1573         struct inode    *fdir, *tdir;
1574         __be32          err;
1575         int             host_err;
1576
1577         err = fh_verify(rqstp, ffhp, S_IFDIR, MAY_REMOVE);
1578         if (err)
1579                 goto out;
1580         err = fh_verify(rqstp, tfhp, S_IFDIR, MAY_CREATE);
1581         if (err)
1582                 goto out;
1583
1584         fdentry = ffhp->fh_dentry;
1585         fdir = fdentry->d_inode;
1586
1587         tdentry = tfhp->fh_dentry;
1588         tdir = tdentry->d_inode;
1589
1590         err = (rqstp->rq_vers == 2) ? nfserr_acces : nfserr_xdev;
1591         if (ffhp->fh_export != tfhp->fh_export)
1592                 goto out;
1593
1594         err = nfserr_perm;
1595         if (!flen || isdotent(fname, flen) || !tlen || isdotent(tname, tlen))
1596                 goto out;
1597
1598         /* cannot use fh_lock as we need deadlock protective ordering
1599          * so do it by hand */
1600         trap = lock_rename(tdentry, fdentry);
1601         ffhp->fh_locked = tfhp->fh_locked = 1;
1602         fill_pre_wcc(ffhp);
1603         fill_pre_wcc(tfhp);
1604
1605         odentry = lookup_one_len(fname, fdentry, flen);
1606         host_err = PTR_ERR(odentry);
1607         if (IS_ERR(odentry))
1608                 goto out_nfserr;
1609
1610         host_err = -ENOENT;
1611         if (!odentry->d_inode)
1612                 goto out_dput_old;
1613         host_err = -EINVAL;
1614         if (odentry == trap)
1615                 goto out_dput_old;
1616
1617         ndentry = lookup_one_len(tname, tdentry, tlen);
1618         host_err = PTR_ERR(ndentry);
1619         if (IS_ERR(ndentry))
1620                 goto out_dput_old;
1621         host_err = -ENOTEMPTY;
1622         if (ndentry == trap)
1623                 goto out_dput_new;
1624
1625 #ifdef MSNFS
1626         if ((ffhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
1627                 ((atomic_read(&odentry->d_count) > 1)
1628                  || (atomic_read(&ndentry->d_count) > 1))) {
1629                         host_err = -EPERM;
1630         } else
1631 #endif
1632         host_err = vfs_rename(fdir, odentry, tdir, ndentry);
1633         if (!host_err && EX_ISSYNC(tfhp->fh_export)) {
1634                 host_err = nfsd_sync_dir(tdentry);
1635                 if (!host_err)
1636                         host_err = nfsd_sync_dir(fdentry);
1637         }
1638
1639  out_dput_new:
1640         dput(ndentry);
1641  out_dput_old:
1642         dput(odentry);
1643  out_nfserr:
1644         err = nfserrno(host_err);
1645
1646         /* we cannot reply on fh_unlock on the two filehandles,
1647          * as that would do the wrong thing if the two directories
1648          * were the same, so again we do it by hand
1649          */
1650         fill_post_wcc(ffhp);
1651         fill_post_wcc(tfhp);
1652         unlock_rename(tdentry, fdentry);
1653         ffhp->fh_locked = tfhp->fh_locked = 0;
1654
1655 out:
1656         return err;
1657 }
1658
1659 /*
1660  * Unlink a file or directory
1661  * N.B. After this call fhp needs an fh_put
1662  */
1663 __be32
1664 nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
1665                                 char *fname, int flen)
1666 {
1667         struct dentry   *dentry, *rdentry;
1668         struct inode    *dirp;
1669         __be32          err;
1670         int             host_err;
1671
1672         err = nfserr_acces;
1673         if (!flen || isdotent(fname, flen))
1674                 goto out;
1675         err = fh_verify(rqstp, fhp, S_IFDIR, MAY_REMOVE);
1676         if (err)
1677                 goto out;
1678
1679         fh_lock_nested(fhp, I_MUTEX_PARENT);
1680         dentry = fhp->fh_dentry;
1681         dirp = dentry->d_inode;
1682
1683         rdentry = lookup_one_len(fname, dentry, flen);
1684         host_err = PTR_ERR(rdentry);
1685         if (IS_ERR(rdentry))
1686                 goto out_nfserr;
1687
1688         if (!rdentry->d_inode) {
1689                 dput(rdentry);
1690                 err = nfserr_noent;
1691                 goto out;
1692         }
1693
1694         if (!type)
1695                 type = rdentry->d_inode->i_mode & S_IFMT;
1696
1697         if (type != S_IFDIR) { /* It's UNLINK */
1698 #ifdef MSNFS
1699                 if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
1700                         (atomic_read(&rdentry->d_count) > 1)) {
1701                         host_err = -EPERM;
1702                 } else
1703 #endif
1704                 host_err = vfs_unlink(dirp, rdentry);
1705         } else { /* It's RMDIR */
1706                 host_err = vfs_rmdir(dirp, rdentry);
1707         }
1708
1709         dput(rdentry);
1710
1711         if (host_err)
1712                 goto out_nfserr;
1713         if (EX_ISSYNC(fhp->fh_export))
1714                 host_err = nfsd_sync_dir(dentry);
1715
1716 out_nfserr:
1717         err = nfserrno(host_err);
1718 out:
1719         return err;
1720 }
1721
1722 /*
1723  * Read entries from a directory.
1724  * The  NFSv3/4 verifier we ignore for now.
1725  */
1726 __be32
1727 nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp, 
1728              struct readdir_cd *cdp, filldir_t func)
1729 {
1730         __be32          err;
1731         int             host_err;
1732         struct file     *file;
1733         loff_t          offset = *offsetp;
1734
1735         err = nfsd_open(rqstp, fhp, S_IFDIR, MAY_READ, &file);
1736         if (err)
1737                 goto out;
1738
1739         offset = vfs_llseek(file, offset, 0);
1740         if (offset < 0) {
1741                 err = nfserrno((int)offset);
1742                 goto out_close;
1743         }
1744
1745         /*
1746          * Read the directory entries. This silly loop is necessary because
1747          * readdir() is not guaranteed to fill up the entire buffer, but
1748          * may choose to do less.
1749          */
1750
1751         do {
1752                 cdp->err = nfserr_eof; /* will be cleared on successful read */
1753                 host_err = vfs_readdir(file, func, cdp);
1754         } while (host_err >=0 && cdp->err == nfs_ok);
1755         if (host_err)
1756                 err = nfserrno(host_err);
1757         else
1758                 err = cdp->err;
1759         *offsetp = vfs_llseek(file, 0, 1);
1760
1761         if (err == nfserr_eof || err == nfserr_toosmall)
1762                 err = nfs_ok; /* can still be found in ->err */
1763 out_close:
1764         nfsd_close(file);
1765 out:
1766         return err;
1767 }
1768
1769 /*
1770  * Get file system stats
1771  * N.B. After this call fhp needs an fh_put
1772  */
1773 __be32
1774 nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat)
1775 {
1776         __be32 err = fh_verify(rqstp, fhp, 0, MAY_NOP);
1777         if (!err && vfs_statfs(fhp->fh_dentry,stat))
1778                 err = nfserr_io;
1779         return err;
1780 }
1781
1782 /*
1783  * Check for a user's access permissions to this inode.
1784  */
1785 __be32
1786 nfsd_permission(struct svc_export *exp, struct dentry *dentry, int acc)
1787 {
1788         struct inode    *inode = dentry->d_inode;
1789         int             err;
1790
1791         if (acc == MAY_NOP)
1792                 return 0;
1793 #if 0
1794         dprintk("nfsd: permission 0x%x%s%s%s%s%s%s%s mode 0%o%s%s%s\n",
1795                 acc,
1796                 (acc & MAY_READ)?       " read"  : "",
1797                 (acc & MAY_WRITE)?      " write" : "",
1798                 (acc & MAY_EXEC)?       " exec"  : "",
1799                 (acc & MAY_SATTR)?      " sattr" : "",
1800                 (acc & MAY_TRUNC)?      " trunc" : "",
1801                 (acc & MAY_LOCK)?       " lock"  : "",
1802                 (acc & MAY_OWNER_OVERRIDE)? " owneroverride" : "",
1803                 inode->i_mode,
1804                 IS_IMMUTABLE(inode)?    " immut" : "",
1805                 IS_APPEND(inode)?       " append" : "",
1806                 IS_RDONLY(inode)?       " ro" : "");
1807         dprintk("      owner %d/%d user %d/%d\n",
1808                 inode->i_uid, inode->i_gid, current->fsuid, current->fsgid);
1809 #endif
1810
1811         /* Normally we reject any write/sattr etc access on a read-only file
1812          * system.  But if it is IRIX doing check on write-access for a 
1813          * device special file, we ignore rofs.
1814          */
1815         if (!(acc & MAY_LOCAL_ACCESS))
1816                 if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) {
1817                         if (EX_RDONLY(exp) || IS_RDONLY(inode))
1818                                 return nfserr_rofs;
1819                         if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode))
1820                                 return nfserr_perm;
1821                 }
1822         if ((acc & MAY_TRUNC) && IS_APPEND(inode))
1823                 return nfserr_perm;
1824
1825         if (acc & MAY_LOCK) {
1826                 /* If we cannot rely on authentication in NLM requests,
1827                  * just allow locks, otherwise require read permission, or
1828                  * ownership
1829                  */
1830                 if (exp->ex_flags & NFSEXP_NOAUTHNLM)
1831                         return 0;
1832                 else
1833                         acc = MAY_READ | MAY_OWNER_OVERRIDE;
1834         }
1835         /*
1836          * The file owner always gets access permission for accesses that
1837          * would normally be checked at open time. This is to make
1838          * file access work even when the client has done a fchmod(fd, 0).
1839          *
1840          * However, `cp foo bar' should fail nevertheless when bar is
1841          * readonly. A sensible way to do this might be to reject all
1842          * attempts to truncate a read-only file, because a creat() call
1843          * always implies file truncation.
1844          * ... but this isn't really fair.  A process may reasonably call
1845          * ftruncate on an open file descriptor on a file with perm 000.
1846          * We must trust the client to do permission checking - using "ACCESS"
1847          * with NFSv3.
1848          */
1849         if ((acc & MAY_OWNER_OVERRIDE) &&
1850             inode->i_uid == current->fsuid)
1851                 return 0;
1852
1853         err = permission(inode, acc & (MAY_READ|MAY_WRITE|MAY_EXEC), NULL);
1854
1855         /* Allow read access to binaries even when mode 111 */
1856         if (err == -EACCES && S_ISREG(inode->i_mode) &&
1857             acc == (MAY_READ | MAY_OWNER_OVERRIDE))
1858                 err = permission(inode, MAY_EXEC, NULL);
1859
1860         return err? nfserrno(err) : 0;
1861 }
1862
1863 void
1864 nfsd_racache_shutdown(void)
1865 {
1866         if (!raparml)
1867                 return;
1868         dprintk("nfsd: freeing readahead buffers.\n");
1869         kfree(raparml);
1870         raparml = NULL;
1871 }
1872 /*
1873  * Initialize readahead param cache
1874  */
1875 int
1876 nfsd_racache_init(int cache_size)
1877 {
1878         int     i;
1879         int     j = 0;
1880         int     nperbucket;
1881
1882
1883         if (raparml)
1884                 return 0;
1885         if (cache_size < 2*RAPARM_HASH_SIZE)
1886                 cache_size = 2*RAPARM_HASH_SIZE;
1887         raparml = kcalloc(cache_size, sizeof(struct raparms), GFP_KERNEL);
1888
1889         if (!raparml) {
1890                 printk(KERN_WARNING
1891                         "nfsd: Could not allocate memory read-ahead cache.\n");
1892                 return -ENOMEM;
1893         }
1894
1895         dprintk("nfsd: allocating %d readahead buffers.\n", cache_size);
1896         for (i = 0 ; i < RAPARM_HASH_SIZE ; i++) {
1897                 raparm_hash[i].pb_head = NULL;
1898                 spin_lock_init(&raparm_hash[i].pb_lock);
1899         }
1900         nperbucket = cache_size >> RAPARM_HASH_BITS;
1901         for (i = 0; i < cache_size - 1; i++) {
1902                 if (i % nperbucket == 0)
1903                         raparm_hash[j++].pb_head = raparml + i;
1904                 if (i % nperbucket < nperbucket-1)
1905                         raparml[i].p_next = raparml + i + 1;
1906         }
1907
1908         nfsdstats.ra_size = cache_size;
1909         return 0;
1910 }
1911
1912 #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
1913 struct posix_acl *
1914 nfsd_get_posix_acl(struct svc_fh *fhp, int type)
1915 {
1916         struct inode *inode = fhp->fh_dentry->d_inode;
1917         char *name;
1918         void *value = NULL;
1919         ssize_t size;
1920         struct posix_acl *acl;
1921
1922         if (!IS_POSIXACL(inode))
1923                 return ERR_PTR(-EOPNOTSUPP);
1924
1925         switch (type) {
1926         case ACL_TYPE_ACCESS:
1927                 name = POSIX_ACL_XATTR_ACCESS;
1928                 break;
1929         case ACL_TYPE_DEFAULT:
1930                 name = POSIX_ACL_XATTR_DEFAULT;
1931                 break;
1932         default:
1933                 return ERR_PTR(-EOPNOTSUPP);
1934         }
1935
1936         size = nfsd_getxattr(fhp->fh_dentry, name, &value);
1937         if (size < 0)
1938                 return ERR_PTR(size);
1939
1940         acl = posix_acl_from_xattr(value, size);
1941         kfree(value);
1942         return acl;
1943 }
1944
1945 int
1946 nfsd_set_posix_acl(struct svc_fh *fhp, int type, struct posix_acl *acl)
1947 {
1948         struct inode *inode = fhp->fh_dentry->d_inode;
1949         char *name;
1950         void *value = NULL;
1951         size_t size;
1952         int error;
1953
1954         if (!IS_POSIXACL(inode) || !inode->i_op ||
1955             !inode->i_op->setxattr || !inode->i_op->removexattr)
1956                 return -EOPNOTSUPP;
1957         switch(type) {
1958                 case ACL_TYPE_ACCESS:
1959                         name = POSIX_ACL_XATTR_ACCESS;
1960                         break;
1961                 case ACL_TYPE_DEFAULT:
1962                         name = POSIX_ACL_XATTR_DEFAULT;
1963                         break;
1964                 default:
1965                         return -EOPNOTSUPP;
1966         }
1967
1968         if (acl && acl->a_count) {
1969                 size = posix_acl_xattr_size(acl->a_count);
1970                 value = kmalloc(size, GFP_KERNEL);
1971                 if (!value)
1972                         return -ENOMEM;
1973                 error = posix_acl_to_xattr(acl, value, size);
1974                 if (error < 0)
1975                         goto getout;
1976                 size = error;
1977         } else
1978                 size = 0;
1979
1980         if (size)
1981                 error = vfs_setxattr(fhp->fh_dentry, name, value, size, 0);
1982         else {
1983                 if (!S_ISDIR(inode->i_mode) && type == ACL_TYPE_DEFAULT)
1984                         error = 0;
1985                 else {
1986                         error = vfs_removexattr(fhp->fh_dentry, name);
1987                         if (error == -ENODATA)
1988                                 error = 0;
1989                 }
1990         }
1991
1992 getout:
1993         kfree(value);
1994         return error;
1995 }
1996 #endif  /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */