vfs.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:37k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #define MSNFS /* HACK HACK */
  2. /*
  3.  * linux/fs/nfsd/vfs.c
  4.  *
  5.  * File operations used by nfsd. Some of these have been ripped from
  6.  * other parts of the kernel because they weren't in ksyms.c, others
  7.  * are partial duplicates with added or changed functionality.
  8.  *
  9.  * Note that several functions dget() the dentry upon which they want
  10.  * to act, most notably those that create directory entries. Response
  11.  * dentry's are dput()'d if necessary in the release callback.
  12.  * So if you notice code paths that apparently fail to dput() the
  13.  * dentry, don't worry--they have been taken care of.
  14.  *
  15.  * Copyright (C) 1995-1999 Olaf Kirch <okir@monad.swb.de>
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/version.h>
  19. #include <linux/string.h>
  20. #include <linux/sched.h>
  21. #include <linux/errno.h>
  22. #include <linux/locks.h>
  23. #include <linux/fs.h>
  24. #include <linux/major.h>
  25. #include <linux/ext2_fs.h>
  26. #include <linux/proc_fs.h>
  27. #include <linux/stat.h>
  28. #include <linux/fcntl.h>
  29. #include <linux/net.h>
  30. #include <linux/unistd.h>
  31. #include <linux/slab.h>
  32. #include <linux/in.h>
  33. #define __NO_VERSION__
  34. #include <linux/module.h>
  35. #include <linux/sunrpc/svc.h>
  36. #include <linux/nfsd/nfsd.h>
  37. #ifdef CONFIG_NFSD_V3
  38. #include <linux/nfs3.h>
  39. #include <linux/nfsd/xdr3.h>
  40. #endif /* CONFIG_NFSD_V3 */
  41. #include <linux/nfsd/nfsfh.h>
  42. #include <linux/quotaops.h>
  43. #include <asm/uaccess.h>
  44. #define NFSDDBG_FACILITY NFSDDBG_FILEOP
  45. #define NFSD_PARANOIA
  46. /* We must ignore files (but only files) which might have mandatory
  47.  * locks on them because there is no way to know if the accesser has
  48.  * the lock.
  49.  */
  50. #define IS_ISMNDLK(i) (S_ISREG((i)->i_mode) && MANDATORY_LOCK(i))
  51. /*
  52.  * This is a cache of readahead params that help us choose the proper
  53.  * readahead strategy. Initially, we set all readahead parameters to 0
  54.  * and let the VFS handle things.
  55.  * If you increase the number of cached files very much, you'll need to
  56.  * add a hash table here.
  57.  */
  58. struct raparms {
  59. struct raparms *p_next;
  60. unsigned int p_count;
  61. ino_t p_ino;
  62. dev_t p_dev;
  63. unsigned long p_reada,
  64. p_ramax,
  65. p_raend,
  66. p_ralen,
  67. p_rawin;
  68. };
  69. static struct raparms * raparml;
  70. static struct raparms * raparm_cache;
  71. /*
  72.  * Look up one component of a pathname.
  73.  * N.B. After this call _both_ fhp and resfh need an fh_put
  74.  *
  75.  * If the lookup would cross a mountpoint, and the mounted filesystem
  76.  * is exported to the client with NFSEXP_CROSSMNT, then the lookup is
  77.  * accepted as it stands and the mounted directory is
  78.  * returned. Otherwise the covered directory is returned.
  79.  * NOTE: this mountpoint crossing is not supported properly by all
  80.  *   clients and is explicitly disallowed for NFSv3
  81.  *      NeilBrown <neilb@cse.unsw.edu.au>
  82.  */
  83. int
  84. nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
  85. int len, struct svc_fh *resfh)
  86. {
  87. struct svc_export *exp;
  88. struct dentry *dparent;
  89. struct dentry *dentry;
  90. int err;
  91. dprintk("nfsd: nfsd_lookup(fh %s, %.*s)n", SVCFH_fmt(fhp), len,name);
  92. /* Obtain dentry and export. */
  93. err = fh_verify(rqstp, fhp, S_IFDIR, MAY_EXEC);
  94. if (err)
  95. goto out;
  96. dparent = fhp->fh_dentry;
  97. exp  = fhp->fh_export;
  98. err = nfserr_acces;
  99. /* Lookup the name, but don't follow links */
  100. if (isdotent(name, len)) {
  101. if (len==1)
  102. dentry = dget(dparent);
  103. else if (dparent != exp->ex_dentry)
  104. dentry = dget(dparent->d_parent);
  105. else if (!EX_CROSSMNT(exp))
  106. dentry = dget(dparent); /* .. == . just like at / */
  107. else {
  108. /* checking mountpoint crossing is very different when stepping up */
  109. struct svc_export *exp2 = NULL;
  110. struct dentry *dp;
  111. struct vfsmount *mnt = mntget(exp->ex_mnt);
  112. dentry = dget(dparent);
  113. while(follow_up(&mnt, &dentry))
  114. ;
  115. dp = dget(dentry->d_parent);
  116. dput(dentry);
  117. dentry = dp;
  118. for ( ; exp2 == NULL && dp->d_parent != dp;
  119.       dp=dp->d_parent)
  120. exp2 = exp_get(exp->ex_client, dp->d_inode->i_dev, dp->d_inode->i_ino);
  121. if (exp2==NULL) {
  122. dput(dentry);
  123. dentry = dget(dparent);
  124. } else {
  125. exp = exp2;
  126. }
  127. mntput(mnt);
  128. }
  129. } else {
  130. fh_lock(fhp);
  131. dentry = lookup_one_len(name, dparent, len);
  132. err = PTR_ERR(dentry);
  133. if (IS_ERR(dentry))
  134. goto out_nfserr;
  135. /*
  136.  * check if we have crossed a mount point ...
  137.  */
  138. if (d_mountpoint(dentry)) {
  139. struct svc_export *exp2 = NULL;
  140. struct vfsmount *mnt = mntget(exp->ex_mnt);
  141. struct dentry *mounts = dget(dentry);
  142. while (follow_down(&mnt,&mounts)&&d_mountpoint(mounts))
  143. ;
  144. exp2 = exp_get(rqstp->rq_client,
  145.        mounts->d_inode->i_dev,
  146.        mounts->d_inode->i_ino);
  147. if (exp2 && EX_CROSSMNT(exp2)) {
  148. /* successfully crossed mount point */
  149. exp = exp2;
  150. dput(dentry);
  151. dentry = mounts;
  152. } else
  153. dput(mounts);
  154. mntput(mnt);
  155. }
  156. }
  157. /*
  158.  * Note: we compose the file handle now, but as the
  159.  * dentry may be negative, it may need to be updated.
  160.  */
  161. err = fh_compose(resfh, exp, dentry, fhp);
  162. if (!err && !dentry->d_inode)
  163. err = nfserr_noent;
  164. out:
  165. return err;
  166. out_nfserr:
  167. err = nfserrno(err);
  168. goto out;
  169. }
  170. /*
  171.  * Set various file attributes.
  172.  * N.B. After this call fhp needs an fh_put
  173.  */
  174. int
  175. nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
  176.      int check_guard, time_t guardtime)
  177. {
  178. struct dentry *dentry;
  179. struct inode *inode;
  180. int accmode = MAY_SATTR;
  181. int ftype = 0;
  182. int imode;
  183. int err;
  184. int size_change = 0;
  185. if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE))
  186. accmode |= MAY_WRITE|MAY_OWNER_OVERRIDE;
  187. if (iap->ia_valid & ATTR_SIZE)
  188. ftype = S_IFREG;
  189. /* Get inode */
  190. err = fh_verify(rqstp, fhp, ftype, accmode);
  191. if (err || !iap->ia_valid)
  192. goto out;
  193. dentry = fhp->fh_dentry;
  194. inode = dentry->d_inode;
  195. /* NFSv2 does not differentiate between "set-[ac]time-to-now"
  196.  * which only requires access, and "set-[ac]time-to-X" which
  197.  * requires ownership.
  198.  * So if it looks like it might be "set both to the same time which
  199.  * is close to now", and if inode_change_ok fails, then we
  200.  * convert to "set to now" instead of "set to explicit time"
  201.  *
  202.  * We only call inode_change_ok as the last test as technically
  203.  * it is not an interface that we should be using.  It is only
  204.  * valid if the filesystem does not define it's own i_op->setattr.
  205.  */
  206. #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET)
  207. #define MAX_TOUCH_TIME_ERROR (30*60)
  208. if ((iap->ia_valid & BOTH_TIME_SET) == BOTH_TIME_SET
  209.     && iap->ia_mtime == iap->ia_atime
  210.     ) {
  211.     /* Looks probable.  Now just make sure time is in the right ballpark.
  212.      * Solaris, at least, doesn't seem to care what the time request is.
  213.      * We require it be within 30 minutes of now.
  214.      */
  215.     time_t delta = iap->ia_atime - CURRENT_TIME;
  216.     if (delta<0) delta = -delta;
  217.     if (delta < MAX_TOUCH_TIME_ERROR &&
  218. inode_change_ok(inode, iap) != 0) {
  219. /* turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME
  220.  * this will cause notify_change to set these times to "now"
  221.  */
  222. iap->ia_valid &= ~BOTH_TIME_SET;
  223.     }
  224. }
  225.     
  226. /* The size case is special. It changes the file as well as the attributes.  */
  227. if (iap->ia_valid & ATTR_SIZE) {
  228. if (iap->ia_size < inode->i_size) {
  229. err = nfsd_permission(fhp->fh_export, dentry, MAY_TRUNC|MAY_OWNER_OVERRIDE);
  230. if (err)
  231. goto out;
  232. }
  233. /*
  234.  * If we are changing the size of the file, then
  235.  * we need to break all leases.
  236.  */
  237. err = get_lease(inode, FMODE_WRITE);
  238. if (err)
  239. goto out_nfserr;
  240. err = get_write_access(inode);
  241. if (err)
  242. goto out_nfserr;
  243. err = locks_verify_truncate(inode, NULL, iap->ia_size);
  244. if (err) {
  245. put_write_access(inode);
  246. goto out_nfserr;
  247. }
  248. DQUOT_INIT(inode);
  249. }
  250. imode = inode->i_mode;
  251. if (iap->ia_valid & ATTR_MODE) {
  252. iap->ia_mode &= S_IALLUGO;
  253. imode = iap->ia_mode |= (imode & ~S_IALLUGO);
  254. }
  255. /* Revoke setuid/setgid bit on chown/chgrp */
  256. if ((iap->ia_valid & ATTR_UID) && (imode & S_ISUID)
  257.  && iap->ia_uid != inode->i_uid) {
  258. iap->ia_valid |= ATTR_MODE;
  259. iap->ia_mode = imode &= ~S_ISUID;
  260. }
  261. if ((iap->ia_valid & ATTR_GID) && (imode & S_ISGID)
  262.  && iap->ia_gid != inode->i_gid) {
  263. iap->ia_valid |= ATTR_MODE;
  264. iap->ia_mode = imode &= ~S_ISGID;
  265. }
  266. /* Change the attributes. */
  267. iap->ia_valid |= ATTR_CTIME;
  268. if (iap->ia_valid & ATTR_SIZE) {
  269. fh_lock(fhp);
  270. size_change = 1;
  271. }
  272. err = nfserr_notsync;
  273. if (!check_guard || guardtime == inode->i_ctime) {
  274. err = notify_change(dentry, iap);
  275. err = nfserrno(err);
  276. }
  277. if (size_change) {
  278. fh_unlock(fhp);
  279. put_write_access(inode);
  280. }
  281. if (!err)
  282. if (EX_ISSYNC(fhp->fh_export))
  283. write_inode_now(inode, 1);
  284. out:
  285. return err;
  286. out_nfserr:
  287. err = nfserrno(err);
  288. goto out;
  289. }
  290. #ifdef CONFIG_NFSD_V3
  291. /*
  292.  * Check server access rights to a file system object
  293.  */
  294. struct accessmap {
  295. u32 access;
  296. int how;
  297. };
  298. static struct accessmap nfs3_regaccess[] = {
  299.     { NFS3_ACCESS_READ, MAY_READ },
  300.     { NFS3_ACCESS_EXECUTE, MAY_EXEC },
  301.     { NFS3_ACCESS_MODIFY, MAY_WRITE|MAY_TRUNC },
  302.     { NFS3_ACCESS_EXTEND, MAY_WRITE },
  303.     { 0, 0 }
  304. };
  305. static struct accessmap nfs3_diraccess[] = {
  306.     { NFS3_ACCESS_READ, MAY_READ },
  307.     { NFS3_ACCESS_LOOKUP, MAY_EXEC },
  308.     { NFS3_ACCESS_MODIFY, MAY_EXEC|MAY_WRITE|MAY_TRUNC },
  309.     { NFS3_ACCESS_EXTEND, MAY_EXEC|MAY_WRITE },
  310.     { NFS3_ACCESS_DELETE, MAY_REMOVE },
  311.     { 0, 0 }
  312. };
  313. static struct accessmap nfs3_anyaccess[] = {
  314. /* Some clients - Solaris 2.6 at least, make an access call
  315.  * to the server to check for access for things like /dev/null
  316.  * (which really, the server doesn't care about).  So
  317.  * We provide simple access checking for them, looking
  318.  * mainly at mode bits
  319.  */
  320.     { NFS3_ACCESS_READ, MAY_READ },
  321.     { NFS3_ACCESS_EXECUTE, MAY_EXEC },
  322.     { NFS3_ACCESS_MODIFY, MAY_WRITE },
  323.     { NFS3_ACCESS_EXTEND, MAY_WRITE },
  324.     { 0, 0 }
  325. };
  326. int
  327. nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access)
  328. {
  329. struct accessmap *map;
  330. struct svc_export *export;
  331. struct dentry *dentry;
  332. u32 query, result = 0;
  333. unsigned int error;
  334. error = fh_verify(rqstp, fhp, 0, MAY_NOP);
  335. if (error)
  336. goto out;
  337. export = fhp->fh_export;
  338. dentry = fhp->fh_dentry;
  339. if (S_ISREG(dentry->d_inode->i_mode))
  340. map = nfs3_regaccess;
  341. else if (S_ISDIR(dentry->d_inode->i_mode))
  342. map = nfs3_diraccess;
  343. else
  344. map = nfs3_anyaccess;
  345. query = *access;
  346. for  (; map->access; map++) {
  347. if (map->access & query) {
  348. unsigned int err2;
  349. err2 = nfsd_permission(export, dentry, map->how);
  350. switch (err2) {
  351. case nfs_ok:
  352. result |= map->access;
  353. break;
  354. /* the following error codes just mean the access was not allowed,
  355.  * rather than an error occurred */
  356. case nfserr_rofs:
  357. case nfserr_acces:
  358. case nfserr_perm:
  359. /* simply don't "or" in the access bit. */
  360. break;
  361. default:
  362. error = err2;
  363. goto out;
  364. }
  365. }
  366. }
  367. *access = result;
  368.  out:
  369. return error;
  370. }
  371. #endif /* CONFIG_NFSD_V3 */
  372. /*
  373.  * Open an existing file or directory.
  374.  * The access argument indicates the type of open (read/write/lock)
  375.  * N.B. After this call fhp needs an fh_put
  376.  */
  377. int
  378. nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
  379. int access, struct file *filp)
  380. {
  381. struct dentry *dentry;
  382. struct inode *inode;
  383. int err;
  384. /* If we get here, then the client has already done an "open", and (hopefully)
  385.  * checked permission - so allow OWNER_OVERRIDE in case a chmod has now revoked
  386.  * permission */
  387. err = fh_verify(rqstp, fhp, type, access | MAY_OWNER_OVERRIDE);
  388. if (err)
  389. goto out;
  390. dentry = fhp->fh_dentry;
  391. inode = dentry->d_inode;
  392. /* Disallow access to files with the append-only bit set or
  393.  * with mandatory locking enabled
  394.  */
  395. err = nfserr_perm;
  396. if (IS_APPEND(inode) || IS_ISMNDLK(inode))
  397. goto out;
  398. if (!inode->i_fop)
  399. goto out;
  400. /*
  401.  * Check to see if there are any leases on this file.
  402.  * This may block while leases are broken.
  403.  */
  404. err = get_lease(inode, (access & MAY_WRITE) ? FMODE_WRITE : 0);
  405. if (err)
  406. goto out_nfserr;
  407. if ((access & MAY_WRITE) && (err = get_write_access(inode)) != 0)
  408. goto out_nfserr;
  409. memset(filp, 0, sizeof(*filp));
  410. filp->f_op    = fops_get(inode->i_fop);
  411. atomic_set(&filp->f_count, 1);
  412. filp->f_dentry = dentry;
  413. filp->f_vfsmnt = fhp->fh_export->ex_mnt;
  414. if (access & MAY_WRITE) {
  415. filp->f_flags = O_WRONLY|O_LARGEFILE;
  416. filp->f_mode  = FMODE_WRITE;
  417. DQUOT_INIT(inode);
  418. } else {
  419. filp->f_flags = O_RDONLY|O_LARGEFILE;
  420. filp->f_mode  = FMODE_READ;
  421. }
  422. err = 0;
  423. if (filp->f_op && filp->f_op->open) {
  424. err = filp->f_op->open(inode, filp);
  425. if (err) {
  426. fops_put(filp->f_op);
  427. if (access & MAY_WRITE)
  428. put_write_access(inode);
  429. /* I nearly added put_filp() call here, but this filp
  430.  * is really on callers stack frame. -DaveM
  431.  */
  432. atomic_dec(&filp->f_count);
  433. }
  434. }
  435. out_nfserr:
  436. if (err)
  437. err = nfserrno(err);
  438. out:
  439. return err;
  440. }
  441. /*
  442.  * Close a file.
  443.  */
  444. void
  445. nfsd_close(struct file *filp)
  446. {
  447. struct dentry *dentry = filp->f_dentry;
  448. struct inode *inode = dentry->d_inode;
  449. if (filp->f_op && filp->f_op->release)
  450. filp->f_op->release(inode, filp);
  451. fops_put(filp->f_op);
  452. if (filp->f_mode & FMODE_WRITE)
  453. put_write_access(inode);
  454. }
  455. /*
  456.  * Sync a file
  457.  * As this calls fsync (not fdatasync) there is no need for a write_inode
  458.  * after it.
  459.  */
  460. inline void nfsd_dosync(struct file *filp, struct dentry *dp, 
  461. struct file_operations *fop)
  462. {
  463. struct inode *inode = dp->d_inode;
  464. int (*fsync) (struct file *, struct dentry *, int);
  465. filemap_fdatasync(inode->i_mapping);
  466. if (fop && (fsync = fop->fsync))
  467. fsync(filp, dp, 0);
  468. filemap_fdatawait(inode->i_mapping);
  469. }
  470. void
  471. nfsd_sync(struct file *filp)
  472. {
  473. struct inode *inode = filp->f_dentry->d_inode;
  474. dprintk("nfsd: sync file %sn", filp->f_dentry->d_name.name);
  475. down(&inode->i_sem);
  476. nfsd_dosync(filp, filp->f_dentry, filp->f_op);
  477. up(&inode->i_sem);
  478. }
  479. void
  480. nfsd_sync_dir(struct dentry *dp)
  481. {
  482. nfsd_dosync(NULL, dp, dp->d_inode->i_fop);
  483. }
  484. /*
  485.  * Obtain the readahead parameters for the file
  486.  * specified by (dev, ino).
  487.  */
  488. static inline struct raparms *
  489. nfsd_get_raparms(dev_t dev, ino_t ino)
  490. {
  491. struct raparms *ra, **rap, **frap = NULL;
  492. int depth = 0;
  493. for (rap = &raparm_cache; (ra = *rap); rap = &ra->p_next) {
  494. if (ra->p_ino == ino && ra->p_dev == dev)
  495. goto found;
  496. depth++;
  497. if (ra->p_count == 0)
  498. frap = rap;
  499. }
  500. depth = nfsdstats.ra_size*11/10;
  501. if (!frap)
  502. return NULL;
  503. rap = frap;
  504. ra = *frap;
  505. ra->p_dev = dev;
  506. ra->p_ino = ino;
  507. ra->p_reada = 0;
  508. ra->p_ramax = 0;
  509. ra->p_raend = 0;
  510. ra->p_ralen = 0;
  511. ra->p_rawin = 0;
  512. found:
  513. if (rap != &raparm_cache) {
  514. *rap = ra->p_next;
  515. ra->p_next   = raparm_cache;
  516. raparm_cache = ra;
  517. }
  518. ra->p_count++;
  519. nfsdstats.ra_depth[depth*10/nfsdstats.ra_size]++;
  520. return ra;
  521. }
  522. /*
  523.  * Read data from a file. count must contain the requested read count
  524.  * on entry. On return, *count contains the number of bytes actually read.
  525.  * N.B. After this call fhp needs an fh_put
  526.  */
  527. int
  528. nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset,
  529.           char *buf, unsigned long *count)
  530. {
  531. struct raparms *ra;
  532. mm_segment_t oldfs;
  533. int err;
  534. struct file file;
  535. err = nfsd_open(rqstp, fhp, S_IFREG, MAY_READ, &file);
  536. if (err)
  537. goto out;
  538. err = nfserr_perm;
  539. if (!file.f_op->read)
  540. goto out_close;
  541. #ifdef MSNFS
  542. if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
  543. (!lock_may_read(file.f_dentry->d_inode, offset, *count)))
  544. goto out_close;
  545. #endif
  546. /* Get readahead parameters */
  547. ra = nfsd_get_raparms(fhp->fh_export->ex_dev, fhp->fh_dentry->d_inode->i_ino);
  548. if (ra) {
  549. file.f_reada = ra->p_reada;
  550. file.f_ramax = ra->p_ramax;
  551. file.f_raend = ra->p_raend;
  552. file.f_ralen = ra->p_ralen;
  553. file.f_rawin = ra->p_rawin;
  554. }
  555. file.f_pos = offset;
  556. oldfs = get_fs(); set_fs(KERNEL_DS);
  557. err = file.f_op->read(&file, buf, *count, &file.f_pos);
  558. set_fs(oldfs);
  559. /* Write back readahead params */
  560. if (ra != NULL) {
  561. dprintk("nfsd: raparms %ld %ld %ld %ld %ldn",
  562. file.f_reada, file.f_ramax, file.f_raend,
  563. file.f_ralen, file.f_rawin);
  564. ra->p_reada = file.f_reada;
  565. ra->p_ramax = file.f_ramax;
  566. ra->p_raend = file.f_raend;
  567. ra->p_ralen = file.f_ralen;
  568. ra->p_rawin = file.f_rawin;
  569. ra->p_count -= 1;
  570. }
  571. if (err >= 0) {
  572. nfsdstats.io_read += err;
  573. *count = err;
  574. err = 0;
  575. } else 
  576. err = nfserrno(err);
  577. out_close:
  578. nfsd_close(&file);
  579. out:
  580. return err;
  581. }
  582. /*
  583.  * Write data to a file.
  584.  * The stable flag requests synchronous writes.
  585.  * N.B. After this call fhp needs an fh_put
  586.  */
  587. int
  588. nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset,
  589. char *buf, unsigned long cnt, int *stablep)
  590. {
  591. struct svc_export *exp;
  592. struct file file;
  593. struct dentry *dentry;
  594. struct inode *inode;
  595. mm_segment_t oldfs;
  596. int err = 0;
  597. int stable = *stablep;
  598. err = nfsd_open(rqstp, fhp, S_IFREG, MAY_WRITE, &file);
  599. if (err)
  600. goto out;
  601. if (!cnt)
  602. goto out_close;
  603. err = nfserr_perm;
  604. if (!file.f_op->write)
  605. goto out_close;
  606. #ifdef MSNFS
  607. if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
  608. (!lock_may_write(file.f_dentry->d_inode, offset, cnt)))
  609. goto out_close;
  610. #endif
  611. dentry = file.f_dentry;
  612. inode = dentry->d_inode;
  613. exp   = fhp->fh_export;
  614. /*
  615.  * Request sync writes if
  616.  *  - the sync export option has been set, or
  617.  *  - the client requested O_SYNC behavior (NFSv3 feature).
  618.  *  -   The file system doesn't support fsync().
  619.  * When gathered writes have been configured for this volume,
  620.  * flushing the data to disk is handled separately below.
  621.  */
  622. if (file.f_op->fsync == 0) {/* COMMIT3 cannot work */
  623.        stable = 2;
  624.        *stablep = 2; /* FILE_SYNC */
  625. }
  626. if (!EX_ISSYNC(exp))
  627. stable = 0;
  628. if (stable && !EX_WGATHER(exp))
  629. file.f_flags |= O_SYNC;
  630. file.f_pos = offset; /* set write offset */
  631. /* Write the data. */
  632. oldfs = get_fs(); set_fs(KERNEL_DS);
  633. err = file.f_op->write(&file, buf, cnt, &file.f_pos);
  634. if (err >= 0)
  635. nfsdstats.io_write += cnt;
  636. set_fs(oldfs);
  637. /* clear setuid/setgid flag after write */
  638. if (err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID))) {
  639. struct iattr ia;
  640. ia.ia_valid = ATTR_MODE;
  641. ia.ia_mode  = inode->i_mode & ~(S_ISUID | S_ISGID);
  642. notify_change(dentry, &ia);
  643. }
  644. if (err >= 0 && stable) {
  645. static unsigned long last_ino;
  646. static kdev_t last_dev = NODEV;
  647. /*
  648.  * Gathered writes: If another process is currently
  649.  * writing to the file, there's a high chance
  650.  * this is another nfsd (triggered by a bulk write
  651.  * from a client's biod). Rather than syncing the
  652.  * file with each write request, we sleep for 10 msec.
  653.  *
  654.  * I don't know if this roughly approximates
  655.  * C. Juszak's idea of gathered writes, but it's a
  656.  * nice and simple solution (IMHO), and it seems to
  657.  * work:-)
  658.  */
  659. if (EX_WGATHER(exp)) {
  660. if (atomic_read(&inode->i_writecount) > 1
  661.     || (last_ino == inode->i_ino && last_dev == inode->i_dev)) {
  662. dprintk("nfsd: write defer %dn", current->pid);
  663. set_current_state(TASK_UNINTERRUPTIBLE);
  664. schedule_timeout((HZ+99)/100);
  665. current->state = TASK_RUNNING;
  666. dprintk("nfsd: write resume %dn", current->pid);
  667. }
  668. if (inode->i_state & I_DIRTY) {
  669. dprintk("nfsd: write sync %dn", current->pid);
  670. nfsd_sync(&file);
  671. }
  672. #if 0
  673. wake_up(&inode->i_wait);
  674. #endif
  675. }
  676. last_ino = inode->i_ino;
  677. last_dev = inode->i_dev;
  678. }
  679. dprintk("nfsd: write complete err=%dn", err);
  680. if (err >= 0)
  681. err = 0;
  682. else 
  683. err = nfserrno(err);
  684. out_close:
  685. nfsd_close(&file);
  686. out:
  687. return err;
  688. }
  689. #ifdef CONFIG_NFSD_V3
  690. /*
  691.  * Commit all pending writes to stable storage.
  692.  * Strictly speaking, we could sync just the indicated file region here,
  693.  * but there's currently no way we can ask the VFS to do so.
  694.  *
  695.  * Unfortunately we cannot lock the file to make sure we return full WCC
  696.  * data to the client, as locking happens lower down in the filesystem.
  697.  */
  698. int
  699. nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
  700.                off_t offset, unsigned long count)
  701. {
  702. struct file file;
  703. int err;
  704. if ((err = nfsd_open(rqstp, fhp, S_IFREG, MAY_WRITE, &file)) != 0)
  705. return err;
  706. if (EX_ISSYNC(fhp->fh_export)) {
  707. if (file.f_op && file.f_op->fsync) {
  708. nfsd_sync(&file);
  709. } else {
  710. err = nfserr_notsupp;
  711. }
  712. }
  713. nfsd_close(&file);
  714. return err;
  715. }
  716. #endif /* CONFIG_NFSD_V3 */
  717. /*
  718.  * Create a file (regular, directory, device, fifo); UNIX sockets 
  719.  * not yet implemented.
  720.  * If the response fh has been verified, the parent directory should
  721.  * already be locked. Note that the parent directory is left locked.
  722.  *
  723.  * N.B. Every call to nfsd_create needs an fh_put for _both_ fhp and resfhp
  724.  */
  725. int
  726. nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
  727. char *fname, int flen, struct iattr *iap,
  728. int type, dev_t rdev, struct svc_fh *resfhp)
  729. {
  730. struct dentry *dentry, *dchild;
  731. struct inode *dirp;
  732. int err;
  733. err = nfserr_perm;
  734. if (!flen)
  735. goto out;
  736. err = nfserr_exist;
  737. if (isdotent(fname, flen))
  738. goto out;
  739. err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
  740. if (err)
  741. goto out;
  742. dentry = fhp->fh_dentry;
  743. dirp = dentry->d_inode;
  744. err = nfserr_notdir;
  745. if(!dirp->i_op || !dirp->i_op->lookup)
  746. goto out;
  747. /*
  748.  * Check whether the response file handle has been verified yet.
  749.  * If it has, the parent directory should already be locked.
  750.  */
  751. if (!resfhp->fh_dentry) {
  752. /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */
  753. fh_lock(fhp);
  754. dchild = lookup_one_len(fname, dentry, flen);
  755. err = PTR_ERR(dchild);
  756. if (IS_ERR(dchild))
  757. goto out_nfserr;
  758. err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
  759. if (err)
  760. goto out;
  761. } else {
  762. /* called from nfsd_proc_create */
  763. dchild = resfhp->fh_dentry;
  764. if (!fhp->fh_locked) {
  765. /* not actually possible */
  766. printk(KERN_ERR
  767. "nfsd_create: parent %s/%s not locked!n",
  768. dentry->d_parent->d_name.name,
  769. dentry->d_name.name);
  770. err = -EIO;
  771. goto out;
  772. }
  773. }
  774. /*
  775.  * Make sure the child dentry is still negative ...
  776.  */
  777. err = nfserr_exist;
  778. if (dchild->d_inode) {
  779. dprintk("nfsd_create: dentry %s/%s not negative!n",
  780. dentry->d_name.name, dchild->d_name.name);
  781. goto out; 
  782. }
  783. if (!(iap->ia_valid & ATTR_MODE))
  784. iap->ia_mode = 0;
  785. iap->ia_mode = (iap->ia_mode & S_IALLUGO) | type;
  786. /*
  787.  * Get the dir op function pointer.
  788.  */
  789. err = nfserr_perm;
  790. switch (type) {
  791. case S_IFREG:
  792. err = vfs_create(dirp, dchild, iap->ia_mode);
  793. break;
  794. case S_IFDIR:
  795. err = vfs_mkdir(dirp, dchild, iap->ia_mode);
  796. break;
  797. case S_IFCHR:
  798. case S_IFBLK:
  799. case S_IFIFO:
  800. case S_IFSOCK:
  801. err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
  802. break;
  803. default:
  804.         printk("nfsd: bad file type %o in nfsd_createn", type);
  805. err = -EINVAL;
  806. }
  807. if (err < 0)
  808. goto out_nfserr;
  809. if (EX_ISSYNC(fhp->fh_export)) {
  810. nfsd_sync_dir(dentry);
  811. write_inode_now(dchild->d_inode, 1);
  812. }
  813. /* Set file attributes. Mode has already been set and
  814.  * setting uid/gid works only for root. Irix appears to
  815.  * send along the gid when it tries to implement setgid
  816.  * directories via NFS.
  817.  */
  818. err = 0;
  819. if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID|ATTR_MODE)) != 0)
  820. err = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0);
  821. /*
  822.  * Update the file handle to get the new inode info.
  823.  */
  824. if (!err)
  825. err = fh_update(resfhp);
  826. out:
  827. return err;
  828. out_nfserr:
  829. err = nfserrno(err);
  830. goto out;
  831. }
  832. #ifdef CONFIG_NFSD_V3
  833. /*
  834.  * NFSv3 version of nfsd_create
  835.  */
  836. int
  837. nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
  838. char *fname, int flen, struct iattr *iap,
  839. struct svc_fh *resfhp, int createmode, u32 *verifier)
  840. {
  841. struct dentry *dentry, *dchild;
  842. struct inode *dirp;
  843. int err;
  844. __u32 v_mtime=0, v_atime=0;
  845. int v_mode=0;
  846. err = nfserr_perm;
  847. if (!flen)
  848. goto out;
  849. err = nfserr_exist;
  850. if (isdotent(fname, flen))
  851. goto out;
  852. if (!(iap->ia_valid & ATTR_MODE))
  853. iap->ia_mode = 0;
  854. err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
  855. if (err)
  856. goto out;
  857. dentry = fhp->fh_dentry;
  858. dirp = dentry->d_inode;
  859. /* Get all the sanity checks out of the way before
  860.  * we lock the parent. */
  861. err = nfserr_notdir;
  862. if(!dirp->i_op || !dirp->i_op->lookup)
  863. goto out;
  864. fh_lock(fhp);
  865. /*
  866.  * Compose the response file handle.
  867.  */
  868. dchild = lookup_one_len(fname, dentry, flen);
  869. err = PTR_ERR(dchild);
  870. if (IS_ERR(dchild))
  871. goto out_nfserr;
  872. err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
  873. if (err)
  874. goto out;
  875. if (createmode == NFS3_CREATE_EXCLUSIVE) {
  876. /* while the verifier would fit in mtime+atime,
  877.  * solaris7 gets confused (bugid 4218508) if these have
  878.  * the high bit set, so we use the mode as well
  879.  */
  880. v_mtime = verifier[0]&0x7fffffff;
  881. v_atime = verifier[1]&0x7fffffff;
  882. v_mode  = S_IFREG
  883. | ((verifier[0]&0x80000000) >> (32-7)) /* u+x */
  884. | ((verifier[1]&0x80000000) >> (32-9)) /* u+r */
  885. ;
  886. }
  887. if (dchild->d_inode) {
  888. err = 0;
  889. switch (createmode) {
  890. case NFS3_CREATE_UNCHECKED:
  891. if (! S_ISREG(dchild->d_inode->i_mode))
  892. err = nfserr_exist;
  893. else {
  894. iap->ia_valid &= ATTR_SIZE;
  895. goto set_attr;
  896. }
  897. break;
  898. case NFS3_CREATE_EXCLUSIVE:
  899. if (   dchild->d_inode->i_mtime == v_mtime
  900.     && dchild->d_inode->i_atime == v_atime
  901.     && dchild->d_inode->i_mode  == v_mode
  902.     && dchild->d_inode->i_size  == 0 )
  903. break;
  904.  /* fallthru */
  905. case NFS3_CREATE_GUARDED:
  906. err = nfserr_exist;
  907. }
  908. goto out;
  909. }
  910. err = vfs_create(dirp, dchild, iap->ia_mode);
  911. if (err < 0)
  912. goto out_nfserr;
  913. if (EX_ISSYNC(fhp->fh_export)) {
  914. nfsd_sync_dir(dentry);
  915. /* setattr will sync the child (or not) */
  916. }
  917. /*
  918.  * Update the filehandle to get the new inode info.
  919.  */
  920. err = fh_update(resfhp);
  921. if (err)
  922. goto out;
  923. if (createmode == NFS3_CREATE_EXCLUSIVE) {
  924. /* Cram the verifier into atime/mtime/mode */
  925. iap->ia_valid = ATTR_MTIME|ATTR_ATIME
  926. | ATTR_MTIME_SET|ATTR_ATIME_SET
  927. | ATTR_MODE;
  928. iap->ia_mtime = v_mtime;
  929. iap->ia_atime = v_atime;
  930. iap->ia_mode  = v_mode;
  931. }
  932. /* Set file attributes.
  933.  * Mode has already been set but we might need to reset it
  934.  * for CREATE_EXCLUSIVE
  935.  * Irix appears to send along the gid when it tries to
  936.  * implement setgid directories via NFS. Clear out all that cruft.
  937.  */
  938.  set_attr:
  939. if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID)) != 0)
  940.   err = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0);
  941.  out:
  942. fh_unlock(fhp);
  943.   return err;
  944.  
  945.  out_nfserr:
  946. err = nfserrno(err);
  947. goto out;
  948. }
  949. #endif /* CONFIG_NFSD_V3 */
  950. /*
  951.  * Read a symlink. On entry, *lenp must contain the maximum path length that
  952.  * fits into the buffer. On return, it contains the true length.
  953.  * N.B. After this call fhp needs an fh_put
  954.  */
  955. int
  956. nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp)
  957. {
  958. struct dentry *dentry;
  959. struct inode *inode;
  960. mm_segment_t oldfs;
  961. int err;
  962. err = fh_verify(rqstp, fhp, S_IFLNK, MAY_NOP);
  963. if (err)
  964. goto out;
  965. dentry = fhp->fh_dentry;
  966. inode = dentry->d_inode;
  967. err = nfserr_inval;
  968. if (!inode->i_op || !inode->i_op->readlink)
  969. goto out;
  970. UPDATE_ATIME(inode);
  971. /* N.B. Why does this call need a get_fs()??
  972.  * Remove the set_fs and watch the fireworks:-) --okir
  973.  */
  974. oldfs = get_fs(); set_fs(KERNEL_DS);
  975. err = inode->i_op->readlink(dentry, buf, *lenp);
  976. set_fs(oldfs);
  977. if (err < 0)
  978. goto out_nfserr;
  979. *lenp = err;
  980. err = 0;
  981. out:
  982. return err;
  983. out_nfserr:
  984. err = nfserrno(err);
  985. goto out;
  986. }
  987. /*
  988.  * Create a symlink and look up its inode
  989.  * N.B. After this call _both_ fhp and resfhp need an fh_put
  990.  */
  991. int
  992. nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp,
  993. char *fname, int flen,
  994. char *path,  int plen,
  995. struct svc_fh *resfhp,
  996. struct iattr *iap)
  997. {
  998. struct dentry *dentry, *dnew;
  999. int err, cerr;
  1000. err = nfserr_noent;
  1001. if (!flen || !plen)
  1002. goto out;
  1003. err = nfserr_exist;
  1004. if (isdotent(fname, flen))
  1005. goto out;
  1006. err = fh_verify(rqstp, fhp, S_IFDIR, MAY_CREATE);
  1007. if (err)
  1008. goto out;
  1009. fh_lock(fhp);
  1010. dentry = fhp->fh_dentry;
  1011. dnew = lookup_one_len(fname, dentry, flen);
  1012. err = PTR_ERR(dnew);
  1013. if (IS_ERR(dnew))
  1014. goto out_nfserr;
  1015. err = vfs_symlink(dentry->d_inode, dnew, path);
  1016. if (!err) {
  1017. if (EX_ISSYNC(fhp->fh_export))
  1018. nfsd_sync_dir(dentry);
  1019. if (iap) {
  1020. iap->ia_valid &= ATTR_MODE /* ~(ATTR_MODE|ATTR_UID|ATTR_GID)*/;
  1021. if (iap->ia_valid) {
  1022. iap->ia_valid |= ATTR_CTIME;
  1023. iap->ia_mode = (iap->ia_mode&S_IALLUGO)
  1024. | S_IFLNK;
  1025. err = notify_change(dnew, iap);
  1026. if (!err && EX_ISSYNC(fhp->fh_export))
  1027. write_inode_now(dentry->d_inode, 1);
  1028.        }
  1029. }
  1030. } else
  1031. err = nfserrno(err);
  1032. fh_unlock(fhp);
  1033. /* Compose the fh so the dentry will be freed ... */
  1034. cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
  1035. if (err==0) err = cerr;
  1036. out:
  1037. return err;
  1038. out_nfserr:
  1039. err = nfserrno(err);
  1040. goto out;
  1041. }
  1042. /*
  1043.  * Create a hardlink
  1044.  * N.B. After this call _both_ ffhp and tfhp need an fh_put
  1045.  */
  1046. int
  1047. nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
  1048. char *name, int len, struct svc_fh *tfhp)
  1049. {
  1050. struct dentry *ddir, *dnew, *dold;
  1051. struct inode *dirp, *dest;
  1052. int err;
  1053. err = fh_verify(rqstp, ffhp, S_IFDIR, MAY_CREATE);
  1054. if (err)
  1055. goto out;
  1056. err = fh_verify(rqstp, tfhp, -S_IFDIR, MAY_NOP);
  1057. if (err)
  1058. goto out;
  1059. err = nfserr_perm;
  1060. if (!len)
  1061. goto out;
  1062. err = nfserr_exist;
  1063. if (isdotent(name, len))
  1064. goto out;
  1065. fh_lock(ffhp);
  1066. ddir = ffhp->fh_dentry;
  1067. dirp = ddir->d_inode;
  1068. dnew = lookup_one_len(name, ddir, len);
  1069. err = PTR_ERR(dnew);
  1070. if (IS_ERR(dnew))
  1071. goto out_nfserr;
  1072. dold = tfhp->fh_dentry;
  1073. dest = dold->d_inode;
  1074. err = vfs_link(dold, dirp, dnew);
  1075. if (!err) {
  1076. if (EX_ISSYNC(ffhp->fh_export)) {
  1077. nfsd_sync_dir(ddir);
  1078. write_inode_now(dest, 1);
  1079. }
  1080. } else {
  1081. if (err == -EXDEV && rqstp->rq_vers == 2)
  1082. err = nfserr_acces;
  1083. else
  1084. err = nfserrno(err);
  1085. }
  1086. fh_unlock(ffhp);
  1087. dput(dnew);
  1088. out:
  1089. return err;
  1090. out_nfserr:
  1091. err = nfserrno(err);
  1092. goto out;
  1093. }
  1094. /*
  1095.  * Rename a file
  1096.  * N.B. After this call _both_ ffhp and tfhp need an fh_put
  1097.  */
  1098. int
  1099. nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
  1100.     struct svc_fh *tfhp, char *tname, int tlen)
  1101. {
  1102. struct dentry *fdentry, *tdentry, *odentry, *ndentry;
  1103. struct inode *fdir, *tdir;
  1104. int err;
  1105. err = fh_verify(rqstp, ffhp, S_IFDIR, MAY_REMOVE);
  1106. if (err)
  1107. goto out;
  1108. err = fh_verify(rqstp, tfhp, S_IFDIR, MAY_CREATE);
  1109. if (err)
  1110. goto out;
  1111. fdentry = ffhp->fh_dentry;
  1112. fdir = fdentry->d_inode;
  1113. tdentry = tfhp->fh_dentry;
  1114. tdir = tdentry->d_inode;
  1115. err = (rqstp->rq_vers == 2) ? nfserr_acces : nfserr_xdev;
  1116. if (fdir->i_dev != tdir->i_dev)
  1117. goto out;
  1118. err = nfserr_perm;
  1119. if (!flen || isdotent(fname, flen) || !tlen || isdotent(tname, tlen))
  1120. goto out;
  1121. /* cannot use fh_lock as we need deadlock protective ordering
  1122.  * so do it by hand */
  1123. double_down(&tdir->i_sem, &fdir->i_sem);
  1124. ffhp->fh_locked = tfhp->fh_locked = 1;
  1125. fill_pre_wcc(ffhp);
  1126. fill_pre_wcc(tfhp);
  1127. odentry = lookup_one_len(fname, fdentry, flen);
  1128. err = PTR_ERR(odentry);
  1129. if (IS_ERR(odentry))
  1130. goto out_nfserr;
  1131. err = -ENOENT;
  1132. if (!odentry->d_inode)
  1133. goto out_dput_old;
  1134. ndentry = lookup_one_len(tname, tdentry, tlen);
  1135. err = PTR_ERR(ndentry);
  1136. if (IS_ERR(ndentry))
  1137. goto out_dput_old;
  1138. #ifdef MSNFS
  1139. if ((ffhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
  1140. ((atomic_read(&odentry->d_count) > 1)
  1141.  || (atomic_read(&ndentry->d_count) > 1))) {
  1142. err = nfserr_perm;
  1143. } else
  1144. #endif
  1145. err = vfs_rename(fdir, odentry, tdir, ndentry);
  1146. if (!err && EX_ISSYNC(tfhp->fh_export)) {
  1147. nfsd_sync_dir(tdentry);
  1148. nfsd_sync_dir(fdentry);
  1149. }
  1150. dput(ndentry);
  1151.  out_dput_old:
  1152. dput(odentry);
  1153.  out_nfserr:
  1154. if (err)
  1155. err = nfserrno(err);
  1156. /* we cannot reply on fh_unlock on the two filehandles,
  1157.  * as that would do the wrong thing if the two directories
  1158.  * were the same, so again we do it by hand
  1159.  */
  1160. fill_post_wcc(ffhp);
  1161. fill_post_wcc(tfhp);
  1162. double_up(&tdir->i_sem, &fdir->i_sem);
  1163. ffhp->fh_locked = tfhp->fh_locked = 0;
  1164. out:
  1165. return err;
  1166. }
  1167. /*
  1168.  * Unlink a file or directory
  1169.  * N.B. After this call fhp needs an fh_put
  1170.  */
  1171. int
  1172. nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
  1173. char *fname, int flen)
  1174. {
  1175. struct dentry *dentry, *rdentry;
  1176. struct inode *dirp;
  1177. int err;
  1178. err = nfserr_acces;
  1179. if (!flen || isdotent(fname, flen))
  1180. goto out;
  1181. err = fh_verify(rqstp, fhp, S_IFDIR, MAY_REMOVE);
  1182. if (err)
  1183. goto out;
  1184. fh_lock(fhp);
  1185. dentry = fhp->fh_dentry;
  1186. dirp = dentry->d_inode;
  1187. rdentry = lookup_one_len(fname, dentry, flen);
  1188. err = PTR_ERR(rdentry);
  1189. if (IS_ERR(rdentry))
  1190. goto out_nfserr;
  1191. if (!rdentry->d_inode) {
  1192. dput(rdentry);
  1193. err = nfserr_noent;
  1194. goto out;
  1195. }
  1196. if (type != S_IFDIR) { /* It's UNLINK */
  1197. #ifdef MSNFS
  1198. if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
  1199. (atomic_read(&rdentry->d_count) > 1)) {
  1200. err = nfserr_perm;
  1201. } else
  1202. #endif
  1203. err = vfs_unlink(dirp, rdentry);
  1204. } else { /* It's RMDIR */
  1205. err = vfs_rmdir(dirp, rdentry);
  1206. }
  1207. dput(rdentry);
  1208. if (err)
  1209. goto out_nfserr;
  1210. if (EX_ISSYNC(fhp->fh_export)) 
  1211. nfsd_sync_dir(dentry);
  1212. out:
  1213. return err;
  1214. out_nfserr:
  1215. err = nfserrno(err);
  1216. goto out;
  1217. }
  1218. /*
  1219.  * Read entries from a directory.
  1220.  * The verifier is an NFSv3 thing we ignore for now.
  1221.  */
  1222. int
  1223. nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, 
  1224.              encode_dent_fn func, u32 *buffer, int *countp, u32 *verf)
  1225. {
  1226. u32 *p;
  1227. int oldlen, eof, err;
  1228. struct file file;
  1229. struct readdir_cd cd;
  1230. err = nfsd_open(rqstp, fhp, S_IFDIR, MAY_READ, &file);
  1231. if (err)
  1232. goto out;
  1233. if (offset > ~(u32) 0)
  1234. goto out_close;
  1235. file.f_pos = offset;
  1236. /* Set up the readdir context */
  1237. memset(&cd, 0, sizeof(cd));
  1238. cd.rqstp  = rqstp;
  1239. cd.buffer = buffer;
  1240. cd.buflen = *countp; /* count of words */
  1241. cd.dirfh  = fhp;
  1242. /*
  1243.  * Read the directory entries. This silly loop is necessary because
  1244.  * readdir() is not guaranteed to fill up the entire buffer, but
  1245.  * may choose to do less.
  1246.  */
  1247. do {
  1248. oldlen = cd.buflen;
  1249. err = vfs_readdir(&file, (filldir_t) func, &cd);
  1250. if (err < 0)
  1251. goto out_nfserr;
  1252. } while (oldlen != cd.buflen && !cd.eob);
  1253. /* If we didn't fill the buffer completely, we're at EOF */
  1254. eof = !cd.eob;
  1255. if (cd.offset) {
  1256. if (rqstp->rq_vers == 3)
  1257. (void)xdr_encode_hyper(cd.offset, file.f_pos);
  1258. else
  1259. *cd.offset = htonl(file.f_pos);
  1260. }
  1261. p = cd.buffer;
  1262. *p++ = 0; /* no more entries */
  1263. *p++ = htonl(eof); /* end of directory */
  1264. *countp = (caddr_t) p - (caddr_t) buffer;
  1265. dprintk("nfsd: readdir result %d bytes, eof %d offset %dn",
  1266. *countp, eof,
  1267. cd.offset? ntohl(*cd.offset) : -1);
  1268. err = 0;
  1269. out_close:
  1270. nfsd_close(&file);
  1271. out:
  1272. return err;
  1273. out_nfserr:
  1274. err = nfserrno(err);
  1275. goto out_close;
  1276. }
  1277. /*
  1278.  * Get file system stats
  1279.  * N.B. After this call fhp needs an fh_put
  1280.  */
  1281. int
  1282. nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct statfs *stat)
  1283. {
  1284. int err = fh_verify(rqstp, fhp, 0, MAY_NOP);
  1285. if (!err && vfs_statfs(fhp->fh_dentry->d_inode->i_sb,stat))
  1286. err = nfserr_io;
  1287. return err;
  1288. }
  1289. /*
  1290.  * Check for a user's access permissions to this inode.
  1291.  */
  1292. int
  1293. nfsd_permission(struct svc_export *exp, struct dentry *dentry, int acc)
  1294. {
  1295. struct inode *inode = dentry->d_inode;
  1296. int err;
  1297. if (acc == MAY_NOP)
  1298. return 0;
  1299. #if 0
  1300. dprintk("nfsd: permission 0x%x%s%s%s%s%s%s%s mode 0%o%s%s%sn",
  1301. acc,
  1302. (acc & MAY_READ)? " read"  : "",
  1303. (acc & MAY_WRITE)? " write" : "",
  1304. (acc & MAY_EXEC)? " exec"  : "",
  1305. (acc & MAY_SATTR)? " sattr" : "",
  1306. (acc & MAY_TRUNC)? " trunc" : "",
  1307. (acc & MAY_LOCK)? " lock"  : "",
  1308. (acc & MAY_OWNER_OVERRIDE)? " owneroverride" : "",
  1309. inode->i_mode,
  1310. IS_IMMUTABLE(inode)? " immut" : "",
  1311. IS_APPEND(inode)? " append" : "",
  1312. IS_RDONLY(inode)? " ro" : "");
  1313. dprintk("      owner %d/%d user %d/%dn",
  1314. inode->i_uid, inode->i_gid, current->fsuid, current->fsgid);
  1315. #endif
  1316. /* The following code is here to make IRIX happy, which
  1317.  * does a permission check every time a user does
  1318.  * echo yaddayadda > special-file
  1319.  * by sending a CREATE request.
  1320.  * The original code would check read-only export status
  1321.  * only for regular files and directories, allowing
  1322.  * clients to chown/chmod device files and fifos even
  1323.  * on volumes exported read-only. */
  1324. if (!(acc & _NFSD_IRIX_BOGOSITY)
  1325.  && (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC))) {
  1326. if (EX_RDONLY(exp) || IS_RDONLY(inode))
  1327. return nfserr_rofs;
  1328. if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode))
  1329. return nfserr_perm;
  1330. }
  1331. if ((acc & MAY_TRUNC) && IS_APPEND(inode))
  1332. return nfserr_perm;
  1333. if (acc & MAY_LOCK) {
  1334. /* If we cannot rely on authentication in NLM requests,
  1335.  * just allow locks, otherwise require read permission, or
  1336.  * ownership
  1337.  */
  1338. if (exp->ex_flags & NFSEXP_NOAUTHNLM)
  1339. return 0;
  1340. else
  1341. acc = MAY_READ | MAY_OWNER_OVERRIDE;
  1342. }
  1343. /*
  1344.  * The file owner always gets access permission for accesses that
  1345.  * would normally be checked at open time. This is to make
  1346.  * file access work even when the client has done a fchmod(fd, 0).
  1347.  *
  1348.  * However, `cp foo bar' should fail nevertheless when bar is
  1349.  * readonly. A sensible way to do this might be to reject all
  1350.  * attempts to truncate a read-only file, because a creat() call
  1351.  * always implies file truncation.
  1352.  * ... but this isn't really fair.  A process may reasonably call
  1353.  * ftruncate on an open file descriptor on a file with perm 000.
  1354.  * We must trust the client to do permission checking - using "ACCESS"
  1355.  * with NFSv3.
  1356.  */
  1357. if ((acc & MAY_OWNER_OVERRIDE) &&
  1358.     inode->i_uid == current->fsuid)
  1359. return 0;
  1360. acc &= ~ MAY_OWNER_OVERRIDE; /* This bit is no longer needed,
  1361.                                         and gets in the way later */
  1362. err = permission(inode, acc & (MAY_READ|MAY_WRITE|MAY_EXEC));
  1363. /* Allow read access to binaries even when mode 111 */
  1364. if (err == -EACCES && S_ISREG(inode->i_mode) && acc == MAY_READ)
  1365. err = permission(inode, MAY_EXEC);
  1366. return err? nfserrno(err) : 0;
  1367. }
  1368. void
  1369. nfsd_racache_shutdown(void)
  1370. {
  1371. if (!raparm_cache)
  1372. return;
  1373. dprintk("nfsd: freeing readahead buffers.n");
  1374. kfree(raparml);
  1375. raparm_cache = raparml = NULL;
  1376. }
  1377. /*
  1378.  * Initialize readahead param cache
  1379.  */
  1380. int
  1381. nfsd_racache_init(int cache_size)
  1382. {
  1383. int i;
  1384. if (raparm_cache)
  1385. return 0;
  1386. raparml = kmalloc(sizeof(struct raparms) * cache_size, GFP_KERNEL);
  1387. if (raparml != NULL) {
  1388. dprintk("nfsd: allocating %d readahead buffers.n",
  1389. cache_size);
  1390. memset(raparml, 0, sizeof(struct raparms) * cache_size);
  1391. for (i = 0; i < cache_size - 1; i++) {
  1392. raparml[i].p_next = raparml + i + 1;
  1393. }
  1394. raparm_cache = raparml;
  1395. } else {
  1396. printk(KERN_WARNING
  1397.        "nfsd: Could not allocate memory read-ahead cache.n");
  1398. return -ENOMEM;
  1399. }
  1400. nfsdstats.ra_size = cache_size;
  1401. return 0;
  1402. }