<div dir="ltr"><div class="gmail_extra"><div class="gmail_extra">Hi,</div><div class="gmail_extra"><br></div><div class="gmail_extra">While studying the code and attempting to understand it, we have come up against certain doubts that have us in a slight fix. We've included the concerned</div><div class="gmail_extra"> sections of the code below, along with our specific problem in each of these </div><div class="gmail_extra"> sections. A little pointer in the right direction would be of great help.</div><div class="gmail_extra"><br></div><div class="gmail_extra">(Source file : fsr_xfs_fsr.c)</div><div class="gmail_extra"><br></div><div class="gmail_extra">****** Doubt number 1 ******</div><div class="gmail_extra">(line 331 onwards)</div><div class="gmail_extra">int main() </div><div class="gmail_extra"><br></div><div class="gmail_extra">if (optind < argc)<span class="" style="white-space:pre">  </span>// If the command line input contains the XFS </div><div class="gmail_extra">//filesystem name / file on which xfs_fsr needs to be run on</div><div class="gmail_extra">{<span class="" style="white-space:pre">    </span></div><div class="gmail_extra"><span class="" style="white-space:pre">     </span>for (; optind < argc; optind++) </div><div class="gmail_extra"><span class="" style="white-space:pre"> </span>{</div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>argname = argv[optind];<span class="" style="white-space:pre">   </span>// save target which can be file or filesystem<span class="" style="white-space:pre">    </span></div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>if (lstat64(argname, &sb) < 0) <span class="" style="white-space:pre">    </span></div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>{<span class="" style="white-space:pre"> </span>/* This system call returns a stat64 structure, and thus sets          </div><div class="gmail_extra">                * all fields in it.</div><div class="gmail_extra"><span class="" style="white-space:pre">                         </span>* On success, zero is returned.  On error, -1 is returned, </div><div class="gmail_extra">                * and  errno  is set appropriately.</div><div class="gmail_extra"><span class="" style="white-space:pre">                      </span>*/</div><div class="gmail_extra"><span class="" style="white-space:pre">                   </span>fprintf(stderr,</div><div class="gmail_extra"><span class="" style="white-space:pre">                      </span>_("%s: could not stat: %s: %s\n"),</div><div class="gmail_extra"><span class="" style="white-space:pre">                 </span>progname, argname, strerror(errno));</div><div class="gmail_extra"><span class="" style="white-space:pre">                 </span>continue;<span class="" style="white-space:pre"> </span></div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>}</div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>// POSIX macros are defined to check the file type using the st_mode field</div><div class="gmail_extra"><span class="" style="white-space:pre">           </span>if (S_ISLNK(sb.st_mode)) <span class="" style="white-space:pre"> </span>// Check if path(argname) is a </div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>//symbolic link, if so link will be stat-ed and not file</div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>{// Hence  we run stat64() and save the obtained stat structure</div><div class="gmail_extra"><span class="" style="white-space:pre">                     </span>struct stat64 sb2;</div><div class="gmail_extra"><span class="" style="white-space:pre">                   </span>if (stat64(argname, &sb2) == 0 && (S_ISBLK(sb2.st_mode) ||<span class="" style="white-space:pre">                                                                    </span>   </div><div class="gmail_extra"><span class="" style="white-space:pre">                        </span>     S_ISCHR(sb2.st_mode)))</div><div class="gmail_extra"><span class="" style="white-space:pre">                                        </span>sb = sb2;<span class="" style="white-space:pre"> </span>// check if stat is a success and </div><div class="gmail_extra"><span class="" style="white-space:pre">                                  </span>//if argname(path) is block device ? OR is character device? <span class="" style="white-space:pre">     </span></div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>}</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra"><br></div><div class="gmail_extra">We understand that lstat64() and stat64() are used to see if target</div><div class="gmail_extra"> (file/filesystem) can be stated and if yes then the structure is saved. </div><div class="gmail_extra">But we couldn’t exactly understand its use and why both functions are used separately.</div><div class="gmail_extra">Usually the error could not stat: filename : is followed by Permission denied.</div><div class="gmail_extra"> Is this related to the root permissions i.e. accessibility ?</div><div class="gmail_extra"><br></div><div class="gmail_extra">****** Doubt number 2 ******</div><div class="gmail_extra"><br></div><div class="gmail_extra">(line 184 onwards)</div><div class="gmail_extra">static char *</div><div class="gmail_extra">find_mountpoint(char *mtab, char *argname, struct stat64 *sb)</div><div class="gmail_extra"><br></div><div class="gmail_extra">while ((t = getmntent(mtabp))) {</div><div class="gmail_extra"><span class="" style="white-space:pre">               </span>if (S_ISDIR(sb->st_mode)) {<span class="" style="white-space:pre">            </span>/* mount point */</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (stat64(t->mnt_dir, &ms) < 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                           </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (sb->st_ino != ms.st_ino)</div><div class="gmail_extra"><span class="" style="white-space:pre">                              </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (sb->st_dev != ms.st_dev)</div><div class="gmail_extra"><span class="" style="white-space:pre">                              </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                                </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>} else {<span class="" style="white-space:pre">                          </span>/* device */</div><div class="gmail_extra"><span class="" style="white-space:pre">                 </span>struct stat64 sb2;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (stat64(t->mnt_fsname, &ms) < 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                                </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (sb->st_rdev != ms.st_rdev)</div><div class="gmail_extra"><span class="" style="white-space:pre">                            </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">                    </span>if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                                </span>continue;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">                     </span>/*</div><div class="gmail_extra"><span class="" style="white-space:pre">                   </span> * Make sure the mount point given by mtab is accessible</div><div class="gmail_extra"><span class="" style="white-space:pre">                     </span> * before using it.</div><div class="gmail_extra"><span class="" style="white-space:pre">                  </span> */</div><div class="gmail_extra"><span class="" style="white-space:pre">                  </span>if (stat64(t->mnt_dir, &sb2) < 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                          </span>continue;</div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>}</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra">We just wanted to confirm if the basic working of the function is</div><div class="gmail_extra">1) To obtain a mount table pointer to the mount table (/etc/mtab/ or /proc/mounts).</div><div class="gmail_extra">2)  For each entry in the mount table check if it is a directory or device and after</div><div class="gmail_extra"> performing various comparisons (checks) – (could you please elaborate on the checks</div><div class="gmail_extra">  performed), this function returns a pointer to the entry. </div><div class="gmail_extra"><br></div><div class="gmail_extra">****** Doubt number 3 ******</div><div class="gmail_extra"><br></div><div class="gmail_extra">(line 677 onwards)</div><div class="gmail_extra">static int</div><div class="gmail_extra">fsrfs(char *mntdir, xfs_ino_t startino, int targetrange)</div><div class="gmail_extra"><br></div><div class="gmail_extra">For the following </div><div class="gmail_extra"><br></div><div class="gmail_extra">__s32<span class="" style="white-space:pre">   </span>buflenout;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">    </span>fshandlep = jdm_getfshandle( mntdir );</div><div class="gmail_extra"><span class="" style="white-space:pre">       </span>if ( ! fshandlep ) {</div><div class="gmail_extra"><span class="" style="white-space:pre">         </span>fsrprintf(_("unable to get handle: %s: %s\n"),</div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>          mntdir, strerror( errno ));</div><div class="gmail_extra"><span class="" style="white-space:pre">           </span>return -1;</div><div class="gmail_extra"><span class="" style="white-space:pre">   </span>}</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra"><br></div><div class="gmail_extra">We are a bit confused about what is exactly the file handle being returned</div><div class="gmail_extra"> by jdm_getfshandle().</div><div class="gmail_extra">Also what exactly is buflenout. Is it a structure field ?</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra"><br></div><div class="gmail_extra">while ((ret = xfs_bulkstat(fsfd,&lastino, GRABSZ, &buf[0], &buflenout) == 0))</div><div class="gmail_extra"><span class="" style="white-space:pre">     </span> {</div><div class="gmail_extra"><span class="" style="white-space:pre">           </span>xfs_bstat_t *p;</div><div class="gmail_extra"><span class="" style="white-space:pre">              </span>xfs_bstat_t *endp;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>if (buflenout == 0)</div><div class="gmail_extra"><span class="" style="white-space:pre">                  </span>goto out0;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">            </span>/* Each loop through, defrag targetrange percent of the files */</div><div class="gmail_extra"><span class="" style="white-space:pre">             </span>count = (buflenout * targetrange) / 100;</div><div class="gmail_extra"><br></div><div class="gmail_extra"><span class="" style="white-space:pre">              </span>qsort((char *)buf, buflenout, sizeof(struct xfs_bstat), cmp);</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra"><br></div><div class="gmail_extra">In the above code snippet we understand that the while loop will run for N(10) </div><div class="gmail_extra">passes and defragment top 10% of the defragmented files.</div><div class="gmail_extra">However we would appreciate if you could further explain the functions:</div><div class="gmail_extra"><br></div><div class="gmail_extra">(ret = xfs_bulkstat(fsfd,&lastino, GRABSZ, &buf[0], &buflenout) == 0)</div><div class="gmail_extra"><br></div><div class="gmail_extra">qsort((char *)buf, buflenout, sizeof(struct xfs_bstat), cmp);</div><div class="gmail_extra"><br></div><div class="gmail_extra">We know that the sort function will be used to sort extents based on size and then </div><div class="gmail_extra">offset, but a bit more information on how it is exactly working will be really </div><div class="gmail_extra">appreciated, as we believe that this sort() has some other purpose.</div><div class="gmail_extra">________________________________________________________________________________</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">For this mail we have listed only a limited number of doubts that we think are pressing. Based on further explanations that we might receive from you, we will send out another  mail for the doubts that still linger.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Regards,</div><div class="gmail_extra">A-DRS.</div></div></div>