diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ceph/mds_client.c | 6 | ||||
-rw-r--r-- | fs/devpts/inode.c | 100 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 2 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 33 |
4 files changed, 69 insertions, 72 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 541ead4d8965..85b8517f17a0 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -386,9 +386,7 @@ void ceph_put_mds_session(struct ceph_mds_session *s) | |||
386 | atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1); | 386 | atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1); |
387 | if (atomic_dec_and_test(&s->s_ref)) { | 387 | if (atomic_dec_and_test(&s->s_ref)) { |
388 | if (s->s_auth.authorizer) | 388 | if (s->s_auth.authorizer) |
389 | ceph_auth_destroy_authorizer( | 389 | ceph_auth_destroy_authorizer(s->s_auth.authorizer); |
390 | s->s_mdsc->fsc->client->monc.auth, | ||
391 | s->s_auth.authorizer); | ||
392 | kfree(s); | 390 | kfree(s); |
393 | } | 391 | } |
394 | } | 392 | } |
@@ -3900,7 +3898,7 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con, | |||
3900 | struct ceph_auth_handshake *auth = &s->s_auth; | 3898 | struct ceph_auth_handshake *auth = &s->s_auth; |
3901 | 3899 | ||
3902 | if (force_new && auth->authorizer) { | 3900 | if (force_new && auth->authorizer) { |
3903 | ceph_auth_destroy_authorizer(ac, auth->authorizer); | 3901 | ceph_auth_destroy_authorizer(auth->authorizer); |
3904 | auth->authorizer = NULL; | 3902 | auth->authorizer = NULL; |
3905 | } | 3903 | } |
3906 | if (!auth->authorizer) { | 3904 | if (!auth->authorizer) { |
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 655f21f99160..0b2954d7172d 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
@@ -128,6 +128,7 @@ static const match_table_t tokens = { | |||
128 | struct pts_fs_info { | 128 | struct pts_fs_info { |
129 | struct ida allocated_ptys; | 129 | struct ida allocated_ptys; |
130 | struct pts_mount_opts mount_opts; | 130 | struct pts_mount_opts mount_opts; |
131 | struct super_block *sb; | ||
131 | struct dentry *ptmx_dentry; | 132 | struct dentry *ptmx_dentry; |
132 | }; | 133 | }; |
133 | 134 | ||
@@ -358,7 +359,7 @@ static const struct super_operations devpts_sops = { | |||
358 | .show_options = devpts_show_options, | 359 | .show_options = devpts_show_options, |
359 | }; | 360 | }; |
360 | 361 | ||
361 | static void *new_pts_fs_info(void) | 362 | static void *new_pts_fs_info(struct super_block *sb) |
362 | { | 363 | { |
363 | struct pts_fs_info *fsi; | 364 | struct pts_fs_info *fsi; |
364 | 365 | ||
@@ -369,6 +370,7 @@ static void *new_pts_fs_info(void) | |||
369 | ida_init(&fsi->allocated_ptys); | 370 | ida_init(&fsi->allocated_ptys); |
370 | fsi->mount_opts.mode = DEVPTS_DEFAULT_MODE; | 371 | fsi->mount_opts.mode = DEVPTS_DEFAULT_MODE; |
371 | fsi->mount_opts.ptmxmode = DEVPTS_DEFAULT_PTMX_MODE; | 372 | fsi->mount_opts.ptmxmode = DEVPTS_DEFAULT_PTMX_MODE; |
373 | fsi->sb = sb; | ||
372 | 374 | ||
373 | return fsi; | 375 | return fsi; |
374 | } | 376 | } |
@@ -384,7 +386,7 @@ devpts_fill_super(struct super_block *s, void *data, int silent) | |||
384 | s->s_op = &devpts_sops; | 386 | s->s_op = &devpts_sops; |
385 | s->s_time_gran = 1; | 387 | s->s_time_gran = 1; |
386 | 388 | ||
387 | s->s_fs_info = new_pts_fs_info(); | 389 | s->s_fs_info = new_pts_fs_info(s); |
388 | if (!s->s_fs_info) | 390 | if (!s->s_fs_info) |
389 | goto fail; | 391 | goto fail; |
390 | 392 | ||
@@ -524,17 +526,14 @@ static struct file_system_type devpts_fs_type = { | |||
524 | * to the System V naming convention | 526 | * to the System V naming convention |
525 | */ | 527 | */ |
526 | 528 | ||
527 | int devpts_new_index(struct inode *ptmx_inode) | 529 | int devpts_new_index(struct pts_fs_info *fsi) |
528 | { | 530 | { |
529 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | ||
530 | struct pts_fs_info *fsi; | ||
531 | int index; | 531 | int index; |
532 | int ida_ret; | 532 | int ida_ret; |
533 | 533 | ||
534 | if (!sb) | 534 | if (!fsi) |
535 | return -ENODEV; | 535 | return -ENODEV; |
536 | 536 | ||
537 | fsi = DEVPTS_SB(sb); | ||
538 | retry: | 537 | retry: |
539 | if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) | 538 | if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) |
540 | return -ENOMEM; | 539 | return -ENOMEM; |
@@ -564,11 +563,8 @@ retry: | |||
564 | return index; | 563 | return index; |
565 | } | 564 | } |
566 | 565 | ||
567 | void devpts_kill_index(struct inode *ptmx_inode, int idx) | 566 | void devpts_kill_index(struct pts_fs_info *fsi, int idx) |
568 | { | 567 | { |
569 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | ||
570 | struct pts_fs_info *fsi = DEVPTS_SB(sb); | ||
571 | |||
572 | mutex_lock(&allocated_ptys_lock); | 568 | mutex_lock(&allocated_ptys_lock); |
573 | ida_remove(&fsi->allocated_ptys, idx); | 569 | ida_remove(&fsi->allocated_ptys, idx); |
574 | pty_count--; | 570 | pty_count--; |
@@ -578,21 +574,25 @@ void devpts_kill_index(struct inode *ptmx_inode, int idx) | |||
578 | /* | 574 | /* |
579 | * pty code needs to hold extra references in case of last /dev/tty close | 575 | * pty code needs to hold extra references in case of last /dev/tty close |
580 | */ | 576 | */ |
581 | 577 | struct pts_fs_info *devpts_get_ref(struct inode *ptmx_inode, struct file *file) | |
582 | void devpts_add_ref(struct inode *ptmx_inode) | ||
583 | { | 578 | { |
584 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | 579 | struct super_block *sb; |
580 | struct pts_fs_info *fsi; | ||
581 | |||
582 | sb = pts_sb_from_inode(ptmx_inode); | ||
583 | if (!sb) | ||
584 | return NULL; | ||
585 | fsi = DEVPTS_SB(sb); | ||
586 | if (!fsi) | ||
587 | return NULL; | ||
585 | 588 | ||
586 | atomic_inc(&sb->s_active); | 589 | atomic_inc(&sb->s_active); |
587 | ihold(ptmx_inode); | 590 | return fsi; |
588 | } | 591 | } |
589 | 592 | ||
590 | void devpts_del_ref(struct inode *ptmx_inode) | 593 | void devpts_put_ref(struct pts_fs_info *fsi) |
591 | { | 594 | { |
592 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | 595 | deactivate_super(fsi->sb); |
593 | |||
594 | iput(ptmx_inode); | ||
595 | deactivate_super(sb); | ||
596 | } | 596 | } |
597 | 597 | ||
598 | /** | 598 | /** |
@@ -604,22 +604,20 @@ void devpts_del_ref(struct inode *ptmx_inode) | |||
604 | * | 604 | * |
605 | * The created inode is returned. Remove it from /dev/pts/ by devpts_pty_kill. | 605 | * The created inode is returned. Remove it from /dev/pts/ by devpts_pty_kill. |
606 | */ | 606 | */ |
607 | struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index, | 607 | struct dentry *devpts_pty_new(struct pts_fs_info *fsi, int index, void *priv) |
608 | void *priv) | ||
609 | { | 608 | { |
610 | struct dentry *dentry; | 609 | struct dentry *dentry; |
611 | struct super_block *sb = pts_sb_from_inode(ptmx_inode); | 610 | struct super_block *sb; |
612 | struct inode *inode; | 611 | struct inode *inode; |
613 | struct dentry *root; | 612 | struct dentry *root; |
614 | struct pts_fs_info *fsi; | ||
615 | struct pts_mount_opts *opts; | 613 | struct pts_mount_opts *opts; |
616 | char s[12]; | 614 | char s[12]; |
617 | 615 | ||
618 | if (!sb) | 616 | if (!fsi) |
619 | return ERR_PTR(-ENODEV); | 617 | return ERR_PTR(-ENODEV); |
620 | 618 | ||
619 | sb = fsi->sb; | ||
621 | root = sb->s_root; | 620 | root = sb->s_root; |
622 | fsi = DEVPTS_SB(sb); | ||
623 | opts = &fsi->mount_opts; | 621 | opts = &fsi->mount_opts; |
624 | 622 | ||
625 | inode = new_inode(sb); | 623 | inode = new_inode(sb); |
@@ -630,25 +628,21 @@ struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index, | |||
630 | inode->i_uid = opts->setuid ? opts->uid : current_fsuid(); | 628 | inode->i_uid = opts->setuid ? opts->uid : current_fsuid(); |
631 | inode->i_gid = opts->setgid ? opts->gid : current_fsgid(); | 629 | inode->i_gid = opts->setgid ? opts->gid : current_fsgid(); |
632 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 630 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
633 | init_special_inode(inode, S_IFCHR|opts->mode, device); | 631 | init_special_inode(inode, S_IFCHR|opts->mode, MKDEV(UNIX98_PTY_SLAVE_MAJOR, index)); |
634 | inode->i_private = priv; | ||
635 | 632 | ||
636 | sprintf(s, "%d", index); | 633 | sprintf(s, "%d", index); |
637 | 634 | ||
638 | inode_lock(d_inode(root)); | ||
639 | |||
640 | dentry = d_alloc_name(root, s); | 635 | dentry = d_alloc_name(root, s); |
641 | if (dentry) { | 636 | if (dentry) { |
637 | dentry->d_fsdata = priv; | ||
642 | d_add(dentry, inode); | 638 | d_add(dentry, inode); |
643 | fsnotify_create(d_inode(root), dentry); | 639 | fsnotify_create(d_inode(root), dentry); |
644 | } else { | 640 | } else { |
645 | iput(inode); | 641 | iput(inode); |
646 | inode = ERR_PTR(-ENOMEM); | 642 | dentry = ERR_PTR(-ENOMEM); |
647 | } | 643 | } |
648 | 644 | ||
649 | inode_unlock(d_inode(root)); | 645 | return dentry; |
650 | |||
651 | return inode; | ||
652 | } | 646 | } |
653 | 647 | ||
654 | /** | 648 | /** |
@@ -657,24 +651,10 @@ struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index, | |||
657 | * | 651 | * |
658 | * Returns whatever was passed as priv in devpts_pty_new for a given inode. | 652 | * Returns whatever was passed as priv in devpts_pty_new for a given inode. |
659 | */ | 653 | */ |
660 | void *devpts_get_priv(struct inode *pts_inode) | 654 | void *devpts_get_priv(struct dentry *dentry) |
661 | { | 655 | { |
662 | struct dentry *dentry; | 656 | WARN_ON_ONCE(dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC); |
663 | void *priv = NULL; | 657 | return dentry->d_fsdata; |
664 | |||
665 | BUG_ON(pts_inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR)); | ||
666 | |||
667 | /* Ensure dentry has not been deleted by devpts_pty_kill() */ | ||
668 | dentry = d_find_alias(pts_inode); | ||
669 | if (!dentry) | ||
670 | return NULL; | ||
671 | |||
672 | if (pts_inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC) | ||
673 | priv = pts_inode->i_private; | ||
674 | |||
675 | dput(dentry); | ||
676 | |||
677 | return priv; | ||
678 | } | 658 | } |
679 | 659 | ||
680 | /** | 660 | /** |
@@ -683,24 +663,14 @@ void *devpts_get_priv(struct inode *pts_inode) | |||
683 | * | 663 | * |
684 | * This is an inverse operation of devpts_pty_new. | 664 | * This is an inverse operation of devpts_pty_new. |
685 | */ | 665 | */ |
686 | void devpts_pty_kill(struct inode *inode) | 666 | void devpts_pty_kill(struct dentry *dentry) |
687 | { | 667 | { |
688 | struct super_block *sb = pts_sb_from_inode(inode); | 668 | WARN_ON_ONCE(dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC); |
689 | struct dentry *root = sb->s_root; | ||
690 | struct dentry *dentry; | ||
691 | 669 | ||
692 | BUG_ON(inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR)); | 670 | dentry->d_fsdata = NULL; |
693 | 671 | drop_nlink(dentry->d_inode); | |
694 | inode_lock(d_inode(root)); | ||
695 | |||
696 | dentry = d_find_alias(inode); | ||
697 | |||
698 | drop_nlink(inode); | ||
699 | d_delete(dentry); | 672 | d_delete(dentry); |
700 | dput(dentry); /* d_alloc_name() in devpts_pty_new() */ | 673 | dput(dentry); /* d_alloc_name() in devpts_pty_new() */ |
701 | dput(dentry); /* d_find_alias above */ | ||
702 | |||
703 | inode_unlock(d_inode(root)); | ||
704 | } | 674 | } |
705 | 675 | ||
706 | static int __init init_devpts_fs(void) | 676 | static int __init init_devpts_fs(void) |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 9aed6e202201..13719d3f35f8 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -2455,6 +2455,8 @@ int dlm_deref_lockres_done_handler(struct o2net_msg *msg, u32 len, void *data, | |||
2455 | 2455 | ||
2456 | spin_unlock(&dlm->spinlock); | 2456 | spin_unlock(&dlm->spinlock); |
2457 | 2457 | ||
2458 | ret = 0; | ||
2459 | |||
2458 | done: | 2460 | done: |
2459 | dlm_put(dlm); | 2461 | dlm_put(dlm); |
2460 | return ret; | 2462 | return ret; |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 229cb546bee0..541583510cfb 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -1518,6 +1518,32 @@ static struct page *can_gather_numa_stats(pte_t pte, struct vm_area_struct *vma, | |||
1518 | return page; | 1518 | return page; |
1519 | } | 1519 | } |
1520 | 1520 | ||
1521 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
1522 | static struct page *can_gather_numa_stats_pmd(pmd_t pmd, | ||
1523 | struct vm_area_struct *vma, | ||
1524 | unsigned long addr) | ||
1525 | { | ||
1526 | struct page *page; | ||
1527 | int nid; | ||
1528 | |||
1529 | if (!pmd_present(pmd)) | ||
1530 | return NULL; | ||
1531 | |||
1532 | page = vm_normal_page_pmd(vma, addr, pmd); | ||
1533 | if (!page) | ||
1534 | return NULL; | ||
1535 | |||
1536 | if (PageReserved(page)) | ||
1537 | return NULL; | ||
1538 | |||
1539 | nid = page_to_nid(page); | ||
1540 | if (!node_isset(nid, node_states[N_MEMORY])) | ||
1541 | return NULL; | ||
1542 | |||
1543 | return page; | ||
1544 | } | ||
1545 | #endif | ||
1546 | |||
1521 | static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | 1547 | static int gather_pte_stats(pmd_t *pmd, unsigned long addr, |
1522 | unsigned long end, struct mm_walk *walk) | 1548 | unsigned long end, struct mm_walk *walk) |
1523 | { | 1549 | { |
@@ -1527,14 +1553,14 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | |||
1527 | pte_t *orig_pte; | 1553 | pte_t *orig_pte; |
1528 | pte_t *pte; | 1554 | pte_t *pte; |
1529 | 1555 | ||
1556 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
1530 | ptl = pmd_trans_huge_lock(pmd, vma); | 1557 | ptl = pmd_trans_huge_lock(pmd, vma); |
1531 | if (ptl) { | 1558 | if (ptl) { |
1532 | pte_t huge_pte = *(pte_t *)pmd; | ||
1533 | struct page *page; | 1559 | struct page *page; |
1534 | 1560 | ||
1535 | page = can_gather_numa_stats(huge_pte, vma, addr); | 1561 | page = can_gather_numa_stats_pmd(*pmd, vma, addr); |
1536 | if (page) | 1562 | if (page) |
1537 | gather_stats(page, md, pte_dirty(huge_pte), | 1563 | gather_stats(page, md, pmd_dirty(*pmd), |
1538 | HPAGE_PMD_SIZE/PAGE_SIZE); | 1564 | HPAGE_PMD_SIZE/PAGE_SIZE); |
1539 | spin_unlock(ptl); | 1565 | spin_unlock(ptl); |
1540 | return 0; | 1566 | return 0; |
@@ -1542,6 +1568,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | |||
1542 | 1568 | ||
1543 | if (pmd_trans_unstable(pmd)) | 1569 | if (pmd_trans_unstable(pmd)) |
1544 | return 0; | 1570 | return 0; |
1571 | #endif | ||
1545 | orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); | 1572 | orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); |
1546 | do { | 1573 | do { |
1547 | struct page *page = can_gather_numa_stats(*pte, vma, addr); | 1574 | struct page *page = can_gather_numa_stats(*pte, vma, addr); |