Deleted Added
full compact
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 ---