Re: [PATCH 1/5] Add support for read-only subvolumes.
+subvol = argv[optind+1]; +dst = argv[optind+2]; +struct btrfs_ioctl_vol_args_v2 args; Does the standard C allow to define a variable in the middle in a function instead of in the begin ? Anyway, even not required, I suggest to fill args by zero. + memset(args, 0, sizeog(args)); It's necessary, otherwise args.unused[4] and args.transid will have arbitrary value. -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2 0/5] Add user-space support for read-only snapshot creation.
Changelog v2: - Fixed uninitialized variable (args). - Corrected order of patches to make everything compile. - Fixed some style errors. There is kernel side support for the creation of read-only snapshots for some time now, but I did not find any patches for the userspace btrfs utilites. Thus I created this patchset which is tested and working with kernel version 2.6.39-rc2. Andreas Philipp (5): Added support for an additional ioctl. Add support for read-only subvolumes. Support the new parameters in do_clone(int argc, char** argv). Test the additional ioctl. Updated manpage for btrfs subvolume snapshot. btrfs.c|6 +++--- btrfs_cmds.c | 48 ioctl-test.c |1 + ioctl.h| 14 ++ man/btrfs.8.in | 11 ++- 5 files changed, 64 insertions(+), 16 deletions(-) -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/5] Added support for an additional ioctl.
Added BTRFS_IOC_SNAP_CREATE_V2 and struct btrfs_ioctl_vol_args_v2 as defined in fs/btrfs/ioctl.h in the kernel sources. Signed-off-by: Andreas Philipp philipp.andr...@gmail.com --- ioctl.h | 14 ++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/ioctl.h b/ioctl.h index 776d7a9..358f814 100644 --- a/ioctl.h +++ b/ioctl.h @@ -30,6 +30,17 @@ struct btrfs_ioctl_vol_args { char name[BTRFS_PATH_NAME_MAX + 1]; }; +#define BTRFS_SUBVOL_RDONLY(1ULL 1) +#define BTRFS_SUBVOL_NAME_MAX 4039 + +struct btrfs_ioctl_vol_args_v2 { + __s64 fd; + __u64 transid; + __u64 flags; + __u64 unused[4]; + char name[BTRFS_SUBVOL_NAME_MAX + 1]; +}; + struct btrfs_ioctl_search_key { /* which root are we searching. 0 is the tree of tree roots */ __u64 tree_id; @@ -132,6 +143,7 @@ struct btrfs_ioctl_space_args { struct btrfs_ioctl_space_info spaces[0]; }; +/* BTRFS_IOC_SNAP_CREATE is no longer used by the btrfs command */ #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ struct btrfs_ioctl_vol_args) #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ @@ -169,4 +181,6 @@ struct btrfs_ioctl_space_args { #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ struct btrfs_ioctl_space_args) +#define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \ + struct btrfs_ioctl_vol_args_v2) #endif -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 5/5] Updated manpage for btrfs subvolume snapshot.
Signed-off-by: Andreas Philipp philipp.andr...@gmail.com --- man/btrfs.8.in | 11 ++- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/man/btrfs.8.in b/man/btrfs.8.in index 26ef982..b59bc6f 100644 --- a/man/btrfs.8.in +++ b/man/btrfs.8.in @@ -5,7 +5,7 @@ .SH NAME btrfs \- control a btrfs filesystem .SH SYNOPSIS -\fBbtrfs\fP \fBsubvolume snapshot\fP\fI source [dest/]name\fP +\fBbtrfs\fP \fBsubvolume snapshot\fP\fI [-r] source [dest/]name\fP .PP \fBbtrfs\fP \fBsubvolume delete\fP\fI subvolume\fP .PP @@ -70,10 +70,11 @@ command. .SH COMMANDS .TP -\fBsubvolume snapshot\fR\fI source [dest/]name\fR -Create a writable snapshot of the subvolume \fIsource\fR with the name -\fIname\fR in the \fIdest\fR directory. If \fIsource\fR is not a -subvolume, \fBbtrfs\fR returns an error. +\fBsubvolume snapshot\fR\fI [-r] source [dest/]name\fR +Create a writable/readonly snapshot of the subvolume \fIsource\fR with the +name \fIname\fR in the \fIdest\fR directory. If \fIsource\fR is not a +subvolume, \fBbtrfs\fR returns an error. If \fI-r\fR is given, the snapshot +will be readonly. .TP \fBsubvolume delete\fR\fI subvolume\fR -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 3/5] Support the new parameters in do_clone(int argc, char** argv).
Now 'btrfs subvolume snapshot' takes not two but only at least two parameters. Additionally, the help message is updated accordingly. Signed-off-by: Andreas Philipp philipp.andr...@gmail.com --- btrfs.c |6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/btrfs.c b/btrfs.c index 46314cf..f70d64b 100644 --- a/btrfs.c +++ b/btrfs.c @@ -44,9 +44,9 @@ static struct Command commands[] = { /* avoid short commands different for the case only */ - { do_clone, 2, - subvolume snapshot, source [dest/]name\n - Create a writable snapshot of the subvolume source with\n + { do_clone, -2, + subvolume snapshot, [-r] source [dest/]name\n + Create a writable/readonly snapshot of the subvolume source with\n the name name in the dest directory. }, { do_delete_subvolume, 1, -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 2/5] Add support for read-only subvolumes.
Use BTRFS_IOC_CREATE_SNAP_V2 instead of BTRFS_IOC_CREATE_SNAP and add an option for the creation of a readonly snapshot. Signed-off-by: Andreas Philipp philipp.andr...@gmail.com --- btrfs_cmds.c | 48 1 files changed, 40 insertions(+), 8 deletions(-) diff --git a/btrfs_cmds.c b/btrfs_cmds.c index 8031c58..9367bac 100644 --- a/btrfs_cmds.c +++ b/btrfs_cmds.c @@ -43,7 +43,7 @@ #ifdef __CHECKER__ #define BLKGETSIZE64 0 -#define BTRFS_IOC_SNAP_CREATE 0 +#define BTRFS_IOC_SNAP_CREATE_V2 0 #define BTRFS_VOL_NAME_MAX 255 struct btrfs_ioctl_vol_args { char name[BTRFS_VOL_NAME_MAX]; }; static inline int ioctl(int fd, int define, void *arg) { return 0; } @@ -310,13 +310,38 @@ int do_subvol_list(int argc, char **argv) int do_clone(int argc, char **argv) { char*subvol, *dst; - int res, fd, fddst, len; + int res, fd, fddst, len, optind = 0, readonly = 0; char*newname; char*dstdir; + struct btrfs_ioctl_vol_args_v2 args; - subvol = argv[1]; - dst = argv[2]; - struct btrfs_ioctl_vol_args args; + memset(args, 0, sizeof(args)); + + while (1) { + int c = getopt(argc, argv, r); + + if (c 0) + break; + switch (c) { + case 'r': + optind++; + readonly = 1; + break; + default: + fprintf(stderr, + Invalid arguments for subvolume snapshot\n); + free(argv); + return 1; + } + } + if (argc - optind 2) { + fprintf(stderr, Invalid arguments for subvolume snapshot\n); + free(argv); + return 1; + } + + subvol = argv[optind+1]; + dst = argv[optind+2]; res = test_issubvolume(subvol); if(res0){ @@ -372,11 +397,18 @@ int do_clone(int argc, char **argv) return 12; } - printf(Create a snapshot of '%s' in '%s/%s'\n, - subvol, dstdir, newname); + if (readonly) { + args.flags |= BTRFS_SUBVOL_RDONLY; + printf(Create a readonly snapshot of '%s' in '%s/%s'\n, + subvol, dstdir, newname); + } else { + printf(Create a snapshot of '%s' in '%s/%s'\n, + subvol, dstdir, newname); + } + args.fd = fd; strcpy(args.name, newname); - res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE, args); + res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE_V2, args); close(fd); close(fddst); -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 4/5] Test the additional ioctl.
Signed-off-by: Andreas Philipp philipp.andr...@gmail.com --- ioctl-test.c |1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/ioctl-test.c b/ioctl-test.c index 7cf3bc2..1c27d61 100644 --- a/ioctl-test.c +++ b/ioctl-test.c @@ -22,6 +22,7 @@ unsigned long ioctls[] = { BTRFS_IOC_INO_LOOKUP, BTRFS_IOC_DEFAULT_SUBVOL, BTRFS_IOC_SPACE_INFO, + BTRFS_IOC_SNAP_CREATE_V2, 0 }; int main(int ac, char **av) -- 1.7.4.1 -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GIT PULL] Btrfs plugging
Hi everyone, The for-linus branch of the btrfs unstable tree: git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git for-linus Has a single commit for the btrfs bio submission worker threads. These gather up IOs when the checksumming or compression threads are done with the CPU intensive work. Since the submission threads go one device at a time, they want to unplug after finishing off all the bios for one device. Jens ripped this code out when he did the plugging work, I had promised to redo it in the new framework. Instead of the normal shortlog: commit 211588ad1902df57beeeadc9b44546540fa4bd81 Author: Chris Mason chris.ma...@oracle.com Date: Tue Apr 19 20:12:40 2011 -0400 Btrfs: do some plugging in the submit_bio threads The Btrfs submit bio threads have a small number of threads responsible for pushing down bios we've collected for a large number of devices. Since we do all the bios for a single device at once, we want to make sure we unplug and send down the bios for each device as we're done processing them. The new plugging API removed the btrfs code to unplug while processing bios, this adds it back with the new API. Signed-off-by: Chris Mason chris.ma...@oracle.com diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 309a57b..c7367ae 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -155,6 +155,15 @@ static noinline int run_scheduled_bios(struct btrfs_device *device) unsigned long limit; unsigned long last_waited = 0; int force_reg = 0; + struct blk_plug plug; + + /* +* this function runs all the bios we've collected for +* a particular device. We don't want to wander off to +* another device without first sending all of these down. +* So, setup a plug here and finish it off before we return +*/ + blk_start_plug(plug); bdi = blk_get_backing_dev_info(device-bdev); fs_info = device-dev_root-fs_info; @@ -294,6 +303,7 @@ loop_lock: spin_unlock(device-io_lock); done: + blk_finish_plug(plug); return 0; } -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GIT PULL] Btrfs updates
Hi everyone, The master branch of the btrfs unstable repo: git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git master Has a few bug fixes. Josef fixed up a crash in the free space cache error handling code, and it should close out the open bugs there. Li Zefan found a slab corruption in btrfs fitrim support. Otherwise, these are smaller fixes for corner cases. This is a separate pull from my plugging fixes because this is against 2.6.38, while the plugging stuff was on top of 2.6.39-rc4. David Sterba (1) commits (+1/-0): btrfs: add missing spin_unlock to a rare exit path Itaru Kitayama (1) commits (+1/-1): btrfs: fix wrong allocating flag when reading page Josef Bacik (2) commits (+8/-5): Btrfs: free bitmaps properly when evicting the cache (+7/-4) Btrfs: put the right bio if we have an error (+1/-1) Li Zefan (1) commits (+1/-1): Btrfs: Free free_space item properly in btrfs_trim_block_group() Tsutomu Itoh (3) commits (+21/-8): Btrfs: fix missing mutex_unlock in btrfs_del_dir_entries_in_log() (+5/-2) Btrfs: cleanup error handling in inode.c (+9/-6) Btrfs: check return value of kmalloc() (+7/-0) Total: (8) commits (+32/-15) fs/btrfs/disk-io.c |1 + fs/btrfs/extent-tree.c |4 fs/btrfs/extent_io.c|2 +- fs/btrfs/free-space-cache.c | 13 - fs/btrfs/inode.c| 20 +--- fs/btrfs/tree-log.c |7 +-- 6 files changed, 32 insertions(+), 15 deletions(-) -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH V8 4/8] mm/fs: add hooks to support cleancache
From: Minchan Kim [mailto:minchan@gmail.com] On Sat, Apr 16, 2011 at 3:53 AM, Dan Magenheimer dan.magenhei...@oracle.com wrote: From: OGAWA Hirofumi [mailto:hirof...@mail.parknet.co.jp] Andrew Morton a...@linux-foundation.org writes: Andrew, I wonder if you would be so kind as to read the following and make a ruling. If you determine a preferable set of names, I will abide by your decision and repost (if necessary). The problem is this: The English language has a limited number of words that can be used to represent data motion and mapping and most/all of them are already used in the kernel, often, to quote Andrew, in confusing ways. Complicating this, I think the semantics of the cleancache operations are different from the semantics of any other kernel operation... intentionally so, because the value of cleancache is a direct result of those differing semantics. And the cleancache semantics are fairly complex (again intentionally) so a single function name can't possibly describe the semantics. The cleancache operations are: - put (page) - get (page) - flush page - flush inode - init fs - flush fs I think these names are reasonable representations of the semantics of the operations performed... but I'm not a kernel expert so there is certainly room for disagreement. Though I absolutely recognize the importance of a name, I am primarily interested in merging the semantics of the operations and would happily accept any name that kernel developers could agree on. However, I fear that there will be NO name that will satisfy all, so would prefer to keep the existing names. If some renaming is eventually agreed upon, this could be done post-merge. Here's a brief description of the semantics: : semantics for other operations elided : The cleancache operation currently known as get has the following semantics: Derive the filesystem-determined handle from this struct page. If cleancache contains a page matching that handle, recreate the page of data from cleancache and place the results in the pageframe referred to by the struct page. Then delete in cleancache any record of the handle and any data associated with it, so that a subsequent get will no longer find a match for the handle; any space used for the data can also be freed. : semantics for other operations elided : At least, I didn't confused your semantics except just flush. That's why I suggested only flush but after seeing your explaining, there is another thing I want to change. The get/put is common semantic of reference counting in kernel but in POV your semantics, it makes sense to me but get has a exclusive semantic so I want to represent it with API name. Maybe cleancache_get_page_exclusive. The summary is that I don't want to change all API name. Just two thing. (I am not sure you and others agree on me. It's just suggestion). 1. cleancache_flush_page - cleancache_[invalidate|remove]_page 2. cleancache_get_page - cleancache_get_page_exclusive Hi Minchan -- Thanks for continuing to be interested in this and sorry for my delayed response. Actually, your comment about get_page_exclusive points out an incompleteness in my description of the semantics for cleancache_get_page. First, I forgot to list cleancache_init_shared_fs, which is the equivalent of cleancache_init_fs but used for clustered filesystems. (Support is included in the patch for ocfs2 but I haven't played with it in quite some time and my focus has been on the other filesystems, so it slipped my mind :-} The cleancache_get_page operation has a slightly different semantics depending on which of the init_fs calls was used. However, the location of the cleancache_get_page hook is the same regardless of the fs, so the name of the operation must represent both semantics. In the case of init_fs (non-shared), the behavior of cleancache_get_page is that the get is destructive; the page is removed from cleancache on a successful get. In the case of a init_shared_fs, however, the get is non-destructive; the page is NOT removed from cleancache. When cleancache contains pages from multiple kernels (e.g. Xen guests or different machines in a RAMster cluster), this semantic difference can make a big performance difference for a clustered filesystem. Since zcache only contains pages for a single kernel, the difference is moot. Because of this, I am hesitant to add exclusive to the end of the name of the operation. BTW, Nice description. Please include it in documentation if we can't reach the conclusion. It will help others to understand semantic of cleancache. Thanks! Nearly all of the description already exists in various places in the patch but I agree that it would be good if I add a new section to the Documentation file with the exact semantics. Dan -- To unsubscribe from this list: send the line unsubscribe linux-btrfs
Observed unexpected behavior of BTRFS in d_instantiate
I have been tracking down an problem that we've been seeing with Smack on top of btrfs and have narrowed it down to a check in smack_d_instantiate() that checks to see if the underlying filesystem supports extended attributes by looking at inode-i_op-getxattr If the filesystem has no entry for getxattr it is assumed that it does not support extended attributes. The Smack code clearly finds this value to be NULL for btrfs and uses a fallback value. Clearly something is amiss, as other code paths clearly find the i_op-getxattr function and use it to effect. The btrfs code quite obviously includes getxattr functions. So, what is btrfs up to such that the inode ops does not include getxattr when security_d_instantiate is called? I am led to understand that SELinux has worked around this, but looking at the SELinux code I expect that there is a problem there as well. Thank you. -- To unsubscribe from this list: send the line unsubscribe linux-btrfs in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
btrfs-convert crashes
I have a 1.5 TB (1,475,720,773,632) partition that I wanted to convert from ext4 to btrfs. It is currently used as / for ubuntu 10.10. I booted into 11.04 beta2 and tried a 'btrfs-convert /dev/sdc1', but after about 20 minutes it segfaulted. I performed a: sck.ext4 -cDfty -C 0 /dev/sdc1 After everything was clean, I downloaded the debugging symbols for btrfs-convert and tried again. Below is the 'bt full' output. I don't have enough free space to copy all the data off, create a fresh btrfs partition, and copy everything back on (I have backups of important stuff). Is there something else I can try to get this to work? Brian at: http://pastebin.com/NEwJNzuP #0 0x77444d05 in raise () from /lib/x86_64-linux-gnu/libc.so.6 No symbol table info available. #1 0x77448ab6 in abort () from /lib/x86_64-linux-gnu/libc.so.6 No symbol table info available. #2 0x0040502c in btrfs_extend_item (trans=value optimized out, root=0x633920, path=value optimized out, data_size=27) at ctree.c:2525 slot =value optimized out slot_orig =value optimized out leaf = 0x1955250 nritems = 1 data_end =value optimized out old_data =value optimized out i =value optimized out __PRETTY_FUNCTION__ = btrfs_extend_item #3 0x0040e32d in btrfs_insert_inode_ref (trans=0xc9ef10, root=0x633920, name=0xcfa314 gtfntf.f.svn-base, name_len=17, inode_objectid=value optimized out, ref_objectid=value optimized out, index=150) at inode-item.c:135 old_size = 3945 path = 0x1639aa0 key = {objectid = 37361107, type = 12 '\f', offset = 37359706} ref =value optimized out ptr =value optimized out ret =value optimized out ins_len = 27 __PRETTY_FUNCTION__ = btrfs_insert_inode_ref #4 0x00413fff in dir_iterate_proc (dir=value optimized out, entry=value optimized out, old=0xcfa30c, offset=value optimized out, blocksize=value optimized out, buf=value optimized out, priv_data=0x7fffe370) at convert.c:289 ret =value optimized out file_type =value optimized out objectid = 37361107 dotdot = .. location = {objectid = 37361107, type = 1 '\001', offset = 0} dirent = 0xcfa30c idata = 0x7fffe370 __PRETTY_FUNCTION__ = dir_iterate_proc #5 0x77bbdc13 in ext2fs_process_dir_block () from /lib/x86_64-linux-gnu/libext2fs.so.2 No symbol table info available. #6 0x77bbac02 in ext2fs_block_iterate2 () from /lib/x86_64-linux-gnu/libext2fs.so.2 No symbol table info available. #7 0x77bbdfb8 in ext2fs_dir_iterate2 () from /lib/x86_64-linux-gnu/libext2fs.so.2 No symbol table info available. #8 0x0041689d in create_dir_entries (devname=0x7fffe897 /dev/sdc1, datacsum=1, packing=1, noxattr=0) at convert.c:322 err =value optimized out data = {trans = 0xc9ef10, root = 0x633920, inode = 0x7fffe1c0, objectid = 37359706, index_cnt = 150, parent = 37359705, errcode = 0} ret =value optimized out #9 copy_single_inode (devname=0x7fffe897 /dev/sdc1, datacsum=1, packing=1, noxattr=0) at convert.c:1072 ret =value optimized out btrfs_inode = {generation = 1, transid = 140737354044640, size = 4994, nbytes = 0, block_group = 0, nlink = 1, uid = 1000, gid = 1000, mode = 16877, rdev = 0, flags = 0, sequence = 140737351933932, reserved = {0, 140737354040256, 140733193388033, 0}, atime = {sec = 1303466526, nsec = 0}, ctime = { sec = 1296464377, nsec = 0}, mtime = {sec = 1296464377, nsec = 0}, otime = {sec = 0, nsec = 0}} #10 copy_inodes (devname=0x7fffe897 /dev/sdc1, datacsum=1, packing=1, noxattr=0) at convert.c:1154 ret =value optimized out err =value optimized out ext2_scan = 0xce2300 ext2_ino = 37359452 objectid = 37359706 ext2_inode = {i_mode = 16877, i_uid = 1000, i_size = 16384, i_atime = 1303466526, i_ctime = 1296464377, i_mtime = 1296464377, i_dtime = 0, i_gid = 1000, i_links_count = 2, i_blocks = 32, i_flags = 528384, osd1 = {linux1 = {l_i_version = 1981}, hurd1 = {h_i_translator = 1981}}, i_block = {193290, 4, 0, 0, 1, 149430439, 1, 3, 149430464, 0, 0, 0, 0, 0, 0}, i_generation = 2854948622, i_file_acl = 0, i_dir_acl = 0, i_faddr = 0, osd2 = {linux2 = { l_i_blocks_hi = 0, l_i_file_acl_high = 0, l_i_uid_high = 0, l_i_gid_high = 0, l_i_reserved2 = 0}, hurd2 = {h_i_frag = 0 '\000', h_i_fsize = 0 '\000', h_i_mode_high = 0, h_i_uid_high = 0, h_i_gid_high = 0, h_i_author = 0}}} trans = 0xc9ef10 #11 do_convert (devname=0x7fffe897 /dev/sdc1, datacsum=1, packing=1, noxattr=0) at convert.c:2411 i =value optimized out fd = 6 ret =value optimized out blocksize = 4096 blocks = {9258, 9259, 9260, 9261, 9284, 9285, 9286} total_bytes =value optimized out