|
@@ -696,7 +696,15 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor
|
|
|
}
|
|
|
#endif /* CONFIG_NFSD_V3 */
|
|
|
|
|
|
+static int nfsd_open_break_lease(struct inode *inode, int access)
|
|
|
+{
|
|
|
+ unsigned int mode;
|
|
|
|
|
|
+ if (access & NFSD_MAY_NOT_BREAK_LEASE)
|
|
|
+ return 0;
|
|
|
+ mode = (access & NFSD_MAY_WRITE) ? O_WRONLY : O_RDONLY;
|
|
|
+ return break_lease(inode, mode | O_NONBLOCK);
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* Open an existing file or directory.
|
|
@@ -744,12 +752,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
|
|
|
if (!inode->i_fop)
|
|
|
goto out;
|
|
|
|
|
|
- /*
|
|
|
- * Check to see if there are any leases on this file.
|
|
|
- * This may block while leases are broken.
|
|
|
- */
|
|
|
- if (!(access & NFSD_MAY_NOT_BREAK_LEASE))
|
|
|
- host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0));
|
|
|
+ host_err = nfsd_open_break_lease(inode, access);
|
|
|
if (host_err) /* NOMEM or WOULDBLOCK */
|
|
|
goto out_nfserr;
|
|
|
|