root/branches/orange-next/src/kernel/linux-2.6/inode.c @ 8994

Revision 8994, 19.5 KB (checked in by dcypher, 22 months ago)

replaced %llu->%s for (PVFS|TROVE)_handle

Line 
1/*
2 * (C) 2001 Clemson University and The University of Chicago
3 *
4 * See COPYING in top-level directory.
5 */
6
7/** \file
8 *  \ingroup pvfs2linux
9 *
10 *  Linux VFS inode operations.
11 */
12
13#include "pvfs2-kernel.h"
14#include "pvfs2-bufmap.h"
15#include "pvfs2-types.h"
16#include "pvfs2-internal.h"
17#include "../../common/misc/pvfs2-handle-to-str.h"
18
19static int read_one_page(struct page *page)
20{
21    void *page_data;
22    int ret, max_block;
23    ssize_t bytes_read = 0;
24    struct inode *inode = page->mapping->host;
25    const uint32_t blocksize = PAGE_CACHE_SIZE;  /* inode->i_blksize */
26    const uint32_t blockbits = PAGE_CACHE_SHIFT; /* inode->i_blkbits */
27
28    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_readpage called with page %p\n",page);
29    page_data = pvfs2_kmap(page);
30
31    max_block = ((inode->i_size / blocksize) + 1);
32
33    if (page->index < max_block)
34    {
35        loff_t blockptr_offset =
36            (((loff_t)page->index) << blockbits);
37        bytes_read = pvfs2_inode_read(
38            inode, page_data, blocksize, &blockptr_offset, 0, inode->i_size);
39    }
40    /* only zero remaining unread portions of the page data */
41    if (bytes_read > 0)
42    {
43        memset(page_data + bytes_read, 0, blocksize - bytes_read);
44    }
45    else
46    {
47        memset(page_data, 0, blocksize);
48    }
49    /* takes care of potential aliasing */
50    flush_dcache_page(page);
51    if (bytes_read < 0)
52    {
53        ret = bytes_read;
54        SetPageError(page);
55    }
56    else
57    {
58        SetPageUptodate(page);
59        if (PageError(page))
60        {
61            ClearPageError(page);
62        }
63        ret = 0;
64    }
65    pvfs2_kunmap(page);
66    /* unlock the page after the ->readpage() routine completes */
67    unlock_page(page);
68    return ret;
69}
70
71static int pvfs2_readpage(
72    struct file *file,
73    struct page *page)
74{
75    return read_one_page(page);
76}
77
78#ifndef PVFS2_LINUX_KERNEL_2_4
79static int pvfs2_readpages(
80    struct file *file,
81    struct address_space *mapping,
82    struct list_head *pages,
83    unsigned nr_pages)
84{
85    int page_idx;
86    int ret;
87
88    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_readpages called\n");
89
90    for (page_idx = 0; page_idx < nr_pages; page_idx++)
91    {
92        struct page *page;
93        page = list_entry(pages->prev, struct page, lru);
94        list_del(&page->lru);
95        if (!add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) {
96            ret = read_one_page(page);
97            gossip_debug(GOSSIP_INODE_DEBUG, "failure adding page to cache, "
98                         "read_one_page returned: %d\n", ret);
99        }
100        else {
101            page_cache_release(page);
102        }
103    }
104    BUG_ON(!list_empty(pages));
105    return 0;
106}
107
108#ifdef HAVE_INT_RETURN_ADDRESS_SPACE_OPERATIONS_INVALIDATEPAGE
109static int pvfs2_invalidatepage(struct page *page, unsigned long offset)
110#else
111static void pvfs2_invalidatepage(struct page *page, unsigned long offset)
112#endif
113{
114    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_invalidatepage called on page %p "
115                "(offset is %lu)\n", page, offset);
116
117    ClearPageUptodate(page);
118    ClearPageMappedToDisk(page);
119#ifdef HAVE_INT_RETURN_ADDRESS_SPACE_OPERATIONS_INVALIDATEPAGE
120    return 0;
121#else
122    return;
123#endif
124
125}
126
127#ifdef HAVE_INT_ARG2_ADDRESS_SPACE_OPERATIONS_RELEASEPAGE
128static int pvfs2_releasepage(struct page *page, int foo)
129#else
130static int pvfs2_releasepage(struct page *page, gfp_t foo)
131#endif
132{
133    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_releasepage called on page %p\n", page);
134    return 0;
135}
136
137struct backing_dev_info pvfs2_backing_dev_info =
138{
139#ifdef HAVE_BACKING_DEV_INFO_NAME
140    .name = "pvfs2",
141#endif
142    .ra_pages = 0,
143#ifdef HAVE_BDI_MEMORY_BACKED
144    /* old interface, up through 2.6.11 */
145    .memory_backed = 1 /* does not contribute to dirty memory */
146#else
147    .capabilities = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
148#endif
149};
150#endif /* !PVFS2_LINUX_KERNEL_2_4 */
151
152/** PVFS2 implementation of address space operations */
153struct address_space_operations pvfs2_address_operations =
154{
155#ifdef PVFS2_LINUX_KERNEL_2_4
156    readpage : pvfs2_readpage
157#else
158    .readpage = pvfs2_readpage,
159    .readpages = pvfs2_readpages,
160    .invalidatepage = pvfs2_invalidatepage,
161    .releasepage = pvfs2_releasepage
162#endif
163};
164
165/** Change size of an object referenced by inode
166 */
167void pvfs2_truncate(struct inode *inode)
168{
169    loff_t orig_size = pvfs2_i_size_read(inode);
170
171    if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
172        return;
173    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2: pvfs2_truncate called on inode %s "
174                "with size %ld\n", PVFS_handle_to_str(get_handle_from_ino(inode)), (long) orig_size);
175
176    /* successful truncate when size changes also requires mtime updates
177     * although the mtime updates are propagated lazily!
178     */
179    if (pvfs2_truncate_inode(inode, inode->i_size) == 0
180            && (orig_size != pvfs2_i_size_read(inode)))
181    {
182        pvfs2_inode_t *pvfs2_inode = PVFS2_I(inode);
183        SetMtimeFlag(pvfs2_inode);
184        inode->i_mtime = CURRENT_TIME;
185        mark_inode_dirty_sync(inode);
186    }
187}
188
189/** Change attributes of an object referenced by dentry.
190 */
191int pvfs2_setattr(struct dentry *dentry, struct iattr *iattr)
192{
193    int ret = -EINVAL;
194    struct inode *inode = dentry->d_inode;
195
196    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_setattr: called on %s\n",
197                 dentry->d_name.name);
198
199    ret = inode_change_ok(inode, iattr);
200    if (ret == 0)
201    {
202
203#ifdef HAVE_INODE_SETATTR
204        ret = inode_setattr(inode, iattr);
205#else
206        if ((iattr->ia_valid & ATTR_SIZE) &&
207           iattr->ia_size != i_size_read(inode))
208        {
209            ret = vmtruncate(inode, iattr->ia_size);
210            if (ret)
211                return ret;
212        }
213
214        setattr_copy(inode, iattr);
215        mark_inode_dirty(inode);
216        ret = 0;
217#endif /* HAVE_INODE_SETATTR */
218   
219        gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_setattr: inode_setattr returned %d\n", ret);
220
221        if (ret == 0)
222        {
223            ret = pvfs2_inode_setattr(inode, iattr);
224#if !defined(PVFS2_LINUX_KERNEL_2_4) && defined(HAVE_GENERIC_GETXATTR) && defined(CONFIG_FS_POSIX_ACL)
225            if (!ret && (iattr->ia_valid & ATTR_MODE))
226            {
227                /* change mod on a file that has ACLs */
228                ret = pvfs2_acl_chmod(inode);
229            }
230#endif
231        }
232    }
233    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_setattr: returning %d\n", ret);
234    return ret;
235}
236
237#ifdef PVFS2_LINUX_KERNEL_2_4
238/** Linux 2.4 only equivalent of getattr
239 */
240int pvfs2_revalidate(struct dentry *dentry)
241{
242    int ret = 0;
243    struct inode *inode = (dentry ? dentry->d_inode : NULL);
244
245    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_revalidate: called on %s\n", dentry->d_name.name);
246
247    /*
248     * A revalidate expects that all fields of the inode would be refreshed
249     * So we have no choice but to refresh all attributes.
250     */
251    ret = pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_ALL_NOHINT);
252    if (ret)
253    {
254        /* assume an I/O error and flag inode as bad */
255        gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__,  __func__, __LINE__);
256        pvfs2_make_bad_inode(inode);
257    }
258    return ret;
259}
260#else
261/** Obtain attributes of an object given a dentry
262 */
263int pvfs2_getattr(
264    struct vfsmount *mnt,
265    struct dentry *dentry,
266    struct kstat *kstat)
267{
268    int ret = -ENOENT;
269    struct inode *inode = dentry->d_inode;
270    pvfs2_inode_t *pvfs2_inode = NULL;
271
272    gossip_debug(GOSSIP_INODE_DEBUG,
273        "pvfs2_getattr: called on %s\n", dentry->d_name.name);
274
275    /* This seems to be the only place to reliably detect mount options
276     * parsed by the VFS layer.  Propigate them to our internal sb structure so
277     * that we can handle lazy time updates properly.
278     */
279#ifdef HAVE_MNT_NOATIME
280    if(mnt->mnt_flags && MNT_NOATIME)
281    {
282        inode->i_sb->s_flags |= MS_NOATIME;
283    }
284#endif
285#ifdef HAVE_MNT_NODIRATIME
286    if(mnt->mnt_flags && MNT_NODIRATIME)
287    {
288        inode->i_sb->s_flags |= MS_NODIRATIME;
289    }
290#endif
291
292    /*
293     * Similar to the above comment, a getattr also expects that all fields/attributes
294     * of the inode would be refreshed. So again, we dont have too much of a choice
295     * but refresh all the attributes.
296     */
297    ret = pvfs2_inode_getattr(inode, PVFS_ATTR_SYS_ALL_NOHINT);
298    if (ret == 0)
299    {
300        generic_fillattr(inode, kstat);
301        /* override block size reported to stat */
302        pvfs2_inode = PVFS2_I(inode);
303        kstat->blksize = pvfs2_inode->blksize;
304    }
305    else
306    {
307        /* assume an I/O error and flag inode as bad */
308        gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__,  __func__, __LINE__);
309        pvfs2_make_bad_inode(inode);
310    }
311    return ret;
312}
313
314#ifdef HAVE_GETATTR_LITE_INODE_OPERATIONS
315
316uint32_t convert_to_pvfs2_mask(unsigned long lite_mask)
317{
318    uint32_t mask = 0;
319
320    if (SLITE_SIZET(lite_mask))
321        mask |= PVFS_ATTR_SYS_SIZE;
322    if (SLITE_ATIME(lite_mask))
323        mask |= PVFS_ATTR_SYS_ATIME;
324    if (SLITE_MTIME(lite_mask))
325        mask |= PVFS_ATTR_SYS_MTIME;
326    if (SLITE_CTIME(lite_mask))
327        mask |= PVFS_ATTR_SYS_CTIME;
328    return mask;
329}
330
331int pvfs2_getattr_lite(
332    struct vfsmount *mnt,
333    struct dentry *dentry,
334    struct kstat_lite *kstat_lite)
335{
336    int ret = -ENOENT;
337    struct inode *inode = dentry->d_inode;
338    uint32_t mask;
339
340    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_getattr_lite: called on %s\n", dentry->d_name.name);
341
342    /*
343     * ->getattr_lite needs to refresh only certain fields
344     * of the inode and that is indicated by the lite_mask
345     * field of kstat_lite structure.
346     */
347    mask = convert_to_pvfs2_mask(kstat_lite->lite_mask);
348    ret = pvfs2_inode_getattr(inode, mask);
349    if (ret == 0)
350    {
351        generic_fillattr_lite(inode, kstat_lite);
352    }
353    else
354    {
355        /* assume an I/O error and flag inode as bad */
356        gossip_debug(GOSSIP_INODE_DEBUG, "%s:%s:%d calling make bad inode\n", __FILE__,  __func__, __LINE__);
357        pvfs2_make_bad_inode(inode);
358    }
359    return ret;
360}
361#endif
362#endif /* PVFS2_LINUX_KERNEL_2_4 */
363
364/** PVFS2 implementation of VFS inode operations for files */
365struct inode_operations pvfs2_file_inode_operations =
366{
367#ifdef PVFS2_LINUX_KERNEL_2_4
368    truncate : pvfs2_truncate,
369    setattr : pvfs2_setattr,
370    revalidate : pvfs2_revalidate,
371#ifdef HAVE_XATTR
372    setxattr : pvfs2_setxattr,
373    getxattr : pvfs2_getxattr,
374    removexattr: pvfs2_removexattr,
375    listxattr: pvfs2_listxattr,
376#endif
377#else
378    .truncate = pvfs2_truncate,
379    .setattr = pvfs2_setattr,
380    .getattr = pvfs2_getattr,
381#ifdef HAVE_GETATTR_LITE_INODE_OPERATIONS
382    .getattr_lite = pvfs2_getattr_lite,
383#endif
384#if defined(HAVE_GENERIC_GETXATTR) && defined(CONFIG_FS_POSIX_ACL)
385    .setxattr = generic_setxattr,
386    .getxattr = generic_getxattr,
387    .removexattr = generic_removexattr,
388#else
389    .setxattr = pvfs2_setxattr,
390    .getxattr = pvfs2_getxattr,
391    .removexattr = pvfs2_removexattr,
392#endif
393    .listxattr = pvfs2_listxattr,
394#if defined(HAVE_GENERIC_GETXATTR) && defined(CONFIG_FS_POSIX_ACL)
395    .permission = pvfs2_permission,
396#endif
397#ifdef HAVE_FILL_HANDLE_INODE_OPERATIONS
398    .fill_handle = pvfs2_fill_handle,
399#endif
400#endif
401};
402
403#if defined(HAVE_IGET5_LOCKED) || defined (HAVE_IGET4_LOCKED)
404
405/*
406 * Given a PVFS2 object identifier (fsid, handle), convert it into a ino_t type
407 * that will be used as a hash-index from where the handle will
408 * be searched for in the VFS hash table of inodes.
409 */
410static inline ino_t pvfs2_handle_hash(PVFS_object_ref *ref)
411{
412    if (!ref)
413        return 0;
414    return pvfs2_handle_to_ino(ref->handle);
415}
416
417/* the ->set callback of iget5_locked and friends. Sorta equivalent to the ->read_inode()
418 * callback if we are using iget and friends
419 */
420int pvfs2_set_inode(struct inode *inode, void *data)
421{
422    /* callbacks to set inode number handle */
423    PVFS_object_ref *ref = (PVFS_object_ref *) data;
424    pvfs2_inode_t *pvfs2_inode = NULL;
425
426    /* Make sure that we have sane parameters */
427    if (!data || !inode)
428        return 0;
429    pvfs2_inode = PVFS2_I(inode);
430    if (!pvfs2_inode)
431        return 0;
432    pvfs2_inode_initialize(pvfs2_inode);
433    pvfs2_inode->refn.fs_id  = ref->fs_id;
434    pvfs2_inode->refn.handle = ref->handle;
435    return 0;
436}
437
438#ifdef HAVE_IGET5_LOCKED
439static int
440pvfs2_test_inode(struct inode *inode, void *data)
441#elif defined(HAVE_IGET4_LOCKED)
442static int
443pvfs2_test_inode(struct inode *inode, unsigned long ino, void *data)
444#endif
445{
446    /* callbacks to determine if handles match */
447    PVFS_object_ref *ref = (PVFS_object_ref *) data;
448    pvfs2_inode_t *pvfs2_inode = NULL;
449
450    pvfs2_inode = PVFS2_I(inode);
451    return (pvfs2_inode->refn.handle == ref->handle && pvfs2_inode->refn.fs_id == ref->fs_id);
452}
453#endif
454
455/*
456 * Front-end to lookup the inode-cache maintained by the VFS using the PVFS2
457 * file handle instead of the inode number.
458 * Problem with iget() is well-documented in that it can lead to possible
459 * collissions especially for a file-system with 64 bit handles since inode->i_ino
460 * is only a scalar field (32 bits). So the trick now is to use iget4_locked (OR) iget5_locked
461 * if the kernel defines one and set inode number to be just a hash for the
462 * handle
463 * @sb: the file system super block instance
464 * @ref: The PVFS2 object for which we are trying to locate an inode structure
465 * @keep_locked : indicates whether the inode must be simply allocated and not filled
466 * in with the results from a ->getattr. i.e. if keep_locked is set to 0, we do a getattr() and
467 * unlock the inode and if set to 1, we do not issue a getattr() and keep it locked
468 *
469 * Boy, this function is so ugly with all these macros. I wish I could find a better
470 * way to reduce the macro clutter.
471 */
472struct inode *pvfs2_iget_common(struct super_block *sb, PVFS_object_ref *ref, int keep_locked)
473{
474    struct inode *inode = NULL;
475    unsigned long hash;
476
477#if defined(HAVE_IGET5_LOCKED) || defined(HAVE_IGET4_LOCKED)
478    hash = pvfs2_handle_hash(ref);
479#if defined(HAVE_IGET5_LOCKED)
480    inode = iget5_locked(sb, hash, pvfs2_test_inode, pvfs2_set_inode, ref);
481#elif defined(HAVE_IGET4_LOCKED)
482    inode = iget4_locked(sb, hash, pvfs2_test_inode, ref);
483#endif
484#else
485    hash = (unsigned long) ref->handle;
486#ifdef HAVE_IGET_LOCKED
487    inode = iget_locked(sb, hash);
488#else
489    /* iget() internally issues a call to read_inode() */
490    inode = iget(sb, hash);
491#endif
492#endif
493    if (!keep_locked)
494    {
495#if defined(HAVE_IGET5_LOCKED) || defined(HAVE_IGET4_LOCKED) || defined(HAVE_IGET_LOCKED)
496        if (inode && (inode->i_state & I_NEW))
497        {
498            inode->i_ino = hash; /* needed for stat etc */
499            /* iget4_locked and iget_locked dont invoke the set_inode callback.
500             * So we work around that by stashing the pvfs object reference
501             * in the inode specific private part for 2.4 kernels and invoking
502             * the setcallback explicitly for 2.6 kernels.
503             */
504#if defined(HAVE_IGET4_LOCKED) || defined(HAVE_IGET_LOCKED)
505            if (PVFS2_I(inode)) {
506                pvfs2_set_inode(inode, ref);
507            }
508            else {
509#ifdef PVFS2_LINUX_KERNEL_2_4
510                inode->u.generic_ip = (void *) ref;
511#endif
512            }
513#endif
514            /* issue a call to read the inode */
515            pvfs2_read_inode(inode);
516            unlock_new_inode(inode);
517        }
518#endif
519    }
520    gossip_debug(GOSSIP_INODE_DEBUG, "iget handle %s, fsid %d hash %ld i_ino %lu\n",
521                 PVFS_handle_to_str(ref->handle), ref->fs_id, hash, inode->i_ino);
522    return inode;
523}
524
525/** Allocates a Linux inode structure with additional PVFS2-specific
526 *  private data (I think -- RobR).
527 */
528struct inode *pvfs2_get_custom_inode_common(
529    struct super_block *sb,
530    struct inode *dir,
531    int mode,
532    dev_t dev,
533    PVFS_object_ref object,
534    int from_create)
535{
536    struct inode *inode = NULL;
537    pvfs2_inode_t *pvfs2_inode = NULL;
538
539    gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_get_custom_inode_common: called\n  (sb is %p | "
540                "MAJOR(dev)=%u | MINOR(dev)=%u)\n", sb, MAJOR(dev),
541                MINOR(dev));
542
543    inode = pvfs2_iget(sb, &object);
544    if (inode)
545    {
546        /* initialize pvfs2 specific private data */
547        pvfs2_inode = PVFS2_I(inode);
548        if (!pvfs2_inode)
549        {
550            iput(inode);
551            gossip_err("pvfs2_get_custom_inode: PRIVATE "
552                        "DATA NOT ALLOCATED\n");
553            return NULL;
554        }
555
556        /*
557         * Since we are using the same function to create a new on-disk object
558         * as well as to create an in-memory object, the mode of the object
559         * needs to be set carefully. If we are called from a function that is
560         * creating a new on-disk object, set its mode here since the caller is
561         * providing it. Else let it be since the getattr should fill it up
562         * properly.
563         */
564        if (from_create)
565        {
566            /* the exception is when we are creating a directory that needs
567             * to inherit the setgid bit.  That much we need to preserve from
568             * the getattr's view of the mode.
569             */
570            if(inode->i_mode & S_ISGID)
571            {
572                gossip_debug(GOSSIP_INODE_DEBUG,
573                    "pvfs2_get_custom_inode_commmon: setting SGID bit.\n");
574                inode->i_mode = mode | S_ISGID;
575            }
576            else
577            {
578                inode->i_mode = mode;
579            }
580        }
581        gossip_debug(GOSSIP_INODE_DEBUG,
582                "pvfs2_get_custom_inode_common: inode: %p, inode->i_mode %o\n",
583                inode, inode->i_mode);
584        inode->i_mapping->host = inode;
585#ifdef HAVE_CURRENT_FSUID
586        inode->i_uid = current_fsuid();
587        inode->i_gid = current_fsgid();
588#else
589        inode->i_uid = current->fsuid;
590        inode->i_gid = current->fsgid;
591#endif
592        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
593        inode->i_size = PAGE_CACHE_SIZE;
594#ifdef HAVE_I_BLKSIZE_IN_STRUCT_INODE
595        inode->i_blksize = PAGE_CACHE_SIZE;
596#endif
597        inode->i_blkbits = PAGE_CACHE_SHIFT;
598        inode->i_blocks = 0;
599        inode->i_rdev = dev;
600        inode->i_bdev = NULL;
601        inode->i_cdev = NULL;
602        inode->i_mapping->a_ops = &pvfs2_address_operations;
603#ifndef PVFS2_LINUX_KERNEL_2_4
604        inode->i_mapping->backing_dev_info = &pvfs2_backing_dev_info;
605#endif
606
607        gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_get_custom_inode: inode %p allocated\n  "
608                    "(pvfs2_inode is %p | sb is %p)\n", inode,
609                    pvfs2_inode, inode->i_sb);
610
611        if ((mode & S_IFMT) == S_IFREG)
612        {
613            inode->i_op = &pvfs2_file_inode_operations;
614            inode->i_fop = &pvfs2_file_operations;
615
616#ifdef HAVE_I_BLKSIZE_IN_STRUCT_INODE
617            inode->i_blksize = pvfs_bufmap_size_query();
618#endif
619            inode->i_blkbits = PAGE_CACHE_SHIFT;
620        }
621        else if ((mode & S_IFMT) == S_IFLNK)
622        {
623            inode->i_op = &pvfs2_symlink_inode_operations;
624            inode->i_fop = NULL;
625        }
626        else if ((mode & S_IFMT) == S_IFDIR)
627        {
628            inode->i_op = &pvfs2_dir_inode_operations;
629            inode->i_fop = &pvfs2_dir_operations;
630
631            /* dir inodes start with i_nlink == 2 (for "." entry) */
632            inode->i_nlink++;
633        }
634        else
635        {
636            gossip_debug(GOSSIP_INODE_DEBUG, "pvfs2_get_custom_inode: unsupported mode\n");
637            goto error;
638        }
639#if !defined(PVFS2_LINUX_KERNEL_2_4) && defined(HAVE_GENERIC_GETXATTR) && defined(CONFIG_FS_POSIX_ACL)
640        gossip_debug(GOSSIP_ACL_DEBUG, "Initializing ACL's for inode %s\n",
641                PVFS_handle_to_str(get_handle_from_ino(inode)));
642        /* Initialize the ACLs of the new inode */
643        pvfs2_init_acl(inode, dir);
644#endif
645    }
646error:
647    return inode;
648}
649
650/*
651 * Local variables:
652 *  c-indent-level: 4
653 *  c-basic-offset: 4
654 * End:
655 *
656 * vim: ts=8 sts=4 sw=4 expandtab
657 */
Note: See TracBrowser for help on using the browser.