diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:53:54 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:53:54 -0400 |
| commit | bd81ccea8558daab570d70d2c23746413f26cecf (patch) | |
| tree | a3a75dde2dc3cf26c74353b21792da30d65d7c13 | |
| parent | 98260daa184c4a171834463cf85ab3a2c509d983 (diff) | |
| parent | a9ca4043d074509b9d15003fbcb068d3cdae85a4 (diff) | |
Merge branch 'for-3.7' of git://linux-nfs.org/~bfields/linux
Pull nfsd update from J Bruce Fields:
"Another relatively quiet cycle. There was some progress on my
remaining 4.1 todo's, but a couple of them were just of the form
"check that we do X correctly", so didn't have much affect on the
code.
Other than that, a bunch of cleanup and some bugfixes (including an
annoying NFSv4.0 state leak and a busy-loop in the server that could
cause it to peg the CPU without making progress)."
* 'for-3.7' of git://linux-nfs.org/~bfields/linux: (46 commits)
UAPI: (Scripted) Disintegrate include/linux/sunrpc
UAPI: (Scripted) Disintegrate include/linux/nfsd
nfsd4: don't allow reclaims of expired clients
nfsd4: remove redundant callback probe
nfsd4: expire old client earlier
nfsd4: separate session allocation and initialization
nfsd4: clean up session allocation
nfsd4: minor free_session cleanup
nfsd4: new_conn_from_crses should only allocate
nfsd4: separate connection allocation and initialization
nfsd4: reject bad forechannel attrs earlier
nfsd4: enforce per-client sessions/no-sessions distinction
nfsd4: set cl_minorversion at create time
nfsd4: don't pin clientids to pseudoflavors
nfsd4: fix bind_conn_to_session xdr comment
nfsd4: cast readlink() bug argument
NFSD: pass null terminated buf to kstrtouint()
nfsd: remove duplicate init in nfsd4_cb_recall
nfsd4: eliminate redundant nfs4_free_stateid
fs/nfsd/nfs4idmap.c: adjust inconsistent IS_ERR and PTR_ERR
...
36 files changed, 756 insertions, 757 deletions
diff --git a/Documentation/filesystems/nfs/nfsd-admin-interfaces.txt b/Documentation/filesystems/nfs/nfsd-admin-interfaces.txt new file mode 100644 index 000000000000..56a96fb08a73 --- /dev/null +++ b/Documentation/filesystems/nfs/nfsd-admin-interfaces.txt | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | Administrative interfaces for nfsd | ||
| 2 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 3 | |||
| 4 | Note that normally these interfaces are used only by the utilities in | ||
| 5 | nfs-utils. | ||
| 6 | |||
| 7 | nfsd is controlled mainly by pseudofiles under the "nfsd" filesystem, | ||
| 8 | which is normally mounted at /proc/fs/nfsd/. | ||
| 9 | |||
| 10 | The server is always started by the first write of a nonzero value to | ||
| 11 | nfsd/threads. | ||
| 12 | |||
| 13 | Before doing that, NFSD can be told which sockets to listen on by | ||
| 14 | writing to nfsd/portlist; that write may be: | ||
| 15 | |||
| 16 | - an ascii-encoded file descriptor, which should refer to a | ||
| 17 | bound (and listening, for tcp) socket, or | ||
| 18 | - "transportname port", where transportname is currently either | ||
| 19 | "udp", "tcp", or "rdma". | ||
| 20 | |||
| 21 | If nfsd is started without doing any of these, then it will create one | ||
| 22 | udp and one tcp listener at port 2049 (see nfsd_init_socks). | ||
| 23 | |||
| 24 | On startup, nfsd and lockd grace periods start. | ||
| 25 | |||
| 26 | nfsd is shut down by a write of 0 to nfsd/threads. All locks and state | ||
| 27 | are thrown away at that point. | ||
| 28 | |||
| 29 | Between startup and shutdown, the number of threads may be adjusted up | ||
| 30 | or down by additional writes to nfsd/threads or by writes to | ||
| 31 | nfsd/pool_threads. | ||
| 32 | |||
| 33 | For more detail about files under nfsd/ and what they control, see | ||
| 34 | fs/nfsd/nfsctl.c; most of them have detailed comments. | ||
| 35 | |||
| 36 | Implementation notes | ||
| 37 | ^^^^^^^^^^^^^^^^^^^^ | ||
| 38 | |||
| 39 | Note that the rpc server requires the caller to serialize addition and | ||
| 40 | removal of listening sockets, and startup and shutdown of the server. | ||
| 41 | For nfsd this is done using nfsd_mutex. | ||
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 7e355870d519..a2aa97d45670 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
| @@ -126,7 +126,7 @@ static void restart_grace(void) | |||
| 126 | static int | 126 | static int |
| 127 | lockd(void *vrqstp) | 127 | lockd(void *vrqstp) |
| 128 | { | 128 | { |
| 129 | int err = 0, preverr = 0; | 129 | int err = 0; |
| 130 | struct svc_rqst *rqstp = vrqstp; | 130 | struct svc_rqst *rqstp = vrqstp; |
| 131 | 131 | ||
| 132 | /* try_to_freeze() is called from svc_recv() */ | 132 | /* try_to_freeze() is called from svc_recv() */ |
| @@ -165,21 +165,8 @@ lockd(void *vrqstp) | |||
| 165 | * recvfrom routine. | 165 | * recvfrom routine. |
| 166 | */ | 166 | */ |
| 167 | err = svc_recv(rqstp, timeout); | 167 | err = svc_recv(rqstp, timeout); |
| 168 | if (err == -EAGAIN || err == -EINTR) { | 168 | if (err == -EAGAIN || err == -EINTR) |
| 169 | preverr = err; | ||
| 170 | continue; | 169 | continue; |
| 171 | } | ||
| 172 | if (err < 0) { | ||
| 173 | if (err != preverr) { | ||
| 174 | printk(KERN_WARNING "%s: unexpected error " | ||
| 175 | "from svc_recv (%d)\n", __func__, err); | ||
| 176 | preverr = err; | ||
| 177 | } | ||
| 178 | schedule_timeout_interruptible(HZ); | ||
| 179 | continue; | ||
| 180 | } | ||
| 181 | preverr = err; | ||
| 182 | |||
| 183 | dprintk("lockd: request from %s\n", | 170 | dprintk("lockd: request from %s\n", |
| 184 | svc_print_addr(rqstp, buf, sizeof(buf))); | 171 | svc_print_addr(rqstp, buf, sizeof(buf))); |
| 185 | 172 | ||
diff --git a/fs/locks.c b/fs/locks.c index abc7dc6c490b..a94e331a52a2 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -1289,7 +1289,7 @@ EXPORT_SYMBOL(__break_lease); | |||
| 1289 | void lease_get_mtime(struct inode *inode, struct timespec *time) | 1289 | void lease_get_mtime(struct inode *inode, struct timespec *time) |
| 1290 | { | 1290 | { |
| 1291 | struct file_lock *flock = inode->i_flock; | 1291 | struct file_lock *flock = inode->i_flock; |
| 1292 | if (flock && IS_LEASE(flock) && (flock->fl_type & F_WRLCK)) | 1292 | if (flock && IS_LEASE(flock) && (flock->fl_type == F_WRLCK)) |
| 1293 | *time = current_fs_time(inode->i_sb); | 1293 | *time = current_fs_time(inode->i_sb); |
| 1294 | else | 1294 | else |
| 1295 | *time = inode->i_mtime; | 1295 | *time = inode->i_mtime; |
| @@ -2185,8 +2185,8 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl, | |||
| 2185 | } else { | 2185 | } else { |
| 2186 | seq_printf(f, "%s ", | 2186 | seq_printf(f, "%s ", |
| 2187 | (lease_breaking(fl)) | 2187 | (lease_breaking(fl)) |
| 2188 | ? (fl->fl_type & F_UNLCK) ? "UNLCK" : "READ " | 2188 | ? (fl->fl_type == F_UNLCK) ? "UNLCK" : "READ " |
| 2189 | : (fl->fl_type & F_WRLCK) ? "WRITE" : "READ "); | 2189 | : (fl->fl_type == F_WRLCK) ? "WRITE" : "READ "); |
| 2190 | } | 2190 | } |
| 2191 | if (inode) { | 2191 | if (inode) { |
| 2192 | #ifdef WE_CAN_BREAK_LSLK_NOW | 2192 | #ifdef WE_CAN_BREAK_LSLK_NOW |
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 2245bef50f37..9a521fb39869 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
| @@ -72,7 +72,7 @@ out_err: | |||
| 72 | static int | 72 | static int |
| 73 | nfs4_callback_svc(void *vrqstp) | 73 | nfs4_callback_svc(void *vrqstp) |
| 74 | { | 74 | { |
| 75 | int err, preverr = 0; | 75 | int err; |
| 76 | struct svc_rqst *rqstp = vrqstp; | 76 | struct svc_rqst *rqstp = vrqstp; |
| 77 | 77 | ||
| 78 | set_freezable(); | 78 | set_freezable(); |
| @@ -82,20 +82,8 @@ nfs4_callback_svc(void *vrqstp) | |||
| 82 | * Listen for a request on the socket | 82 | * Listen for a request on the socket |
| 83 | */ | 83 | */ |
| 84 | err = svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT); | 84 | err = svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT); |
| 85 | if (err == -EAGAIN || err == -EINTR) { | 85 | if (err == -EAGAIN || err == -EINTR) |
| 86 | preverr = err; | ||
| 87 | continue; | 86 | continue; |
| 88 | } | ||
| 89 | if (err < 0) { | ||
| 90 | if (err != preverr) { | ||
| 91 | |||
