NFS: Allow optimisation of lseek(fd, SEEK_CUR, 0) on directories
There should be no need to grab the inode lock if we're only reading the file offset. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
411ae722d1
commit
b2b1ff3da6
26
fs/nfs/dir.c
26
fs/nfs/dir.c
|
@ -904,23 +904,29 @@ static loff_t nfs_llseek_dir(struct file *filp, loff_t offset, int whence)
|
|||
dfprintk(FILE, "NFS: llseek dir(%pD2, %lld, %d)\n",
|
||||
filp, offset, whence);
|
||||
|
||||
inode_lock(inode);
|
||||
switch (whence) {
|
||||
case 1:
|
||||
offset += filp->f_pos;
|
||||
case 0:
|
||||
if (offset >= 0)
|
||||
break;
|
||||
default:
|
||||
offset = -EINVAL;
|
||||
goto out;
|
||||
default:
|
||||
return -EINVAL;
|
||||
case SEEK_SET:
|
||||
if (offset < 0)
|
||||
return -EINVAL;
|
||||
inode_lock(inode);
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
if (offset == 0)
|
||||
return filp->f_pos;
|
||||
inode_lock(inode);
|
||||
offset += filp->f_pos;
|
||||
if (offset < 0) {
|
||||
inode_unlock(inode);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (offset != filp->f_pos) {
|
||||
filp->f_pos = offset;
|
||||
dir_ctx->dir_cookie = 0;
|
||||
dir_ctx->duped = 0;
|
||||
}
|
||||
out:
|
||||
inode_unlock(inode);
|
||||
return offset;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue