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