vserver 1.9.3
[linux-2.6.git] / fs / nfs / dir.c
1 /*
2  *  linux/fs/nfs/dir.c
3  *
4  *  Copyright (C) 1992  Rick Sladkey
5  *
6  *  nfs directory handling functions
7  *
8  * 10 Apr 1996  Added silly rename for unlink   --okir
9  * 28 Sep 1996  Improved directory cache --okir
10  * 23 Aug 1997  Claus Heine claus@momo.math.rwth-aachen.de 
11  *              Re-implemented silly rename for unlink, newly implemented
12  *              silly rename for nfs_rename() following the suggestions
13  *              of Olaf Kirch (okir) found in this file.
14  *              Following Linus comments on my original hack, this version
15  *              depends only on the dcache stuff and doesn't touch the inode
16  *              layer (iput() and friends).
17  *  6 Jun 1999  Cache readdir lookups in the page cache. -DaveM
18  */
19
20 #include <linux/time.h>
21 #include <linux/errno.h>
22 #include <linux/stat.h>
23 #include <linux/fcntl.h>
24 #include <linux/string.h>
25 #include <linux/kernel.h>
26 #include <linux/slab.h>
27 #include <linux/mm.h>
28 #include <linux/sunrpc/clnt.h>
29 #include <linux/nfs_fs.h>
30 #include <linux/nfs_mount.h>
31 #include <linux/pagemap.h>
32 #include <linux/smp_lock.h>
33 #include <linux/namei.h>
34
35 #include "delegation.h"
36
37 #define NFS_PARANOIA 1
38 /* #define NFS_DEBUG_VERBOSE 1 */
39
40 static int nfs_opendir(struct inode *, struct file *);
41 static int nfs_readdir(struct file *, void *, filldir_t);
42 static struct dentry *nfs_lookup(struct inode *, struct dentry *, struct nameidata *);
43 static int nfs_cached_lookup(struct inode *, struct dentry *,
44                                 struct nfs_fh *, struct nfs_fattr *);
45 static int nfs_create(struct inode *, struct dentry *, int, struct nameidata *);
46 static int nfs_mkdir(struct inode *, struct dentry *, int);
47 static int nfs_rmdir(struct inode *, struct dentry *);
48 static int nfs_unlink(struct inode *, struct dentry *);
49 static int nfs_symlink(struct inode *, struct dentry *, const char *);
50 static int nfs_link(struct dentry *, struct inode *, struct dentry *);
51 static int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
52 static int nfs_rename(struct inode *, struct dentry *,
53                       struct inode *, struct dentry *);
54 static int nfs_fsync_dir(struct file *, struct dentry *, int);
55
56 struct file_operations nfs_dir_operations = {
57         .read           = generic_read_dir,
58         .readdir        = nfs_readdir,
59         .open           = nfs_opendir,
60         .release        = nfs_release,
61         .fsync          = nfs_fsync_dir,
62 };
63
64 struct inode_operations nfs_dir_inode_operations = {
65         .create         = nfs_create,
66         .lookup         = nfs_lookup,
67         .link           = nfs_link,
68         .unlink         = nfs_unlink,
69         .symlink        = nfs_symlink,
70         .mkdir          = nfs_mkdir,
71         .rmdir          = nfs_rmdir,
72         .mknod          = nfs_mknod,
73         .rename         = nfs_rename,
74         .permission     = nfs_permission,
75         .getattr        = nfs_getattr,
76         .setattr        = nfs_setattr,
77 };
78
79 #ifdef CONFIG_NFS_V4
80
81 static struct dentry *nfs_atomic_lookup(struct inode *, struct dentry *, struct nameidata *);
82 struct inode_operations nfs4_dir_inode_operations = {
83         .create         = nfs_create,
84         .lookup         = nfs_atomic_lookup,
85         .link           = nfs_link,
86         .unlink         = nfs_unlink,
87         .symlink        = nfs_symlink,
88         .mkdir          = nfs_mkdir,
89         .rmdir          = nfs_rmdir,
90         .mknod          = nfs_mknod,
91         .rename         = nfs_rename,
92         .permission     = nfs_permission,
93         .getattr        = nfs_getattr,
94         .setattr        = nfs_setattr,
95 };
96
97 #endif /* CONFIG_NFS_V4 */
98
99 /*
100  * Open file
101  */
102 static int
103 nfs_opendir(struct inode *inode, struct file *filp)
104 {
105         int res = 0;
106
107         lock_kernel();
108         /* Call generic open code in order to cache credentials */
109         if (!res)
110                 res = nfs_open(inode, filp);
111         unlock_kernel();
112         return res;
113 }
114
115 typedef u32 * (*decode_dirent_t)(u32 *, struct nfs_entry *, int);
116 typedef struct {
117         struct file     *file;
118         struct page     *page;
119         unsigned long   page_index;
120         u32             *ptr;
121         u64             target;
122         struct nfs_entry *entry;
123         decode_dirent_t decode;
124         int             plus;
125         int             error;
126 } nfs_readdir_descriptor_t;
127
128 /* Now we cache directories properly, by stuffing the dirent
129  * data directly in the page cache.
130  *
131  * Inode invalidation due to refresh etc. takes care of
132  * _everything_, no sloppy entry flushing logic, no extraneous
133  * copying, network direct to page cache, the way it was meant
134  * to be.
135  *
136  * NOTE: Dirent information verification is done always by the
137  *       page-in of the RPC reply, nowhere else, this simplies
138  *       things substantially.
139  */
140 static
141 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
142 {
143         struct file     *file = desc->file;
144         struct inode    *inode = file->f_dentry->d_inode;
145         struct rpc_cred *cred = nfs_file_cred(file);
146         unsigned long   timestamp;
147         int             error;
148
149         dfprintk(VFS, "NFS: nfs_readdir_filler() reading cookie %Lu into page %lu.\n", (long long)desc->entry->cookie, page->index);
150
151  again:
152         timestamp = jiffies;
153         error = NFS_PROTO(inode)->readdir(file->f_dentry, cred, desc->entry->cookie, page,
154                                           NFS_SERVER(inode)->dtsize, desc->plus);
155         if (error < 0) {
156                 /* We requested READDIRPLUS, but the server doesn't grok it */
157                 if (error == -ENOTSUPP && desc->plus) {
158                         NFS_SERVER(inode)->caps &= ~NFS_CAP_READDIRPLUS;
159                         NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS;
160                         desc->plus = 0;
161                         goto again;
162                 }
163                 goto error;
164         }
165         SetPageUptodate(page);
166         NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME;
167         /* Ensure consistent page alignment of the data.
168          * Note: assumes we have exclusive access to this mapping either
169          *       throught inode->i_sem or some other mechanism.
170          */
171         if (page->index == 0) {
172                 invalidate_inode_pages(inode->i_mapping);
173                 NFS_I(inode)->readdir_timestamp = timestamp;
174         }
175         unlock_page(page);
176         return 0;
177  error:
178         SetPageError(page);
179         unlock_page(page);
180         nfs_zap_caches(inode);
181         desc->error = error;
182         return -EIO;
183 }
184
185 static inline
186 int dir_decode(nfs_readdir_descriptor_t *desc)
187 {
188         u32     *p = desc->ptr;
189         p = desc->decode(p, desc->entry, desc->plus);
190         if (IS_ERR(p))
191                 return PTR_ERR(p);
192         desc->ptr = p;
193         return 0;
194 }
195
196 static inline
197 void dir_page_release(nfs_readdir_descriptor_t *desc)
198 {
199         kunmap(desc->page);
200         page_cache_release(desc->page);
201         desc->page = NULL;
202         desc->ptr = NULL;
203 }
204
205 /*
206  * Given a pointer to a buffer that has already been filled by a call
207  * to readdir, find the next entry.
208  *
209  * If the end of the buffer has been reached, return -EAGAIN, if not,
210  * return the offset within the buffer of the next entry to be
211  * read.
212  */
213 static inline
214 int find_dirent(nfs_readdir_descriptor_t *desc, struct page *page)
215 {
216         struct nfs_entry *entry = desc->entry;
217         int             loop_count = 0,
218                         status;
219
220         while((status = dir_decode(desc)) == 0) {
221                 dfprintk(VFS, "NFS: found cookie %Lu\n", (long long)entry->cookie);
222                 if (entry->prev_cookie == desc->target)
223                         break;
224                 if (loop_count++ > 200) {
225                         loop_count = 0;
226                         schedule();
227                 }
228         }
229         dfprintk(VFS, "NFS: find_dirent() returns %d\n", status);
230         return status;
231 }
232
233 /*
234  * Find the given page, and call find_dirent() in order to try to
235  * return the next entry.
236  */
237 static inline
238 int find_dirent_page(nfs_readdir_descriptor_t *desc)
239 {
240         struct inode    *inode = desc->file->f_dentry->d_inode;
241         struct page     *page;
242         int             status;
243
244         dfprintk(VFS, "NFS: find_dirent_page() searching directory page %ld\n", desc->page_index);
245
246         page = read_cache_page(inode->i_mapping, desc->page_index,
247                                (filler_t *)nfs_readdir_filler, desc);
248         if (IS_ERR(page)) {
249                 status = PTR_ERR(page);
250                 goto out;
251         }
252         if (!PageUptodate(page))
253                 goto read_error;
254
255         /* NOTE: Someone else may have changed the READDIRPLUS flag */
256         desc->page = page;
257         desc->ptr = kmap(page);         /* matching kunmap in nfs_do_filldir */
258         status = find_dirent(desc, page);
259         if (status < 0)
260                 dir_page_release(desc);
261  out:
262         dfprintk(VFS, "NFS: find_dirent_page() returns %d\n", status);
263         return status;
264  read_error:
265         page_cache_release(page);
266         return -EIO;
267 }
268
269 /*
270  * Recurse through the page cache pages, and return a
271  * filled nfs_entry structure of the next directory entry if possible.
272  *
273  * The target for the search is 'desc->target'.
274  */
275 static inline
276 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
277 {
278         int             loop_count = 0;
279         int             res;
280
281         dfprintk(VFS, "NFS: readdir_search_pagecache() searching for cookie %Lu\n", (long long)desc->target);
282         for (;;) {
283                 res = find_dirent_page(desc);
284                 if (res != -EAGAIN)
285                         break;
286                 /* Align to beginning of next page */
287                 desc->page_index ++;
288                 if (loop_count++ > 200) {
289                         loop_count = 0;
290                         schedule();
291                 }
292         }
293         dfprintk(VFS, "NFS: readdir_search_pagecache() returned %d\n", res);
294         return res;
295 }
296
297 static unsigned int nfs_type2dtype[] = {
298         DT_UNKNOWN,
299         DT_REG,
300         DT_DIR,
301         DT_BLK,
302         DT_CHR,
303         DT_LNK,
304         DT_SOCK,
305         DT_UNKNOWN,
306         DT_FIFO
307 };
308
309 static inline
310 unsigned int nfs_type_to_d_type(enum nfs_ftype type)
311 {
312         return nfs_type2dtype[type];
313 }
314
315 /*
316  * Once we've found the start of the dirent within a page: fill 'er up...
317  */
318 static 
319 int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent,
320                    filldir_t filldir)
321 {
322         struct file     *file = desc->file;
323         struct nfs_entry *entry = desc->entry;
324         unsigned long   fileid;
325         int             loop_count = 0,
326                         res;
327
328         dfprintk(VFS, "NFS: nfs_do_filldir() filling starting @ cookie %Lu\n", (long long)desc->target);
329
330         for(;;) {
331                 unsigned d_type = DT_UNKNOWN;
332                 /* Note: entry->prev_cookie contains the cookie for
333                  *       retrieving the current dirent on the server */
334                 fileid = nfs_fileid_to_ino_t(entry->ino);
335
336                 /* Use readdirplus info */
337                 if (desc->plus && (entry->fattr->valid & NFS_ATTR_FATTR))
338                         d_type = nfs_type_to_d_type(entry->fattr->type);
339
340                 res = filldir(dirent, entry->name, entry->len, 
341                               entry->prev_cookie, fileid, d_type);
342                 if (res < 0)
343                         break;
344                 file->f_pos = desc->target = entry->cookie;
345                 if (dir_decode(desc) != 0) {
346                         desc->page_index ++;
347                         break;
348                 }
349                 if (loop_count++ > 200) {
350                         loop_count = 0;
351                         schedule();
352                 }
353         }
354         dir_page_release(desc);
355
356         dfprintk(VFS, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", (long long)desc->target, res);
357         return res;
358 }
359
360 /*
361  * If we cannot find a cookie in our cache, we suspect that this is
362  * because it points to a deleted file, so we ask the server to return
363  * whatever it thinks is the next entry. We then feed this to filldir.
364  * If all goes well, we should then be able to find our way round the
365  * cache on the next call to readdir_search_pagecache();
366  *
367  * NOTE: we cannot add the anonymous page to the pagecache because
368  *       the data it contains might not be page aligned. Besides,
369  *       we should already have a complete representation of the
370  *       directory in the page cache by the time we get here.
371  */
372 static inline
373 int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
374                      filldir_t filldir)
375 {
376         struct file     *file = desc->file;
377         struct inode    *inode = file->f_dentry->d_inode;
378         struct rpc_cred *cred = nfs_file_cred(file);
379         struct page     *page = NULL;
380         int             status;
381
382         dfprintk(VFS, "NFS: uncached_readdir() searching for cookie %Lu\n", (long long)desc->target);
383
384         page = alloc_page(GFP_HIGHUSER);
385         if (!page) {
386                 status = -ENOMEM;
387                 goto out;
388         }
389         desc->error = NFS_PROTO(inode)->readdir(file->f_dentry, cred, desc->target,
390                                                 page,
391                                                 NFS_SERVER(inode)->dtsize,
392                                                 desc->plus);
393         NFS_FLAGS(inode) |= NFS_INO_INVALID_ATIME;
394         desc->page = page;
395         desc->ptr = kmap(page);         /* matching kunmap in nfs_do_filldir */
396         if (desc->error >= 0) {
397                 if ((status = dir_decode(desc)) == 0)
398                         desc->entry->prev_cookie = desc->target;
399         } else
400                 status = -EIO;
401         if (status < 0)
402                 goto out_release;
403
404         status = nfs_do_filldir(desc, dirent, filldir);
405
406         /* Reset read descriptor so it searches the page cache from
407          * the start upon the next call to readdir_search_pagecache() */
408         desc->page_index = 0;
409         desc->entry->cookie = desc->entry->prev_cookie = 0;
410         desc->entry->eof = 0;
411  out:
412         dfprintk(VFS, "NFS: uncached_readdir() returns %d\n", status);
413         return status;
414  out_release:
415         dir_page_release(desc);
416         goto out;
417 }
418
419 /* The file offset position is now represented as a true offset into the
420  * page cache as is the case in most of the other filesystems.
421  */
422 static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
423 {
424         struct dentry   *dentry = filp->f_dentry;
425         struct inode    *inode = dentry->d_inode;
426         nfs_readdir_descriptor_t my_desc,
427                         *desc = &my_desc;
428         struct nfs_entry my_entry;
429         struct nfs_fh    fh;
430         struct nfs_fattr fattr;
431         long            res;
432
433         lock_kernel();
434
435         res = nfs_revalidate_inode(NFS_SERVER(inode), inode);
436         if (res < 0) {
437                 unlock_kernel();
438                 return res;
439         }
440
441         /*
442          * filp->f_pos points to the file offset in the page cache.
443          * but if the cache has meanwhile been zapped, we need to
444          * read from the last dirent to revalidate f_pos
445          * itself.
446          */
447         memset(desc, 0, sizeof(*desc));
448
449         desc->file = filp;
450         desc->target = filp->f_pos;
451         desc->decode = NFS_PROTO(inode)->decode_dirent;
452         desc->plus = NFS_USE_READDIRPLUS(inode);
453
454         my_entry.cookie = my_entry.prev_cookie = 0;
455         my_entry.eof = 0;
456         my_entry.fh = &fh;
457         my_entry.fattr = &fattr;
458         desc->entry = &my_entry;
459
460         while(!desc->entry->eof) {
461                 res = readdir_search_pagecache(desc);
462                 if (res == -EBADCOOKIE) {
463                         /* This means either end of directory */
464                         if (desc->entry->cookie != desc->target) {
465                                 /* Or that the server has 'lost' a cookie */
466                                 res = uncached_readdir(desc, dirent, filldir);
467                                 if (res >= 0)
468                                         continue;
469                         }
470                         res = 0;
471                         break;
472                 }
473                 if (res == -ETOOSMALL && desc->plus) {
474                         NFS_FLAGS(inode) &= ~NFS_INO_ADVISE_RDPLUS;
475                         nfs_zap_caches(inode);
476                         desc->plus = 0;
477                         desc->entry->eof = 0;
478                         continue;
479                 }
480                 if (res < 0)
481                         break;
482
483                 res = nfs_do_filldir(desc, dirent, filldir);
484                 if (res < 0) {
485                         res = 0;
486                         break;
487                 }
488         }
489         unlock_kernel();
490         if (desc->error < 0)
491                 return desc->error;
492         if (res < 0)
493                 return res;
494         return 0;
495 }
496
497 /*
498  * All directory operations under NFS are synchronous, so fsync()
499  * is a dummy operation.
500  */
501 int nfs_fsync_dir(struct file *filp, struct dentry *dentry, int datasync)
502 {
503         return 0;
504 }
505
506 /*
507  * A check for whether or not the parent directory has changed.
508  * In the case it has, we assume that the dentries are untrustworthy
509  * and may need to be looked up again.
510  */
511 static inline int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
512 {
513         if (IS_ROOT(dentry))
514                 return 1;
515         if ((NFS_FLAGS(dir) & NFS_INO_INVALID_ATTR) != 0
516                         || nfs_attribute_timeout(dir))
517                 return 0;
518         return nfs_verify_change_attribute(dir, (unsigned long)dentry->d_fsdata);
519 }
520
521 static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf)
522 {
523         dentry->d_fsdata = (void *)verf;
524 }
525
526 /*
527  * Whenever an NFS operation succeeds, we know that the dentry
528  * is valid, so we update the revalidation timestamp.
529  */
530 static inline void nfs_renew_times(struct dentry * dentry)
531 {
532         dentry->d_time = jiffies;
533 }
534
535 static inline
536 int nfs_lookup_verify_inode(struct inode *inode, int isopen)
537 {
538         struct nfs_server *server = NFS_SERVER(inode);
539
540         if (isopen && !(server->flags & NFS_MOUNT_NOCTO))
541                 return __nfs_revalidate_inode(server, inode);
542         return nfs_revalidate_inode(server, inode);
543 }
544
545 /*
546  * We judge how long we want to trust negative
547  * dentries by looking at the parent inode mtime.
548  *
549  * If parent mtime has changed, we revalidate, else we wait for a
550  * period corresponding to the parent's attribute cache timeout value.
551  */
552 static inline
553 int nfs_neg_need_reval(struct inode *dir, struct dentry *dentry,
554                        struct nameidata *nd)
555 {
556         int ndflags = 0;
557
558         if (nd)
559                 ndflags = nd->flags;
560         /* Don't revalidate a negative dentry if we're creating a new file */
561         if ((ndflags & LOOKUP_CREATE) && !(ndflags & LOOKUP_CONTINUE))
562                 return 0;
563         return !nfs_check_verifier(dir, dentry);
564 }
565
566 /*
567  * This is called every time the dcache has a lookup hit,
568  * and we should check whether we can really trust that
569  * lookup.
570  *
571  * NOTE! The hit can be a negative hit too, don't assume
572  * we have an inode!
573  *
574  * If the parent directory is seen to have changed, we throw out the
575  * cached dentry and do a new lookup.
576  */
577 static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
578 {
579         struct inode *dir;
580         struct inode *inode;
581         struct dentry *parent;
582         int error;
583         struct nfs_fh fhandle;
584         struct nfs_fattr fattr;
585         unsigned long verifier;
586         int isopen = 0;
587
588         parent = dget_parent(dentry);
589         lock_kernel();
590         dir = parent->d_inode;
591         inode = dentry->d_inode;
592
593         if (nd && !(nd->flags & LOOKUP_CONTINUE) && (nd->flags & LOOKUP_OPEN))
594                 isopen = 1;
595
596         if (!inode) {
597                 if (nfs_neg_need_reval(dir, dentry, nd))
598                         goto out_bad;
599                 goto out_valid;
600         }
601
602         if (is_bad_inode(inode)) {
603                 dfprintk(VFS, "nfs_lookup_validate: %s/%s has dud inode\n",
604                         dentry->d_parent->d_name.name, dentry->d_name.name);
605                 goto out_bad;
606         }
607
608         /* Revalidate parent directory attribute cache */
609         nfs_revalidate_inode(NFS_SERVER(dir), dir);
610
611         /* Force a full look up iff the parent directory has changed */
612         if (nfs_check_verifier(dir, dentry)) {
613                 if (nfs_lookup_verify_inode(inode, isopen))
614                         goto out_zap_parent;
615                 goto out_valid;
616         }
617
618         /*
619          * Note: we're not holding inode->i_sem and so may be racing with
620          * operations that change the directory. We therefore save the
621          * change attribute *before* we do the RPC call.
622          */
623         verifier = nfs_save_change_attribute(dir);
624         error = nfs_cached_lookup(dir, dentry, &fhandle, &fattr);
625         if (!error) {
626                 if (nfs_compare_fh(NFS_FH(inode), &fhandle))
627                         goto out_bad;
628                 if (nfs_lookup_verify_inode(inode, isopen))
629                         goto out_zap_parent;
630                 goto out_valid_renew;
631         }
632
633         if (NFS_STALE(inode))
634                 goto out_bad;
635
636         error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, &fhandle, &fattr);
637         if (error)
638                 goto out_bad;
639         if (nfs_compare_fh(NFS_FH(inode), &fhandle))
640                 goto out_bad;
641         if ((error = nfs_refresh_inode(inode, &fattr)) != 0)
642                 goto out_bad;
643
644  out_valid_renew:
645         nfs_renew_times(dentry);
646         nfs_set_verifier(dentry, verifier);
647  out_valid:
648         unlock_kernel();
649         dput(parent);
650         return 1;
651 out_zap_parent:
652         nfs_zap_caches(dir);
653  out_bad:
654         NFS_CACHEINV(dir);
655         if (inode && S_ISDIR(inode->i_mode)) {
656                 /* Purge readdir caches. */
657                 nfs_zap_caches(inode);
658                 /* If we have submounts, don't unhash ! */
659                 if (have_submounts(dentry))
660                         goto out_valid;
661                 shrink_dcache_parent(dentry);
662         }
663         d_drop(dentry);
664         unlock_kernel();
665         dput(parent);
666         return 0;
667 }
668
669 /*
670  * This is called from dput() when d_count is going to 0.
671  */
672 static int nfs_dentry_delete(struct dentry *dentry)
673 {
674         dfprintk(VFS, "NFS: dentry_delete(%s/%s, %x)\n",
675                 dentry->d_parent->d_name.name, dentry->d_name.name,
676                 dentry->d_flags);
677
678         if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
679                 /* Unhash it, so that ->d_iput() would be called */
680                 return 1;
681         }
682         if (!(dentry->d_sb->s_flags & MS_ACTIVE)) {
683                 /* Unhash it, so that ancestors of killed async unlink
684                  * files will be cleaned up during umount */
685                 return 1;
686         }
687         return 0;
688
689 }
690
691 /*
692  * Called when the dentry loses inode.
693  * We use it to clean up silly-renamed files.
694  */
695 static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
696 {
697         if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
698                 lock_kernel();
699                 inode->i_nlink--;
700                 nfs_complete_unlink(dentry);
701                 unlock_kernel();
702         }
703         /* When creating a negative dentry, we want to renew d_time */
704         nfs_renew_times(dentry);
705         iput(inode);
706 }
707
708 struct dentry_operations nfs_dentry_operations = {
709         .d_revalidate   = nfs_lookup_revalidate,
710         .d_delete       = nfs_dentry_delete,
711         .d_iput         = nfs_dentry_iput,
712 };
713
714 static inline
715 int nfs_is_exclusive_create(struct inode *dir, struct nameidata *nd)
716 {
717         if (NFS_PROTO(dir)->version == 2)
718                 return 0;
719         if (!nd || (nd->flags & LOOKUP_CONTINUE) || !(nd->flags & LOOKUP_CREATE))
720                 return 0;
721         return (nd->intent.open.flags & O_EXCL) != 0;
722 }
723
724 static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd)
725 {
726         struct inode *inode = NULL;
727         int error;
728         struct nfs_fh fhandle;
729         struct nfs_fattr fattr;
730
731         dfprintk(VFS, "NFS: lookup(%s/%s)\n",
732                 dentry->d_parent->d_name.name, dentry->d_name.name);
733
734         error = -ENAMETOOLONG;
735         if (dentry->d_name.len > NFS_SERVER(dir)->namelen)
736                 goto out;
737
738         error = -ENOMEM;
739         dentry->d_op = NFS_PROTO(dir)->dentry_ops;
740
741         lock_kernel();
742         /* Revalidate parent directory attribute cache */
743         nfs_revalidate_inode(NFS_SERVER(dir), dir);
744
745         /* If we're doing an exclusive create, optimize away the lookup */
746         if (nfs_is_exclusive_create(dir, nd))
747                 goto no_entry;
748
749         error = nfs_cached_lookup(dir, dentry, &fhandle, &fattr);
750         if (error != 0) {
751                 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name,
752                                 &fhandle, &fattr);
753                 if (error == -ENOENT)
754                         goto no_entry;
755                 if (error != 0)
756                         goto out_unlock;
757         }
758         error = -EACCES;
759         inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr);
760         if (!inode)
761                 goto out_unlock;
762 no_entry:
763         error = 0;
764         d_add(dentry, inode);
765         nfs_renew_times(dentry);
766         nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
767 out_unlock:
768         unlock_kernel();
769 out:
770         BUG_ON(error > 0);
771         return ERR_PTR(error);
772 }
773
774 #ifdef CONFIG_NFS_V4
775 static int nfs_open_revalidate(struct dentry *, struct nameidata *);
776
777 struct dentry_operations nfs4_dentry_operations = {
778         .d_revalidate   = nfs_open_revalidate,
779         .d_delete       = nfs_dentry_delete,
780         .d_iput         = nfs_dentry_iput,
781 };
782
783 static int is_atomic_open(struct inode *dir, struct nameidata *nd)
784 {
785         if (!nd)
786                 return 0;
787         /* Check that we are indeed trying to open this file */
788         if ((nd->flags & LOOKUP_CONTINUE) || !(nd->flags & LOOKUP_OPEN))
789                 return 0;
790         /* NFS does not (yet) have a stateful open for directories */
791         if (nd->flags & LOOKUP_DIRECTORY)
792                 return 0;
793         /* Are we trying to write to a read only partition? */
794         if (IS_RDONLY(dir) && (nd->intent.open.flags & (O_CREAT|O_TRUNC|FMODE_WRITE)))
795                 return 0;
796         return 1;
797 }
798
799 static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
800 {
801         struct inode *inode = NULL;
802         int error = 0;
803
804         /* Check that we are indeed trying to open this file */
805         if (!is_atomic_open(dir, nd))
806                 goto no_open;
807
808         if (dentry->d_name.len > NFS_SERVER(dir)->namelen) {
809                 error = -ENAMETOOLONG;
810                 goto out;
811         }
812         dentry->d_op = NFS_PROTO(dir)->dentry_ops;
813
814         /* Let vfs_create() deal with O_EXCL */
815         if (nd->intent.open.flags & O_EXCL)
816                 goto no_entry;
817
818         /* Open the file on the server */
819         lock_kernel();
820         /* Revalidate parent directory attribute cache */
821         nfs_revalidate_inode(NFS_SERVER(dir), dir);
822
823         if (nd->intent.open.flags & O_CREAT) {
824                 nfs_begin_data_update(dir);
825                 inode = nfs4_atomic_open(dir, dentry, nd);
826                 nfs_end_data_update(dir);
827         } else
828                 inode = nfs4_atomic_open(dir, dentry, nd);
829         unlock_kernel();
830         if (IS_ERR(inode)) {
831                 error = PTR_ERR(inode);
832                 switch (error) {
833                         /* Make a negative dentry */
834                         case -ENOENT:
835                                 inode = NULL;
836                                 break;
837                         /* This turned out not to be a regular file */
838                         case -ELOOP:
839                                 if (!(nd->intent.open.flags & O_NOFOLLOW))
840                                         goto no_open;
841                         /* case -EISDIR: */
842                         /* case -EINVAL: */
843                         default:
844                                 goto out;
845                 }
846         }
847 no_entry:
848         d_add(dentry, inode);
849         nfs_renew_times(dentry);
850         nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
851 out:
852         BUG_ON(error > 0);
853         return ERR_PTR(error);
854 no_open:
855         return nfs_lookup(dir, dentry, nd);
856 }
857
858 static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
859 {
860         struct dentry *parent = NULL;
861         struct inode *inode = dentry->d_inode;
862         struct inode *dir;
863         unsigned long verifier;
864         int openflags, ret = 0;
865
866         parent = dget_parent(dentry);
867         dir = parent->d_inode;
868         if (!is_atomic_open(dir, nd))
869                 goto no_open;
870         /* We can't create new files in nfs_open_revalidate(), so we
871          * optimize away revalidation of negative dentries.
872          */
873         if (inode == NULL)
874                 goto out;
875         /* NFS only supports OPEN on regular files */
876         if (!S_ISREG(inode->i_mode))
877                 goto no_open;
878         openflags = nd->intent.open.flags;
879         /* We cannot do exclusive creation on a positive dentry */
880         if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
881                 goto no_open;
882         /* We can't create new files, or truncate existing ones here */
883         openflags &= ~(O_CREAT|O_TRUNC);
884
885         /*
886          * Note: we're not holding inode->i_sem and so may be racing with
887          * operations that change the directory. We therefore save the
888          * change attribute *before* we do the RPC call.
889          */
890         lock_kernel();
891         verifier = nfs_save_change_attribute(dir);
892         ret = nfs4_open_revalidate(dir, dentry, openflags);
893         if (!ret)
894                 nfs_set_verifier(dentry, verifier);
895         unlock_kernel();
896 out:
897         dput(parent);
898         if (!ret)
899                 d_drop(dentry);
900         return ret;
901 no_open:
902         dput(parent);
903         if (inode != NULL && nfs_have_delegation(inode, FMODE_READ))
904                 return 1;
905         return nfs_lookup_revalidate(dentry, nd);
906 }
907 #endif /* CONFIG_NFSV4 */
908
909 static inline
910 int find_dirent_name(nfs_readdir_descriptor_t *desc, struct page *page, struct dentry *dentry)
911 {
912         struct nfs_entry *entry = desc->entry;
913         int              status;
914
915         while((status = dir_decode(desc)) == 0) {
916                 if (entry->len != dentry->d_name.len)
917                         continue;
918                 if (memcmp(entry->name, dentry->d_name.name, entry->len))
919                         continue;
920                 if (!(entry->fattr->valid & NFS_ATTR_FATTR))
921                         continue;
922                 break;
923         }
924         return status;
925 }
926
927 /*
928  * Use the cached Readdirplus results in order to avoid a LOOKUP call
929  * whenever we believe that the parent directory has not changed.
930  *
931  * We assume that any file creation/rename changes the directory mtime.
932  * As this results in a page cache invalidation whenever it occurs,
933  * we don't require any other tests for cache coherency.
934  */
935 static
936 int nfs_cached_lookup(struct inode *dir, struct dentry *dentry,
937                         struct nfs_fh *fh, struct nfs_fattr *fattr)
938 {
939         nfs_readdir_descriptor_t desc;
940         struct nfs_server *server;
941         struct nfs_entry entry;
942         struct page *page;
943         unsigned long timestamp;
944         int res;
945
946         if (!NFS_USE_READDIRPLUS(dir))
947                 return -ENOENT;
948         server = NFS_SERVER(dir);
949         /* Don't use readdirplus unless the cache is stable */
950         if ((server->flags & NFS_MOUNT_NOAC) != 0
951                         || nfs_caches_unstable(dir)
952                         || nfs_attribute_timeout(dir))
953                 return -ENOENT;
954         if ((NFS_FLAGS(dir) & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA)) != 0)
955                 return -ENOENT;
956         timestamp = NFS_I(dir)->readdir_timestamp;
957
958         entry.fh = fh;
959         entry.fattr = fattr;
960
961         desc.decode = NFS_PROTO(dir)->decode_dirent;
962         desc.entry = &entry;
963         desc.page_index = 0;
964         desc.plus = 1;
965
966         for(;(page = find_get_page(dir->i_mapping, desc.page_index)); desc.page_index++) {
967
968                 res = -EIO;
969                 if (PageUptodate(page)) {
970                         void * kaddr = kmap_atomic(page, KM_USER0);
971                         desc.ptr = kaddr;
972                         res = find_dirent_name(&desc, page, dentry);
973                         kunmap_atomic(kaddr, KM_USER0);
974                 }
975                 page_cache_release(page);
976
977                 if (res == 0)
978                         goto out_found;
979                 if (res != -EAGAIN)
980                         break;
981         }
982         return -ENOENT;
983  out_found:
984         fattr->timestamp = timestamp;
985         return 0;
986 }
987
988 /*
989  * Code common to create, mkdir, and mknod.
990  */
991 static int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
992                                 struct nfs_fattr *fattr)
993 {
994         struct inode *inode;
995         int error = -EACCES;
996
997         /* We may have been initialized further down */
998         if (dentry->d_inode)
999                 return 0;
1000         if (fhandle->size == 0) {
1001                 struct inode *dir = dentry->d_parent->d_inode;
1002                 error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr);
1003                 if (error)
1004                         goto out_err;
1005         }
1006         if (!(fattr->valid & NFS_ATTR_FATTR)) {
1007                 struct nfs_server *server = NFS_SB(dentry->d_sb);
1008                 error = server->rpc_ops->getattr(server, fhandle, fattr);
1009                 if (error < 0)
1010                         goto out_err;
1011         }
1012         inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
1013         if (inode) {
1014                 d_instantiate(dentry, inode);
1015                 nfs_renew_times(dentry);
1016                 nfs_set_verifier(dentry, nfs_save_change_attribute(dentry->d_parent->d_inode));
1017                 return 0;
1018         }
1019         error = -ENOMEM;
1020 out_err:
1021         d_drop(dentry);
1022         return error;
1023 }
1024
1025 /*
1026  * Following a failed create operation, we drop the dentry rather
1027  * than retain a negative dentry. This avoids a problem in the event
1028  * that the operation succeeded on the server, but an error in the
1029  * reply path made it appear to have failed.
1030  */
1031 static int nfs_create(struct inode *dir, struct dentry *dentry, int mode,
1032                 struct nameidata *nd)
1033 {
1034         struct iattr attr;
1035         struct inode *inode;
1036         int error;
1037         int open_flags = 0;
1038
1039         dfprintk(VFS, "NFS: create(%s/%ld, %s\n", dir->i_sb->s_id, 
1040                 dir->i_ino, dentry->d_name.name);
1041
1042         attr.ia_mode = mode;
1043         attr.ia_valid = ATTR_MODE;
1044
1045         if (nd && (nd->flags & LOOKUP_CREATE))
1046                 open_flags = nd->intent.open.flags;
1047
1048         /*
1049          * The 0 argument passed into the create function should one day
1050          * contain the O_EXCL flag if requested. This allows NFSv3 to
1051          * select the appropriate create strategy. Currently open_namei
1052          * does not pass the create flags.
1053          */
1054         lock_kernel();
1055         nfs_begin_data_update(dir);
1056         inode = NFS_PROTO(dir)->create(dir, &dentry->d_name, &attr, open_flags);
1057         nfs_end_data_update(dir);
1058         if (!IS_ERR(inode)) {
1059                 d_instantiate(dentry, inode);
1060                 nfs_renew_times(dentry);
1061                 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1062                 error = 0;
1063         } else {
1064                 error = PTR_ERR(inode);
1065                 d_drop(dentry);
1066         }
1067         unlock_kernel();
1068         return error;
1069 }
1070
1071 /*
1072  * See comments for nfs_proc_create regarding failed operations.
1073  */
1074 static int
1075 nfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
1076 {
1077         struct iattr attr;
1078         struct nfs_fattr fattr;
1079         struct nfs_fh fhandle;
1080         int error;
1081
1082         dfprintk(VFS, "NFS: mknod(%s/%ld, %s\n", dir->i_sb->s_id,
1083                 dir->i_ino, dentry->d_name.name);
1084
1085         if (!new_valid_dev(rdev))
1086                 return -EINVAL;
1087
1088         attr.ia_mode = mode;
1089         attr.ia_valid = ATTR_MODE;
1090
1091         lock_kernel();
1092         nfs_begin_data_update(dir);
1093         error = NFS_PROTO(dir)->mknod(dir, &dentry->d_name, &attr, rdev,
1094                                         &fhandle, &fattr);
1095         nfs_end_data_update(dir);
1096         if (!error)
1097                 error = nfs_instantiate(dentry, &fhandle, &fattr);
1098         else
1099                 d_drop(dentry);
1100         unlock_kernel();
1101         return error;
1102 }
1103
1104 /*
1105  * See comments for nfs_proc_create regarding failed operations.
1106  */
1107 static int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
1108 {
1109         struct iattr attr;
1110         struct nfs_fattr fattr;
1111         struct nfs_fh fhandle;
1112         int error;
1113
1114         dfprintk(VFS, "NFS: mkdir(%s/%ld, %s\n", dir->i_sb->s_id,
1115                 dir->i_ino, dentry->d_name.name);
1116
1117         attr.ia_valid = ATTR_MODE;
1118         attr.ia_mode = mode | S_IFDIR;
1119
1120         lock_kernel();
1121 #if 0
1122         /*
1123          * Always drop the dentry, we can't always depend on
1124          * the fattr returned by the server (AIX seems to be
1125          * broken). We're better off doing another lookup than
1126          * depending on potentially bogus information.
1127          */
1128         d_drop(dentry);
1129 #endif
1130         nfs_begin_data_update(dir);
1131         error = NFS_PROTO(dir)->mkdir(dir, &dentry->d_name, &attr, &fhandle,
1132                                         &fattr);
1133         nfs_end_data_update(dir);
1134         if (!error)
1135                 error = nfs_instantiate(dentry, &fhandle, &fattr);
1136         else
1137                 d_drop(dentry);
1138         unlock_kernel();
1139         return error;
1140 }
1141
1142 static int nfs_rmdir(struct inode *dir, struct dentry *dentry)
1143 {
1144         int error;
1145
1146         dfprintk(VFS, "NFS: rmdir(%s/%ld, %s\n", dir->i_sb->s_id,
1147                 dir->i_ino, dentry->d_name.name);
1148
1149         lock_kernel();
1150         nfs_begin_data_update(dir);
1151         error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
1152         /* Ensure the VFS deletes this inode */
1153         if (error == 0 && dentry->d_inode != NULL)
1154                 dentry->d_inode->i_nlink = 0;
1155         nfs_end_data_update(dir);
1156         unlock_kernel();
1157
1158         return error;
1159 }
1160
1161 static int nfs_sillyrename(struct inode *dir, struct dentry *dentry)
1162 {
1163         static unsigned int sillycounter;
1164         const int      i_inosize  = sizeof(dir->i_ino)*2;
1165         const int      countersize = sizeof(sillycounter)*2;
1166         const int      slen       = strlen(".nfs") + i_inosize + countersize;
1167         char           silly[slen+1];
1168         struct qstr    qsilly;
1169         struct dentry *sdentry;
1170         int            error = -EIO;
1171
1172         dfprintk(VFS, "NFS: silly-rename(%s/%s, ct=%d)\n",
1173                 dentry->d_parent->d_name.name, dentry->d_name.name, 
1174                 atomic_read(&dentry->d_count));
1175
1176 #ifdef NFS_PARANOIA
1177 if (!dentry->d_inode)
1178 printk("NFS: silly-renaming %s/%s, negative dentry??\n",
1179 dentry->d_parent->d_name.name, dentry->d_name.name);
1180 #endif
1181         /*
1182          * We don't allow a dentry to be silly-renamed twice.
1183          */
1184         error = -EBUSY;
1185         if (dentry->d_flags & DCACHE_NFSFS_RENAMED)
1186                 goto out;
1187
1188         sprintf(silly, ".nfs%*.*lx",
1189                 i_inosize, i_inosize, dentry->d_inode->i_ino);
1190
1191         sdentry = NULL;
1192         do {
1193                 char *suffix = silly + slen - countersize;
1194
1195                 dput(sdentry);
1196                 sillycounter++;
1197                 sprintf(suffix, "%*.*x", countersize, countersize, sillycounter);
1198
1199                 dfprintk(VFS, "trying to rename %s to %s\n",
1200                          dentry->d_name.name, silly);
1201                 
1202                 sdentry = lookup_one_len(silly, dentry->d_parent, slen);
1203                 /*
1204                  * N.B. Better to return EBUSY here ... it could be
1205                  * dangerous to delete the file while it's in use.
1206                  */
1207                 if (IS_ERR(sdentry))
1208                         goto out;
1209         } while(sdentry->d_inode != NULL); /* need negative lookup */
1210
1211         qsilly.name = silly;
1212         qsilly.len  = strlen(silly);
1213         nfs_begin_data_update(dir);
1214         if (dentry->d_inode) {
1215                 nfs_begin_data_update(dentry->d_inode);
1216                 error = NFS_PROTO(dir)->rename(dir, &dentry->d_name,
1217                                 dir, &qsilly);
1218                 nfs_end_data_update(dentry->d_inode);
1219         } else
1220                 error = NFS_PROTO(dir)->rename(dir, &dentry->d_name,
1221                                 dir, &qsilly);
1222         nfs_end_data_update(dir);
1223         if (!error) {
1224                 nfs_renew_times(dentry);
1225                 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1226                 d_move(dentry, sdentry);
1227                 error = nfs_async_unlink(dentry);
1228                 /* If we return 0 we don't unlink */
1229         }
1230         dput(sdentry);
1231 out:
1232         return error;
1233 }
1234
1235 /*
1236  * Remove a file after making sure there are no pending writes,
1237  * and after checking that the file has only one user. 
1238  *
1239  * We invalidate the attribute cache and free the inode prior to the operation
1240  * to avoid possible races if the server reuses the inode.
1241  */
1242 static int nfs_safe_remove(struct dentry *dentry)
1243 {
1244         struct inode *dir = dentry->d_parent->d_inode;
1245         struct inode *inode = dentry->d_inode;
1246         int error = -EBUSY;
1247                 
1248         dfprintk(VFS, "NFS: safe_remove(%s/%s)\n",
1249                 dentry->d_parent->d_name.name, dentry->d_name.name);
1250
1251         /* If the dentry was sillyrenamed, we simply call d_delete() */
1252         if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
1253                 error = 0;
1254                 goto out;
1255         }
1256
1257         nfs_begin_data_update(dir);
1258         if (inode != NULL) {
1259                 nfs_begin_data_update(inode);
1260                 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
1261                 /* The VFS may want to delete this inode */
1262                 if (error == 0)
1263                         inode->i_nlink--;
1264                 nfs_end_data_update(inode);
1265         } else
1266                 error = NFS_PROTO(dir)->remove(dir, &dentry->d_name);
1267         nfs_end_data_update(dir);
1268 out:
1269         return error;
1270 }
1271
1272 /*  We do silly rename. In case sillyrename() returns -EBUSY, the inode
1273  *  belongs to an active ".nfs..." file and we return -EBUSY.
1274  *
1275  *  If sillyrename() returns 0, we do nothing, otherwise we unlink.
1276  */
1277 static int nfs_unlink(struct inode *dir, struct dentry *dentry)
1278 {
1279         int error;
1280         int need_rehash = 0;
1281
1282         dfprintk(VFS, "NFS: unlink(%s/%ld, %s)\n", dir->i_sb->s_id,
1283                 dir->i_ino, dentry->d_name.name);
1284
1285         lock_kernel();
1286         spin_lock(&dcache_lock);
1287         spin_lock(&dentry->d_lock);
1288         if (atomic_read(&dentry->d_count) > 1) {
1289                 spin_unlock(&dentry->d_lock);
1290                 spin_unlock(&dcache_lock);
1291                 error = nfs_sillyrename(dir, dentry);
1292                 unlock_kernel();
1293                 return error;
1294         }
1295         if (!d_unhashed(dentry)) {
1296                 __d_drop(dentry);
1297                 need_rehash = 1;
1298         }
1299         spin_unlock(&dentry->d_lock);
1300         spin_unlock(&dcache_lock);
1301         error = nfs_safe_remove(dentry);
1302         if (!error) {
1303                 nfs_renew_times(dentry);
1304                 nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
1305         } else if (need_rehash)
1306                 d_rehash(dentry);
1307         unlock_kernel();
1308         return error;
1309 }
1310
1311 static int
1312 nfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1313 {
1314         struct iattr attr;
1315         struct nfs_fattr sym_attr;
1316         struct nfs_fh sym_fh;
1317         struct qstr qsymname;
1318         int error;
1319
1320         dfprintk(VFS, "NFS: symlink(%s/%ld, %s, %s)\n", dir->i_sb->s_id,
1321                 dir->i_ino, dentry->d_name.name, symname);
1322
1323 #ifdef NFS_PARANOIA
1324 if (dentry->d_inode)
1325 printk("nfs_proc_symlink: %s/%s not negative!\n",
1326 dentry->d_parent->d_name.name, dentry->d_name.name);
1327 #endif
1328         /*
1329          * Fill in the sattr for the call.
1330          * Note: SunOS 4.1.2 crashes if the mode isn't initialized!
1331          */
1332         attr.ia_valid = ATTR_MODE;
1333         attr.ia_mode = S_IFLNK | S_IRWXUGO;
1334
1335         qsymname.name = symname;
1336         qsymname.len  = strlen(symname);
1337
1338         lock_kernel();
1339         nfs_begin_data_update(dir);
1340         error = NFS_PROTO(dir)->symlink(dir, &dentry->d_name, &qsymname,
1341                                           &attr, &sym_fh, &sym_attr);
1342         nfs_end_data_update(dir);
1343         if (!error) {
1344                 error = nfs_instantiate(dentry, &sym_fh, &sym_attr);
1345         } else {
1346                 if (error == -EEXIST)
1347                         printk("nfs_proc_symlink: %s/%s already exists??\n",
1348                                dentry->d_parent->d_name.name, dentry->d_name.name);
1349                 d_drop(dentry);
1350         }
1351         unlock_kernel();
1352         return error;
1353 }
1354
1355 static int 
1356 nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
1357 {
1358         struct inode *inode = old_dentry->d_inode;
1359         int error;
1360
1361         dfprintk(VFS, "NFS: link(%s/%s -> %s/%s)\n",
1362                 old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
1363                 dentry->d_parent->d_name.name, dentry->d_name.name);
1364
1365         /*
1366          * Drop the dentry in advance to force a new lookup.
1367          * Since nfs_proc_link doesn't return a file handle,
1368          * we can't use the existing dentry.
1369          */
1370         lock_kernel();
1371         d_drop(dentry);
1372
1373         nfs_begin_data_update(dir);
1374         nfs_begin_data_update(inode);
1375         error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
1376         nfs_end_data_update(inode);
1377         nfs_end_data_update(dir);
1378         unlock_kernel();
1379         return error;
1380 }
1381
1382 /*
1383  * RENAME
1384  * FIXME: Some nfsds, like the Linux user space nfsd, may generate a
1385  * different file handle for the same inode after a rename (e.g. when
1386  * moving to a different directory). A fail-safe method to do so would
1387  * be to look up old_dir/old_name, create a link to new_dir/new_name and
1388  * rename the old file using the sillyrename stuff. This way, the original
1389  * file in old_dir will go away when the last process iput()s the inode.
1390  *
1391  * FIXED.
1392  * 
1393  * It actually works quite well. One needs to have the possibility for
1394  * at least one ".nfs..." file in each directory the file ever gets
1395  * moved or linked to which happens automagically with the new
1396  * implementation that only depends on the dcache stuff instead of
1397  * using the inode layer
1398  *
1399  * Unfortunately, things are a little more complicated than indicated
1400  * above. For a cross-directory move, we want to make sure we can get
1401  * rid of the old inode after the operation.  This means there must be
1402  * no pending writes (if it's a file), and the use count must be 1.
1403  * If these conditions are met, we can drop the dentries before doing
1404  * the rename.
1405  */
1406 static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
1407                       struct inode *new_dir, struct dentry *new_dentry)
1408 {
1409         struct inode *old_inode = old_dentry->d_inode;
1410         struct inode *new_inode = new_dentry->d_inode;
1411         struct dentry *dentry = NULL, *rehash = NULL;
1412         int error = -EBUSY;
1413
1414         /*
1415          * To prevent any new references to the target during the rename,
1416          * we unhash the dentry and free the inode in advance.
1417          */
1418         lock_kernel();
1419         if (!d_unhashed(new_dentry)) {
1420                 d_drop(new_dentry);
1421                 rehash = new_dentry;
1422         }
1423
1424         dfprintk(VFS, "NFS: rename(%s/%s -> %s/%s, ct=%d)\n",
1425                  old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
1426                  new_dentry->d_parent->d_name.name, new_dentry->d_name.name,
1427                  atomic_read(&new_dentry->d_count));
1428
1429         /*
1430          * First check whether the target is busy ... we can't
1431          * safely do _any_ rename if the target is in use.
1432          *
1433          * For files, make a copy of the dentry and then do a 
1434          * silly-rename. If the silly-rename succeeds, the
1435          * copied dentry is hashed and becomes the new target.
1436          */
1437         if (!new_inode)
1438                 goto go_ahead;
1439         if (S_ISDIR(new_inode->i_mode))
1440                 goto out;
1441         else if (atomic_read(&new_dentry->d_count) > 1) {
1442                 int err;
1443                 /* copy the target dentry's name */
1444                 dentry = d_alloc(new_dentry->d_parent,
1445                                  &new_dentry->d_name);
1446                 if (!dentry)
1447                         goto out;
1448
1449                 /* silly-rename the existing target ... */
1450                 err = nfs_sillyrename(new_dir, new_dentry);
1451                 if (!err) {
1452                         new_dentry = rehash = dentry;
1453                         new_inode = NULL;
1454                         /* instantiate the replacement target */
1455                         d_instantiate(new_dentry, NULL);
1456                 }
1457
1458                 /* dentry still busy? */
1459                 if (atomic_read(&new_dentry->d_count) > 1) {
1460 #ifdef NFS_PARANOIA
1461                         printk("nfs_rename: target %s/%s busy, d_count=%d\n",
1462                                new_dentry->d_parent->d_name.name,
1463                                new_dentry->d_name.name,
1464                                atomic_read(&new_dentry->d_count));
1465 #endif
1466                         goto out;
1467                 }
1468         }
1469
1470 go_ahead:
1471         /*
1472          * ... prune child dentries and writebacks if needed.
1473          */
1474         if (atomic_read(&old_dentry->d_count) > 1) {
1475                 nfs_wb_all(old_inode);
1476                 shrink_dcache_parent(old_dentry);
1477         }
1478
1479         if (new_inode)
1480                 d_delete(new_dentry);
1481
1482         nfs_begin_data_update(old_dir);
1483         nfs_begin_data_update(new_dir);
1484         nfs_begin_data_update(old_inode);
1485         error = NFS_PROTO(old_dir)->rename(old_dir, &old_dentry->d_name,
1486                                            new_dir, &new_dentry->d_name);
1487         nfs_end_data_update(old_inode);
1488         nfs_end_data_update(new_dir);
1489         nfs_end_data_update(old_dir);
1490 out:
1491         if (rehash)
1492                 d_rehash(rehash);
1493         if (!error) {
1494                 if (!S_ISDIR(old_inode->i_mode))
1495                         d_move(old_dentry, new_dentry);
1496                 nfs_renew_times(new_dentry);
1497                 nfs_set_verifier(new_dentry, nfs_save_change_attribute(new_dir));
1498         }
1499
1500         /* new dentry created? */
1501         if (dentry)
1502                 dput(dentry);
1503         unlock_kernel();
1504         return error;
1505 }
1506
1507 int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, struct nfs_access_entry *res)
1508 {
1509         struct nfs_access_entry *cache = &NFS_I(inode)->cache_access;
1510
1511         if (cache->cred != cred
1512                         || time_after(jiffies, cache->jiffies + NFS_ATTRTIMEO(inode))
1513                         || (NFS_FLAGS(inode) & NFS_INO_INVALID_ATTR))
1514                 return -ENOENT;
1515         memcpy(res, cache, sizeof(*res));
1516         return 0;
1517 }
1518
1519 void nfs_access_add_cache(struct inode *inode, struct nfs_access_entry *set)
1520 {
1521         struct nfs_access_entry *cache = &NFS_I(inode)->cache_access;
1522
1523         if (cache->cred != set->cred) {
1524                 if (cache->cred)
1525                         put_rpccred(cache->cred);
1526                 cache->cred = get_rpccred(set->cred);
1527         }
1528         cache->jiffies = set->jiffies;
1529         cache->mask = set->mask;
1530 }
1531
1532 static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)
1533 {
1534         struct nfs_access_entry cache;
1535         int status;
1536
1537         status = nfs_access_get_cached(inode, cred, &cache);
1538         if (status == 0)
1539                 goto out;
1540
1541         /* Be clever: ask server to check for all possible rights */
1542         cache.mask = MAY_EXEC | MAY_WRITE | MAY_READ;
1543         cache.cred = cred;
1544         cache.jiffies = jiffies;
1545         status = NFS_PROTO(inode)->access(inode, &cache);
1546         if (status != 0)
1547                 return status;
1548         nfs_access_add_cache(inode, &cache);
1549 out:
1550         if ((cache.mask & mask) == mask)
1551                 return 0;
1552         return -EACCES;
1553 }
1554
1555 int nfs_permission(struct inode *inode, int mask, struct nameidata *nd)
1556 {
1557         struct rpc_cred *cred;
1558         int mode = inode->i_mode;
1559         int res;
1560
1561         if (mask == 0)
1562                 return 0;
1563         if (mask & MAY_WRITE) {
1564                 /*
1565                  *
1566                  * Nobody gets write access to a read-only fs.
1567                  *
1568                  */
1569                 if (IS_RDONLY(inode) &&
1570                     (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
1571                         return -EROFS;
1572
1573                 /*
1574                  *
1575                  * Nobody gets write access to an immutable file.
1576                  *
1577                  */
1578                 if (IS_IMMUTABLE(inode))
1579                         return -EACCES;
1580         }
1581         /* Are we checking permissions on anything other than lookup/execute? */
1582         if ((mask & MAY_EXEC) == 0) {
1583                 /* We only need to check permissions on file open() and access() */
1584                 if (!nd || !(nd->flags & (LOOKUP_OPEN|LOOKUP_ACCESS)))
1585                         return 0;
1586                 /* NFSv4 has atomic_open... */
1587                 if (NFS_PROTO(inode)->version > 3 && (nd->flags & LOOKUP_OPEN))
1588                         return 0;
1589         }
1590
1591         lock_kernel();
1592
1593         if (!NFS_PROTO(inode)->access)
1594                 goto out_notsup;
1595
1596         cred = rpcauth_lookupcred(NFS_CLIENT(inode)->cl_auth, 0);
1597         res = nfs_do_access(inode, cred, mask);
1598         put_rpccred(cred);
1599         unlock_kernel();
1600         return res;
1601 out_notsup:
1602         nfs_revalidate_inode(NFS_SERVER(inode), inode);
1603         res = vfs_permission(inode, mask);
1604         unlock_kernel();
1605         return res;
1606 }
1607
1608 /*
1609  * Local variables:
1610  *  version-control: t
1611  *  kept-new-versions: 5
1612  * End:
1613  */