namei.c (e5451c8f8330e03ad3cfa16048b4daf961af434f) namei.c (b6853f78e763d42c7a158d8de3549c9827c604ab)
1/*
2 * linux/fs/hpfs/namei.c
3 *
4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
5 *
6 * adding & removing files & directories
7 */
8#include <linux/sched.h>

--- 362 unchanged lines hidden (view full) ---

371{
372 const unsigned char *name = dentry->d_name.name;
373 unsigned len = dentry->d_name.len;
374 struct quad_buffer_head qbh;
375 struct hpfs_dirent *de;
376 struct inode *inode = d_inode(dentry);
377 dnode_secno dno;
378 int r;
1/*
2 * linux/fs/hpfs/namei.c
3 *
4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
5 *
6 * adding & removing files & directories
7 */
8#include <linux/sched.h>

--- 362 unchanged lines hidden (view full) ---

371{
372 const unsigned char *name = dentry->d_name.name;
373 unsigned len = dentry->d_name.len;
374 struct quad_buffer_head qbh;
375 struct hpfs_dirent *de;
376 struct inode *inode = d_inode(dentry);
377 dnode_secno dno;
378 int r;
379 int rep = 0;
380 int err;
381
382 hpfs_lock(dir->i_sb);
383 hpfs_adjust_length(name, &len);
379 int err;
380
381 hpfs_lock(dir->i_sb);
382 hpfs_adjust_length(name, &len);
384again:
383
385 err = -ENOENT;
386 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh);
387 if (!de)
388 goto out;
389
390 err = -EPERM;
391 if (de->first)
392 goto out1;
393
394 err = -EISDIR;
395 if (de->directory)
396 goto out1;
397
398 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
399 switch (r) {
400 case 1:
401 hpfs_error(dir->i_sb, "there was error when removing dirent");
402 err = -EFSERROR;
403 break;
384 err = -ENOENT;
385 de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh);
386 if (!de)
387 goto out;
388
389 err = -EPERM;
390 if (de->first)
391 goto out1;
392
393 err = -EISDIR;
394 if (de->directory)
395 goto out1;
396
397 r = hpfs_remove_dirent(dir, dno, de, &qbh, 1);
398 switch (r) {
399 case 1:
400 hpfs_error(dir->i_sb, "there was error when removing dirent");
401 err = -EFSERROR;
402 break;
404 case 2: /* no space for deleting, try to truncate file */
405
403 case 2: /* no space for deleting */
406 err = -ENOSPC;
404 err = -ENOSPC;
407 if (rep++)
408 break;
409
410 dentry_unhash(dentry);
411 if (!d_unhashed(dentry)) {
412 hpfs_unlock(dir->i_sb);
413 return -ENOSPC;
414 }
415 if (generic_permission(inode, MAY_WRITE) ||
416 !S_ISREG(inode->i_mode) ||
417 get_write_access(inode)) {
418 d_rehash(dentry);
419 } else {
420 struct iattr newattrs;
421 /*pr_info("truncating file before delete.\n");*/
422 newattrs.ia_size = 0;
423 newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
424 err = notify_change(dentry, &newattrs, NULL);
425 put_write_access(inode);
426 if (!err)
427 goto again;
428 }
429 hpfs_unlock(dir->i_sb);
430 return -ENOSPC;
405 break;
431 default:
432 drop_nlink(inode);
433 err = 0;
434 }
435 goto out;
436
437out1:
438 hpfs_brelse4(&qbh);

--- 210 unchanged lines hidden ---
406 default:
407 drop_nlink(inode);
408 err = 0;
409 }
410 goto out;
411
412out1:
413 hpfs_brelse4(&qbh);

--- 210 unchanged lines hidden ---