diff options
Diffstat (limited to 'fs/nfs/file.c')
| -rw-r--r-- | fs/nfs/file.c | 151 |
1 files changed, 116 insertions, 35 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 4e98a56a1777..43164fe86069 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -50,7 +50,7 @@ static ssize_t nfs_file_read(struct kiocb *, const struct iovec *iov, | |||
| 50 | static ssize_t nfs_file_write(struct kiocb *, const struct iovec *iov, | 50 | static ssize_t nfs_file_write(struct kiocb *, const struct iovec *iov, |
| 51 | unsigned long nr_segs, loff_t pos); | 51 | unsigned long nr_segs, loff_t pos); |
| 52 | static int nfs_file_flush(struct file *, fl_owner_t id); | 52 | static int nfs_file_flush(struct file *, fl_owner_t id); |
| 53 | static int nfs_fsync(struct file *, struct dentry *dentry, int datasync); | 53 | static int nfs_file_fsync(struct file *, struct dentry *dentry, int datasync); |
| 54 | static int nfs_check_flags(int flags); | 54 | static int nfs_check_flags(int flags); |
| 55 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl); | 55 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl); |
| 56 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl); | 56 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl); |
| @@ -72,7 +72,7 @@ const struct file_operations nfs_file_operations = { | |||
| 72 | .open = nfs_file_open, | 72 | .open = nfs_file_open, |
| 73 | .flush = nfs_file_flush, | 73 | .flush = nfs_file_flush, |
| 74 | .release = nfs_file_release, | 74 | .release = nfs_file_release, |
| 75 | .fsync = nfs_fsync, | 75 | .fsync = nfs_file_fsync, |
| 76 | .lock = nfs_lock, | 76 | .lock = nfs_lock, |
| 77 | .flock = nfs_flock, | 77 | .flock = nfs_flock, |
| 78 | .splice_read = nfs_file_splice_read, | 78 | .splice_read = nfs_file_splice_read, |
| @@ -119,13 +119,17 @@ nfs_file_open(struct inode *inode, struct file *filp) | |||
| 119 | { | 119 | { |
| 120 | int res; | 120 | int res; |
| 121 | 121 | ||
| 122 | dprintk("NFS: open file(%s/%s)\n", | ||
| 123 | filp->f_path.dentry->d_parent->d_name.name, | ||
| 124 | filp->f_path.dentry->d_name.name); | ||
| 125 | |||
| 122 | res = nfs_check_flags(filp->f_flags); | 126 | res = nfs_check_flags(filp->f_flags); |
| 123 | if (res) | 127 | if (res) |
| 124 | return res; | 128 | return res; |
| 125 | 129 | ||
| 126 | nfs_inc_stats(inode, NFSIOS_VFSOPEN); | 130 | nfs_inc_stats(inode, NFSIOS_VFSOPEN); |
| 127 | lock_kernel(); | 131 | lock_kernel(); |
| 128 | res = NFS_PROTO(inode)->file_open(inode, filp); | 132 | res = nfs_open(inode, filp); |
| 129 | unlock_kernel(); | 133 | unlock_kernel(); |
| 130 | return res; | 134 | return res; |
| 131 | } | 135 | } |
| @@ -133,11 +137,17 @@ nfs_file_open(struct inode *inode, struct file *filp) | |||
| 133 | static int | 137 | static int |
| 134 | nfs_file_release(struct inode *inode, struct file *filp) | 138 | nfs_file_release(struct inode *inode, struct file *filp) |
| 135 | { | 139 | { |
| 140 | struct dentry *dentry = filp->f_path.dentry; | ||
| 141 | |||
| 142 | dprintk("NFS: release(%s/%s)\n", | ||
| 143 | dentry->d_parent->d_name.name, | ||
| 144 | dentry->d_name.name); | ||
| 145 | |||
| 136 | /* Ensure that dirty pages are flushed out with the right creds */ | 146 | /* Ensure that dirty pages are flushed out with the right creds */ |
| 137 | if (filp->f_mode & FMODE_WRITE) | 147 | if (filp->f_mode & FMODE_WRITE) |
| 138 | nfs_wb_all(filp->f_path.dentry->d_inode); | 148 | nfs_wb_all(dentry->d_inode); |
| 139 | nfs_inc_stats(inode, NFSIOS_VFSRELEASE); | 149 | nfs_inc_stats(inode, NFSIOS_VFSRELEASE); |
| 140 | return NFS_PROTO(inode)->file_release(inode, filp); | 150 | return nfs_release(inode, filp); |
| 141 | } | 151 | } |
| 142 | 152 | ||
| 143 | /** | 153 | /** |
| @@ -171,6 +181,12 @@ force_reval: | |||
| 171 | static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin) | 181 | static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin) |
| 172 | { | 182 | { |
| 173 | loff_t loff; | 183 | loff_t loff; |
| 184 | |||
| 185 | dprintk("NFS: llseek file(%s/%s, %lld, %d)\n", | ||
| 186 | filp->f_path.dentry->d_parent->d_name.name, | ||
| 187 | filp->f_path.dentry->d_name.name, | ||
| 188 | offset, origin); | ||
| 189 | |||
| 174 | /* origin == SEEK_END => we must revalidate the cached file length */ | 190 | /* origin == SEEK_END => we must revalidate the cached file length */ |
| 175 | if (origin == SEEK_END) { | 191 | if (origin == SEEK_END) { |
| 176 | struct inode *inode = filp->f_mapping->host; | 192 | struct inode *inode = filp->f_mapping->host; |
| @@ -185,7 +201,7 @@ static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin) | |||
| 185 | } | 201 | } |
| 186 | 202 | ||
| 187 | /* | 203 | /* |
| 188 | * Helper for nfs_file_flush() and nfs_fsync() | 204 | * Helper for nfs_file_flush() and nfs_file_fsync() |
| 189 | * | 205 | * |
| 190 | * Notice that it clears the NFS_CONTEXT_ERROR_WRITE before synching to | 206 | * Notice that it clears the NFS_CONTEXT_ERROR_WRITE before synching to |
| 191 | * disk, but it retrieves and clears ctx->error after synching, despite | 207 | * disk, but it retrieves and clears ctx->error after synching, despite |
| @@ -211,16 +227,18 @@ static int nfs_do_fsync(struct nfs_open_context *ctx, struct inode *inode) | |||
| 211 | 227 | ||
| 212 | /* | 228 | /* |
| 213 | * Flush all dirty pages, and check for write errors. | 229 | * Flush all dirty pages, and check for write errors. |
| 214 | * | ||
| 215 | */ | 230 | */ |
| 216 | static int | 231 | static int |
| 217 | nfs_file_flush(struct file *file, fl_owner_t id) | 232 | nfs_file_flush(struct file *file, fl_owner_t id) |
| 218 | { | 233 | { |
| 219 | struct nfs_open_context *ctx = nfs_file_open_context(file); | 234 | struct nfs_open_context *ctx = nfs_file_open_context(file); |
| 220 | struct inode *inode = file->f_path.dentry->d_inode; | 235 | struct dentry *dentry = file->f_path.dentry; |
| 236 | struct inode *inode = dentry->d_inode; | ||
| 221 | int status; | 237 | int status; |
| 222 | 238 | ||
| 223 | dfprintk(VFS, "nfs: flush(%s/%ld)\n", inode->i_sb->s_id, inode->i_ino); | 239 | dprintk("NFS: flush(%s/%s)\n", |
| 240 | dentry->d_parent->d_name.name, | ||
| 241 | dentry->d_name.name); | ||
| 224 | 242 | ||
| 225 | if ((file->f_mode & FMODE_WRITE) == 0) | 243 | if ((file->f_mode & FMODE_WRITE) == 0) |
| 226 | return 0; | 244 | return 0; |
| @@ -245,7 +263,7 @@ nfs_file_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 245 | if (iocb->ki_filp->f_flags & O_DIRECT) | 263 | if (iocb->ki_filp->f_flags & O_DIRECT) |
| 246 | return nfs_file_direct_read(iocb, iov, nr_segs, pos); | 264 | return nfs_file_direct_read(iocb, iov, nr_segs, pos); |
| 247 | 265 | ||
| 248 | dfprintk(VFS, "nfs: read(%s/%s, %lu@%lu)\n", | 266 | dprintk("NFS: read(%s/%s, %lu@%lu)\n", |
| 249 | dentry->d_parent->d_name.name, dentry->d_name.name, | 267 | dentry->d_parent->d_name.name, dentry->d_name.name, |
| 250 | (unsigned long) count, (unsigned long) pos); | 268 | (unsigned long) count, (unsigned long) pos); |
| 251 | 269 | ||
| @@ -265,7 +283,7 @@ nfs_file_splice_read(struct file *filp, loff_t *ppos, | |||
| 265 | struct inode *inode = dentry->d_inode; | 283 | struct inode *inode = dentry->d_inode; |
| 266 | ssize_t res; | 284 | ssize_t res; |
| 267 | 285 | ||
| 268 | dfprintk(VFS, "nfs: splice_read(%s/%s, %lu@%Lu)\n", | 286 | dprintk("NFS: splice_read(%s/%s, %lu@%Lu)\n", |
| 269 | dentry->d_parent->d_name.name, dentry->d_name.name, | 287 | dentry->d_parent->d_name.name, dentry->d_name.name, |
| 270 | (unsigned long) count, (unsigned long long) *ppos); | 288 | (unsigned long) count, (unsigned long long) *ppos); |
| 271 | 289 | ||
| @@ -282,7 +300,7 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma) | |||
| 282 | struct inode *inode = dentry->d_inode; | 300 | struct inode *inode = dentry->d_inode; |
| 283 | int status; | 301 | int status; |
| 284 | 302 | ||
| 285 | dfprintk(VFS, "nfs: mmap(%s/%s)\n", | 303 | dprintk("NFS: mmap(%s/%s)\n", |
| 286 | dentry->d_parent->d_name.name, dentry->d_name.name); | 304 | dentry->d_parent->d_name.name, dentry->d_name.name); |
| 287 | 305 | ||
| 288 | status = nfs_revalidate_mapping(inode, file->f_mapping); | 306 | status = nfs_revalidate_mapping(inode, file->f_mapping); |
| @@ -300,12 +318,14 @@ nfs_file_mmap(struct file * file, struct vm_area_struct * vma) | |||
| 300 | * whether any write errors occurred for this process. | 318 | * whether any write errors occurred for this process. |
| 301 | */ | 319 | */ |
| 302 | static int | 320 | static int |
| 303 | nfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 321 | nfs_file_fsync(struct file *file, struct dentry *dentry, int datasync) |
| 304 | { | 322 | { |
| 305 | struct nfs_open_context *ctx = nfs_file_open_context(file); | 323 | struct nfs_open_context *ctx = nfs_file_open_context(file); |
| 306 | struct inode *inode = dentry->d_inode; | 324 | struct inode *inode = dentry->d_inode; |
| 307 | 325 | ||
| 308 | dfprintk(VFS, "nfs: fsync(%s/%ld)\n", inode->i_sb->s_id, inode->i_ino); | 326 | dprintk("NFS: fsync file(%s/%s) datasync %d\n", |
| 327 | dentry->d_parent->d_name.name, dentry->d_name.name, | ||
| 328 | datasync); | ||
| 309 | 329 | ||
| 310 | nfs_inc_stats(inode, NFSIOS_VFSFSYNC); | 330 | nfs_inc_stats(inode, NFSIOS_VFSFSYNC); |
| 311 | return nfs_do_fsync(ctx, inode); | 331 | return nfs_do_fsync(ctx, inode); |
| @@ -328,6 +348,11 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping, | |||
| 328 | struct page *page; | 348 | struct page *page; |
| 329 | index = pos >> PAGE_CACHE_SHIFT; | 349 | index = pos >> PAGE_CACHE_SHIFT; |
| 330 | 350 | ||
| 351 | dfprintk(PAGECACHE, "NFS: write_begin(%s/%s(%ld), %u@%lld)\n", | ||
| 352 | file->f_path.dentry->d_parent->d_name.name, | ||
| 353 | file->f_path.dentry->d_name.name, | ||
| 354 | mapping->host->i_ino, len, (long long) pos); | ||
| 355 | |||
| 331 | page = __grab_cache_page(mapping, index); | 356 | page = __grab_cache_page(mapping, index); |
| 332 | if (!page) | 357 | if (!page) |
| 333 | return -ENOMEM; | 358 | return -ENOMEM; |
| @@ -348,6 +373,31 @@ static int nfs_write_end(struct file *file, struct address_space *mapping, | |||
| 348 | unsigned offset = pos & (PAGE_CACHE_SIZE - 1); | 373 | unsigned offset = pos & (PAGE_CACHE_SIZE - 1); |
| 349 | int status; | 374 | int status; |
| 350 | 375 | ||
| 376 | dfprintk(PAGECACHE, "NFS: write_end(%s/%s(%ld), %u@%lld)\n", | ||
| 377 | file->f_path.dentry->d_parent->d_name.name, | ||
| 378 | file->f_path.dentry->d_name.name, | ||
| 379 | mapping->host->i_ino, len, (long long) pos); | ||
| 380 | |||
| 381 | /* | ||
| 382 | * Zero any uninitialised parts of the page, and then mark the page | ||
| 383 | * as up to date if it turns out that we're extending the file. | ||
| 384 | */ | ||
| 385 | if (!PageUptodate(page)) { | ||
| 386 | unsigned pglen = nfs_page_length(page); | ||
| 387 | unsigned end = offset + len; | ||
| 388 | |||
| 389 | if (pglen == 0) { | ||
| 390 | zero_user_segments(page, 0, offset, | ||
| 391 | end, PAGE_CACHE_SIZE); | ||
| 392 | SetPageUptodate(page); | ||
| 393 | } else if (end >= pglen) { | ||
| 394 | zero_user_segment(page, end, PAGE_CACHE_SIZE); | ||
| 395 | if (offset == 0) | ||
| 396 | SetPageUptodate(page); | ||
| 397 | } else | ||
| 398 | zero_user_segment(page, pglen, PAGE_CACHE_SIZE); | ||
| 399 | } | ||
| 400 | |||
| 351 | lock_kernel(); | 401 | lock_kernel(); |
| 352 | status = nfs_updatepage(file, page, offset, copied); | 402 | status = nfs_updatepage(file, page, offset, copied); |
| 353 | unlock_kernel(); | 403 | unlock_kernel(); |
| @@ -362,6 +412,8 @@ static int nfs_write_end(struct file *file, struct address_space *mapping, | |||
| 362 | 412 | ||
| 363 | static void nfs_invalidate_page(struct page *page, unsigned long offset) | 413 | static void nfs_invalidate_page(struct page *page, unsigned long offset) |
| 364 | { | 414 | { |
| 415 | dfprintk(PAGECACHE, "NFS: invalidate_page(%p, %lu)\n", page, offset); | ||
| 416 | |||
| 365 | if (offset != 0) | 417 | if (offset != 0) |
| 366 | return; | 418 | return; |
| 367 | /* Cancel any unstarted writes on this page */ | 419 | /* Cancel any unstarted writes on this page */ |
| @@ -370,13 +422,20 @@ static void nfs_invalidate_page(struct page *page, unsigned long offset) | |||
| 370 | 422 | ||
| 371 | static int nfs_release_page(struct page *page, gfp_t gfp) | 423 | static int nfs_release_page(struct page *page, gfp_t gfp) |
| 372 | { | 424 | { |
| 425 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); | ||
| 426 | |||
| 373 | /* If PagePrivate() is set, then the page is not freeable */ | 427 | /* If PagePrivate() is set, then the page is not freeable */ |
| 374 | return 0; | 428 | return 0; |
| 375 | } | 429 | } |
| 376 | 430 | ||
| 377 | static int nfs_launder_page(struct page *page) | 431 | static int nfs_launder_page(struct page *page) |
| 378 | { | 432 | { |
| 379 | return nfs_wb_page(page->mapping->host, page); | 433 | struct inode *inode = page->mapping->host; |
| 434 | |||
| 435 | dfprintk(PAGECACHE, "NFS: launder_page(%ld, %llu)\n", | ||
| 436 | inode->i_ino, (long long)page_offset(page)); | ||
| 437 | |||
| 438 | return nfs_wb_page(inode, page); | ||
| 380 | } | 439 | } |
| 381 | 440 | ||
| 382 | const struct address_space_operations nfs_file_aops = { | 441 | const struct address_space_operations nfs_file_aops = { |
| @@ -396,13 +455,19 @@ const struct address_space_operations nfs_file_aops = { | |||
| 396 | static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page) | 455 | static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page) |
| 397 | { | 456 | { |
| 398 | struct file *filp = vma->vm_file; | 457 | struct file *filp = vma->vm_file; |
| 458 | struct dentry *dentry = filp->f_path.dentry; | ||
| 399 | unsigned pagelen; | 459 | unsigned pagelen; |
| 400 | int ret = -EINVAL; | 460 | int ret = -EINVAL; |
| 401 | struct address_space *mapping; | 461 | struct address_space *mapping; |
| 402 | 462 | ||
| 463 | dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%s/%s(%ld), offset %lld)\n", | ||
| 464 | dentry->d_parent->d_name.name, dentry->d_name.name, | ||
| 465 | filp->f_mapping->host->i_ino, | ||
| 466 | (long long)page_offset(page)); | ||
| 467 | |||
| 403 | lock_page(page); | 468 | lock_page(page); |
| 404 | mapping = page->mapping; | 469 | mapping = page->mapping; |
| 405 | if (mapping != vma->vm_file->f_path.dentry->d_inode->i_mapping) | 470 | if (mapping != dentry->d_inode->i_mapping) |
| 406 | goto out_unlock; | 471 | goto out_unlock; |
| 407 | 472 | ||
| 408 | ret = 0; | 473 | ret = 0; |
| @@ -450,9 +515,9 @@ static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 450 | if (iocb->ki_filp->f_flags & O_DIRECT) | 515 | if (iocb->ki_filp->f_flags & O_DIRECT) |
| 451 | return nfs_file_direct_write(iocb, iov, nr_segs, pos); | 516 | return nfs_file_direct_write(iocb, iov, nr_segs, pos); |
| 452 | 517 | ||
| 453 | dfprintk(VFS, "nfs: write(%s/%s(%ld), %lu@%Ld)\n", | 518 | dprintk("NFS: write(%s/%s, %lu@%Ld)\n", |
| 454 | dentry->d_parent->d_name.name, dentry->d_name.name, | 519 | dentry->d_parent->d_name.name, dentry->d_name.name, |
| 455 | inode->i_ino, (unsigned long) count, (long long) pos); | 520 | (unsigned long) count, (long long) pos); |
| 456 | 521 | ||
| 457 | result = -EBUSY; | 522 | result = -EBUSY; |
| 458 | if (IS_SWAPFILE(inode)) | 523 | if (IS_SWAPFILE(inode)) |
| @@ -586,7 +651,8 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl) | |||
| 586 | * This makes locking act as a cache coherency point. | 651 | * This makes locking act as a cache coherency point. |
| 587 | */ | 652 | */ |
| 588 | nfs_sync_mapping(filp->f_mapping); | 653 | nfs_sync_mapping(filp->f_mapping); |
| 589 | nfs_zap_caches(inode); | 654 | if (!nfs_have_delegation(inode, FMODE_READ)) |
| 655 | nfs_zap_caches(inode); | ||
| 590 | out: | 656 | out: |
| 591 | return status; | 657 | return status; |
| 592 | } | 658 | } |
| @@ -596,23 +662,35 @@ out: | |||
| 596 | */ | 662 | */ |
| 597 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) | 663 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) |
| 598 | { | 664 | { |
| 599 | struct inode * inode = filp->f_mapping->host; | 665 | struct inode *inode = filp->f_mapping->host; |
| 666 | int ret = -ENOLCK; | ||
| 600 | 667 | ||
| 601 | dprintk("NFS: nfs_lock(f=%s/%ld, t=%x, fl=%x, r=%Ld:%Ld)\n", | 668 | dprintk("NFS: lock(%s/%s, t=%x, fl=%x, r=%lld:%lld)\n", |
| 602 | inode->i_sb->s_id, inode->i_ino, | 669 | filp->f_path.dentry->d_parent->d_name.name, |
| 670 | filp->f_path.dentry->d_name.name, | ||
| 603 | fl->fl_type, fl->fl_flags, | 671 | fl->fl_type, fl->fl_flags, |
| 604 | (long long)fl->fl_start, (long long)fl->fl_end); | 672 | (long long)fl->fl_start, (long long)fl->fl_end); |
| 673 | |||
| 605 | nfs_inc_stats(inode, NFSIOS_VFSLOCK); | 674 | nfs_inc_stats(inode, NFSIOS_VFSLOCK); |
| 606 | 675 | ||
| 607 | /* No mandatory locks over NFS */ | 676 | /* No mandatory locks over NFS */ |
| 608 | if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK) | 677 | if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK) |
| 609 | return -ENOLCK; | 678 | goto out_err; |
| 679 | |||
| 680 | if (NFS_PROTO(inode)->lock_check_bounds != NULL) { | ||
| 681 | ret = NFS_PROTO(inode)->lock_check_bounds(fl); | ||
| 682 | if (ret < 0) | ||
| 683 | goto out_err; | ||
| 684 | } | ||
| 610 | 685 | ||
| 611 | if (IS_GETLK(cmd)) | 686 | if (IS_GETLK(cmd)) |
| 612 | return do_getlk(filp, cmd, fl); | 687 | ret = do_getlk(filp, cmd, fl); |
| 613 | if (fl->fl_type == F_UNLCK) | 688 | else if (fl->fl_type == F_UNLCK) |
| 614 | return do_unlk(filp, cmd, fl); | 689 | ret = do_unlk(filp, cmd, fl); |
| 615 | return do_setlk(filp, cmd, fl); | 690 | else |
| 691 | ret = do_setlk(filp, cmd, fl); | ||
| 692 | out_err: | ||
| 693 | return ret; | ||
| 616 | } | 694 | } |
| 617 | 695 | ||
| 618 | /* | 696 | /* |
| @@ -620,9 +698,9 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) | |||
| 620 | */ | 698 | */ |
| 621 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl) | 699 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl) |
| 622 | { | 700 | { |
| 623 | dprintk("NFS: nfs_flock(f=%s/%ld, t=%x, fl=%x)\n", | 701 | dprintk("NFS: flock(%s/%s, t=%x, fl=%x)\n", |
| 624 | filp->f_path.dentry->d_inode->i_sb->s_id, | 702 | filp->f_path.dentry->d_parent->d_name.name, |
| 625 | filp->f_path.dentry->d_inode->i_ino, | 703 | filp->f_path.dentry->d_name.name, |
| 626 | fl->fl_type, fl->fl_flags); | 704 | fl->fl_type, fl->fl_flags); |
| 627 | 705 | ||
| 628 | /* | 706 | /* |
| @@ -645,12 +723,15 @@ static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl) | |||
| 645 | return do_setlk(filp, cmd, fl); | 723 | return do_setlk(filp, cmd, fl); |
| 646 | } | 724 | } |
| 647 | 725 | ||
| 726 | /* | ||
| 727 | * There is no protocol support for leases, so we have no way to implement | ||
| 728 | * them correctly in the face of opens by other clients. | ||
| 729 | */ | ||
| 648 | static int nfs_setlease(struct file *file, long arg, struct file_lock **fl) | 730 | static int nfs_setlease(struct file *file, long arg, struct file_lock **fl) |
| 649 | { | 731 | { |
| 650 | /* | 732 | dprintk("NFS: setlease(%s/%s, arg=%ld)\n", |
| 651 | * There is no protocol support for leases, so we have no way | 733 | file->f_path.dentry->d_parent->d_name.name, |
| 652 | * to implement them correctly in the face of opens by other | 734 | file->f_path.dentry->d_name.name, arg); |
| 653 | * clients. | 735 | |
| 654 | */ | ||
| 655 | return -EINVAL; | 736 | return -EINVAL; |
| 656 | } | 737 | } |
