diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/aio.c | 21 | ||||
| -rw-r--r-- | fs/btrfs/compression.c | 33 | ||||
| -rw-r--r-- | fs/btrfs/compression.h | 4 | ||||
| -rw-r--r-- | fs/btrfs/lzo.c | 15 | ||||
| -rw-r--r-- | fs/btrfs/zlib.c | 20 | ||||
| -rw-r--r-- | fs/fat/namei_vfat.c | 20 | ||||
| -rw-r--r-- | fs/jbd2/journal.c | 5 | ||||
| -rw-r--r-- | fs/nfsd/nfs4callback.c | 8 | ||||
| -rw-r--r-- | fs/nfsd/nfsd.h | 9 |
9 files changed, 106 insertions, 29 deletions
| @@ -165,6 +165,15 @@ static struct vfsmount *aio_mnt; | |||
| 165 | static const struct file_operations aio_ring_fops; | 165 | static const struct file_operations aio_ring_fops; |
| 166 | static const struct address_space_operations aio_ctx_aops; | 166 | static const struct address_space_operations aio_ctx_aops; |
| 167 | 167 | ||
| 168 | /* Backing dev info for aio fs. | ||
| 169 | * -no dirty page accounting or writeback happens | ||
| 170 | */ | ||
| 171 | static struct backing_dev_info aio_fs_backing_dev_info = { | ||
| 172 | .name = "aiofs", | ||
| 173 | .state = 0, | ||
| 174 | .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_MAP_COPY, | ||
| 175 | }; | ||
| 176 | |||
| 168 | static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages) | 177 | static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages) |
| 169 | { | 178 | { |
| 170 | struct qstr this = QSTR_INIT("[aio]", 5); | 179 | struct qstr this = QSTR_INIT("[aio]", 5); |
| @@ -176,6 +185,7 @@ static struct file *aio_private_file(struct kioctx *ctx, loff_t nr_pages) | |||
| 176 | 185 | ||
| 177 | inode->i_mapping->a_ops = &aio_ctx_aops; | 186 | inode->i_mapping->a_ops = &aio_ctx_aops; |
| 178 | inode->i_mapping->private_data = ctx; | 187 | inode->i_mapping->private_data = ctx; |
| 188 | inode->i_mapping->backing_dev_info = &aio_fs_backing_dev_info; | ||
| 179 | inode->i_size = PAGE_SIZE * nr_pages; | 189 | inode->i_size = PAGE_SIZE * nr_pages; |
| 180 | 190 | ||
| 181 | path.dentry = d_alloc_pseudo(aio_mnt->mnt_sb, &this); | 191 | path.dentry = d_alloc_pseudo(aio_mnt->mnt_sb, &this); |
| @@ -220,6 +230,9 @@ static int __init aio_setup(void) | |||
| 220 | if (IS_ERR(aio_mnt)) | 230 | if (IS_ERR(aio_mnt)) |
| 221 | panic("Failed to create aio fs mount."); | 231 | panic("Failed to create aio fs mount."); |
| 222 | 232 | ||
| 233 | if (bdi_init(&aio_fs_backing_dev_info)) | ||
| 234 | panic("Failed to init aio fs backing dev info."); | ||
| 235 | |||
| 223 | kiocb_cachep = KMEM_CACHE(kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC); | 236 | kiocb_cachep = KMEM_CACHE(kiocb, SLAB_HWCACHE_ALIGN|SLAB_PANIC); |
| 224 | kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC); | 237 | kioctx_cachep = KMEM_CACHE(kioctx,SLAB_HWCACHE_ALIGN|SLAB_PANIC); |
| 225 | 238 | ||
| @@ -281,11 +294,6 @@ static const struct file_operations aio_ring_fops = { | |||
| 281 | .mmap = aio_ring_mmap, | 294 | .mmap = aio_ring_mmap, |
| 282 | }; | 295 | }; |
| 283 | 296 | ||
| 284 | static int aio_set_page_dirty(struct page *page) | ||
| 285 | { | ||
| 286 | return 0; | ||
| 287 | } | ||
| 288 | |||
| 289 | #if IS_ENABLED(CONFIG_MIGRATION) | 297 | #if IS_ENABLED(CONFIG_MIGRATION) |
| 290 | static int aio_migratepage(struct address_space *mapping, struct page *new, | 298 | static int aio_migratepage(struct address_space *mapping, struct page *new, |
| 291 | struct page *old, enum migrate_mode mode) | 299 | struct page *old, enum migrate_mode mode) |
| @@ -357,7 +365,7 @@ out: | |||
| 357 | #endif | 365 | #endif |
| 358 | 366 | ||
| 359 | static const struct address_space_operations aio_ctx_aops = { | 367 | static const struct address_space_operations aio_ctx_aops = { |
| 360 | .set_page_dirty = aio_set_page_dirty, | 368 | .set_page_dirty = __set_page_dirty_no_writeback, |
| 361 | #if IS_ENABLED(CONFIG_MIGRATION) | 369 | #if IS_ENABLED(CONFIG_MIGRATION) |
| 362 | .migratepage = aio_migratepage, | 370 | .migratepage = aio_migratepage, |
| 363 | #endif | 371 | #endif |
| @@ -412,7 +420,6 @@ static int aio_setup_ring(struct kioctx *ctx) | |||
| 412 | pr_debug("pid(%d) page[%d]->count=%d\n", | 420 | pr_debug("pid(%d) page[%d]->count=%d\n", |
| 413 | current->pid, i, page_count(page)); | 421 | current->pid, i, page_count(page)); |
| 414 | SetPageUptodate(page); | 422 | SetPageUptodate(page); |
| 415 | SetPageDirty(page); | ||
| 416 | unlock_page(page); | 423 | unlock_page(page); |
| 417 | 424 | ||
| 418 | ctx->ring_pages[i] = page; | 425 | ctx->ring_pages[i] = page; |
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index d3220d31d3cb..dcd9be32ac57 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
| @@ -1011,8 +1011,6 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
| 1011 | bytes = min(bytes, working_bytes); | 1011 | bytes = min(bytes, working_bytes); |
| 1012 | kaddr = kmap_atomic(page_out); | 1012 | kaddr = kmap_atomic(page_out); |
| 1013 | memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); | 1013 | memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); |
| 1014 | if (*pg_index == (vcnt - 1) && *pg_offset == 0) | ||
| 1015 | memset(kaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); | ||
| 1016 | kunmap_atomic(kaddr); | 1014 | kunmap_atomic(kaddr); |
| 1017 | flush_dcache_page(page_out); | 1015 | flush_dcache_page(page_out); |
| 1018 | 1016 | ||
| @@ -1054,3 +1052,34 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
| 1054 | 1052 | ||
| 1055 | return 1; | 1053 | return 1; |
| 1056 | } | 1054 | } |
| 1055 | |||
| 1056 | /* | ||
| 1057 | * When uncompressing data, we need to make sure and zero any parts of | ||
| 1058 | * the biovec that were not filled in by the decompression code. pg_index | ||
| 1059 | * and pg_offset indicate the last page and the last offset of that page | ||
| 1060 | * that have been filled in. This will zero everything remaining in the | ||
| 1061 | * biovec. | ||
| 1062 | */ | ||
| 1063 | void btrfs_clear_biovec_end(struct bio_vec *bvec, int vcnt, | ||
| 1064 | unsigned long pg_index, | ||
| 1065 | unsigned long pg_offset) | ||
| 1066 | { | ||
| 1067 | while (pg_index < vcnt) { | ||
| 1068 | struct page *page = bvec[pg_index].bv_page; | ||
| 1069 | unsigned long off = bvec[pg_index].bv_offset; | ||
| 1070 | unsigned long len = bvec[pg_index].bv_len; | ||
| 1071 | |||
| 1072 | if (pg_offset < off) | ||
| 1073 | pg_offset = off; | ||
| 1074 | if (pg_offset < off + len) { | ||
| 1075 | unsigned long bytes = off + len - pg_offset; | ||
| 1076 | char *kaddr; | ||
| 1077 | |||
| 1078 | kaddr = kmap_atomic(page); | ||
| 1079 | memset(kaddr + pg_offset, 0, bytes); | ||
| 1080 | kunmap_atomic(kaddr); | ||
| 1081 | } | ||
| 1082 | pg_index++; | ||
| 1083 | pg_offset = 0; | ||
| 1084 | } | ||
| 1085 | } | ||
diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h index 0c803b4fbf93..d181f70caae0 100644 --- a/fs/btrfs/compression.h +++ b/fs/btrfs/compression.h | |||
| @@ -45,7 +45,9 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
| 45 | unsigned long nr_pages); | 45 | unsigned long nr_pages); |
| 46 | int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | 46 | int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, |
| 47 | int mirror_num, unsigned long bio_flags); | 47 | int mirror_num, unsigned long bio_flags); |
| 48 | 48 | void btrfs_clear_biovec_end(struct bio_vec *bvec, int vcnt, | |
| 49 | unsigned long pg_index, | ||
| 50 | unsigned long pg_offset); | ||
| 49 | struct btrfs_compress_op { | 51 | struct btrfs_compress_op { |
| 50 | struct list_head *(*alloc_workspace)(void); | 52 | struct list_head *(*alloc_workspace)(void); |
| 51 | 53 | ||
diff --git a/fs/btrfs/lzo.c b/fs/btrfs/lzo.c index 78285f30909e..617553cdb7d3 100644 --- a/fs/btrfs/lzo.c +++ b/fs/btrfs/lzo.c | |||
| @@ -373,6 +373,8 @@ cont: | |||
| 373 | } | 373 | } |
| 374 | done: | 374 | done: |
| 375 | kunmap(pages_in[page_in_index]); | 375 | kunmap(pages_in[page_in_index]); |
| 376 | if (!ret) | ||
| 377 | btrfs_clear_biovec_end(bvec, vcnt, page_out_index, pg_offset); | ||
| 376 | return ret; | 378 | return ret; |
| 377 | } | 379 | } |
| 378 | 380 | ||
| @@ -410,10 +412,23 @@ static int lzo_decompress(struct list_head *ws, unsigned char *data_in, | |||
| 410 | goto out; | 412 | goto out; |
| 411 | } | 413 | } |
| 412 | 414 | ||
| 415 | /* | ||
| 416 | * the caller is already checking against PAGE_SIZE, but lets | ||
| 417 | * move this check closer to the memcpy/memset | ||
| 418 | */ | ||
| 419 | destlen = min_t(unsigned long, destlen, PAGE_SIZE); | ||
| 413 | bytes = min_t(unsigned long, destlen, out_len - start_byte); | 420 | bytes = min_t(unsigned long, destlen, out_len - start_byte); |
| 414 | 421 | ||
| 415 | kaddr = kmap_atomic(dest_page); | 422 | kaddr = kmap_atomic(dest_page); |
| 416 | memcpy(kaddr, workspace->buf + start_byte, bytes); | 423 | memcpy(kaddr, workspace->buf + start_byte, bytes); |
| 424 | |||
| 425 | /* | ||
| 426 | * btrfs_getblock is doing a zero on the tail of the page too, | ||
| 427 | * but this will cover anything missing from the decompressed | ||
| 428 | * data. | ||
| 429 | */ | ||
| 430 | if (bytes < destlen) | ||
| 431 | memset(kaddr+bytes, 0, destlen-bytes); | ||
| 417 | kunmap_atomic(kaddr); | 432 | kunmap_atomic(kaddr); |
| 418 | out: | 433 | out: |
| 419 | return ret; | 434 | return ret; |
diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c index 759fa4e2de8f..fb22fd8d8fb8 100644 --- a/fs/btrfs/zlib.c +++ b/fs/btrfs/zlib.c | |||
| @@ -299,6 +299,8 @@ done: | |||
| 299 | zlib_inflateEnd(&workspace->strm); | 299 | zlib_inflateEnd(&workspace->strm); |
| 300 | if (data_in) | 300 | if (data_in) |
| 301 | kunmap(pages_in[page_in_index]); | 301 | kunmap(pages_in[page_in_index]); |
| 302 | if (!ret) | ||
| 303 | btrfs_clear_biovec_end(bvec, vcnt, page_out_index, pg_offset); | ||
| 302 | return ret; | 304 | return ret; |
| 303 | } | 305 | } |
| 304 | 306 | ||
| @@ -310,10 +312,14 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in, | |||
| 310 | struct workspace *workspace = list_entry(ws, struct workspace, list); | 312 | struct workspace *workspace = list_entry(ws, struct workspace, list); |
| 311 | int ret = 0; | 313 | int ret = 0; |
| 312 | int wbits = MAX_WBITS; | 314 | int wbits = MAX_WBITS; |
| 313 | unsigned long bytes_left = destlen; | 315 | unsigned long bytes_left; |
| 314 | unsigned long total_out = 0; | 316 | unsigned long total_out = 0; |
| 317 | unsigned long pg_offset = 0; | ||
| 315 | char *kaddr; | 318 | char *kaddr; |
| 316 | 319 | ||
| 320 | destlen = min_t(unsigned long, destlen, PAGE_SIZE); | ||
| 321 | bytes_left = destlen; | ||
| 322 | |||
| 317 | workspace->strm.next_in = data_in; | 323 | workspace->strm.next_in = data_in; |
| 318 | workspace->strm.avail_in = srclen; | 324 | workspace->strm.avail_in = srclen; |
| 319 | workspace->strm.total_in = 0; | 325 | workspace->strm.total_in = 0; |
| @@ -341,7 +347,6 @@ static int zlib_decompress(struct list_head *ws, unsigned char *data_in, | |||
| 341 | unsigned long buf_start; | 347 | unsigned long buf_start; |
| 342 | unsigned long buf_offset; | 348 | unsigned long buf_offset; |
| 343 | unsigned long bytes; | 349 | unsigned long bytes; |
| 344 | unsigned long pg_offset = 0; | ||
| 345 | 350 | ||
| 346 | ret = zlib_inflate(&workspace->strm, Z_NO_FLUSH); | 351 | ret = zlib_inflate(&workspace->strm, Z_NO_FLUSH); |
| 347 | if (ret != Z_OK && ret != Z_STREAM_END) | 352 | if (ret != Z_OK && ret != Z_STREAM_END) |
| @@ -384,6 +389,17 @@ next: | |||
| 384 | ret = 0; | 389 | ret = 0; |
| 385 | 390 | ||
| 386 | zlib_inflateEnd(&workspace->strm); | 391 | zlib_inflateEnd(&workspace->strm); |
| 392 | |||
| 393 | /* | ||
| 394 | * this should only happen if zlib returned fewer bytes than we | ||
| 395 | * expected. btrfs_get_block is responsible for zeroing from the | ||
| 396 | * end of the inline extent (destlen) to the end of the page | ||
| 397 | */ | ||
| 398 | if (pg_offset < destlen) { | ||
| 399 | kaddr = kmap_atomic(dest_page); | ||
| 400 | memset(kaddr + pg_offset, 0, destlen - pg_offset); | ||
| 401 | kunmap_atomic(kaddr); | ||
| 402 | } | ||
| 387 | return ret; | 403 | return ret; |
| 388 | } | 404 | } |
| 389 | 405 | ||
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 6df8d3d885e5..b8b92c2f9683 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
| @@ -736,7 +736,12 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry, | |||
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | alias = d_find_alias(inode); | 738 | alias = d_find_alias(inode); |
| 739 | if (alias && !vfat_d_anon_disconn(alias)) { | 739 | /* |
| 740 | * Checking "alias->d_parent == dentry->d_parent" to make sure | ||
| 741 | * FS is not corrupted (especially double linked dir). | ||
| 742 | */ | ||
| 743 | if (alias && alias->d_parent == dentry->d_parent && | ||
| 744 | !vfat_d_anon_disconn(alias)) { | ||
| 740 | /* | 745 | /* |
| 741 | * This inode has non anonymous-DCACHE_DISCONNECTED | 746 | * This inode has non anonymous-DCACHE_DISCONNECTED |
| 742 | * dentry. This means, the user did ->lookup() by an | 747 | * dentry. This means, the user did ->lookup() by an |
| @@ -755,12 +760,9 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry, | |||
| 755 | 760 | ||
| 756 | out: | 761 | out: |
| 757 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 762 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 758 | dentry->d_time = dentry->d_parent->d_inode->i_version; | 763 | if (!inode) |
| 759 | dentry = d_splice_alias(inode, dentry); | 764 | dentry->d_time = dir->i_version; |
| 760 | if (dentry) | 765 | return d_splice_alias(inode, dentry); |
| 761 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 762 | return dentry; | ||
| 763 | |||
| 764 | error: | 766 | error: |
| 765 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 767 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 766 | return ERR_PTR(err); | 768 | return ERR_PTR(err); |
| @@ -793,7 +795,6 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode, | |||
| 793 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; | 795 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
| 794 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ | 796 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
| 795 | 797 | ||
| 796 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 797 | d_instantiate(dentry, inode); | 798 | d_instantiate(dentry, inode); |
| 798 | out: | 799 | out: |
| 799 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 800 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| @@ -824,6 +825,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 824 | clear_nlink(inode); | 825 | clear_nlink(inode); |
| 825 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; | 826 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; |
| 826 | fat_detach(inode); | 827 | fat_detach(inode); |
| 828 | dentry->d_time = dir->i_version; | ||
| 827 | out: | 829 | out: |
| 828 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 830 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 829 | 831 | ||
| @@ -849,6 +851,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry) | |||
| 849 | clear_nlink(inode); | 851 | clear_nlink(inode); |
| 850 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; | 852 | inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; |
| 851 | fat_detach(inode); | 853 | fat_detach(inode); |
| 854 | dentry->d_time = dir->i_version; | ||
| 852 | out: | 855 | out: |
| 853 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 856 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
| 854 | 857 | ||
| @@ -889,7 +892,6 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
| 889 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; | 892 | inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
| 890 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ | 893 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
| 891 | 894 | ||
| 892 | dentry->d_time = dentry->d_parent->d_inode->i_version; | ||
| 893 | d_instantiate(dentry, inode); | 895 | d_instantiate(dentry, inode); |
| 894 | 896 | ||
| 895 | mutex_unlock(&MSDOS_SB(sb)->s_lock); | 897 | mutex_unlock(&MSDOS_SB(sb)->s_lock); |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index e4dc74713a43..1df94fabe4eb 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
| @@ -1853,13 +1853,12 @@ int jbd2_journal_set_features (journal_t *journal, unsigned long compat, | |||
| 1853 | journal->j_chksum_driver = NULL; | 1853 | journal->j_chksum_driver = NULL; |
| 1854 | return 0; | 1854 | return 0; |
| 1855 | } | 1855 | } |
| 1856 | } | ||
| 1857 | 1856 | ||
| 1858 | /* Precompute checksum seed for all metadata */ | 1857 | /* Precompute checksum seed for all metadata */ |
| 1859 | if (jbd2_journal_has_csum_v2or3(journal)) | ||
| 1860 | journal->j_csum_seed = jbd2_chksum(journal, ~0, | 1858 | journal->j_csum_seed = jbd2_chksum(journal, ~0, |
| 1861 | sb->s_uuid, | 1859 | sb->s_uuid, |
| 1862 | sizeof(sb->s_uuid)); | 1860 | sizeof(sb->s_uuid)); |
| 1861 | } | ||
| 1863 | } | 1862 | } |
| 1864 | 1863 | ||
| 1865 | /* If enabling v1 checksums, downgrade superblock */ | 1864 | /* If enabling v1 checksums, downgrade superblock */ |
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index ed2b1151b171..7cbdf1b2e4ab 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
| @@ -774,8 +774,12 @@ static bool nfsd41_cb_get_slot(struct nfs4_client *clp, struct rpc_task *task) | |||
| 774 | { | 774 | { |
| 775 | if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) { | 775 | if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) { |
| 776 | rpc_sleep_on(&clp->cl_cb_waitq, task, NULL); | 776 | rpc_sleep_on(&clp->cl_cb_waitq, task, NULL); |
| 777 | dprintk("%s slot is busy\n", __func__); | 777 | /* Race breaker */ |
| 778 | return false; | 778 | if (test_and_set_bit(0, &clp->cl_cb_slot_busy) != 0) { |
| 779 | dprintk("%s slot is busy\n", __func__); | ||
| 780 | return false; | ||
| 781 | } | ||
| 782 | rpc_wake_up_queued_task(&clp->cl_cb_waitq, task); | ||
| 779 | } | 783 | } |
| 780 | return true; | 784 | return true; |
| 781 | } | 785 | } |
diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h index 747f3b95bd11..33a46a8dfaf7 100644 --- a/fs/nfsd/nfsd.h +++ b/fs/nfsd/nfsd.h | |||
| @@ -335,12 +335,15 @@ void nfsd_lockd_shutdown(void); | |||
| 335 | (NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT) | 335 | (NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT) |
| 336 | 336 | ||
| 337 | #ifdef CONFIG_NFSD_V4_SECURITY_LABEL | 337 | #ifdef CONFIG_NFSD_V4_SECURITY_LABEL |
| 338 | #define NFSD4_2_SUPPORTED_ATTRS_WORD2 \ | 338 | #define NFSD4_2_SECURITY_ATTRS FATTR4_WORD2_SECURITY_LABEL |
| 339 | (NFSD4_1_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SECURITY_LABEL) | ||
| 340 | #else | 339 | #else |
| 341 | #define NFSD4_2_SUPPORTED_ATTRS_WORD2 0 | 340 | #define NFSD4_2_SECURITY_ATTRS 0 |
| 342 | #endif | 341 | #endif |
| 343 | 342 | ||
| 343 | #define NFSD4_2_SUPPORTED_ATTRS_WORD2 \ | ||
| 344 | (NFSD4_1_SUPPORTED_ATTRS_WORD2 | \ | ||
| 345 | NFSD4_2_SECURITY_ATTRS) | ||
| 346 | |||
| 344 | static inline u32 nfsd_suppattrs0(u32 minorversion) | 347 | static inline u32 nfsd_suppattrs0(u32 minorversion) |
| 345 | { | 348 | { |
| 346 | return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0 | 349 | return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0 |
