namei.c (b981d8b3f5e008ff10d993be633ad00564fc22cd) | namei.c (afddba49d18f346e5cc2938b6ed7c512db18ca68) |
---|---|
1/* 2 * linux/fs/namei.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7/* 8 * Some corrections by tytso. --- 2715 unchanged lines hidden (view full) --- 2724 } 2725} 2726 2727int __page_symlink(struct inode *inode, const char *symname, int len, 2728 gfp_t gfp_mask) 2729{ 2730 struct address_space *mapping = inode->i_mapping; 2731 struct page *page; | 1/* 2 * linux/fs/namei.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7/* 8 * Some corrections by tytso. --- 2715 unchanged lines hidden (view full) --- 2724 } 2725} 2726 2727int __page_symlink(struct inode *inode, const char *symname, int len, 2728 gfp_t gfp_mask) 2729{ 2730 struct address_space *mapping = inode->i_mapping; 2731 struct page *page; |
2732 void *fsdata; |
|
2732 int err; 2733 char *kaddr; 2734 2735retry: | 2733 int err; 2734 char *kaddr; 2735 2736retry: |
2736 err = -ENOMEM; 2737 page = find_or_create_page(mapping, 0, gfp_mask); 2738 if (!page) 2739 goto fail; 2740 err = mapping->a_ops->prepare_write(NULL, page, 0, len-1); 2741 if (err == AOP_TRUNCATED_PAGE) { 2742 page_cache_release(page); 2743 goto retry; 2744 } | 2737 err = pagecache_write_begin(NULL, mapping, 0, len-1, 2738 AOP_FLAG_UNINTERRUPTIBLE, &page, &fsdata); |
2745 if (err) | 2739 if (err) |
2746 goto fail_map; | 2740 goto fail; 2741 |
2747 kaddr = kmap_atomic(page, KM_USER0); 2748 memcpy(kaddr, symname, len-1); 2749 kunmap_atomic(kaddr, KM_USER0); | 2742 kaddr = kmap_atomic(page, KM_USER0); 2743 memcpy(kaddr, symname, len-1); 2744 kunmap_atomic(kaddr, KM_USER0); |
2750 err = mapping->a_ops->commit_write(NULL, page, 0, len-1); 2751 if (err == AOP_TRUNCATED_PAGE) { 2752 page_cache_release(page); 2753 goto retry; 2754 } 2755 if (err) 2756 goto fail_map; 2757 /* 2758 * Notice that we are _not_ going to block here - end of page is 2759 * unmapped, so this will only try to map the rest of page, see 2760 * that it is unmapped (typically even will not look into inode - 2761 * ->i_size will be enough for everything) and zero it out. 2762 * OTOH it's obviously correct and should make the page up-to-date. 2763 */ 2764 if (!PageUptodate(page)) { 2765 err = mapping->a_ops->readpage(NULL, page); 2766 if (err != AOP_TRUNCATED_PAGE) 2767 wait_on_page_locked(page); 2768 } else { 2769 unlock_page(page); 2770 } 2771 page_cache_release(page); | 2745 2746 err = pagecache_write_end(NULL, mapping, 0, len-1, len-1, 2747 page, fsdata); |
2772 if (err < 0) 2773 goto fail; | 2748 if (err < 0) 2749 goto fail; |
2750 if (err < len-1) 2751 goto retry; 2752 |
|
2774 mark_inode_dirty(inode); 2775 return 0; | 2753 mark_inode_dirty(inode); 2754 return 0; |
2776fail_map: 2777 unlock_page(page); 2778 page_cache_release(page); | |
2779fail: 2780 return err; 2781} 2782 2783int page_symlink(struct inode *inode, const char *symname, int len) 2784{ 2785 return __page_symlink(inode, symname, len, 2786 mapping_gfp_mask(inode->i_mapping)); --- 42 unchanged lines hidden --- | 2755fail: 2756 return err; 2757} 2758 2759int page_symlink(struct inode *inode, const char *symname, int len) 2760{ 2761 return __page_symlink(inode, symname, len, 2762 mapping_gfp_mask(inode->i_mapping)); --- 42 unchanged lines hidden --- |