dsl_dir.c (332547) | dsl_dir.c (339129) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 1805 unchanged lines hidden (view full) --- 1814} 1815 1816typedef struct dsl_dir_rename_arg { 1817 const char *ddra_oldname; 1818 const char *ddra_newname; 1819 cred_t *ddra_cred; 1820} dsl_dir_rename_arg_t; 1821 | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 1805 unchanged lines hidden (view full) --- 1814} 1815 1816typedef struct dsl_dir_rename_arg { 1817 const char *ddra_oldname; 1818 const char *ddra_newname; 1819 cred_t *ddra_cred; 1820} dsl_dir_rename_arg_t; 1821 |
1822typedef struct dsl_valid_rename_arg { 1823 int char_delta; 1824 int nest_delta; 1825} dsl_valid_rename_arg_t; 1826 |
|
1822/* ARGSUSED */ 1823static int 1824dsl_valid_rename(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg) 1825{ | 1827/* ARGSUSED */ 1828static int 1829dsl_valid_rename(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg) 1830{ |
1826 int *deltap = arg; | 1831 dsl_valid_rename_arg_t *dvra = arg; |
1827 char namebuf[ZFS_MAX_DATASET_NAME_LEN]; 1828 1829 dsl_dataset_name(ds, namebuf); 1830 | 1832 char namebuf[ZFS_MAX_DATASET_NAME_LEN]; 1833 1834 dsl_dataset_name(ds, namebuf); 1835 |
1831 if (strlen(namebuf) + *deltap >= ZFS_MAX_DATASET_NAME_LEN) | 1836 ASSERT3U(strnlen(namebuf, ZFS_MAX_DATASET_NAME_LEN), 1837 <, ZFS_MAX_DATASET_NAME_LEN); 1838 int namelen = strlen(namebuf) + dvra->char_delta; 1839 int depth = get_dataset_depth(namebuf) + dvra->nest_delta; 1840 1841 if (namelen >= ZFS_MAX_DATASET_NAME_LEN) |
1832 return (SET_ERROR(ENAMETOOLONG)); | 1842 return (SET_ERROR(ENAMETOOLONG)); |
1843 if (dvra->nest_delta > 0 && depth >= zfs_max_dataset_nesting) 1844 return (SET_ERROR(ENAMETOOLONG)); |
|
1833 return (0); 1834} 1835 1836static int 1837dsl_dir_rename_check(void *arg, dmu_tx_t *tx) 1838{ 1839 dsl_dir_rename_arg_t *ddra = arg; 1840 dsl_pool_t *dp = dmu_tx_pool(tx); 1841 dsl_dir_t *dd, *newparent; | 1845 return (0); 1846} 1847 1848static int 1849dsl_dir_rename_check(void *arg, dmu_tx_t *tx) 1850{ 1851 dsl_dir_rename_arg_t *ddra = arg; 1852 dsl_pool_t *dp = dmu_tx_pool(tx); 1853 dsl_dir_t *dd, *newparent; |
1854 dsl_valid_rename_arg_t dvra; |
|
1842 const char *mynewname; 1843 int error; | 1855 const char *mynewname; 1856 int error; |
1844 int delta = strlen(ddra->ddra_newname) - strlen(ddra->ddra_oldname); | |
1845 1846 /* target dir should exist */ 1847 error = dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL); 1848 if (error != 0) 1849 return (error); 1850 1851 /* new parent should exist */ 1852 error = dsl_dir_hold(dp, ddra->ddra_newname, FTAG, --- 12 unchanged lines hidden (view full) --- 1865 1866 /* new name should not already exist */ 1867 if (mynewname == NULL) { 1868 dsl_dir_rele(newparent, FTAG); 1869 dsl_dir_rele(dd, FTAG); 1870 return (SET_ERROR(EEXIST)); 1871 } 1872 | 1857 1858 /* target dir should exist */ 1859 error = dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL); 1860 if (error != 0) 1861 return (error); 1862 1863 /* new parent should exist */ 1864 error = dsl_dir_hold(dp, ddra->ddra_newname, FTAG, --- 12 unchanged lines hidden (view full) --- 1877 1878 /* new name should not already exist */ 1879 if (mynewname == NULL) { 1880 dsl_dir_rele(newparent, FTAG); 1881 dsl_dir_rele(dd, FTAG); 1882 return (SET_ERROR(EEXIST)); 1883 } 1884 |
1885 ASSERT3U(strnlen(ddra->ddra_newname, ZFS_MAX_DATASET_NAME_LEN), 1886 <, ZFS_MAX_DATASET_NAME_LEN); 1887 ASSERT3U(strnlen(ddra->ddra_oldname, ZFS_MAX_DATASET_NAME_LEN), 1888 <, ZFS_MAX_DATASET_NAME_LEN); 1889 dvra.char_delta = strlen(ddra->ddra_newname) 1890 - strlen(ddra->ddra_oldname); 1891 dvra.nest_delta = get_dataset_depth(ddra->ddra_newname) 1892 - get_dataset_depth(ddra->ddra_oldname); 1893 |
|
1873 /* if the name length is growing, validate child name lengths */ | 1894 /* if the name length is growing, validate child name lengths */ |
1874 if (delta > 0) { | 1895 if (dvra.char_delta > 0 || dvra.nest_delta > 0) { |
1875 error = dmu_objset_find_dp(dp, dd->dd_object, dsl_valid_rename, | 1896 error = dmu_objset_find_dp(dp, dd->dd_object, dsl_valid_rename, |
1876 &delta, DS_FIND_CHILDREN | DS_FIND_SNAPSHOTS); | 1897 &dvra, DS_FIND_CHILDREN | DS_FIND_SNAPSHOTS); |
1877 if (error != 0) { 1878 dsl_dir_rele(newparent, FTAG); 1879 dsl_dir_rele(dd, FTAG); 1880 return (error); 1881 } 1882 } 1883 1884 if (dmu_tx_is_syncing(tx)) { --- 253 unchanged lines hidden --- | 1898 if (error != 0) { 1899 dsl_dir_rele(newparent, FTAG); 1900 dsl_dir_rele(dd, FTAG); 1901 return (error); 1902 } 1903 } 1904 1905 if (dmu_tx_is_syncing(tx)) { --- 253 unchanged lines hidden --- |