~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to fs/omfs/dir.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
235
235
        return *ptr != ~0;
236
236
}
237
237
 
238
 
static int omfs_unlink(struct inode *dir, struct dentry *dentry)
 
238
static int omfs_remove(struct inode *dir, struct dentry *dentry)
239
239
{
 
240
        struct inode *inode = dentry->d_inode;
240
241
        int ret;
241
 
        struct inode *inode = dentry->d_inode;
 
242
 
 
243
 
 
244
        if (S_ISDIR(inode->i_mode) &&
 
245
            !omfs_dir_is_empty(inode))
 
246
                return -ENOTEMPTY;
242
247
 
243
248
        ret = omfs_delete_entry(dentry);
244
249
        if (ret)
245
 
                goto end_unlink;
246
 
 
247
 
        inode_dec_link_count(inode);
 
250
                return ret;
 
251
        
 
252
        clear_nlink(inode);
 
253
        mark_inode_dirty(inode);
248
254
        mark_inode_dirty(dir);
249
 
 
250
 
end_unlink:
251
 
        return ret;
252
 
}
253
 
 
254
 
static int omfs_rmdir(struct inode *dir, struct dentry *dentry)
255
 
{
256
 
        int err = -ENOTEMPTY;
257
 
        struct inode *inode = dentry->d_inode;
258
 
 
259
 
        if (omfs_dir_is_empty(inode)) {
260
 
                err = omfs_unlink(dir, dentry);
261
 
                if (!err)
262
 
                        inode_dec_link_count(inode);
263
 
        }
264
 
        return err;
 
255
        return 0;
265
256
}
266
257
 
267
258
static int omfs_add_node(struct inode *dir, struct dentry *dentry, int mode)
372
363
 
373
364
                res = filldir(dirent, oi->i_name, strnlen(oi->i_name,
374
365
                        OMFS_NAMELEN), filp->f_pos, self, d_type);
375
 
                if (res == 0)
376
 
                        filp->f_pos++;
377
366
                brelse(bh);
 
367
                if (res < 0)
 
368
                        break;
 
369
                filp->f_pos++;
378
370
        }
379
371
out:
380
372
        return res;
385
377
{
386
378
        struct inode *new_inode = new_dentry->d_inode;
387
379
        struct inode *old_inode = old_dentry->d_inode;
388
 
        struct buffer_head *bh;
389
 
        int is_dir;
390
380
        int err;
391
381
 
392
 
        is_dir = S_ISDIR(old_inode->i_mode);
393
 
 
394
382
        if (new_inode) {
395
383
                /* overwriting existing file/dir */
396
 
                err = -ENOTEMPTY;
397
 
                if (is_dir && !omfs_dir_is_empty(new_inode))
398
 
                        goto out;
399
 
 
400
 
                err = -ENOENT;
401
 
                bh = omfs_find_entry(new_dir, new_dentry->d_name.name,
402
 
                        new_dentry->d_name.len);
403
 
                if (IS_ERR(bh))
404
 
                        goto out;
405
 
                brelse(bh);
406
 
 
407
 
                err = omfs_unlink(new_dir, new_dentry);
 
384
                err = omfs_remove(new_dir, new_dentry);
408
385
                if (err)
409
386
                        goto out;
410
387
        }
411
388
 
412
389
        /* since omfs locates files by name, we need to unlink _before_
413
390
         * adding the new link or we won't find the old one */
414
 
        inode_inc_link_count(old_inode);
415
 
        err = omfs_unlink(old_dir, old_dentry);
416
 
        if (err) {
417
 
                inode_dec_link_count(old_inode);
 
391
        err = omfs_delete_entry(old_dentry);
 
392
        if (err)
418
393
                goto out;
419
 
        }
420
394
 
 
395
        mark_inode_dirty(old_dir);
421
396
        err = omfs_add_link(new_dentry, old_inode);
422
397
        if (err)
423
398
                goto out;
424
399
 
425
400
        old_inode->i_ctime = CURRENT_TIME_SEC;
 
401
        mark_inode_dirty(old_inode);
426
402
out:
427
403
        return err;
428
404
}
488
464
        .mkdir = omfs_mkdir,
489
465
        .rename = omfs_rename,
490
466
        .create = omfs_create,
491
 
        .unlink = omfs_unlink,
492
 
        .rmdir = omfs_rmdir,
 
467
        .unlink = omfs_remove,
 
468
        .rmdir = omfs_remove,
493
469
};
494
470
 
495
471
const struct file_operations omfs_dir_operations = {