diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-10-13 03:24:51 -0400 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-10-13 03:24:59 -0400 | 
| commit | 2c96c142e941041973faab20ca3b82d57f435c5e (patch) | |
| tree | 45188f0ecb3f4bb7408a7219f8fcd041d500235a /fs/btrfs/ioctl.c | |
| parent | 3c355863fb32070a2800f41106519c5c3038623a (diff) | |
| parent | 8ad807318fcd62aba0e18c7c7fbfcc1af3fcdbab (diff) | |
Merge branch 'tracing/urgent' into tracing/core
Merge reason: Pick up tracing/filters fix from the urgent queue,
              we will queue up dependent patches.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 62 | 
1 files changed, 41 insertions, 21 deletions
| diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index a8577a7f26ab..9a780c8d0ac8 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -239,7 +239,13 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
| 239 | u64 index = 0; | 239 | u64 index = 0; | 
| 240 | unsigned long nr = 1; | 240 | unsigned long nr = 1; | 
| 241 | 241 | ||
| 242 | ret = btrfs_check_metadata_free_space(root); | 242 | /* | 
| 243 | * 1 - inode item | ||
| 244 | * 2 - refs | ||
| 245 | * 1 - root item | ||
| 246 | * 2 - dir items | ||
| 247 | */ | ||
| 248 | ret = btrfs_reserve_metadata_space(root, 6); | ||
| 243 | if (ret) | 249 | if (ret) | 
| 244 | return ret; | 250 | return ret; | 
| 245 | 251 | ||
| @@ -340,6 +346,9 @@ fail: | |||
| 340 | err = btrfs_commit_transaction(trans, root); | 346 | err = btrfs_commit_transaction(trans, root); | 
| 341 | if (err && !ret) | 347 | if (err && !ret) | 
| 342 | ret = err; | 348 | ret = err; | 
| 349 | |||
| 350 | btrfs_unreserve_metadata_space(root, 6); | ||
| 351 | btrfs_btree_balance_dirty(root, nr); | ||
| 343 | return ret; | 352 | return ret; | 
| 344 | } | 353 | } | 
| 345 | 354 | ||
| @@ -355,19 +364,27 @@ static int create_snapshot(struct btrfs_root *root, struct dentry *dentry, | |||
| 355 | if (!root->ref_cows) | 364 | if (!root->ref_cows) | 
| 356 | return -EINVAL; | 365 | return -EINVAL; | 
| 357 | 366 | ||
| 358 | ret = btrfs_check_metadata_free_space(root); | 367 | /* | 
| 368 | * 1 - inode item | ||
| 369 | * 2 - refs | ||
| 370 | * 1 - root item | ||
| 371 | * 2 - dir items | ||
| 372 | */ | ||
| 373 | ret = btrfs_reserve_metadata_space(root, 6); | ||
| 359 | if (ret) | 374 | if (ret) | 
| 360 | goto fail_unlock; | 375 | goto fail_unlock; | 
| 361 | 376 | ||
| 362 | pending_snapshot = kzalloc(sizeof(*pending_snapshot), GFP_NOFS); | 377 | pending_snapshot = kzalloc(sizeof(*pending_snapshot), GFP_NOFS); | 
| 363 | if (!pending_snapshot) { | 378 | if (!pending_snapshot) { | 
| 364 | ret = -ENOMEM; | 379 | ret = -ENOMEM; | 
| 380 | btrfs_unreserve_metadata_space(root, 6); | ||
| 365 | goto fail_unlock; | 381 | goto fail_unlock; | 
| 366 | } | 382 | } | 
| 367 | pending_snapshot->name = kmalloc(namelen + 1, GFP_NOFS); | 383 | pending_snapshot->name = kmalloc(namelen + 1, GFP_NOFS); | 
| 368 | if (!pending_snapshot->name) { | 384 | if (!pending_snapshot->name) { | 
| 369 | ret = -ENOMEM; | 385 | ret = -ENOMEM; | 
| 370 | kfree(pending_snapshot); | 386 | kfree(pending_snapshot); | 
| 387 | btrfs_unreserve_metadata_space(root, 6); | ||
| 371 | goto fail_unlock; | 388 | goto fail_unlock; | 
| 372 | } | 389 | } | 
| 373 | memcpy(pending_snapshot->name, name, namelen); | 390 | memcpy(pending_snapshot->name, name, namelen); | 
| @@ -1215,15 +1232,15 @@ static long btrfs_ioctl_trans_start(struct file *file) | |||
| 1215 | struct inode *inode = fdentry(file)->d_inode; | 1232 | struct inode *inode = fdentry(file)->d_inode; | 
| 1216 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1233 | struct btrfs_root *root = BTRFS_I(inode)->root; | 
| 1217 | struct btrfs_trans_handle *trans; | 1234 | struct btrfs_trans_handle *trans; | 
| 1218 | int ret = 0; | 1235 | int ret; | 
| 1219 | 1236 | ||
| 1237 | ret = -EPERM; | ||
| 1220 | if (!capable(CAP_SYS_ADMIN)) | 1238 | if (!capable(CAP_SYS_ADMIN)) | 
| 1221 | return -EPERM; | 1239 | goto out; | 
| 1222 | 1240 | ||
| 1223 | if (file->private_data) { | 1241 | ret = -EINPROGRESS; | 
| 1224 | ret = -EINPROGRESS; | 1242 | if (file->private_data) | 
| 1225 | goto out; | 1243 | goto out; | 
| 1226 | } | ||
| 1227 | 1244 | ||
| 1228 | ret = mnt_want_write(file->f_path.mnt); | 1245 | ret = mnt_want_write(file->f_path.mnt); | 
| 1229 | if (ret) | 1246 | if (ret) | 
| @@ -1233,12 +1250,19 @@ static long btrfs_ioctl_trans_start(struct file *file) | |||
| 1233 | root->fs_info->open_ioctl_trans++; | 1250 | root->fs_info->open_ioctl_trans++; | 
| 1234 | mutex_unlock(&root->fs_info->trans_mutex); | 1251 | mutex_unlock(&root->fs_info->trans_mutex); | 
| 1235 | 1252 | ||
| 1253 | ret = -ENOMEM; | ||
| 1236 | trans = btrfs_start_ioctl_transaction(root, 0); | 1254 | trans = btrfs_start_ioctl_transaction(root, 0); | 
| 1237 | if (trans) | 1255 | if (!trans) | 
| 1238 | file->private_data = trans; | 1256 | goto out_drop; | 
| 1239 | else | 1257 | |
| 1240 | ret = -ENOMEM; | 1258 | file->private_data = trans; | 
| 1241 | /*printk(KERN_INFO "btrfs_ioctl_trans_start on %p\n", file);*/ | 1259 | return 0; | 
| 1260 | |||
| 1261 | out_drop: | ||
| 1262 | mutex_lock(&root->fs_info->trans_mutex); | ||
| 1263 | root->fs_info->open_ioctl_trans--; | ||
| 1264 | mutex_unlock(&root->fs_info->trans_mutex); | ||
| 1265 | mnt_drop_write(file->f_path.mnt); | ||
| 1242 | out: | 1266 | out: | 
| 1243 | return ret; | 1267 | return ret; | 
| 1244 | } | 1268 | } | 
| @@ -1254,24 +1278,20 @@ long btrfs_ioctl_trans_end(struct file *file) | |||
| 1254 | struct inode *inode = fdentry(file)->d_inode; | 1278 | struct inode *inode = fdentry(file)->d_inode; | 
| 1255 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1279 | struct btrfs_root *root = BTRFS_I(inode)->root; | 
| 1256 | struct btrfs_trans_handle *trans; | 1280 | struct btrfs_trans_handle *trans; | 
| 1257 | int ret = 0; | ||
| 1258 | 1281 | ||
| 1259 | trans = file->private_data; | 1282 | trans = file->private_data; | 
| 1260 | if (!trans) { | 1283 | if (!trans) | 
| 1261 | ret = -EINVAL; | 1284 | return -EINVAL; | 
| 1262 | goto out; | ||
| 1263 | } | ||
| 1264 | btrfs_end_transaction(trans, root); | ||
| 1265 | file->private_data = NULL; | 1285 | file->private_data = NULL; | 
| 1266 | 1286 | ||
| 1287 | btrfs_end_transaction(trans, root); | ||
| 1288 | |||
| 1267 | mutex_lock(&root->fs_info->trans_mutex); | 1289 | mutex_lock(&root->fs_info->trans_mutex); | 
| 1268 | root->fs_info->open_ioctl_trans--; | 1290 | root->fs_info->open_ioctl_trans--; | 
| 1269 | mutex_unlock(&root->fs_info->trans_mutex); | 1291 | mutex_unlock(&root->fs_info->trans_mutex); | 
| 1270 | 1292 | ||
| 1271 | mnt_drop_write(file->f_path.mnt); | 1293 | mnt_drop_write(file->f_path.mnt); | 
| 1272 | 1294 | return 0; | |
| 1273 | out: | ||
| 1274 | return ret; | ||
| 1275 | } | 1295 | } | 
| 1276 | 1296 | ||
| 1277 | long btrfs_ioctl(struct file *file, unsigned int | 1297 | long btrfs_ioctl(struct file *file, unsigned int | 
